var SetGUnload   = false;
var GMapObj      = null, gMapDir = null;
var WEBAPP_PATH  = "/DesktopModules/GoogleMaps2";
var AJAX_REQUEST = WEBAPP_PATH + "/GoogleMaps2AJAX.aspx";
var GallerySlideViewer = {Viewer:null, LastIndex: null};
var lastDirections = null;

function Start_GMap(startLat, startLng, startZoom)
{
	// Update the table to 100% height
	/*
	var d = document.getElementById("mID" + ModuleID);
	if (d)
	{
		d.style.height = "100%";
		if (d.firstChild.nodeName == "TABLE")
			d.firstChild.style.height = "100%";
	}
	*/
	
	if (GBrowserIsCompatible()) 
	{
		if (!SetGUnload)
		{
			var b = document.getElementsByTagName("body")[0];					
			if (b)
				AddEvent2(b,"unload", GUnload, false);
			SetGUnload = true;	
		}
		
		GMapObj = new GMap2(document.getElementById("GMap"));
		GMapObj.addControl(new GLargeMapControl());
		//GMapObj.addControl(new GOverviewMapControl(new GSize(100,100)));
		GMapObj.addControl(new GMapTypeControl());
		
		if (startLat != "" && startLng != "")
			GMapObj.setCenter(new GLatLng(parseFloat(startLat), parseFloat(startLng)), (startZoom != "" ? parseInt(startZoom) : 8));
		else
			GMapObj.setCenter(new GLatLng(43.131847, -80.760955), 8);
		
		// Enable wheel scrolling + disable whole page mouse wheel scrolling except within the map
		GMapObj.enableScrollWheelZoom();
		GMapObj.enableContinuousZoom();

		if (GMapObj.addEventListener)
			GMapObj.addEventListener("DOMMouseScroll", function(e){e.preventDefault();}, false);
		else if (GMapObj.attachEvent)
			GMapObj.attachEvent("onmousewheel", function(){event.returnValue = false;});	
			
		// Add the directions functionality to the map
		gMapDir = new GDirections(GMapObj, document.getElementById("DirectionsPane"));	
		GEvent.addListener(gMapDir, "error", 
		function(e)
		{
			if (gMapDir.getStatus().code == 602 && lastDirections)
			{
				DirectionsClose(document.getElementById('GMapDirections'));
				open("http://maps.google.com?q="+lastDirections);
			}	
			else
				document.getElementById("DirectionsPane").innerHTML = "<div class='GMapDirectionError'>The directions could not be found.  Please try a different address</div>";
		});
		
		GEvent.addListener(gMapDir, "load", 
		function(e)
		{
				var obj = document.getElementById("DirectionsPane");
				obj.innerHTML = "";
				var si = setInterval(function(){if (obj.style.paddingTop) obj.style.padding="0px 3px"; clearInterval(si)},200);
				
		});	
		
		document.getElementById("GMapSidePanel").style.height = document.getElementById("GMapSidePanel").offsetHeight + "px";
		document.getElementById("GMapDirections").style.height = document.getElementById("GMapSidePanel").offsetHeight + "px";
		
	}			
}

