/**
 * Plugin: jquery.GoogleMaps
 * 
 * 
 * Updated Version: 1.0.2
 * (c) Copyright 2010, David Turner
 *
 * Description: jQuery plugin for displaying maps via Google Maps API v3
 * 
 * History:
 * 1.0.1 - Support for multiple map instances
 * 1.0.2 - Replace google geocode PAI with AJAX Search API to allow mapping fo rmore than 10 locations per map
 * 
 **/
jQuery.fn.googleMapsStaticConvert = function(options) {
		
	//jQuery.fn.googleMaps.includeGoogle(opts.key, opts.sensor);
	return this.each(function(count) {	

		var mapWidth = jQuery(this).width();
		var mapHeight = jQuery(this).height();
		if(mapHeight<50)mapHeight=300;
		
		var newMapCont = jQuery('<div class="googleMapsContainer" id="GoogleMap_'+count+'">')
			.css('width',mapWidth)
			.css('height',mapHeight)
			.css('margin-top',jQuery(this).css('margin-top'))
			.css('margin-right',jQuery(this).css('margin-right'))
			.css('margin-bottom',jQuery(this).css('margin-bottom'))
			.css('margin-left',jQuery(this).css('margin-left'))
			.css('float',jQuery(this).css('float'));
															
		//console.log(jQuery(this).attr("src"));
		//get markers
		var src =jQuery.URLDecode(jQuery(this).attr("src"));
		//console.log(src);
		
		var markers = new Array();
		
		markers = src.match(/markers=([^&]+)/);
		//console.log(markers[1]);
		var aLocations = new Array();
		var aTitles = new Array();
		var aDetails = new Array();
		var aIcons = new Array();
		

		aLocations.push(markers[1]);
		aTitles.push('Test');
		
		//newMapCont.GoogleMap(markers[1].split('|'),'test','default');
		newMapCont.GoogleMap(aLocations,aTitles,aDetails,aIcons, {
			height: '360px',
			navControls:true,
			navControlsOpt:1,
			typeControls:false,
			maxZoom:16
		});
		
		jQuery(this).replaceWith(newMapCont);
		
	});

};

