	/* ------------------------------------------ API EVENTS ---------------------------------*/
	
	/* PUBLIC VARS */
	
	var gmap_id_debugger = "debug";
	var gmap_id_status = "status";
	
	var gmap_id_debugger = "debug";	
	
	/* PRIVATE VARS */
	
	var gmap_debugger = null;
	var gmap_status = null;
	var gmap_c_geo_code = null;
	var gmap_c_lat = null;
	var gmap_c_lng = null;
	
	var gmap_p_lat = null;
	var gmap_p_lng = null;
	var gmap_p_geo_code = null;
	var gmap_p_code = null;
	
	/* PUBLIC METHODS */	

	function gmap_init_debug() {
	    gmap_debugger = document.getElementById(gmap_id_debugger);
	    if(gmap_enable_debug){ gmap_debug_show("DEBUG SETUP COMPLETE",1) }
	    
	    gmap_status = document.getElementById(gmap_id_status);
		gmap_status.style.display = "block";
		
		gmap_c_geo_code = $('c_geo_code');	
		gmap_c_lat = $('c_lat');	
		gmap_c_lng = $('c_lng');
		gmap_c_code = $('c_code');
		
		gmap_p_geo_code = $('p_geo_code');	
		gmap_p_lat = $('p_lat');	
		gmap_p_lng = $('p_lng');	
		gmap_p_code = $('p_code');	
    }	
    
    function gmap_debug_centre_point(lat,lng) { 
    	gmap_c_geo_code.value = lat + "," + lng;
    	gmap_c_lat.value = lat;
    	gmap_c_lng.value = lng;
    	
    	var output = '<item id="geo_code">'+lat+','+lng+'</item>';
    	gmap_c_code.setHTML(output);
    }
    
    function gmap_debug_click_point(lat,lng) { 
    	gmap_p_geo_code.value = lat + "," + lng;
    	gmap_p_lat.value = lat;
    	gmap_p_lng.value = lng;
    	
    	var output = '<point geo_code="'+lat+','+lng+'" marker_icon="a_marker">\n';
    	output += '\t<title>Title</title>\n';
    	output += '\t<description>Description</description>\n';
    	output += '</point>';
    	
    	gmap_p_code.setHTML(output);
    }
    
    
    function gmap_debug_show(message, id) { 
    	
    	var startTag = "";
    	var endTag = "\n";

    	switch(id){
    		case 0:
    			startTag = "ERROR: ";
    			break;
    		case 1:
    			startTag = "INIT: ";
    			break
    		case 2:
    			startTag = "EVENT: ";
    			break
    		case 3:
    			startTag = "CONTROL: ";
    			break
    		default:
    			startTag = "";
    			break;
    	}
 
		message  = startTag + message + endTag;
		gmap_debugger.innerHTML += message;	
	} 
	
	function gmap_debug_clear() {
		gmap_debugger.innerHTML = "";	
	}
	
	/* INIT GMAP EVENTS */	

	function gmap_init_events() {
	    // BUG EVENT LOAD NOT FIRING?
	    GEvent.addListener(gmap, 'load', gmap_ONLOAD);	    	        
	    GEvent.addListener(gmap, 'movestart', gmap_ONMOVESTART);
	    GEvent.addListener(gmap, 'move', gmap_ONMOVE);
	    GEvent.addListener(gmap, 'moveend', gmap_ONMOVEEND);
	    GEvent.addListener(gmap, 'zoomend', gmap_ONZOOMEND);
	    GEvent.addListener(gmap, "click", gmap_ONCLICK);
	    GEvent.addListener(gmap,"infowindowclose", gmap_ONINFOCLOSE);
	    
	    if(gmap_enable_debug){ gmap_debug_show("EVENT SETUP COMPLETE",1) }
    }	
    
    /* HANDLE GMAP EVENTS */	
    
    function gmap_ONLOAD() { 
		if(gmap_enable_debug){ gmap_debug_show("Setup complete..",2) }
	}  
    
    function gmap_ONMOVESTART() {
    	if(gmap_enable_debug){ gmap_debug_show("Started Moving..",2); gmap_getMapMetrics();  }
	}   
	
	function gmap_ONMOVE() {
		//if(gmap_enable_debug){ gmap_debug_show("Moving..",2); gmap_getMapMetrics();  }
	}   
    
    function gmap_ONMOVEEND() {
    	if(gmap_enable_debug){ gmap_debug_show("Finished Moving..",2); gmap_getMapMetrics();  }    	
	}  
	
	function gmap_ONZOOMEND(oldLevel, newLevel) {
    	if(gmap_enable_debug){ gmap_debug_show("Finished Zooming..",2) }
    	if(gmap_enable_customControls){
			gmap_zoomSlider.set(newLevel);	
    	}
	}
	
	function gmap_ONCLICK(marker,point) {
		if(point){
			if(gmap_enable_debug){ gmap_debug_show("Click..",2); gmap_getClickMetrics(point); }
		}
	}
	
	function gmap_ONINFOCLOSE() {
		if(gmap_enable_marker_links){
			document.getElementById(lastlinkid).style.background=gmap_marker_background_colour;
		}
	}
	
	/* ------------------------------------------ MARKERS ---------------------------------*/
	
	var side_bar_html = "";
	var gmarkers = [];
	var marker_count = 0;
	var lastlinkid;
	
	function gmap_init_point_markers() {
		
		for(var i=0; i<gmap_count_points;i++){
			var point = new GLatLng(gmap_points[i]["lat"],gmap_points[i]["lng"]);		
			
			if(gmap_points[i]["marker_icon"]){
				var marker = gmap_createIconMarker(point,gmap_points[i]["title"],gmap_points[i]["marker_icon"],'<div class="marker_window">' + gmap_points[i]["description"] + '</div>')
			}else{
				var marker = gmap_createMarker(point,gmap_points[i]["title"],'<div class="marker_window">' + gmap_points[i]["description"] + '</div>')			
			}		
			
     		gmap.addOverlay(marker);
		}
		
		if(gmap_enable_marker_links){
			side_bar_html += '<br class="clear"/>';
      		document.getElementById("marker_links").innerHTML = side_bar_html;
      	}
	}
	      
    function gmap_createMarker(point,title,html) {
    	
    	if(gmap_enable_marker_links){
    		var linkid = "link"+marker_count;
    	}
    
		var marker = new GMarker(point,{title:title});
		GEvent.addListener(marker, "click", function() {
		  marker.openInfoWindowHtml(html);
		  
		  if(gmap_enable_marker_links){
		  	document.getElementById(linkid).style.background=gmap_marker_active_colour;
		  	lastlinkid=linkid;
		  }
          
		});
		
		if(gmap_enable_marker_links){
			gmarkers[marker_count] = marker;
			side_bar_html += '<div id="'+linkid+'"><a href="javascript:gmap_triggerMarker(' + marker_count + ')">' + title + '</a><br></div>';		
			marker_count++;
		}
				
		return marker;		
    }
         
    function gmap_createIconMarker(point,title,iconSrc,html) {
    
    	if(gmap_enable_marker_links){
    		var linkid = "link"+marker_count;
    	}
    	
    	if(gmap_enable_debug){ gmap_debug_show("Icon Requested - "+iconSrc,2); }
    
		var icon = new GIcon(G_DEFAULT_ICON, iconSrc);
		var marker = new GMarker(point,{title:title,icon:icon});
		GEvent.addListener(marker, "click", function() {
		  marker.openInfoWindowHtml(html);
		  
		  if(gmap_enable_marker_links){
		  	document.getElementById(linkid).style.background=gmap_marker_active_colour;
		  	lastlinkid=linkid;
		  }
          
		});
		
		if(gmap_enable_marker_links){
			gmarkers[marker_count] = marker;
			side_bar_html += '<div id="'+linkid+'"><a href="javascript:gmap_triggerMarker(' + marker_count + ')">' + title + '</a><br></div>';		
			marker_count++;
		}
		
		return marker;
    }
    
	// This function picks up the click and opens the corresponding info window
	function gmap_triggerMarker(i) {
		GEvent.trigger(gmarkers[i], "click");
	}
    
	
	/* ------------------------------------------ CUSTOM CONTROLS ---------------------------------*/
	
	/* PUBLIC VARS */

	var gmap_id_controls = "controls";
	var gmap_id_typeSelector = "ctr_mapTypeSelector";		
	var gmap_id_zoomSliderTrack = "ctr_slider_track";
	var gmap_id_zoomSliderHandle = "ctr_slider_handle";	
	var gmap_id_zoomOut = "ctr_zoom_out";	
	var gmap_id_zoomIn = "ctr_zoom_in";
	
	/* PRIVATE VARS */
	
	var gmap_controls = null;
	var gmap_typeSelector = null;
	var gmap_zoomSlider = null;
	var gmap_zoomOut = null;
	var gmap_zoomIn = null;

	
	/* PUBLIC METHODS */
	
    function gmap_getBounds(){
		var bounds = gmap.getBounds();
		var southWest = bounds.getSouthWest();
		var northEast = bounds.getNorthEast();
		var lngDelta = northEast.lng() - southWest.lng();
		var latDelta = northEast.lat() - southWest.lat();
		var rectBounds = new GLatLngBounds(
		    new GLatLng(southWest.lat() + latDelta, southWest.lng() + lngDelta),
		    new GLatLng(northEast.lat() - latDelta, northEast.lng() - lngDelta));
		return rectBounds
	}
    
   	function gmap_setZoom(a){
   		gmap.setZoom(a);		
   		if(gmap_enable_debug){ gmap_debug_show("Zoom Set : "+gmap.getZoom(),3) }
   	}
    
    function gmap_setZoomIn(a) {
		gmap.setZoom(gmap.getZoom() + a);
		if(gmap_enable_debug){ gmap_debug_show("Zoom Set : "+gmap.getZoom(),3) }
    }
    
	function gmap_setZoomOut(a) {
		gmap.setZoom(gmap.getZoom() - a);
		if(gmap_enable_debug){ gmap_debug_show("Zoom Set : "+gmap.getZoom(),3) }
    }   
    
    function gmap_setDefaultPosition() {
		gmap.returnToSavedPosition();
		if(gmap_enable_debug){ gmap_debug_show("Map reset to default position",3) }
    }    

    function gmap_setMapType(a) {
    	var mapType = null;
    	a = parseFloat(a);
		switch(a){
			case 1:
				mapType = G_NORMAL_MAP;
				break;
			case 2:
				mapType = G_SATELLITE_TYPE;
				break;
			case 3:
				mapType = G_HYBRID_TYPE;
				break;
			default:
				mapType = G_NORMAL_MAP;
				break;
		}
		if(gmap_enable_debug){ gmap_debug_show("Map Type Set : "+mapType.getName(),3) }
		gmap.setMapType(mapType);
    }
    
    function gmap_move(a) {
	   	var dir = null;
		switch(a){
			case 1:
				gmap.panDirection(+1,0);
				break;
			case 2:
				gmap.panDirection(+1, +1);
				break;		
			case 3:
				gmap.panDirection(0, +1);
				break;	
			case 4:
				gmap.panDirection(-1,+1);
				break;
			case 5:
				gmap.panDirection(-1,0);
				break;	
			case 6:
				gmap.panDirection(-1,-1);
				break;					
			case 7:
				gmap.panDirection(0,-1);
				break;
			case 8:
				gmap.panDirection(+1,-1);
				break;	
		}
		if(gmap_enable_debug){ gmap_debug_show("Moved The Map..",5) }
    }
	
	function gmap_getMapMetrics(){
    	var cPoint = gmap.getCenter();    	
    	if(gmap_enable_debug){ gmap_debug_centre_point(cPoint.lat(),cPoint.lng()); }    		
    	
    	/*
    	var bounds = gmap_getBounds();
    	var boundsDisplay = "SW : " + bounds.getSouthWest() + " NE : " + bounds.getNorthEast();
    	if(gmap_enable_debug){ gmap_debug_show(boundsDisplay,6) }
    	*/    			
    } 
    
    function gmap_getClickMetrics(point){
    	if(gmap_enable_debug){ gmap_debug_click_point(point.lat(),point.lng()); }
    }
	

    /* HANDLE CONTROL EVENTS */ 
    
    function gmap_ONTYPESELECTCHANGE(theElement){
    	// reset focus to the body to prevent scrolly inside select list
    	// after selection
    	document.body.focus( );
    	
    	typeId = gmap_typeSelector.value;
    	gmap_setMapType(typeId);
    }
    
   function gmap_ONZOOMIN(){    	
    	gmap_setZoomIn(1);
    }
    
    function gmap_ONZOOMOUT(){    	
    	gmap_setZoomOut(1);
    }
    
    /* PUBLIC METHODS */ 

	function gmap_init_customControls() {
		
		gmap_controls = document.getElementById(gmap_id_controls);
		gmap_controls.style.display = "block";
		
    	gmap_typeSelector = document.getElementById(gmap_id_typeSelector);
    	gmap_typeSelector.onchange = gmap_ONTYPESELECTCHANGE;
    	
		gmap_zoomSlider = new Slider($(gmap_id_zoomSliderTrack), $(gmap_id_zoomSliderHandle), {
			onChange: function(pos){
				gmap_setZoom(pos);
			},
			steps: gmap_maxZoom
		}).set(gmap_initZoom);

        
        gmap_zoomIn = document.getElementById(gmap_id_zoomIn);
        gmap_zoomIn.onclick = gmap_ONZOOMIN;
        
        gmap_zoomOut = document.getElementById(gmap_id_zoomOut);
        gmap_zoomOut.onclick = gmap_ONZOOMOUT;
    	
    	var ctr = document.getElementById("tl");
    	ctr.onclick = function(){ gmap_move(2) } ;
    	
    	var ctr = document.getElementById("t");
    	ctr.onclick = function(){ gmap_move(3) } ;
    	
    	var ctr = document.getElementById("tr");
    	ctr.onclick = function(){ gmap_move(4) } ;
    	
    	var ctr = document.getElementById("ml");
    	ctr.onclick = function(){ gmap_move(1) } ;
    	
    	var ctr = document.getElementById("m");
    	ctr.onclick = function(){ gmap_setDefaultPosition() } ;
    	
    	var ctr = document.getElementById("mr");
    	ctr.onclick = function(){ gmap_move(5) } ;
    	
    	var ctr = document.getElementById("bl");
    	ctr.onclick = function(){ gmap_move(8) } ;
    	
    	var ctr = document.getElementById("b");
    	ctr.onclick = function(){ gmap_move(7) } ;
    	
    	var ctr = document.getElementById("br");
    	ctr.onclick = function(){ gmap_move(6) } ;
	    
	    if(gmap_enable_debug){ gmap_debug_show("CUSTOM CONTROL SETUP COMPLETE",1) }	    
		    
    }
    
    /* ------------------------------------------ INIT ---------------------------------*/
    
	/* PUBLIC VARS */
	
	
	/* PRIVATE VARS */
	
	var gmap = null;
	

	/* INIT MAP */	

	function gmap_init() {
		if (GBrowserIsCompatible()) {						
			
	        gmap = new GMap2(document.getElementById(gmap_id_map));
	        
	        gmap.enableDoubleClickZoom();
	   		gmap.enableContinuousZoom();	     
	        
	        gmap.setCenter(new GLatLng(gmap_lat, gmap_lng), gmap_initZoom);
		    
		    gmap.addControl(new GScaleControl());
		    gmap.savePosition(); 

		    if(gmap_enable_debug){
		    	gmap_init_debug();
		    }
		    
		    if(gmap_enable_events){
		    	gmap_init_events();
		    }
		    
		    if(gmap_enable_customControls){
		    	gmap_init_customControls();
		    }
		    
		    if(gmap_enable_points){
		    	gmap_init_point_markers();
		    }

	        if(gmap_enable_debug){ gmap_debug_show("MAP SETUP COMPLETE",1) }
	        
		}else{
			document.getElementById(mapId).innerHTML = 'Sorry, your browser is not supported for viewing results on a map.<br /><br />Please use either <a href="http://www.mozilla.com/firefox/" target="_blank">Firefox</a> or <a href="http://www.microsoft.com/windows/ie/ie6/" target="_blank">Internet Explorer</a>.';
		}
    }
    
	/* PAGE LOAD / UNLOAD EVENT HANDLERS  */

	function onPageLoad() {
		gmap_init();
	}
	
	function onPageUnLoad() {
		GUnload();
	}
	
	function addLoadEvent(fn) {	
		if (!window.loadEvents) {
			window.loadEvents = [];
			var loadFn = function() { for (var i=0,f;(f=window.loadEvents[i]);i++) f(); }
			if (window.addEventListener) 
				window.addEventListener('load', loadFn, false)
			else if (window.attachEvent) 
				window.attachEvent('onload', loadFn);
		}
		
		window.loadEvents.push(fn);
	}
	
	function addUnLoadEvent(fn) {	
		if (!window.unloadEvents) {
			window.unloadEvents = [];
			var unloadFn = function() { for (var i=0,f;(f=window.unloadEvents[i]);i++) f(); }
			if (window.addEventListener) 
				window.addEventListener('unload', unloadFn, false)
			else if (window.attachEvent) 
				window.attachEvent('onunload', unloadFn);
		}
		
		window.unloadEvents.push(fn);
	}
	
	addLoadEvent(onPageLoad);	
	addUnLoadEvent(onPageUnLoad);	
	