/*
	FSI Sir Speedy mapping.js
	Paul Farning - ISITE Design
	12.22.08
	
	JS for Google Maps locator and Directions integration
	
*/

//jQuery dom ready
$(document).ready(function() {
	//Moved to center_directions.cfm in order to fire only once.
	//$("#getdirections").submit(function(){ Mapping.setDirections($.trim(this.destinationfrom.value)); return false; });
	
	//Moved to center_map_locator.cfm in order to only fire once.
	//$("#getlocation").submit(function(){ Mapping.searchLocations($.trim(this.addressInput.value)); return false; });
	// post gets populated to form. if not empty, submit the form to initiate map
	//if($.trim($("#addressInput").val()).length > 0) { $("#getlocation").submit(); }

});// goodnight, jQuery

var Mapping = {
	
	map: null,
	gdir: null,
	addressMarker: null,
	$vcard: null,	
	p: null,
	geocoder: null,
	widgetpage: 0,

	// build GMap from vcard
	buildGMap: function($el,i) {
	
		if (GBrowserIsCompatible()) {
			
			$(".generic").after('<div id="map-locations"><ol></ol></div>');
			// location status field
			$("#getlocation ul").append('<li id="status"></li>');
			// directions status field
			$("#getdirections button").before('<p id="status"></p>');
			$("p.location").before('<div id="map-dir-results"></div>');
			
			Mapping.widgetpage = $(".widgetpage").length==1;
			Mapping.$vcard = Mapping.widgetpage ? $(".location.vcard") : $("#location .vcard");
			
			Mapping.p = {
				name 		: Mapping.$vcard.find(".org").text(),
				address 	: Mapping.$vcard.find(".street-address").text(),
				locality	: Mapping.$vcard.find(".locality").text(),
				region		: Mapping.$vcard.find(".region").text(),
				zip			: Mapping.$vcard.find(".postal-code").text()
			};	
			
			$el.attr("id","map"+i).addClass("mapped").html("");				
			if(!Mapping.widgetpage) { $el.addClass("map-small"); } // small map on non-widget page			
			
			Mapping.map	= new GMap2($el.get(0));
			// init directions
			if($("#getdirections").length>0) {
				Mapping.gdir = new GDirections(Mapping.map, document.getElementById("map-dir-results"));
				GEvent.addListener(Mapping.gdir, "load", Mapping.onGDirectionsLoad);
				GEvent.addListener(Mapping.gdir, "error", Mapping.handleErrors);	
				GEvent.addListener(Mapping.gdir, "addoverlay", Mapping.onGDirectionsOverlay);	
			}
			Mapping.map.addControl(new GSmallMapControl());
			Mapping.map.addControl(new GMapTypeControl());
			var tomap = $el.hasClass("generic") ? "United States" : Mapping.p.address + " " + Mapping.p.locality + ", " + Mapping.p.region + " " + Mapping.p.zip;
			Mapping.geocoder = new GClientGeocoder()
			Mapping.geocoder.getLatLng(tomap, function(point) {
				if (!point) { return } else {
					if ($el.hasClass("generic")) {
						Mapping.map.setCenter(point, 3);
					} else {
						Mapping.map.setCenter(point, 14);
						var infoaddress = "<br />" + Mapping.p.locality + ", " + Mapping.p.region + " " + Mapping.p.zip;
						var locMarker = Mapping.createMarker("center",point,Mapping.p.name,Mapping.p.address,infoaddress);
						Mapping.map.addOverlay(locMarker);
						if(Mapping.widgetpage) {
							GEvent.addDomListener($("p.location")[0], 'click', function() { GEvent.trigger(locMarker, 'click');	});	
						}
					}
				}
			});
			window.onunload=GUnload;
		}
	},
	
	// generic marker create function. takes point for location and address info for infowindow
	createMarker: function(index,local_point,local_name,local_streetaddress,local_locality,local_hostName, local_centerid, local_email) {
//		if(index=="center") {
			var baseIcon = new GIcon(G_DEFAULT_ICON);
			baseIcon.shadow = "/images/css/icon_gmarker_location_shadow.png";
			baseIcon.iconSize = new GSize(50, 39);
			baseIcon.shadowSize = new GSize(70, 39);
			baseIcon.iconAnchor = new GPoint(25, 39);
			baseIcon.infoWindowAnchor = new GPoint(39, 2);
			baseIcon.imageMap = [0,0,0,39,39,50,50,0];
			var locationIcon = new GIcon(baseIcon);
			locationIcon.image = "/images/css/icon_gmarker_location.gif";
			markerOptions = { icon:locationIcon };
//		} else {
//			var baseIcon = new GIcon(G_DEFAULT_ICON);
//			baseIcon.shadow = "/images/css/markers/icon_gmarker_shadow.png";
//			baseIcon.iconSize = new GSize(24, 32);
//			baseIcon.shadowSize = new GSize(41, 32);
//			baseIcon.iconAnchor = new GPoint(12, 32);
//			baseIcon.infoWindowAnchor = new GPoint(24, 2);
//			baseIcon.imageMap = [0,0,0,32,32,24,24,0];
//			var letter = String.fromCharCode("A".charCodeAt(0) + index).toLowerCase();
//			var letteredIcon = new GIcon(baseIcon);
//			letteredIcon.image = "/images/css/markers/icon_gmarker_" + letter + ".gif";
//			markerOptions = { icon:letteredIcon };
//		} 
		var marker 	= new GMarker(local_point,markerOptions);
		
		if((typeof(local_email) == "undefined")) {
			var html = '<h4>'+local_name+'</h4><p>'+local_streetaddress+''+local_locality+'</p>'; /*<br />*/
		} else {
			var html = '<h4>'+local_name+'</h4><p>'+local_streetaddress+'<br />'+local_locality+'</p>'+'<a href="mailto:'+local_email+'">Email</a><br /><a href="http://'+local_hostName+'.sirspeedy.com">Web site</a><br /><a href="directions.cfm?loc='+local_centerid+'">Directions</a>';
		}
		
		GEvent.addListener(marker, 'click', function() {
			marker.openInfoWindowHtml(html);	
		});
		return marker;
	},
	
	// receive address from user and map to current vcard
	setDirections: function(fromAddress) {
		if(fromAddress=="") { $("#status").show().addClass("error").text("Enter Address, City and State."); return false; }		
	
		var to = Mapping.p.address + ", " + Mapping.p.locality + ", " + Mapping.p.region + " " + Mapping.p.zip;
		Mapping.gdir.load("from: " + fromAddress +" to: " + to, { "locale": "en_US" });
		$("#directions").empty();
		$("#status").show().removeClass("error").text("Loading directions.");
	},

	handleErrors: function(){
		if (Mapping.gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
			$("#status").addClass("error").text("Address is not recognizable.");
		else $("#status").addClass("error").text("Directions could not be retrieved.");
	},

	// stuff to do when directions are loaded
	onGDirectionsLoad: function (){
		$("#status").hide();
	},

	// stuff to do when directions are mapped and output
	onGDirectionsOverlay: function (){ 
		// remove default icon
		Mapping.map.removeOverlay(Mapping.gdir.getMarker(1));
		// custom styles
		$("#map-directionsteps").addClass("directions").prepend('<h3>Driving Directions to Nearest Location</h3><p class="map-distance-note">'+Mapping.gdir.getDistance().html+' &#8211; about '+ Mapping.gdir.getDuration().html +'</p>');
		$("div[jsselect]>table[style]:last,div.googledir div[jseval]").hide();
		$("div[jsselect]>table[style]:first").css({ background:"#fff",border: "none" });
		$("tr td+td+td[jseval]").addClass("google_note");
	},

	// catch submit of locator form
	searchLocations: function(address) { 
		if(address=="") {
			$("#status").css("visibility","visible").show().html('<p class="error">Enter City and State, or ZIP Code.</p>');
			//Close Loading because of error
			$(document).find("#TB_closeWindowButton").click();
			return false; 
		}
		Mapping.geocoder.getLatLng(address, function(latlng) {
			if (!latlng) {
				var m = address || "address";
				$("#status").css("visibility","visible").show().html('<p class="error">City, State or ZIP is not recognizable.</p>');
				//Close Loading because of error
				$(document).find("#TB_closeWindowButton").click();
			} else {
				$("#status").css("visibility","hidden");
				Mapping.searchLocationsNear(latlng);
			}
		});
	},

	searchLocationsNear: function(center) {
		//var radius = document.getElementById("radiusSelect").value;
		var radius = document.getlocation.radiusSelect.value;
		var searchUrl = '/customcf/distanceSearch_genxml.cfm?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
		//var searchUrl = "samplelocations.xml";
		
		//Show the loading screen
		GDownloadUrl(searchUrl, function(data) {
			var xml = GXml.parse(data);
			var markers = xml.documentElement.getElementsByTagName('marker');
			
			Mapping.map.clearOverlays();
			
			var $sidebar = $("#map-locations");
			$sidebar.empty();
			if (markers.length == 0) {
				$sidebar.html('<h3 class="noresults">No results found.</h3>');
				Mapping.map.setCenter(new GLatLng(40, -100), 3);
				$(document).find("#TB_closeWindowButton").click();
				return;
			}
			$sidebar.append("<ol></ol>");
			var bounds = new GLatLngBounds();
			//alert(markers);
			var expandedSearch = markers[0].getAttribute('expandedSearch');
			$("div#expandedsearch-note").empty();
			//alert("Just ran empty()");
			if(expandedSearch == 1) { $("div#expandedsearch-note").html("<span style='font-style:italic; color:red'>The search criteria entered did not generate enough results, therefore, the search results below reflect a wider radius of options.</span>"); }
			for (var i = 0; i < markers.length; i++) {
				var name			= markers[i].getAttribute('name');
				var streetaddress	= markers[i].getAttribute('streetaddress');
				var locality		= markers[i].getAttribute('locality');
				var distance		= parseFloat(markers[i].getAttribute('distance'));
				var point			= new GLatLng(parseFloat(markers[i].getAttribute('lat')),parseFloat(markers[i].getAttribute('lng')));
				var phone			= markers[i].getAttribute('phone');
				var centerid		= markers[i].getAttribute('id');
				var email			= markers[i].getAttribute('email');
				var hostname		= markers[i].getAttribute('hostname');
				var marker			= Mapping.createMarker(i,point, name, streetaddress, locality, hostname, centerid, email);
				Mapping.map.addOverlay(marker);
				var sidebarEntry = Mapping.createSidebarEntry(i,marker, name, streetaddress, locality, distance, phone, email, hostname, centerid);
				$sidebar.find("ol:last").append(sidebarEntry);
				bounds.extend(point);
				if((i+1)%4==0) { $sidebar.append("<ol></ol>"); }
			}
			Mapping.map.setCenter(bounds.getCenter(), Mapping.map.getBoundsZoomLevel(bounds));
			
			//Close loading when done googling
			$(document).find("#TB_closeWindowButton").click();
		});
	},
	
	createSidebarEntry: function(index, marker, name, streetaddress, locality, distance, phone, email, hostname, id) {
		var li 		 = document.createElement("li");
		var h3 		 = document.createElement("h3");
		var p		 = document.createElement("p");
		var p2		 = document.createElement("p");
		p.innerHTML	 = streetaddress + '<br />' + locality + '<br />' + phone + '<br />' + distance.toFixed(1) + ' Miles';
		p2.innerHTML = '<a href="mailto:'+email+'">Email</a><br /><a href="http://'+hostname+'.sirspeedy.com">Web site</a><br /><a href="directions.cfm?loc='+id+'">Directions</a>';
		h3.innerHTML = '<a href="directions.cfm?loc='+id+'">'+name+'</a>';
		
		GEvent.addDomListener(h3, 'mouseover', function() { GEvent.trigger(marker, 'click'); });
		GEvent.addDomListener(h3, 'click', function() { setCookie("locator",id); });
		GEvent.addDomListener(p2, 'click', function() { setCookie("locator",id); });
		
		//var letter = String.fromCharCode("A".charCodeAt(0) + index).toLowerCase();
		//$(li).css({backgroundImage:"url(/images/css/markers/icon_gmarker_" + letter + ".gif)"});
		$(li).css({backgroundImage:"url(/images/css/icon_gmarker_location.gif)"});
		li.appendChild(h3);
		li.appendChild(p);
		li.appendChild(p2);
		return li;
	}

};

