/**
 * The map object, null until script loads in.
 * @type {GMap2}
 */
var map = null;  

/** variable holding the map key */
var map_key=null;

/**
 * The bounds of the markers once loaded in.
 * @type {GLatLngBounds}
 */
var bounds = null;

/**
 * The dom element that the map is loaded into
 * @type {Element}
 */
var mapDiv = null;

/**
 * The dom element that everything is a child of.
 * @type {Element}
 */
var containerDiv = null;

/**
 * Indicates whether we've created a script tag with Maps API yet
 * @type {Boolean}
 */
var isLoaded = false;


function gm_load( size,overview,map_type){
	if (GBrowserIsCompatible()){ 
		if(size=="large"){
	    var map = new GMap2(document.getElementById("mapViewPort"));
	
	    // add different map types
	    map.addMapType(G_PHYSICAL_MAP);
	    map.addMapType(G_SATELLITE_3D_MAP);
	    
	    //make terrain map default
	    map.setMapType(G_PHYSICAL_MAP);
	    if (map_type!=null)
	    	map.setMapType(map_type);

	    // add map controls
	    map.addControl(new GSmallMapControl());
	    map.addControl(new GScaleControl());
	    if(overview==true){map.addControl(new GOverviewMapControl());}
	    map.addControl(new GMenuMapTypeControl());
	    //map.addControl(new GHierarchicalMapTypeControl());
	    map.enableScrollWheelZoom();
	    map.enableDoubleClickZoom();
	  	    
	    // add zoom control....
	    var boxStyleOpts = { opacity: .2, border: "2px solid yellow" };
	    var otherOpts = {
	      buttonHTML: "<img src='images/zoom-control-inactive.png' />",
	      buttonZoomingHTML: "<img src='images/zoom-control-active.png' />",
	      buttonStartingStyle: {width: '17px', height: '17px'},
	      overlayRemoveTime: 0 };
	    map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, {}),
	    new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(17,110)));
	    
			map.setCenter(new GLatLng(0,0),0);
							
		}
		else if(size=="small"){
	    var map = new GMap2(document.getElementById("mapViewPort"));
	
	    // add different map types
	    map.addMapType(G_PHYSICAL_MAP);
	    //map.addMapType(G_SATELLITE_3D_MAP);
	    
	    //make terrain map default
	    map.setMapType(G_PHYSICAL_MAP);
	    if (map_type!=null)
	    	map.setMapType(map_type);
	    
	    // add map controls
	    //map.addControl(new GSmallMapControl());
	    //map.addControl(new GSmallZoomControl3D());
	    map.addControl(new GSmallZoomControl());
	    map.addControl(new GScaleControl());
	    map.addControl(new GMenuMapTypeControl());
	    //map.addControl(new GHierarchicalMapTypeControl());
	    map.enableScrollWheelZoom();
	    map.enableDoubleClickZoom();
    	    
	    // add zoom control....
	    var boxStyleOpts = { opacity: .2, border: "2px solid yellow" };
	    var otherOpts = {
	      buttonHTML: "<img src='images/zoom-control-inactive.png' />",
	      buttonZoomingHTML: "<img src='images/zoom-control-active.png' />",
	      buttonStartingStyle: {width: '17px', height: '17px'},
	      overlayRemoveTime: 0 };
	    map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, {}),
	    new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(6,47)));
	    
			map.setCenter(new GLatLng(0,0),0);
			
		}
		else if(size=="tiny"){
	    var map = new GMap2(document.getElementById("mapViewPort"));
	
	    // add different map types
	    map.addMapType(G_PHYSICAL_MAP);
	    
	    //make terrain map default
	    map.setMapType(G_PHYSICAL_MAP);
	    if (map_type!=null)
	    	map.setMapType(map_type);
	    
	    // add map controls
	    map.addControl(new GSmallZoomControl());
	    map.enableScrollWheelZoom();
	    map.enableDoubleClickZoom();
		    
			map.setCenter(new GLatLng(0,0),0);
			
		}
		else	if(size=="select"){
	    var map = new GMap2(document.getElementById("mapViewPort"));
	
	    // add different map types
	    map.addMapType(G_PHYSICAL_MAP);
	    
	    //make terrain map default
	    map.setMapType(G_PHYSICAL_MAP);
	    if (map_type!=null)
	    	map.setMapType(map_type);

	    // add map controls
	    map.addControl(new GSmallMapControl());
	    map.addControl(new GScaleControl());
	    if(overview==true){map.addControl(new GOverviewMapControl());}
	    map.addControl(new GMenuMapTypeControl());
	    //map.addControl(new GHierarchicalMapTypeControl());
	    map.enableScrollWheelZoom();
	    map.enableDoubleClickZoom();
	    
	    // add zoom control....
	    var boxStyleOpts = { opacity: .2, border: "2px solid yellow" };
	    var otherOpts = {
	      buttonHTML: "<img src='images/zoom-control-inactive.png' />",
	      buttonZoomingHTML: "<img src='images/zoom-control-active.png' />",
	      buttonStartingStyle: {width: '17px', height: '17px'},
	      overlayRemoveTime: 0 };
	    map.addControl(new DragZoomControl(boxStyleOpts, otherOpts, {}),
	    new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(17,110)));

	    // add select control....
	    var boxStyleOpts = { opacity: .2, border: "2px solid red" };
	    var otherOpts = {
	      buttonHTML: "<img src='images/select-control-inactive.png' />",
	      buttonZoomingHTML: "<img src='images/select-control-active.png' />",
	      buttonStartingStyle: {width: '17px', height: '17px'}};
	    dragSelect=new DragSelectControl(boxStyleOpts, otherOpts, {})
	    map.addControl(dragSelect,
	    new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(17,130)));
			map.setCenter(new GLatLng(0,0),0);	
			map.dragSelect=dragSelect;			
		}
		return map;
	}
}


/**
 * Sets up the gadget by setting CSS and click events.
 */
function gm_loadMapGadget(map_string) {
  containerDiv = document.getElementById('divMap');
  mapDiv = document.getElementById('mapViewPort');

  mapDiv.onclick = function (e) {
    clickedX = (window.event && window.event.offsetX) || e.clientX;
    clickedY = (window.event && window.event.offsetY) || e.clientY;
    gm_loadGM(); 
  };

  mapDiv.style.cursor = 'pointer';
  mapDiv.style.overflow = 'hidden';

  mapDiv.style.background = 'url(\'' + map_string + '\')';

}


/**
 * Loads in the Maps API script. This is called after some sort of user interaction.
 * The script loads asynchronously and calls gm_onload() once it's in.
 * gm_onload() contains the code that loads and defines the map and needs to be in the template
 * that shows the static map
 */
function gm_loadGM() {
  if (!isLoaded) {
    isLoaded = true;
    mapDiv.style.background = '#fff';
    mapDiv.style.cursor = '';
		loadScript("http://maps.google.com/maps?file=api&v=2.x&async=2&callback=gm_onload&key=" + map_key);

  }
}


/**
 * Loads a new script.
 */
function loadScript(sourceString) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = sourceString;
    document.body.appendChild(script);
}
