// This file contains functions to convert Google Static Map images to dynamic
// google maps, loading the GoogleMaps API if necessary

var deferredGoogleMaps={};
var googleMapsAPIStatus=0;

/** Load a Google Map, if necessary first loading the GoogleMaps API scripts */
function loadGoogleMap(id, params) {
	var el=document.getElementById(id);
	if (!el) return;
	switch(googleMapsAPIStatus) {
	case -1: // browser not compatible with Google Maps API
		break;
	case 0: // google maps API not yet loaded or requested
		googleMapsAPIStatus=1;
		deferredGoogleMaps[id]=params;
		var googleMapsAPISrc='http://maps.google.com/maps?file=api&v=2'
			 +'&async=2&callback=loadDeferredGoogleMaps';
		if (typeof(googleMapsAPIKey)!='undefined') {
			googleMapsAPISrc+='&key='+googleMapsAPIKey;
		} else if (el.nodeName=='IMG' && el.src.match(/key=(\w+)/)) {
			googleMapsAPISrc+='&key='+RegExp.$1;
		}
		var script = document.createElement('script');
		script.type='text/javascript';
		script.src=googleMapsAPISrc;
		var head=document.getElementsByTagName('head')[0];
		head.appendChild(script);
		// head.removeChild(script); // Note: causes problems on IE7
		break;
	case 1: // deferred for google maps API to load
		deferredGoogleMaps[id]=params;
		break;
	case 2: // google maps API is loaded
		if (el.nodeName=='IMG' && el.src.match(/maps.google.com.*key=/)) {
			// Extract parameters from image URL
			if (!params) params={};
			var qcs=el.src.replace(/.*?\?/, '').split('&');
			for(var i=0; i<qcs.length; i++) {
				qc=qcs[i].split('=');
				params[decodeURIComponent(qc[0])]=decodeURIComponent(qc[1]);
			}
			var width=el.width;
			var height=el.height;
			// When image is displayed enlarged, we have to make a corresponding
			// adjustment to the dynamic Google Maps zoom-level
			if (params.size && width>0 && height>0) {
				var sizeComps=params.size.split('x');
				if (parseInt(sizeComps[0])>0 && parseInt(sizeComps[1])>0) {
					var enlargement=(width*height)/
						(parseInt(sizeComps[0])*parseInt(sizeComps[1]));
					params.zoom=parseInt(params.zoom)
						+ Math.round(Math.log(enlargement)/Math.log(4));
				}
			}
			if (!params.markers) {
				params.showMarker=false;
			} else {
				params.showMarker=true;
				var markers=params.markers;
				if (markers.match(/([0-9.]+, *[0-9.]+)/)) {
					params.marker_pos=RegExp.$1;
				}
			}
			var el2=document.createElement('span');
			el2.innerHTML='Loading...';
			el2.id=id;
			el2.style.display='inline-block';
			el2.style.width=width+'px';
			el2.style.height=height+'px';
			el2.style.backgroundColor='#d3d3d3';
			el.parentNode.replaceChild(el2, el);
			el=el2;
		}
		var map = new GMap2(el);
		var center = new GLatLng.fromUrlValue(params.center);
		map.setCenter(center, parseInt(params.zoom));
		var mapControl;
		switch (params.hud) {
		case "GLargeMapControl3D":  mapControl = new GLargeMapControl3D(); break;
		case "GLargeMapControl":    mapControl = new GLargeMapControl();   break;
		case "GSmallMapControl":    mapControl = new GSmallMapControl();   break;
		case "GSmallZoomControl3D": mapControl = new GSmallZoomControl3D();break;
		case "GSmallZoomControl":   mapControl = new GSmallZoomControl();  break;
		}
		if (mapControl) map.addControl(mapControl);
		if (params.showScale && params.showScale!='0') {
			var scaleControl = new GScaleControl();
			map.addControl(scaleControl);
		}
		if (params.showOverview && params.showOverview!='0') {
			var overviewControl = new GOverviewMapControl();
			map.addControl(overviewControl);
		}
		if (params.showMarker && params.showMarker!='0') {
			var marker=new GMarker(center, {icon:G_DEFAULT_ICON});
			map.addOverlay(marker);
			marker.setLatLng(new GLatLng.fromUrlValue(params.marker_pos));
		}
		if (params.showMaptypeSelector && params.showMaptypeSelector!='0') {
			var mapTypeControl = new GHierarchicalMapTypeControl();
			map.addControl(mapTypeControl);
			map.addMapType(G_PHYSICAL_MAP);
		}
		switch (params.maptype) {
		case "satellite":        map.setMapType(G_SATELLITE_MAP); break;
		case "hybrid":           map.setMapType(G_HYBRID_MAP);    break;
		case "terrain":          map.setMapType(G_PHYSICAL_MAP);  break;
		case "roadmap": default: map.setMapType(G_NORMAL_MAP);    break;
		}
	}
}

/** Reinvoke 'loadGoogleMaps' to load any Google Maps that were deferred
 * while the GoogleMaps API scripts were loading */
function loadDeferredGoogleMaps() {
	if (!GBrowserIsCompatible()) {
		googleMapsAPIStatus=-1;
		alert('Sorry, the Google Maps API is not compatible with this browser');
		return;
	}
	googleMapsAPIStatus=2;
	if(window.addEventListener){
		window.addEventListener( "unload", GUnload, false );
	} else {
		window.attachEvent( "onunload", GUnload );
	}
	for(id in deferredGoogleMaps) {
		loadGoogleMap(id, deferredGoogleMaps[id]);
	}
	deferredGoogleMaps=null;
}
