var map;
var gmap;

//### Start Map Functions ################\\
	function init_maps(mxml)
	{
		//mxml.constructor==Array
		if(mxml.indexOf("<?xml") == 0)
		{
			//## Parse as String ##\\
			createmap(mxml);
		}
		else
		{
			//## Start AJAX Request ##\\
			request = GXmlHttp.create();
	
			//## Initiate AJAX XML File ##\\
			request.open("GET", mxml, true);
			request.onreadystatechange = function()
			{
				if (request.readyState == 4)
				{
					createmap(request.responseText);
				}
			}
			//## Call AJAX Request ##\\
			request.send(null);
		}
	}
	function createmap(xml)
	{
		xmlDoc = GXml.parse(xml);
		maps = xmlDoc.documentElement.getElementsByTagName("map");
	
		for(a = 0; a < maps.length; a++)
		{
			//## Initiate Map ##\\
			map = maps.item(a);
			element = map.getAttribute("element");			
			gmap = new GMap2(document.getElementById(element));
			bounds = new GLatLngBounds();
	
			//## Find Google Control Vars ##\\
			gtype = map.getAttribute("type");
			controls = GXml.value(map.getElementsByTagName("controls").item(0)).split(",");
			overlays = GXml.value(map.getElementsByTagName("overlays").item(0)).split(",");

			//## Google Map Controls ##\\
			for(b=0; b < controls.length; b++)
			{
				switch(controls[b])
				{
					case "GLargeMapControl":
						gmap.addControl(new GLargeMapControl());
						break;
					case "GSmallMapControl":
						gmap.addControl(new GSmallMapControl());
						break;
					case "GSmallZoomControl":
						gmap.addControl(new GSmallZoomControl());
						break;
					case "GScaleControl":
						gmap.addControl(new GScaleControl());
						break;
					case "GMapTypeControl":
						gmap.addControl(new GMapTypeControl());
						break;
					case "GOverviewMapControl":
						gmap.addControl(new GOverviewMapControl());
						break;
				}
			}
			
			//## Google Map Overlays ##\\
			for(b=0; b < overlays.length; b++)
			{
				switch(overlays[b])
				{
					case "GTrafficOverlay":
						gmap.addOverlay(new GTrafficOverlay());
						break;
				}
			}

			//## Ready Map For Boundry ##\\
			gmap.setCenter(new GLatLng(37.4419, -122.1419), 13);

			//## Apply Markers From XML ##\\
			addpoints_xml();

			//## Apply Polylines From XML ##\\
			addpolylines_xml();

			//## Apply Plygons From XML ##\\
			addpolygons_xml();
			
			zoom = map.getAttribute("zoom");
			if(zoom != null) {
				if(IsNumeric(zoom)) {
					gmap.setZoom(parseInt(zoom));
				} else {
					gmap.setZoom(gmap.getBoundsZoomLevel(bounds));
				}
			} else {
				gmap.setZoom(gmap.getBoundsZoomLevel(bounds));
			}

			//## Set Map Using Marker Bounds ##\\
			gmap.setCenter(bounds.getCenter());
			
			switch(gtype)
			{
				case "G_NORMAL_MAP":
					gmap.setMapType(G_NORMAL_MAP);
					break;
				case "G_SATELLITE_MAP":
					gmap.setMapType(G_SATELLITE_MAP);
					break;
				case "G_HYBRID_MAP":
					gmap.setMapType(G_HYBRID_MAP);
					break;
				case "G_PHYSICAL_MAP":
					gmap.setMapType(G_PHYSICAL_MAP);
					break;
				default:
					gmap.setMapType(G_NORMAL_MAP);
			}
		}
	}
//########################################\\