(function($){
	
	$.fn.GoogleMap = function(locations, titles, details, icons,options) {
		
		// Set pluign defaults
		var defaults = {  
			type: 0,
			navControls:true,
			navControlsOpt:1,
			typeControls:false,
			typeControlsOpt:1,
			width: '100%',
			height: '300px',
			zoom: 3,
			clickable: true,
			tooltip: true,
			tipsuffix: ' (click for more)',
			icon: '/images_site/icons/marker.png',
			maxZoom: 10,
			minZoom: 1
		};  
		var options = $.extend(defaults, options); 
		
		//console.log(locations);
	
		
		// Select map type
		var maptype = getGoogleMapID(options.type);
		
		// Select map controls
		var navControlsOpt = getNavControlsID(options.navControlsOpt);
		
		// Select map controls
		var typeControlsOpt = getTypeControlsID(options.typeControlsOpt);
		
		// Set Map defaults
		var apiDefaults = {
			mapTypeId: maptype,
			navigationControl: options.navControls,
			navigationControlOptions: {
				style: navControlsOpt
			},
			mapTypeControl: options.typeControls,
			mapTypeControlOptions: {
					style: typeControlsOpt
			},
			zoom: options.zoom
		}
		
		// Functions
		return this.each(function(i, e) {
			var $e = $(e);
			
			// Initialise Map variables
			//var apiCenter = new google.maps.LatLng(53.800651,-4.064941);
			var apiMap = new google.maps.Map($e.get(0), $.extend(apiDefaults, { bounds:apiBounds,maxZoom:options.maxZoom,minZoom:options.minZoom}));
 			var apiBounds = new google.maps.LatLngBounds();
			
			
			google.maps.event.addListener(apiMap, 'zoom_changed', function() {
        zoomChangeBoundsListener = google.maps.event.addListener(apiMap, 'bounds_changed', function(event) {
            if (this.getZoom() > options.maxZoom){ // Change max/min zoom here
                this.setZoom(options.maxZoom);
						}else if(this.getZoom() < options.minZoom){
                this.setZoom(options.minZoom);							
						}
            google.maps.event.removeListener(zoomChangeBoundsListener);
        });
			}); 
			

			// Add map class to user div
			if (!$e.hasClass('mapGoogle')) {
				$e.addClass('mapGoogle');
				$e.css('width', options.width);
				$e.css('height', options.height);
			}

			
			// Loop through locations adding markers
			if (locations) {
				if (locations.length > 0) {
					var i = 0;
					while (i < locations.length) {
						// Plot location
						getGeoCode(apiBounds, apiMap, i);
						i = i+1;
					}
				}
			}
		});
		
		// Geocode address and plot markers	
		function getGeoCode(apiBounds, apiMap, index) {
			
			// Check for valid address array
			if (locations && index >= 0) {
				
				// Get Lat/Long values from address
				localsearchGeocode({ address: locations[index] ,bounds:apiBounds,map:apiMap,opts:options}, function(results, status) {
					
					//console.log(status);
					//console.log(results);
					if (status == 200) {
						//console.log(results);
						
						if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
									
							// Create tooltip text
							var title = '';
							if (options.tooltip) title = titles[index] + options.tipsuffix;

							
							var apiMarker = new google.maps.Marker({
								position: results,
								id:'test',
								map: apiMap,
								title: title
							});

							//console.log(title);
							// Create info window
							var apiInfoWindow = new google.maps.InfoWindow({
								content: details[index],
								 maxWidth: 300

							});
							// Create 'click' event and attach info window to marker
							if (options.clickable)
								google.maps.event.addListener(apiMarker, 'click', function() {
									apiInfoWindow.open(apiMap, apiMarker);
								});
							}
							
						
					}
				});
			}
		}

		// Convert map type to Google Map ID
		function getGoogleMapID(map) {
			var mapid = google.maps.MapTypeId.ROADMAP;

			switch (map) {
				case 1:
					mapid = google.maps.MapTypeId.SATELLITE;
					break;
				case 2:
					mapid = google.maps.MapTypeId.HYBRID;
					break;
				case 3:
					mapid = google.maps.MapTypeId.TERRAIN;
					break;
			}

			return mapid;
    }
		
		
		// Switch nav controls type Google Map ID
		function getNavControlsID(map) {
			var controlid = google.maps.NavigationControlStyle.SMALL ;

			switch (map) {
				case 1:
					controlid = google.maps.NavigationControlStyle.SMALL;
					break;
				case 2:
					controlid = google.maps.NavigationControlStyle.ZOOM_PAN;
					break;
				case 3:
					controlid = google.maps.MapTypeControlStyle.ANDROID;
					break;
				case 4:
					controlid = google.maps.MapTypeControlStyle.DEFAULT;
					break;
			}

			return controlid;
    }
		
		
		// Switch type controls type Google Map ID
		function getTypeControlsID(map) {
			var controlid = google.maps.NavigationControlStyle.DEFAULT;

			switch (map) {
				case 1:
					controlid = google.maps.NavigationControlStyle.DEFAULT;
					break;
				case 2:
					controlid = google.maps.MapTypeControlStyle.DROPDOWN_MENU;
					break;
				case 3:
					controlid = google.maps.MapTypeControlStyle.HORIZONTAL_BAR;
					break;
			}

			return controlid;
    }

		
		//better geocoder - using google ajax search api
		function localsearchGeocode(vars,callbackFunction) {
			
			
			
			//set up Google AJAX Search api
			var localSearch = new GlocalSearch();
			
			localSearch.setSearchCompleteCallback(null,
				function() {
					//
					
					if (localSearch.results[0]) {
						//console.log(localSearch.results[0]);
						var resultLat = localSearch.results[0].lat;
						var resultLng = localSearch.results[0].lng;
						var point = new google.maps.LatLng(resultLat,resultLng);
						
						vars['bounds'].extend(point);

						vars['map'].fitBounds(vars['bounds']);
						/*
						if (vars['map'].getZoom() > vars['opts']['maxZoom']){ // Change max/min zoom here
                vars['map'].setZoom(10);
								console.info(vars['map'].getZoom());
						}
						*/

						//vars['map'].maxZoom(vars['opts']['maxZoom'];
						//console.log(location['address']+" found!");
						callbackFunction(point,localSearch.completionStatus);
					}else{
						//console.log(location['address']+" not found!");
						vars['address'] = vars['address'].replace(/[^,]+,/,'');
						if(vars['address']!=""){
							localsearchGeocode(vars,callbackFunction);
						}
						//
						
					}
				});  
				
			localSearch.execute(vars['address'].replace('UNITED KINGDOM','UK'));
		}
	};
	
	
	
	
})(jQuery);
			
jQuery.extend({
	URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;
  while(x<c.length){var m=r.exec(c.substr(x));
		if(m!=null && m.length>1 && m[1]!=''){
			o+=m[1];x+=m[1].length;
		}else{
			if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);
			o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;
	},
	URLDecode:function(s){var o=s;var binVal,t;var r=/(%[^%]{2})/;
  while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){b=parseInt(m[1].substr(1),16);
  t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;}
});


