////////////////////////////////////////////////////////// MAP
function Map () { 

	// INITIALIZE 
	this.Initialize = function() {
	  Map = new GMap2(document.getElementById(this.MapCanvas));	
	  Map.setCenter(new GLatLng(this.Latitude, this.Longitdue), this.Zoom);
	  Map.setUIToDefault();  
	  
	  var Icon = new GIcon(G_DEFAULT_ICON);
	  Icon.image = this.Icon;
	  Icon.shadow = '';
	  Icon.iconSize = GSize(this.IconWidth,this.IconHeight); 
	  MarkerOptions = {icon:Icon};
	 
	  var Point = new GLatLng(this.Latitude,this.Longitdue);
	  var Marker = new GMarker(Point,MarkerOptions);
	  
	  Marker.Title = this.Title;
	  Marker.IconWidth = this.IconWidth;
	  Marker.IconHeight = this.IconHeight;
	  Marker.InfoWindow = '<span class="MapWindow">'+this.Info+'</span>'; 
	  
	  GEvent.addListener(Marker, 'click', function(){
	  	this.openInfoWindowHtml(this.InfoWindow,{maxWidth:250});	 
	  })
		
	  GEvent.addListener(Marker, 'mouseover', function(){
	  	ObjectThis.Label(this);	 
	  })
				
	  GEvent.addListener(Marker, 'mouseout', function(){
	 	 ObjectThis.Label(this);
	  })
	  
	  Map.addOverlay(Marker);
	  
	  if (this.OpenWindow) {
	  	Marker.openInfoWindowHtml(Marker.InfoWindow,{maxWidth:250});
	  }
	  
	}	
	
	// POPULATE LOCATIONS
	this.PopulateLocations = function(ID,LocationsXML,ParseXML){
		
			// PARSE XML
			if(ParseXML) {
				LocationsXML = StringToXML(LocationsXML);
			}
			
			// CREATE MARKER
			Markers[ID] = new Array();
			var Icon = new GIcon(G_DEFAULT_ICON);
			Icon.image = LocationsXML.getElementsByTagName("icon")[0].childNodes[0].nodeValue;
			Icon.shadow = '';
			Icon.iconSize = GSize(LocationsXML.getElementsByTagName("icon")[0].attributes.getNamedItem("width").value, LocationsXML.getElementsByTagName("icon")[0].attributes.getNamedItem("height").value); 
			MarkerOptions = {icon:Icon};	
				  
			// POPULATE	  
			for (var i = 0; i < LocationsXML.getElementsByTagName("location").length; i++) {
				
				var Point = new GLatLng(LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("latitude")[0].childNodes[0].nodeValue,LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("longitdue")[0].childNodes[0].nodeValue);
				var Marker = new GMarker(Point,MarkerOptions);
				
				// VERIABLES
				Marker.Title = LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
				Marker.IconWidth = LocationsXML.getElementsByTagName("icon")[0].attributes.getNamedItem("width").value;
				Marker.IconHeight = LocationsXML.getElementsByTagName("icon")[0].attributes.getNamedItem("height").value;
				Marker.InfoWindow = '<span class="MapWindow">'; 
				Marker.InfoWindow += '<h1>'+LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("title")[0].childNodes[0].nodeValue+'</h1>';
				Marker.InfoWindow += LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("address")[0].childNodes[0].nodeValue;
				Marker.InfoWindow += '<br />';
				Marker.InfoWindow += LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("cityprovince")[0].childNodes[0].nodeValue;				
				
				Marker.InfoWindow += '<br />';
				if (LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("link") && LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("link")[0].childNodes[0].nodeValue != '') {
					Marker.InfoWindow += '<a href="'+LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("link")[0].childNodes[0].nodeValue+'" target="_blank">More Info</a>&nbsp;';
				}
				Marker.InfoWindow += '<a href="http://maps.google.com/maps?saddr=&daddr='+LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("address")[0].childNodes[0].nodeValue+','+LocationsXML.getElementsByTagName("location")[i].getElementsByTagName("cityprovince")[0].childNodes[0].nodeValue+'" target="_blank">Directions</a>';
				Marker.InfoWindow += '</span>'; 
						
				// LISTENERS		
				GEvent.addListener(Marker, 'click', function(){
					this.openInfoWindowHtml(this.InfoWindow,{maxWidth:250});	 
				})
				
				GEvent.addListener(Marker, 'mouseover', function(){
					ObjectThis.Label(this);	 
				})
				
				GEvent.addListener(Marker, 'mouseout', function(){
					ObjectThis.Label(this);
				})
					
				// ADD 	
				Markers[ID][i] = Marker;
				Map.addOverlay(Marker);
			} 	
	}
	
	// TOGGLE
	this.Toggle = function(ID){
		
		// LOAD
		if (!Markers[ID]) {
			
			// LOAD XML		
			var LocationsXML = LoadXML(this.LocationPath.replace('{id}',ID));
			this.PopulateLocations(ID,LocationsXML,false);
		} 
		
		// REMOVE
		else {
			for (var i = 0; i < Markers[ID].length; i++) {
				Map.removeOverlay(Markers[ID][i]); 
			}
			delete Markers[ID];
		}
	}
	
	// LABEL
	this.Label = function(Marker){		
		if (Marker.div) {
			Map.getPane(G_MAP_FLOAT_PANE).removeChild(Marker.div);	
			delete(Marker.div);
		} else {
			var PixelLocation = Map.fromLatLngToDivPixel(Marker.getPoint());
			var div = document.createElement("div");
			div.style.position   = "absolute"
			div.innerHTML = '<div class="MapLabel">'+Marker.Title+'</div>';
			Map.getPane(G_MAP_FLOAT_PANE).appendChild(div);		
			div.style.left = (PixelLocation.x+(Marker.IconWidth/2))+'px';
			div.style.top = (PixelLocation.y-(Marker.IconHeight*2)) +'px';	
			Marker.div = div;
		}
	}

	// VERIABLES
	var ObjectThis = this;	
	var Map = new Object();
	var Markers = new Array ();
	var MapCanvas = '';
	var LocationPath = '';
	var Zoom = 13; this.Zoom = 13;	
	var OpenWindow = false; this.OpenWindow = false;
	var Latitude = 0;	
	var Longitdue = 0;
	var Title = ''; this.Title  = '';
	var Info = ''; this.Info = '';
	var Icon = ''; this.Icon = '';
	var IconWidth = 16; this.IconWidth = 16;
	var IconHeight = 16; this.IconHeight = 16;
}
