/* --------------------------------------------------------------------
*
* Lanarkshire council maps
* powered by google maps
* by 2Fluid creative 2006 (AB)
*
* Requires: 
*  : prototype [ http://prototype.conio.net/ ] 
*  : with thanks to localsearchmaps.com & maps.google.com
*
* -------------------------------------------------------------------*/


/* ---------------------------------------------- [ GLOBAL SETTINGS ] */

map = null;
mapId = "lmapShow";
debugLog = new Array();
dataUrl = "/maps/fetchData.php";

defaultLat = "55.7354";
defaultLon = "-3.8365";
defaultZoom = parseInt(inQueryString("mapZoom")) || 9;
defaultZoom = ($('mapZoom')) ? parseInt($('mapZoom').value) : defaultZoom;



/* ---------------------------------------------- [ GEOCODING ] **
* powered by localsearchmaps.com
*  - last revision: 14 Nov 2006 (AB)
*/
gCode={

	base_url:"http://geo.localsearchmaps.com/",

	sendReq:function(url) {
		var s = document.createElement("script");
		s.src=url;
		s.type = "text/javascript";
		document.getElementsByTagName("head")[0].appendChild(s);
	},
	
	/*
	   Response: callBack(LAT, LONG, CITY, STATE, COUNTRY);
	*/
	street:function(cb, street, city, country, cbe) {
		country = country || "UK";
		var url = this.base_url+"?street="+ street +"&city="+ city +"&country="+ country +"&cb="+ cb;
		if(cbe) url += "&cbe="+cbe;
		this.sendReq(url);
	},
	
	postal:function(cb, street, city, country, postcode, cbe) {
		country = country || "UK";
		var url = this.base_url+"?street="+ street +"&city="+ city +"&country="+ country +"&zip="+postcode+"&cb="+ cb;
		if(cbe) url += "&cbe="+cbe;
		
		/*var t = document.createElement("textarea");
		t.value = url;
		document.body.appendChild(t);*/

		this.sendReq(url);
	},
	
	/*
	   Response: callBack(LAT, LONG);
	*/
	postcode:function(cb, postcode, country, cbe) {
		country = country || "UK";
		var url = this.base_url+"?zip="+ postcode +"&country="+ country +"&cb="+ cb;
		if(cbe) url += "&cbe="+cbe;
		this.sendReq(url);
	},
	
	/*
	   Response: callBack(LAT, LONG, CITY, STATE, COUNTRY);
	*/
	ip:function(cb, uip) {
		var url = this.base_url+"?by_ip=1&cb="+ cb;
		if(uip) url += "&ip="+uip;
		this.sendReq(url);
	}
};




/* ---------------------------------------------- [ MAP CONTROLS / MARKERS ] */
LBDMaps={

	supported:function() {
		return GBrowserIsCompatible();
	},
	
	marker:{

		basic:function(lat, lon, tooltip, html, mIcon) {
			if($("lbdProfileMap")) Element.setOpacity($("lbdProfileMap"), 1);
			var marker = new GMarker(new GLatLng(lat, lon), { title:tooltip, icon:mIcon });
			if(html) {
				GEvent.addListener(marker, "click", function() {
					marker.openInfoWindowHtml(html);
				});
			}
			map.addOverlay(marker);
			return marker;
		},
		
		tab:function(lat, lon, tooltip, tabs, mIcon) {
			var marker = new GMarker(new GLatLng(lat, lon), { title:tooltip, icon:mIcon });
			if(tabs) {
				GEvent.addListener(marker, "click", function() {
					marker.openInfoWindowTabsHtml(tabs);
				});
			}
			map.addOverlay(marker);
			return marker;
		},
		
		drag:function(lat, lon, tooltip, mIcon, gravity) {
			gravity = gravity || 1;
			var marker = new GMarker(new GLatLng(lat, lon), {draggable:true, bounceGravity:gravity, title:tooltip, icon:mIcon });
			map.addOverlay(marker);
			return marker;
		},
		
		/* markers = [{ "lat":xxxxxxx, "lon":xxxxxxx, "tooltip":"xxx xx xxx", "html":"xxxxxxxx" }]; */
		multi:function(markers, zoom) {
			var m;
			var ms = [];
			for (var i = 0; i < markers.length; ++i) {
				m = markers[i];
				ms.push(LBDMaps.marker.basic(m.lat, m.lon, m.tooltip, m.html));
			}
			return ms;
		}
	},
	
	icon:function(data) {
		var icon = new GIcon(G_DEFAULT_ICON);
		if(data.image)            icon.image            = data.image;
		if(data.shadow)           icon.shadow           = data.shadow;
		if(data.iconSize)         icon.iconSize         = new GSize(data.iconSize['w'], data.iconSize['h']);
		if(data.shadowSize)       icon.shadowSize       = new GSize(data.shadowSize['w'], data.shadowSize['h']);
		if(data.iconAnchor)       icon.iconAnchor       = new GPoint(data.iconAnchor['x'], data.iconAnchor['y']);
		if(data.infoWindowAnchor) icon.infoWindowAnchor = new GPoint(data.infoWindowAnchor['x'], data.infoWindowAnchor['y']);
		return icon;
	}
};




