/* =========================================================
// jquery.fuGMAP.js 0.0.1
// Copyright Chris McKee <pcdevils[at]gmail.com> 2010
// chrismckee.co.uk // http://bit.ly/fuGMAP
// Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
// ========================================================= */
/*
 */
(function($) {

   var geocoder = new GClientGeocoder();
   var rando = Math.round(Math.random() * 12);
 
   $.fn.fuGMAP = function(settings) {
     var config = {
		latitude:				43.722746,
		longitude:				-79.246016,
		address: 				"",
		url:					"",
		zoom:					10,
		markerxml:				"",
		kmlfile:				"",
		markers:				[],
		controls:				[],
		scrollwheel:			true,
		popup:					"iframe",
		icon:
		{
			image:				"http://www.google.com/mapfiles/marker.png",
			shadow:				"http://www.google.com/mapfiles/shadow50.png",
			iconsize:			"",
			shadowsize:			"",
			iconanchor:		 	"",
			infowindowanchor:	""
		}
	};
	
	/* Explode Options */
	var op = $.extend({}, config, settings);
	var eMap, bounds;
	
	// Check if the browser is compatible with Google Maps
	if (!window.GBrowserIsCompatible || !GBrowserIsCompatible()) return this;
 
    return this.each(function() {
		// element-specific code here
		   eMap = new GMap2(this);
		   eMap.setCenter(new GLatLng(op.latitude, op.longitude), op.zoom);
		   bounds = eMap.getBounds();
		/* ICON MAKER */
		var bIcon = new GIcon(G_DEFAULT_ICON);
			if(op.icon.image)  bIcon.image = op.icon.image;
			if(op.icon.shadow) bIcon.shadow = op.icon.shadow
			if(isArray(op.icon.iconsize))   bIcon.iconSize = new GSize(op.icon.iconsize[0], op.icon.iconsize[1]);
			if(isArray(op.icon.shadowsize)) bIcon.shadowSize = new GSize(op.icon.shadowsize[0], op.icon.shadowsize[1]);
			if(isArray(op.icon.iconanchor)) bIcon.iconAnchor = new GPoint(op.icon.iconanchor[0], op.icon.iconanchor[1]);
			/* EO ICON MAKER */	

	/* MAP CONTROLS */
	var MapControls = op.controls.length;
		if(op.controls.length == 0){ eMap.setUIToDefault(); }
		else{while(MapControls--) eval('eMap.addControl(new ' + op.controls[MapControls] + '());');}
	/* EO MAP CONTROLS */
	
	/* DISABLE SCROLLWHEEL */
	if (op.scrollwheel == true && op.controls.length !== 0) { eMap.enableScrollWheelZoom(); }
	   
	
	/* MARKERS ARRAY LOOP */
	for (var i = 0; i < op.markers.length; i++)
	{
        var marker = op.markers[i];     
		
		// LOCATION marker
		if(marker.longitude && marker.latitude)
		{
		  var point = new GPoint(marker.longitude, marker.latitude);
          gMarker = new GMarker(point, bIcon);
		  
		  if(marker.url){
				var pop = op.popup === "iframe" ? "<iframe frameborder='0' hspace='0' src='" + marker.url + "' id='tb_iframecontent' name='tb_iframecontent'\/>" : '<div class="gmap_marker" id="gmap-popup">'+marker.url+'<\/div>';
				GEvent.addListener(gMarker, "click", function(){gMarker.openInfoWindowHtml(pop);});
			  }	
		  
		  if(gMarker){
			eMap.addOverlay(gMarker); 
			eMap.setCenter(point, op.zoom);
		  }
        }

		
		// ADDRESS GeoCoder
        if(marker.address)
		{
			$.fn.fuGMAP.geocodeAddress(marker.address, geocoder, eMap, bounds, bIcon, marker.url, op.popup, op.zoom);
		}
		
	}
	/* EO MARKERS ARRAY LOOP */
	
	// MARKER XML File
	if(op.markerxml)
	{
		$.fn.fuGMAP.markerXML(op.markerxml, eMap, bounds, bIcon, op.popup, op.zoom);
	}
	//
    });
 
    return this;
   };
   
	/* 
   Method: Uses GMaps getLatLng to geocode address
   Returns: Adds Google Marker (obj) returns Bool
   */
   	$.fn.fuGMAP.geocodeAddress = function(addr, gcd, eMap, bounds, icon, url, popup, zoom)
	{
      if (gcd) {
        gcd.getLatLng(
          addr,
          function(point) {
            if (!point) {
              console.log(addr + " not found");
            } else {
              var marker = new GMarker(point, icon);
			  if(url)
			  {
				var pop = popup === "iframe" ? "<iframe frameborder='0' hspace='0' src='" + url + "' id='tb_iframecontent' name='tb_iframecontent'\/>" : '<div class="gmap_marker" id="gmap-popup">'+url+'<\/div>';
				GEvent.addListener(marker, "click", function(){marker.openInfoWindowHtml(pop);});
			  }
			  
			  if(marker){ 
			  eMap.setCenter(point, zoom);
			  eMap.addOverlay(marker); 
			  }
			  return marker ? true : false;
            }
          }
        );
      }
	};
	
	
	$.fn.fuGMAP.markerXML = function(file, eMap, bounds, icon, popup, zoom)
	{
		GDownloadUrl(file,
					function(data) {
						var xml = GXml.parse(data);
						var markers = xml.documentElement.getElementsByTagName("marker");
						for (var i = 0; i < markers.length; i++) {
							var latlng = new GLatLng(parseFloat(markers[i].getAttribute("lat")),parseFloat(markers[i].getAttribute("lng")));
							var marker = new GMarker(latlng, icon);
							if(markers[i].getAttribute("html"))
							{
								var Html = markers[i].getAttribute("html");
								var pop = popup === "iframe" ? "<iframe frameborder='0' hspace='0' src='" +Html+ "' id='tb_iframecontent' name='tb_iframecontent'\/>" : '<div class="gmap_marker" id="gmap-popup">'+Html+'<\/div>';
								GEvent.addListener(marker, "click", function(){marker.openInfoWindowHtml(pop);});
							}
							
							eMap.setCenter(latlng, zoom);
							eMap.addOverlay(marker);
						}
					});
	};	
	
       
   /* 
   Method: Test if passed variable is an Array
   Returns: Bool
   */
   var isArray = function(e)
   {
	return typeof(e) == 'object' && (e instanceof Array);
   }
 
})(jQuery);