function ShowMarkers(e,skipCenterZoom)
{
	GMapObj.clearOverlays();

	if (ResponseData.PlaceMarkers.length > 0)
	{
		var myBounds = new GLatLngBounds();
		var pmCount = PlaceMarkerIcons.length;
		//var gMarkerManager = new GMarkerManager(GMapObj);
		var markerArray = [];
		
		for (var i = 0, cnt = ResponseData.PlaceMarkers.length; i < cnt; i++)
		{
			var cnt2= 0, iconFile = "";
			var pmObj = ResponseData.PlaceMarkers[i];
					
			// Get the marker icon
			if (pmCount > 0 && i < pmCount)
				iconFile = PlaceMarkerIcons[i];
			else
			{
				cnt2 = i % 47;
				iconFile = "/DesktopModules/GoogleMaps2/img/iconb" + (cnt2 < 26 ? String.fromCharCode(cnt2+97) : (cnt2 - 25)) + ".png";
			}				

			// Create the marker			
			var icon = new GIcon(G_DEFAULT_ICON, iconFile);
			var markerLatLng = new GLatLng(parseFloat(pmObj.Lat),parseFloat(pmObj.Lng));
			var marker = new GMarker(markerLatLng, {icon:icon, title:pmObj.Name});

			// Store the marker
			pmObj.Marker = marker;
			
			// Store the latlng of the marker to compose the bounds
			myBounds.extend(markerLatLng);
			
			// Create the tabs
			marker.index = i;
			marker.bindInfoWindowTabs(BuildTabs(pmObj), {selectedTab:0, maxWidth:350});
			
			GEvent.addListener(marker, "infowindowopen", 
			function(marker, point)
			{ 
				if (GallerySlideViewer.LastIndex != marker.index && ResponseData.PlaceMarkers[marker.index].Gallery.length > 0)
				{
					GallerySlideViewer.Viewer = null;
					GallerySlideViewer.Viewer = new PhotoViewer();
					
					with (GallerySlideViewer)
					{
						var go = ResponseData.PlaceMarkers[marker.index].Gallery;
						for (var i = 0, cnt = go.length; i < cnt; i++)
							Viewer.add(go[i].FullImage);
					}
					
					GallerySlideViewer.LastIndex = marker.index;
				}
			}); 			

			// Store the marker for later adding to the manager
			GMapObj.addOverlay(marker);
			//markerArray.push(marker);	
		}

		if (!skipCenterZoom)
			centerAndZoomOnBounds(GMapObj, myBounds);

		// Add the marker to the manager
	/*	
		if (markerArray.length > 0)		
		{
			gMarkerManager.addMarkers(markerArray, 1);
			if (!skipCenterZoom)
				centerAndZoomOnBounds(GMapObj, myBounds);
			gMarkerManager.refresh();
		}
		*/
			
	}
}

function BuildTabs(orgItem)
{
	var tabs = [], data = "";

	// Build the tabs for the display

	// Details
	var GetDirectionsStr = "<div class='DirectionsText' id='d_"+orgItem.Marker.index+"'>Get Directions: <a href='javascript:void(0)' onclick='GetDirections(1,1,"+orgItem.Marker.index+")'>To Here</a> &bull; <a href='javascript:void(0)' onclick='GetDirections(1,2,"+orgItem.Marker.index+")'>From Here</a></div>";	
	var tab = new GInfoWindowTab("Details", orgItem.Description + GetDirectionsStr);
	tabs.push(tab);

	// Photos
	if (orgItem.Gallery.length > 0)
	{
		var images = [];
	
		for (var i = 0, cnt = orgItem.Gallery.length; i < cnt; i++)
		{
			var gallery = orgItem.Gallery[i]
			images.push("<a href='#' index="+i+"><img src='"+gallery.Thumbnail+"'></a> ");
		}
			
		tabs.push(new GInfoWindowTab("Photos", "<table cellspacing=\"0\" cellpadding=\"0\" class=\"GMapTable_Photos\"><tbody><tr><td class=\"Name\">"+orgItem.Name+"</td></tr><tr><td class=\"MediaInfo\">"+images.length+" Photo"+(images.length > 2 ? "s" : "")+"</td></tr><tr><td><div class='Gallery' onclick='GI_OnClick(event)'>"+images.join("")+"</div></td></tr></tbody></table>"));
	}
		
	return tabs;
}

