var Xib_Storelocator = Class.create({

	mapCenter:{},
	mapZoom:18,
	mapObject:null,
	infoWindows:[],
	markers:[],
	latlngbounds:null,
	defaults:{
		largeMapUrl:'http://maps.google.com/?',
		markerimage:{
			size:[51.0, 37.0],
			origin:[0,0],
			anchor:[16.0, 18.0]
		}
	},

	initialize: function(params) {
		this.params  = params;
	},
	onDomLoaded:function(){
		var o = this;
		if($('storelocatorGrid_table')){
			$$('#storelocatorGrid_table a[field=info]').each(function(e,n){
				Event.observe(e,'click',o.adminInfoClicked.bindAsEventListener(o));
			});
		}
		if($('edit_form')){
			if($('imgs_icon')){
				o.showIconSample($('imgs_icon'),$F('imgs_icon'));
				new Form.Element.Observer('imgs_icon',0.5,o.showIconSample);
			}
			if($('imgs_shadow')){
				o.showIconSample($('imgs_shadow'),$F('imgs_shadow'));
				new Form.Element.Observer('imgs_shadow',0.5,o.showIconSample);
			}
		}
	},
	
	showIconSample:function(el,value){
	
		if(!value.empty()){
			
			new Ajax.Request(value,{
				onSuccess:function(transport){
					sample = '<img src="'+value+'" />';
					$(el).up(1).select('span[class=sample]').each(function(e,n){e.innerHTML = sample;});
				},
				onFailure:function(transport){
					sample = '<b style="color:red" title="Server Response Status: '+transport.status+' '+ transport.statusText +'"> ?! </b>';
					$(el).up(1).select('span[class=sample]').each(function(e,n){e.innerHTML = sample;});
				}
			});
		}else{
			$(el).up(1).select('span[class=sample]').each(function(e,n){e.innerHTML = '';});
		}
		
	},

	adminInfoClicked:function(e){
		var el = Event.element(e);
		var re = /\/edit\//;
		var url = $(el).up('tr').readAttribute('title').replace(re,'/info/');
		this.openInfoWindow(url);
	},
  
	fireEvent:function(evt,el) {
		var event;
		if (document.createEvent) {
			event = document.createEvent('MouseEvents');
			event.initEvent(evt, true, true);
			el.dispatchEvent(event);
		} else {
			event = document.createEventObject();
			event.eventType = 'MouseEvents';
			el.fireEvent('on' + evt, event);
		}
		return event;
	},
  
	fetchGeoLocation:function(e){
		var o = this;
		var address		= $F('address');
		var postcode	= $F('postcode');
		var city		= $F('city');
		var state		= $F('state');
		var country		= $F('country');
		var q = '';
		if(address){q += address + ',';}
		if(postcode){q+= postcode + ',';}
		if(city){q+= city + ',';}
		if(state){q+= state + ',';}
		if(country){q+= country + ',';}
		if(q == ''){
			alert('Specify address');
			return false;
		}

		var geocoder = new google.maps.Geocoder();
		if (geocoder) {
			geocoder.geocode({ 'address': q }, function (results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				o.parseGeoResource(results);
			}else {
				alert('Geocoding failed: ' + status);
			}
			});
		}
	},
	
	parseGeoResource:function(response){
		var o = this;
		var results = response[0];
		var lat = results.geometry.location.lat(), lng = results.geometry.location.lng();
		$('lat').value = lat;
		$('lng').value = lng;
		var latlng = new google.maps.LatLng(lat, lng);
		var myOptions = {
			zoom: 8,
			center: latlng,
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		var map = new google.maps.Map(document.getElementById("canvas"),myOptions);
		response.each(function(e,n){o.placeAdminMarker(e,map);
		});		
	},
	
	placeAdminMarker:function(o,map){
		var latlng = new google.maps.LatLng(o.geometry.location.lat(), o.geometry.location.lng());
		var marker = new google.maps.Marker({
			position: latlng, 
			map: map, 
			title:o.formatted_address});
		google.maps.event.addListener(marker, 'click', function(){
			$('lat').value = this.position.lat();
			$('lng').value= this.position.lng();
		});

	},
	
	initMap:function(elementId,options){
		this.mapCenter = {lat:options.lat,lng:options.lng}
		this.mapZoom   = (options.zoom || 16);
		var mapType;
		/*** Google Map Types
		* ROADMAP displays the normal, default 2D tiles of Google Maps.
		* SATELLITE displays photographic tiles.
		* HYBRID displays a mix of photographic tiles and a tile layer for prominent features (roads, city names).
		* TERRAIN displays physical relief tiles for displaying elevation and water features (mountains, rivers, etc.).
		* Unlike in the Google Maps V2 API, there is no default map type. You must specifically set an initial map type to see appropria
		***/
		switch(options.type){
			case 'satellite':
				mapType = google.maps.MapTypeId.SATELLITE;
			break;
			case 'hybrid':
				mapType = google.maps.MapTypeId.HYBRID;
			break;
			case 'terrain':
				mapType = google.maps.MapTypeId.TERRAIN;
			break;
			default:
				mapType = google.maps.MapTypeId.ROADMAP;
		}

		
		var latlng = new google.maps.LatLng(options.lat, options.lng);
		var myOptions = {
			zoom: this.mapZoom,
			center: latlng,
			mapTypeId: mapType
		};
		this.mapObject = new google.maps.Map($(elementId),myOptions);
	},
	
	renderLocations:function(locations){
		var o = this;
		this.latlngbounds = new google.maps.LatLngBounds(); 
		locations.each(function(e,n){o.placeMarker(e,o.mapObject)});
		if(arguments.length > 1 && arguments[1] == true){ // autozoom and autocenter
			this.mapObject.setCenter(this.latlngbounds.getCenter());
			this.mapObject.fitBounds(this.latlngbounds); 
		}
	},
	
	placeMarker:function(o,map){
		var X = this;
		var latlng = new google.maps.LatLng(o.lat, o.lng);
		this.latlngbounds.extend(latlng);
		var markerOptions = {
			position: latlng, 
			map: map, 
			title:o.loc_name+' : ' + o.address+', '+o.city};
		
		if(o.imgs && o.imgs.icon){
			markerOptions.icon = new google.maps.MarkerImage(o.imgs.icon,
				new google.maps.Size(X.defaults.markerimage.size[0], X.defaults.markerimage.size[1]),
				new google.maps.Point(X.defaults.markerimage.origin[0], X.defaults.markerimage.origin[1]),
				new google.maps.Point(X.defaults.markerimage.anchor[0], X.defaults.markerimage.anchor[1])
			);
		}

		
		if(o.imgs && o.imgs.shadow){
			markerOptions.shadow = new google.maps.MarkerImage(o.imgs.shadow,
				new google.maps.Size(X.defaults.markerimage.size[0], X.defaults.markerimage.size[1]),
				new google.maps.Point(X.defaults.markerimage.origin[0], X.defaults.markerimage.origin[1]),
				new google.maps.Point(X.defaults.markerimage.anchor[0], X.defaults.markerimage.anchor[1])
			);
		}
		
		var marker = new google.maps.Marker(markerOptions);
		var k = X.markers.length;
		var infowindow = new google.maps.InfoWindow();
		X.infoWindows.push(infowindow);
		X.markers.push(marker);
		google.maps.event.addListener(marker, 'click', function(){
			X.infoWindows.each(function(i,n){i.close();});
			infowindow.setContent(X.getInfowindowContent(o,k));
			infowindow.open(X.mapObject,marker);
		});
	},
	
	getInfowindowContent:function(o,k){
		var re = /\n/g;
		var zoomText = (this.mapObject.getZoom() < 16)?'Zoom Location':'Zoom out';
		var contentString = '<div class="infowindowContent"><h2>'+o.city+'</h2><h4>'+o.loc_name+'</h4>';
		if('distance' in o){
			contentString += '<div class="distance">Distance: <span>' + Math.round(o.distance) + ' ' + o.units + ' </span></div>';
		}
		//'<p>'+o.address+'<br />'+o.postcode+' &nbsp; '+o.city+'<br />'+o.state+'</p>
		contentString += '<p>';
		contentString += o.loc_description.replace(re,'<br />');
		contentString += '</p>';
		contentString += '<p class="mapTools"><a rel="zoomMap" onclick="xibStorelocator.zoomTo(this,'+k+')">'+zoomText+'</a> &nbsp; ';
		contentString += '<a rel="bigMap" href="'+this.defaults.largeMapUrl+'ll='+o.lat+','+o.lng+'&amp;q='+encodeURIComponent(o.address+','+o.postcode+','+o.city+','+o.country)+'" target="_blank">Larger map</a>';
		contentString += '</p></div>';
		return contentString;
	},
	
	zoomTo:function(a,k){
		var X = this;
		var currentZoom = X.mapObject.getZoom();
		if(currentZoom < 16){
			var marker = X.markers[k];
			X.mapObject.setCenter(marker.position);
			X.mapObject.setZoom(18);
			a.innerHTML = 'Zoom out';
		}else{
			// Zoomed in
			X.mapObject.setZoom(X.mapZoom);
			a.innerHTML = 'Zoom location';
			X.mapObject.setCenter(new google.maps.LatLng(X.mapCenter.lat, X.mapCenter.lng));
		}
	},

	testConsole:function(){
		//console.log(this.params.module);
	},
	
	searchLocations:function(address){
		if(address.empty()){
			return;
		}
		var geocoder = new google.maps.Geocoder();
		if (geocoder) {
			geocoder.geocode({ 'address': address }, function (results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				results = results[0];
				$('qLatLng').value = results.geometry.location.lat() + ',' + results.geometry.location.lng();
				$('storeLocatorSearchForm').submit();
			}else {
				alert('Geocoding failed: ' + status);
			}
			});
		}
		return false;
	},
	
    openInfoWindow: function(locationUrl) {
        if ($('xib_storelocator_window') && typeof(Windows) != 'undefined') {
            Windows.focus('xib_storelocator_window');
            return;
        }
        this.dialogWindow = Dialog.info(null, {
            draggable:true,
            resizable:true,
            closable:true,
            className:'magento',
            windowClassName:"popup-window",
            title:'Store Location Information',
            top:50,
            width:950,
            height:400,
            zIndex:1000,
            recenterAuto:false,
            hideEffect:Element.hide,
            showEffect:Element.show,
            id:'xib_storelocator_window',
            onClose: this.closeDialog.bind(this)
        });
        new Ajax.Updater('modal_dialog_message', locationUrl, {evalScripts: true,onComplete:this.setupInfoTabs});
    },
	
	setupInfoTabs:function(){
		var xibLocationsTabs = new varienTabs('xib_locations_tab', 'xib_locations_tab_content', 'xib_location_tab_general', []);
		$('xib_location_tab_general').addClassName('active');
		$('xib_location_tab_general_content').setStyle({display:'block'});
	},
	
    closeDialog: function(window) {
        if (!window) {
            window = this.dialogWindow;
        }
        if (window) {
            // IE fix - hidden form select fields after closing dialog
            WindowUtilities._showSelect();
            window.close();
        }
    }
	
});

var xibStorelocator = new Xib_Storelocator({module:'Xib-Storelocator'});
document.observe("dom:loaded", function() {
 xibStorelocator.onDomLoaded();
});
