// 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;
	if (googleMapsAPIStatus<2 && window.google && window.google.maps) {
		googleMapsAPIStatus=2;
	}
	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.googleapis.com/maps/api/js?v=3.5&sensor=false&callback=loadDeferredGoogleMaps';
		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.*staticmap/)) {
			// Extract parameters from image URL
			if (!params) params={};
			params.disableDefaultUI=true;
			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 = new Element('span', { id: id, styles: { display:'inline-block', width: width+'px', height: height+"px", backgroundColor: "#D3D3D3" } });
			el.id=undefined;
			/* the el2 code gave an error in IE9 in IE8 and IE7 mode, rewriting it with the code at line 63 seems to have fixed it
			var el2 =document.createElement('span');
			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);
			el2.grab(el);
			el=el2;
		} else if (!params) {
			return;
		}
		// convert Google API v2 parameters to v3 where appropriate
		if ($type(params.center)=='string') {
			params.center = new google.maps.LatLng(
				params.center.split(',')[0], params.center.split(',')[1]);
		}
		if (!params.mapTypeId && params.maptype) {
			params.mapTypeId=google.maps.MapTypeId[params.maptype.toUpperCase()];
		}
		if (!params.mapTypeId) {
			params.mapTypeId=google.maps.MapTypeId.HYBRID;
		}
		if (typeof(params.hud)=='string') {
			params.panControl=params.hud.match(/Map/i);
			params.zoomControl=params.hud.match(/Map|Zoom/i);
			params.zoomControlOptions={
				style: google.maps.ZoomControlStyle[
					params.hud.match(/Large/) ? 'LARGE' : 'SMALL']
			};
		}
		if (params.showScale && params.showScale!='0') {
			params.scaleControl=true;
		}
		if (params.showOverview && params.showOverview!='0') {
			params.overviewMapControl=true;
		}
		if (params.showMaptypeSelector && params.showMaptypeSelector!='0') {
			params.mapTypeControl=true;
			params.mapTypeControlOptions = {
				mapTypeIds: [
					params.mapTypeId=google.maps.MapTypeId.HYBRID,
					params.mapTypeId=google.maps.MapTypeId.ROADMAP,
					params.mapTypeId=google.maps.MapTypeId.SATELLITE,
					params.mapTypeId=google.maps.MapTypeId.TERRAIN
				]
			};
		}
		var map = new google.maps.Map(el, params);
		if (params.showMarker && params.showMarker!='0') {
			var marker_pos=new google.maps.LatLng(
				params.marker_pos.split(',')[0], params.marker_pos.split(',')[1]);
			var marker=new google.maps.Marker({
				position: marker_pos,
				map: map
			});
		}
		if (params.onLoad) {
			params.onLoad(map);
		}
	}
}

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

