(function($) {
	$.fn.extend({
	/* jmap: function(settings)
	 * The constructor method
	 * Example: $().jmap();
	 */
	jmap: function(settings) {
		/* Default Settings*/	
		var settings = jQuery.extend({
			maptype: "map",		// can be "map", "sat" or "hybrid"
			center: [53,6],
			zoom: 13,				
			controlsize: "small",	
			showtype: false,			
			showzoom: true,			
			showpan: false,			
			showoverview: false,		
			dragging: true,			
			scrollzoom: false,		
			smoothzoom: true,
			maxZoom: -1,
			minZoom: -1,
			hideLogo: false,
			clickmarker: false,
			doubleclickzoom: true
		}, settings);
		
		return this.each(function(){	
			var jmap = this.jMap = new GMap2(this);
			switch(settings.maptype) {
				case "map":
					var loadmap = G_NORMAL_MAP;
					break;
				case "sat":
					var loadmap = G_SATELLITE_MAP;
					break;
				case "hybrid":
					var loadmap = G_HYBRID_MAP;
					break;
				default:
					var loadmap = G_NORMAL_MAP;
					break;
			}
			jmap.setCenter(new GLatLng(settings.center[0], settings.center[1]), settings.zoom, loadmap);
			switch(settings.controlsize)
			{
				case "small":
					jmap.addControl(new GSmallMapControl());
					break;
				case "large":
					jmap.addControl(new GLargeMapControl());
					break;
				case "none":
					break;
				default:
					jmap.addControl(new GSmallMapControl());
			}
			if (settings.showtype){
				jmap.addControl(new GMapTypeControl());// Type of map Control
			}
			if (settings.showoverview){
				jmap.addControl(new GOverviewMapControl());//Overview Map
			}
			if (settings.scrollzoom) {
				jmap.enableScrollWheelZoom();
			}
			if (settings.smoothzoom) {
				jmap.enableContinuousZoom();
			}
			if (!settings.dragging) {
				jmap.disableDragging();
			}
			if(settings.doubleclickzoom){
			    jmap.enableDoubleClickZoom();
			} else {
			    jmap.disableDoubleClickZoom();
			}
			if(settings.hideLogo){
			    $('.gmnoprint').each(
				    function(i) {
				        if($(this).html().indexOf('poweredby.png') != -1)
					        $(this).css('display','none');
				    }
			    );
			}
			if(settings.maxZoom != -1){
			    var mt = jmap.getMapTypes();
                for (var i=0; i<mt.length; i++)
                    mt[i].getMinimumResolution = function() {return settings.maxZoom;}
			}
			if(settings.minZoom != -1){
			    var mt = jmap.getMapTypes();
                for (var i=0; i<mt.length; i++)
                    mt[i].getMaximumResolution = function() {return settings.minZoom;}
			}
			if (settings.clickmarker){
				GEvent.addListener(jmap, "dblclick", function(marker, point){
					if (marker) {
						jmap.removeOverlay(marker);
					} else {
						var marker = new GMarker(point);
						jmap.addOverlay(marker);
						GEvent.addListener(marker, 'click', function(){
							pointlocation = marker.getPoint();
							marker.openInfoWindowHtml("Latitude: " + pointlocation.lat() + "<br />Longitude: " + pointlocation.lng());
						})	
					}
				});
			}
			/* On document unload, clean unload Google API*/
			if (jmap != null) {
			//if (jmap.b.jMap) {
				jQuery(document).unload(function(){ GUnload(); });
			}
		});
		},
	/* myMap: function()
	 * Returns a map object from the API, so it's available to the user
	 * Example: $().myMap().setCenter(...) for Google;
	 */
	myMap: function() {
		return this[0].jMap;	
	},
	/* addPoint: function()
	 * Returns a marker to be overlayed on the Google map
	 * Example: $().addPoint(...);
	 */
	addPoint: function(pointlat, pointlng, pointhtml, icon) {
		var jmap = this[0].jMap;
		var marker;
		if(icon == null) {
		    marker = new GMarker(new GLatLng(pointlat,pointlng));
		    
		    GEvent.addListener(marker, "click", function(){
			    marker.openInfoWindowHtml(pointhtml);
		    });
		}
		else {
		    marker = new GMarker(new GLatLng(pointlat,pointlng), icon );
		}

		return jmap.addOverlay(marker);
	},
	/* addPoly: function(poly)
	 * Takes an array of GLatLng points, converts it to a vector Polyline to display on the map
	 * Example: $().addPoly(...);
	 */
	addPoly: function (poly, colour, width, alpha) {
		var jmap = this[0].jMap;
		return jmap.addOverlay(poly);
	},
	/* addRss: function()
	 * Takes a KML file and renders it to the map.
	 * Example: $().addPoint(...);
	 */
	addRss: function (rssfile, callback) {
		var jmap = this[0].jMap;
		var geoXml = new GGeoXml(rssfile, callback);
		return jmap.addOverlay(geoXml);
	},
	
	searchAddress: function (address, settings, callback) {
		var settings = jQuery.extend({
			returntype: "map"	//Return as Map or a Object
		}, settings);

		var jmap = this[0].jMap;
		GGeocoder = new GClientGeocoder();
		GGeocoder.getLatLng(address, function(point){
			if (!point) {
				alert(address + " not found");
			} else {
				switch (settings.returntype) {
					case "object":
						var results = [];
						results[0] = point.y;
						results[1] = point.x;						
						return callback(results);
						break;
					default:
						jmap.setCenter(point);
						var marker = new GMarker(point, {draggable: true});
						jmap.addOverlay(marker);
						var pointlocation = marker.getPoint();
						marker.openInfoWindowHtml("Latitude: " + pointlocation.lat() + "<br />Longitude: " + pointlocation.lng());
						GEvent.addListener(marker, "dragend", function(pointlocation){
							marker.openInfoWindowHtml("Latitude: " + pointlocation.lat() + "<br />Longitude: " + pointlocation.lng());			
						});
						break;
				}
			}
		});
	},
	searchDirections : function(from,to,panel) {
		var jmap = this[0].jMap;
		var dirpanel = document.getElementById(panel);
		search = new GDirections(jmap, dirpanel);
		search.load('from:' + from + ' to:' + to);
	}
});
})(jQuery); 