function GetDirections(first, type, orgsListIndex)
{
	// To Here or From Here hyperlink was clicked.  Show the input text box.

	// The input box is shown thru this approach so that the tab can be resized.
	GMapObj.updateCurrentTab(
	function(tab)
	{
		obj = tab.contentElem.lastChild;

		if (type == 1) // To Here
			obj.innerHTML = "Get Directions: <b>To Here</b> &bull; <a href='javascript:void(0)' onclick='GetDirections(0,2,"+orgsListIndex+")'>From Here</a>" +
							'<br><form action="javascript:void(0)"><span class="DirInput">Start Address: <input type="text" SIZE=30 name="saddr" id="saddr_'+orgsListIndex+'" value="" /> <INPUT value="Get Directions" TYPE="SUBMIT" style="width:80px" onclick="return DoGetDirections(this.form)"></span><input type="hidden" name="daddr" id="daddr_'+orgsListIndex+'" value="'+ResponseData.PlaceMarkers[orgsListIndex].Name+"@"+ ResponseData.PlaceMarkers[orgsListIndex].Lat + ',' + ResponseData.PlaceMarkers[orgsListIndex].Lng + '"/>'
		else // From here
			obj.innerHTML = "Get Directions: <a href='javascript:void(0)' onclick='GetDirections(0,1,"+orgsListIndex+")'>To Here</a> &bull; <b>From Here</b>" +
							'<br><form action="javascript:void(0)"><span class="DirInput">End Address: &nbsp;&nbsp;<input type="text" SIZE=30 name="daddr" id="daddr_'+orgsListIndex+'" value="" /> <INPUT value="Get Directions" TYPE="SUBMIT" onclick="return DoGetDirections(this.form)"></span><input type="hidden" name="saddr" id="saddr_'+orgsListIndex+'" value="'+ResponseData.PlaceMarkers[orgsListIndex].Name+"@"+ ResponseData.PlaceMarkers[orgsListIndex].Lat + ',' + ResponseData.PlaceMarkers[orgsListIndex].Lng + '"/>';

		// This is done so that the changes visually shown remain as such when the infowindow is hidden/closed.
		var data = obj.innerHTML;
		setTimeout(
		function()
		{
			try
			{
			document.getElementById("d_"+orgsListIndex).innerHTML = data;
			if (type ==1)
				document.getElementById("saddr_"+orgsListIndex).focus();
			else
				document.getElementById("daddr_"+orgsListIndex).focus();
				}
				catch(e){}
		},100);
	});
}

function DirectionsClose(obj)
{
	obj.style.display = "none";
	GMapObj.checkResize();
	gMapDir.clear();
}

function DoGetDirections(thisForm)
{
	if (thisForm["saddr"].value == "" || thisForm["daddr"].value == "")
		return false;

	var dirPane = document.getElementById("DirectionsPane");
	
	dirPane.innerHTML = "<img src='/DesktopModules/GoogleMaps2/img/prog.gif'>";
	dirPane.style.textAlign = "center";
	
	dirPane.parentNode.style.display = "";
	
	//dirPane.style.width = "300px";

	lastDirections = "from: "+thisForm["saddr"].value+" to: "+thisForm["daddr"].value;
	gMapDir.load(lastDirections);
	ResponseData.PlaceMarkers[thisForm["saddr"].id.split("_")[1]].Marker.closeInfoWindow();
	
	GMapObj.checkResize();
	
	return false;
}

function GI_OnClick(e)
{
	var obj = e.srcElement || e.target;	
	
	if (obj.parentNode.nodeName == "A")
	{	
		GallerySlideViewer.Viewer.show(parseInt(obj.parentNode.getAttribute("index")));
		//ShowSlidePhotoDescription(ResponseData.PlaceMarkers[GallerySlideViewer.LastIndex].Description);
	}
	
	//StopEvent(e);
}

function ShowSlidePhotoDescription(val)
{
	var pv = document.getElementById("PhotoViewerPhoto");
	
	if (pv != null)
	{
		var left   = parseInt(pv.style.left);
		var width  = parseInt(pv.offsetWidth);c
		var top    = parseInt(pv.style.top);
		var height = parseInt(pv.offsetHeight);
		
		var psd =  document.getElementById("PhotoDescription");
		
		if (psd == null)
		{
			psd = new Element('div');
			psd.setProperty('id', 'PhotoDescription').injectAfter(pv);
		}	

		psd.style.left = left;
		psd.style.top = (top + height + 5) + "px";
		psd.style.width = width + "px";
		psd.setHTML(val.replace(/<.*?>/g,function($1)
		{
			var i = $1.toLowerCase();
			if (i == "<br>" || i == "</tr>")
				return "<br>";
			else
				return "";			
		}));
		
		var si = setInterval(function(){
		if (document.getElementById("PhotoViewerPhoto")==null) 
		{psd.style.display="none"; clearInterval(si)}},200);
	}	
	else
		setTimeout(function(){ShowSlidePhotoDescription(val)},200);
}


// Dispatch Click Event.  For IE it simply requires a click on the object but for FF the standard dispatch event is required
function $DCE(obj)
{
	IsDCE = true;
	
	if (obj.click)
		obj.click();
	else
	{
		var evObj = document.createEvent('MouseEvents');
		evObj.initEvent( 'click', true, true );
		obj.dispatchEvent(evObj);
	}
}