//### Add to Map Functions ###############\\
	function addpoints_xml()
	{
		if(map.getElementsByTagName("markers"))
		{
			markers = map.getElementsByTagName("markers").item(0).getElementsByTagName("marker");

			for (b = 0; b < markers.length; b++)
			{
				//## Next Marker ##\\
				vmarker = markers.item(b);
		
				//## Find/Set Marker Point ##\\
				lat = parseFloat(vmarker.getAttribute("lat"));
				lng = parseFloat(vmarker.getAttribute("lng"));
				point = new GLatLng(lat, lng);
		
				//## Set Maps HTML Window ##\\
				html = GXml.value(vmarker.getElementsByTagName("markerinfo").item(0));
				micon = vmarker.getElementsByTagName("icon").item(0);

				if(micon != null)
				{
					vicon = micon.getElementsByTagName("image").item(0);
					label = micon.getElementsByTagName("label").item(0);
					shadow = micon.getElementsByTagName("shadow").item(0);
					
					var mylabel = {
						"url":GXml.value(label),
						"anchor":new GLatLng(label.getAttribute("labelx"),label.getAttribute("labely")),
						"size":new GSize(label.getAttribute("width"),label.getAttribute("height"))
					};
					var icon = new GIcon(G_DEFAULT_ICON, GXml.value(vicon), mylabel);
					icon.shadow = GXml.value(shadow);
					icon.iconSize = GSize(vicon.getAttribute("width"),vicon.getAttribute("height"));
				}
				else
					icon = null;

				//** Tabe Control Coming **\\
				if(vmarker.getElementsByTagName("tabs") != null)
				{
					tabs = vmarker.getElementsByTagName("tabs").item(0);
					if(tabs != null)
					{
						tabs = tabs.getElementsByTagName("tab");
						gmap.addOverlay(createMarkerTabHtml(point, tabs, icon));
					}
					else
					{
						//## Create/Add Marker ##\\
						gmap.addOverlay(createMarkerHtml(point, html, icon));
					}
				}
				else
				{
					//## Create/Add Marker ##\\
					gmap.addOverlay(createMarkerHtml(point, html, icon));
				}		

				//## Add Marker to Bounds to Center Map ##\\
				bounds.extend(point);
			}
		}
	}
	function addpolylines_xml()
	{
		if(map.getElementsByTagName("polyline"))
		{
			polylines = map.getElementsByTagName("polyline");

			for (b = 0; b < polylines.length; b++)
			{
				line = polylines.item(b);
			
				color = line.getAttribute("color");
				width = line.getAttribute("width");
			
				pts = [];
				points = line.getElementsByTagName("point");
				for(c=0; c < points.length; c++)
				{
					point = points.item(c);
				
					lat = point.getAttribute("lat");
					lng = point.getAttribute("lng");
					point = new GLatLng(lat, lng);
				
					pts.push(point);
				
					bounds.extend(point);
				}
			
				gmap.addOverlay(new GPolyline(pts, color, width));
			}
		}
	}
	function addpolygons_xml()
	{
		if(map.getElementsByTagName("polygon"))
		{
			polygons = map.getElementsByTagName("polygon");

			for (b = 0; b < polygons.length; b++)
			{
				line = polygons.item(b);
			
				border = line.getAttribute("border");
				width = line.getAttribute("width");
				alphabor = line.getAttribute("alphabor");
				fill = line.getAttribute("fill");
				alphafill = line.getAttribute("alphafill");
			
				pts = [];
				points = line.getElementsByTagName("point");
				for(c=0; c < points.length; c++)
				{
					point = points.item(c);
				
					lat = point.getAttribute("lat");
					lng = point.getAttribute("lng");
					point = new GLatLng(lat, lng);
				
					pts.push(point);
				
					bounds.extend(point);
				}
			
				gmap.addOverlay(new GPolygon(pts, border, width, alphabor, fill, alphafill));
			}
		}
	}
//########################################\\

//### Marker Functions ###################\\
	function createMarkerHtml(point, html, icon)
	{
		if(icon != null)
			var marker = new GMarker(point, icon);
		else
			var marker = new GMarker(point);
	
		GEvent.addListener(marker, "click", function()
		{
			marker.openInfoWindowHtml(html);
		});
	
		return marker;
	}
	function createMarkerTabHtml(point, tabs, icon)
	{
		if(icon != null)
			var marker = new GMarker(point, icon);
		else
			var marker = new GMarker(point);
	
		mtabs = [];
		for(c=0; c < tabs.length; c++)
		{
			tab = tabs.item(c);
			mtabs.push(new GInfoWindowTab(tab.getAttribute("title"), GXml.value(tab)));
		}
	
		GEvent.addListener(marker, "click", function()
		{
			marker.openInfoWindowTabsHtml(mtabs);
		});
	
		return marker;
	}
//########################################\\

function IsNumeric(sText) {
	var ValidChars = "0123456789.";
	var IsNumber=true;
	var Char;
	
	for (i = 0; i < sText.length && IsNumber == true; i++) { 
		Char = sText.charAt(i);
		
		if (ValidChars.indexOf(Char) == -1) {
			IsNumber = false;
		}
	}
	
	return IsNumber;
}