/* ---------------------------------------------- [ COMPONENTS ] **
* component specific methods
*/

widgetMapOptions={

	init:function() {

		waitingXHR = (window.waitingXHR) ? waitingXHR : false;

		if(waitingXHR) Element.setOpacity($(waitingId), 0.05);
		if($('ind')) Element.removeClassName($('ind'), "hidden");

		if(LBDMaps.supported()) {
			widgetMapOptions.createMap();
			widgetMapOptions.attachEvents();
		}
	},
	
	createMap:function() {
		map = new GMap2(document.getElementById(mapId));
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl(G_ANCHOR_TOP_RIGHT));
		map.addControl(new GOverviewMapControl());
		map.setCenter(new GLatLng(defaultLat, defaultLon), defaultZoom);

		this.checkUrl();
		this.attachEvents();
	},
	
	attachEvents:function() {
		if(document.getElementById('mapSearchForm')) {
			Event.observe('mapSearchForm', 'submit', widgetMapOptions.doSearch, false);
		}

		if($('lmapOptions-azLinks')) {
			var azLinks = $('lmapOptions-azLinks').getElementsByTagName("a");
			for(var j = azLinks.length-1; j >= 0; --j) {
				Event.observe(azLinks[j], 'click', Lmap.loadData.fetchAZLinksData, false);
			}
		}
	},
	
	checkUrl:function() {
		var postcode = inQueryString("postcode");
		var street = inQueryString("street");
		var city = inQueryString("place");
		var mapType = inQueryString("type");
		var x = inQueryString("latitude");
		var y = inQueryString("longitude");
		var name = inQueryString("name");

		//alert(postcode + " " + street + " " + city + " " + name);

		if(name) name = name.replace(/%20/g, " ");
		
		if(mapType == 3) { map.setMapType(G_HYBRID_MAP); }
		else if(mapType == 2) { map.setMapType(G_SATELLITE_MAP); }
		else { map.setMapType(G_NORMAL_MAP); }

		if(city && !street && !postcode) {
			Lmap.map = map;
			Lmap.loadData.fetchPlaceData(city);
			return;
		}
		
		if(x && y) {
			map.setCenter(new GLatLng(x, y));
			if(waitingXHR) {
				Element.setOpacity($(waitingId), 1);
				if($('ind')) Element.addClassName($('ind'), "hidden");
				waitingXHR = false;
			}
			if($('htmlInfo')) {
				LBDMaps.marker.basic(x, y, name, $('htmlInfo').innerHTML);
			} else {
				LBDMaps.marker.basic(x, y, name);
			}
		} else if(street || city || postcode) {
			gCode.postal("widgetMapOptions.streetFound", street, city, "UK", postcode, "widgetMapOptions.error");
		}
	},
	
	doSearch:function(e) {
		Event.stop(e);
		var postcodeOut = trim($('lmapSearchPostcodeOut').value);
		var postcodeIn = trim($('lmapSearchPostcodeIn').value);
		var city = trim($('lmapSearchTown').value);

		if(postcodeOut != "") {
			gCode.postcode("widgetMapOptions.postCodeFound", trim(postcodeOut +" "+ postcodeIn), "UK", "widgetMapOptions.error");
		} else if(city != "") {
			gCode.street("widgetMapOptions.streetFound", "", city, "UK", "widgetMapOptions.error");
		}
	},
	
	postCodeFound:function(lat, lon) {
		map.setCenter(new GLatLng(lat, lon));
		if(document.getElementById('locationAddressDetails')) {
			var html = $('locationAddressDetails').innerHTML;
			LBDMaps.marker.basic(lat, lon, "View location information", html);
		} else {
			var m = LBDMaps.marker.basic(lat, lon);
			GEvent.addListener(m, "click", function() {
				m.showMapBlowup();
			});
		}

		if($('mapZoom')) map.setZoom(parseInt($('mapZoom').value));
		if(waitingXHR) {
			Element.setOpacity($(waitingId), 1);
			if($('ind')) Element.addClassName($('ind'), "hidden");
			waitingXHR = false;
		}
	},
	streetFound:function(lat, lon) {
		map.setCenter(new GLatLng(lat, lon));
		if(document.getElementById('locationAddressDetails')) {
			var html = $('locationAddressDetails').innerHTML;
			LBDMaps.marker.basic(lat, lon, "View location information", html);
		} else {
			var m = LBDMaps.marker.basic(lat, lon);
			GEvent.addListener(m, "click", function() {
				m.showMapBlowup();
			});
		}

		if($('mapZoom')) map.setZoom(parseInt($('mapZoom').value));
		if(waitingXHR) {
			Element.setOpacity($(waitingId), 1);
			if($('ind')) Element.addClassName($('ind'), "hidden");
			waitingXHR = false;
		}
	},

	error:function(msg) {
		var time = new Date();
		time = time.getTime();
		var p = document.createElement("p");
		var txt = document.createTextNode(msg);
		p.appendChild(txt);
		p.setAttribute("id", "LmapErrorMsg" + time);

		if($('lmapError').childNodes.length > 0) {
			$('lmapError').innerHTML = "";
			$('lmapError').insertBefore(p, $('lmapError').firstChild);
		} else {
			$('lmapError').appendChild(p);
		}
		setTimeout("removeMapError('LmapErrorMsg" + time + "')", 8000);
	}
}