function centerAndZoomOnBounds(map, bounds)
{
		map.setZoom(map.getBoundsZoomLevel(bounds));

		var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
		var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
		map.setCenter(new GLatLng(clat,clng));
}

function AddEvent2(elm, evType, fn, useCapture) 
{
	if (elm.addEventListener) 
	{
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) 
	{
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else 
	{
		elm['on' + evType] = fn;
	}
}

// Placemarker Name clicked
function PI_OnClick(e)
{
	var obj = e.srcElement || e.target;
	
	if (obj.nodeName == "A")
	{	
		GEvent.trigger(ResponseData.PlaceMarkers[obj.getAttribute("index")].Marker,"click") 
	}
	StopEvent(e);
}

function StopEvent(e)
{
	e.cancelBubble = true;
	if (e.preventDefault) e.preventDefault();
}

function Back_OnClick(e)
{
	HandleAjaxProgress("BACK");
}

function HasClass(obj, className)
{
	var re = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)");
	return re.test(obj.className);
}

function RemoveClass(obj, className)
{
	var re = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)");
	obj.className = obj.className.replace(re, "");
}

function AddClass(obj, className)
{
	var re = new RegExp("(?:^|\\s+)" + className + "(?:\\s+|$)");
	if (!re.test(obj.className))
	{
		obj.className += " " + className;
	}
}

// Folder Clicked
function FI_OnClick(e)
{
	var obj = e.srcElement || e.target;
	
	if (obj.nodeName == "A")
	{
		// See if the anchor contains children
		if (HasClass(obj,"HasChild"))
		{
			if (HasClass(obj.nextSibling,"FHide"))
			{	
				RemoveClass(obj.nextSibling,"FHide");
				AddClass(obj,"IsOpen");
			}	
			else
			{
				AddClass(obj.nextSibling,"FHide");
				RemoveClass(obj,"IsOpen");
			}	
		}
		else
		{
			// Change display and AJAX for the placemarkers
			HandleAjaxProgress("SHOWPROGRESS");
			
			var ajaxOptions = {
				method: 		'get',
				onComplete: 	HandleAjaxResponse, 
				onFailure: 		HandleAjaxResponse
			};
					
			var folderHeirarchy = [];
			
			// Cycle thru the findexes to compose the heirarchy
			while(obj.getAttribute("findex") != null)
			{
				folderHeirarchy.unshift("Folder[position()=" + obj.getAttribute("findex") + "]");
				obj = obj.parentNode;
			}		
			
			var url = AJAX_REQUEST + "?mID="+ModuleID+"&tabID="+TabID+"&cat=" + folderHeirarchy.join("/");
			new Ajax(url, ajaxOptions).request();
		}
	
	}
	StopEvent(e);
}

function HandleAjaxProgress(type)
{
	// Hide the standard SidePanel and show the AjaxPanel
	if (type == "SHOWPROGRESS")
	{
		$(SidePanelID).style.display="none";
		$("AjaxSidePanel").style.display="block";
		ProgressHtml = $("AjaxProgress").innerHTML;
	}
	else if (type == "HIDEPROGRESS")
	{
		$("AjaxProgress").style.display = "none";		
	}	
	else if (type == "BACK")
	{
		$("AjaxSidePanel").style.display="none";
		$(SidePanelID).style.display="block";
		$("PlaceMarkerContent").innerHTML = "";	
		$("AjaxProgress").innerHTML = ProgressHtml;	
		$("AjaxProgress").style.display = "block";
		$(SidePanelID).focus();
	}	
	else if (type == "AJAXERROR")
	{
		$("AjaxProgress").innerHTML = "There was a problem retrieving the information.<br>Please try again later.";
	}
	
}

function HandleAjaxResponse(respData)
{
	if (this.transport.status == 200)	
	{
		HandleAjaxProgress("HIDEPROGRESS");
		
		if (/^{/.test(this.response.text))
		{
			eval("ResponseData = " + this.response.text);
		
			if (typeof(ResponseData) == "object")
			{
				$("PlaceMarkerContent").innerHTML = ResponseData.Display;
				setTimeout(ShowMarkers,200);
			}
		}
		else
		{
			$("PlaceMarkerContent").innerHTML = "<div class='NoMatch'>There were no matching items for this catgeory.</div>";
		}	
	}
	else
		HandleAjaxProgress("AJAXERROR");
	
}