/* ---------------------------------------------- [ ADD COMPANY ] */
lbdAddCompany={

	m:null,

	init:function() {
		if($('lbd-addBusinessrBody')) {
			mapId = 'plotMap';
			defaultZoom = 16;
			map = new GMap2(document.getElementById(mapId));
			map.addControl(new GSmallMapControl());
			map.setCenter(new GLatLng(defaultLat, defaultLon), defaultZoom);
			Element.setOpacity($(mapId), 0.3);

			widgetMapOptions.checkUrl();
			lbdAddCompany.attachEvents();
		}
	},
		
	attachEvents:function() {
		/*Event.observe($('fields[address1]'), 'blur', lbdAddCompany.auto, false);
		Event.observe($('fields[address2]'), 'blur', lbdAddCompany.auto, false);
		Event.observe($('fields[address3]'), 'blur', lbdAddCompany.auto, false);
		Event.observe($('fields[town]'), 'blur', lbdAddCompany.auto, false);
		Event.observe($('fields[postcode]'), 'blur', lbdAddCompany.auto, false);
		Event.observe($('fields[county]'), 'change', lbdAddCompany.auto, false);*/
		Event.observe($('mapCheckLink'), 'click', lbdAddCompany.manual, false);
	},
		
	auto:function() {
		if(this.m == null) {
			var address1 = trim($('fields[address1]').value);
			var address2 = trim($('fields[address2]').value);
			var address3 = trim($('fields[address3]').value);
			var town = trim($('fields[town]').value);
			var postcode = trim($('fields[postcode]').value);

			if((address1 != "" && address1 != null && address1.length != 0) && (town != "" && town != null && town.length != 0) && (postcode != "" && postcode != null && postcode.length != 0)) {
				var street = encodeURI(address1);
				if(address2 != "" && address2 != null && address2.length != 0) street += "+" + encodeURI(address2);
				if(address3 != "" && address3 != null && address3.length != 0) street += "+" + encodeURI(address3);
				gCode.postal("lbdAddCompany.plot", street, town, "UK", postcode);
			}
		}
	},
	
	manual:function(e) {
		Event.stop(e);
		var address1 = trim($('fields[address1]').value);
		var address2 = trim($('fields[address2]').value);
		var address3 = trim($('fields[address3]').value);
		var town = trim($('fields[town]').value);
		var postcode = trim($('fields[postcode]').value);

		if((postcode != "" && postcode != null && postcode.length != 0)) {
			/*var street = encodeURI(address1);
			if(address2 != "" && address2 != null && address2.length != 0) street += "+" + encodeURI(address2);
			if(address3 != "" && address3 != null && address3.length != 0) street += "+" + encodeURI(address3);
			gCode.postal("lbdAddCompany.plot", street, town, "UK", postcode);*/
			gCode.postcode("lbdAddCompany.plot", postcode, "UK", "lbdAddCompany.errorPlot");
		} else {
			alert("Please ensure you have entered a minimum of:\nFirst line of address\nTown\nPostcode");
		}
	},
	
	plot:function(lat, lon) {
		Element.setOpacity($(mapId), 1);
		var jsonStr = '{"lat":'+ lat +',"long":'+ lon +'}';
		$('fields[geoCodeReturn]').value = jsonStr;
		$('fields[latitude]').value = lat;
		$('fields[longitude]').value = lon;
		map.setCenter(new GLatLng(lat, lon));

		if(this.m == null) {
			this.m = LBDMaps.marker.drag(lat, lon);
			GEvent.addListener(this.m, "dragend", function() {
				lbdAddCompany.dragUpdate(lbdAddCompany.m.getPoint());
			});
		} else {
			this.m.setPoint(new GLatLng(lat, lon));
		}
	},
	
	errorPlot:function() {
		var c = confirm("Sorry we could not locate that postcode.\nWould you like to locate your business manually?");
		if(c) {
			Element.setOpacity($(mapId), 1);
			map.setCenter(new GLatLng(defaultLat, defaultLon), 9);
			if(this.m == null) {
				this.m = LBDMaps.marker.drag(defaultLat, defaultLon);
				GEvent.addListener(this.m, "dragend", function() {
					lbdAddCompany.dragUpdate(lbdAddCompany.m.getPoint());
				});
			} else {
				this.m.setPoint(new GLatLng(defaultLat, defaultLon));
			}
		}
	},
	
	dragUpdate:function(obj) {
		var jsonStr = '{"lat":'+ obj.lat() +',"long":'+ obj.lng() +'}';
		$('fields[geoCodeReturn]').value = jsonStr;
		$('fields[latitude]').value = obj.lat();
		$('fields[longitude]').value = obj.lng();
		map.setCenter(new GLatLng(obj.lat(), obj.lng()));
	}
}

Event.observe(window, 'load', lbdAddCompany.init, false);


/* ---------------------------------------------- [ MISC HELPERS ] */

var co_Attempts = 0;

function co_makeAttempt(lat, lon, name, html, zoom) {
	if(map && typeof map == "object") {
		LBDMaps.marker.basic(lat, lon, name, html);
		map.setCenter(new GLatLng(lat, lon));
		map.setZoom(zoom);
	} else if(co_Attempts <= 30) {
		setTimeout("co_makeAttempt('"+lat+"', '"+lon+"', '"+name+"', '"+html+"', '"+zoom+"')", 500);
	} else {
		return false;
	}
}


function errorPlot() {
	alert("Sorry we could not find that location.");
}


function inQueryString(name, qs) {
	qs = qs || window.location.search.substring(1);
	var pair;
	var vals = qs.split("&");
	for (var i=0;i<vals.length;i++) {
		pair = vals[i].split("=");
		if (pair[0] == name) {
			return pair[1];
		}
	}
	return false;
}

function removeMapError(id) {
	if($(id)) {
		$(id).parentNode.removeChild($(id));
	}
}

function trim(str) {
	return str.replace(/^\s*|\s*$/g,"");
}