﻿var map = null;
//var pinID = 0;
//var pinArray = new Array();
var results = null;

var ztxtMapID = '';

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function Map_Initialize(bitLoadMap)
{
	// DECLARE LOCAL VARIABLES: HIDDEN CONTROLS
	var objMode = document.getElementById('wtxtHidden_Mode');
	var objCenterLat = document.getElementById('wtxtHidden_CenterLat');
	var objCenterLong = document.getElementById('wtxtHidden_CenterLong');
	
	// DECLARE LOCAL VARIABLES: HIDDEN VALUES
	var fltCenterLat = 0;
	var fltCenterLong = 0;

	// VERIFY HIDDEN FIELD: MODE
	if (objMode != null)
	{
		// 
		if (objMode.value == '0') HeaderMenu_Browse();
		if (objMode.value == '1') 
		{
			HeaderMenu_Search();
			document.getElementById('wobjCriteria_Search_Street').focus();
		}
	}

	// VERIFY HIDDEN FIELD: CENTER
	if (objCenterLat != null && objCenterLong != null)
	{
		fltCenterLat = objCenterLat.value;
		fltCenterLong = objCenterLong.value;
	}

	// INSTANCE GLOBAL VARIABLE: MAP
	map = new VEMap('wobjMap');
	MapControl.Features.ScaleBarKilometers = false;

	map.DisambiguationCallback = disambigCall

	map.LoadMap(new VELatLong(fltCenterLat, fltCenterLong), 13 ,'r' ,false);
	map.HideDashboard();	
	
	//map.AttachEvent("onchangeview", Map_ChangeView);

	// LOAD THE CURRENT MAP INFORMATION
	if (bitLoadMap == true) 
		GetData_Map();
	else
		Map_Preload();
}

function disambigCall(e)
{
	alert('Address could not be located as entered, please try agian.');
}

//------------------------------------------------------------------------------------------
// HANDLE A CHANGE VIEW EVENT FROM THE MAP
//------------------------------------------------------------------------------------------
function Map_ChangeView()
{
	// THE MAP IS IN BROWSE MODE?
	if (document.getElementById('wtxtHidden_Mode').value == 0)
	{
		// DECLARE BLOCK VARIABLES
		var objCenterLat = document.getElementById('wtxtHidden_CenterLat');
		var objCenterLong = document.getElementById('wtxtHidden_CenterLong');
		var fltCenterLat = 0;
		var fltCenterLong = 0;
		var fltDelta = 0;
		
		// CENTER LATITUDE AND LONGITUDE HIDDEN FIELDS FOUND?
		if (objCenterLat != null && objCenterLong != null)
		{
			// RETRIEVE THE PREVIOUS CENTER
			fltCenterLat = objCenterLat.value;
			fltCenterLong = objCenterLong.value;

			// APPROXIMATE THE CHANGE FROM THE PREVIOUS CENTER
			fltDelta = Math.sqrt(Math.pow(fltCenterLat - map.GetCenter().Latitude, 2) + Math.pow(fltCenterLong - map.GetCenter().Longitude, 2));				

			// THE CHANGE EXCEEDS THE THRESHOLD
			if (fltDelta > 0.03)
			{
				// SAVE THE CURRENT CENTER TO THE HIDDEN FIELDS
				objCenterLat.value = map.GetCenter().Latitude;
				objCenterLong.value = map.GetCenter().Longitude;

				// REFRESH THE MAP
				GetData_Map_Browse(null, null, 'Ignore')
			}
		}
	}
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function ClearMap()
{
	// DECLARE LOCAL VARIABLES
	var objForm = document.forms[0];
	var objResult;

	// ITERATE THROUGH THE FORM
	for (i = 0; i < objForm.length; i++)
	{
		// FOUND ELEMENT: SElECT TYPE
		if (objForm.elements[i].name == 'SelectType')
		{
			objResult = document.getElementById('wobjBrowse_Results_' + objForm.elements[i].value);
			if (objResult != null) objResult.innerHTML = '';
		}
		
		// (SEARCH SIDEBAR) FOUND ELEMENT: POI TYPE
		if (objForm.elements[i].name == 'wobjCriteria_Search_POIType')
		{
			// (SEARCH SIDEBAR) RETRIEVE THE RESULTS PANEL FOR THE SPECIFIED POI TYPE 
			objResult = document.getElementById('wobjSearch_Results_' + objForm.elements[i].value);
			
			// (SEARCH SIDEBAR) CLEAR THE RESULTS PANEL FOR THE POI TYPE
			if (objResult != null) objResult.innerHTML = '';
		}
	}
	
	// CLEAR THE MAP OF OBJECTS
	map.Clear();
}

//------------------------------------------------------------------------------------------
// BROWSE: REFRESH THE FORM
//------------------------------------------------------------------------------------------
function Browse_Refresh(
	txtAddressCity,
	txtPOITypes,
	fltCenterLat,
	fltCenterLong
){
	// SWITCH TO THE BROWSE SIDEBAR
	HeaderMenu_Browse();

	// LOAD THE CRITERIA: BROWSE ADDRESS CITY
	var objAddressCity = document.getElementById('wobjCriteria_Browse_POICity');
	if (objAddressCity != null) objAddressCity.value = txtAddressCity;

	// LOAD THE CRITERIA: SEARCH POI TYPES
	SetElement_Checkboxes('SelectType', txtPOITypes);
	
	// RECENTER THE MAP ON THE SPECIFIED CENTER
	GetData_Map_Search_Center(new VELatLong(fltCenterLat, fltCenterLong));
}

//------------------------------------------------------------------------------------------
// SEARCH: REFRESH THE FORM
//------------------------------------------------------------------------------------------
function Search_Refresh(
	txtAddressStreet,
	txtAddressCity,
	txtAddressState,
	txtAddressZip,
	txtPOITypes,
	fltCenterLat,
	fltCenterLong,
	intRadius	
){
	// SWITCH TO THE SEARCH SIDEBAR
	HeaderMenu_Search();

	// LOAD THE CRITERIA: SEARCH ADDRESS STREET
	var objAddressStreet = document.getElementById('wobjCriteria_Search_Street');
	if (objAddressStreet != null) objAddressStreet.value = txtAddressStreet;

	// LOAD THE CRITERIA: SEARCH ADDRESS CITY
	var objAddressCity = document.getElementById('wobjCriteria_Search_City');
	if (objAddressCity != null) objAddressCity.value = txtAddressCity;

	// LOAD THE CRITERIA: SEARCH ADDRESS STATE (RESERVED FOR FUTURE USE)
	//var objAddressState = document.getElementById('wobjCriteria_Search_State');
	//if (objAddressState != null) objAddressState.value = txtAddressState;

	// LOAD THE CRITERIA: SEARCH ADDRESS ZIP
	var objAddressZip = document.getElementById('wobjCriteria_Search_Zip');
	if (objAddressZip != null) objAddressZip.value = txtAddressZip;
	
	// LOAD THE CRITERIA: SEARCH POI TYPES
	SetCriteria_Search_POITypes(txtPOITypes);
	
	// LOAD THE CRITERIA: SEARCH RADIUS
	var objRadius = document.getElementById('wobjCriteria_Search_Radius');
	if (objRadius != null) objRadius.value = intRadius;
	
	// RECENTER THE MAP ON THE SPECIFIED CENTER
	GetData_Map_Search_Center(new VELatLong(fltCenterLat, fltCenterLong));
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetCriteria_Shared_MapID()
{
	return escape(document.getElementById('wtxtHidden_MapID').value);
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetCritieria_Browse_POICity()
{
	var objCriteria_Browse_POICity;
	
	objCriteria_Browse_POICity = document.getElementById('wobjCriteria_Browse_POICity');
	
	if (objCriteria_Browse_POICity != null)
	{
		return escape(objCriteria_Browse_POICity.value);
	}
	
	return '';
}

//------------------------------------------------------------------------------------------
// RETRIEVE CRITERIA FROM THE SEARCH FORM: ADDRESS STREET
//------------------------------------------------------------------------------------------
function GetCriteria_Search_Street()
{
	return document.getElementById('wobjCriteria_Search_Street').value;
}

//------------------------------------------------------------------------------------------
// RETRIEVE CRITERIA FROM THE SEARCH FORM: ADDRESS CITY
//------------------------------------------------------------------------------------------
function GetCriteria_Search_City()
{
	return document.getElementById('wobjCriteria_Search_City').value;
}

//------------------------------------------------------------------------------------------
// RETRIEVE CRITERIA FROM THE SEARCH FORM: ADDRESS STATE
//------------------------------------------------------------------------------------------
function GetCriteria_Search_State()
{
	return 'FL';
}

//------------------------------------------------------------------------------------------
// RETRIEVE CRITERIA FROM THE SEARCH FORM: ADDRESS ZIP
//------------------------------------------------------------------------------------------
function GetCriteria_Search_Zip()
{
	return document.getElementById('wobjCriteria_Search_Zip').value;
}

//------------------------------------------------------------------------------------------
// 
//------------------------------------------------------------------------------------------
function SetCriteria_Search_POITypes(txtValue)
{
	// DECLARE LOCAL VARIABLES
	var txtPOITypes = ',' + txtValue + ',';
	var objForm = document.forms[0];
	
	// ITERATE THROUGH EACH ELEMENT IN THE FORM
	for (var i = 0; i < objForm.length; i++)
	{
		// FOUND THE CRITERIA: SEARCH POI TYPE CHECKBOX ELEMENT
		if (objForm.elements[i].name == 'wobjCriteria_Search_POIType')
		{
			// IS THE POI TYPE VALUE IN THE LIST OF SELECTED POI TYPES?
			if (txtPOITypes.indexOf(',' + objForm.elements[i].value + ',') > -1)
				// SEARCH POI TYPE CHECKBOX ELEMENT IS CHECKED
				objForm.elements[i].checked = true;
			else
				// SEARCH POI TYPE CHECKBOX ELEMENT IS UNCHECKED
				objForm.elements[i].checked = false;
		}
	}
}

//------------------------------------------------------------------------------------------
// RETRIEVE CRITERIA FROM THE SEARCH FORM: POI TYPES
//------------------------------------------------------------------------------------------
function GetCriteria_Search_POITypes()
{
	var buffer = '';
	var frm = document.forms[0];

	for (i=0; i < frm.length; i++)
	{
		if (frm.elements[i].name == 'wobjCriteria_Search_POIType')
		{
			if(frm.elements[i].checked == true)             
			{    
				buffer += frm.elements[i].value + ','; 
			}
		}
	} 
	
	var test = "";
	
	return buffer;
}

//------------------------------------------------------------------------------------------
// RETRIEVE CRITERIA FROM THE SEARCH FORM: CENTER RADIUS
//------------------------------------------------------------------------------------------
function GetCriteria_Search_Radius()
{
	return document.getElementById('wobjCriteria_Search_Radius').value;
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetSelectedTypes()
{	
	var buffer = '';
	var frm = document.forms[0];

	for (i=0; i < frm.length; i++)
	{
		if (frm.elements[i].name == 'SelectType')
		{
			if(frm.elements[i].checked == true)             
			{    
				buffer += frm.elements[i].value + ','; 
			}
		}
	} 
	
	return buffer;
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function SetElement_Checkboxes(txtField, txtValue)
{
	// DECLARE LOCAL VARIABLES
	var txtValueList = ',' + txtValue + ',';
	var objForm = document.forms[0];
	
	// ITERATE THROUGH EACH ELEMENT IN THE FORM
	for (var i = 0; i < objForm.length; i++)
	{
		// FOUND THE CRITERIA: SEARCH POI TYPE CHECKBOX ELEMENT
		if (objForm.elements[i].name == txtField)
		{
			// IS THE POI TYPE VALUE IN THE LIST OF SELECTED POI TYPES?
			if (txtValueList.indexOf(',' + objForm.elements[i].value + ',') > -1)
				// SEARCH POI TYPE CHECKBOX ELEMENT IS CHECKED
				objForm.elements[i].checked = true;
			else
				// SEARCH POI TYPE CHECKBOX ELEMENT IS UNCHECKED
				objForm.elements[i].checked = false;
		}
	}
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetData_Map()
{
	// DECLARE LOCAL VARIABLES
	var objRequestHTTP = GetHTTP();
	var txtRequestURL;
	
	// THERE IS AN HTTP OBJECT?
	if (objRequestHTTP)
	{
		// GENERATE THE REQUEST URL
		txtRequestURL = "Server.aspx?Cmd=GetMap"
		txtRequestURL += "&MapID=" + GetCriteria_Shared_MapID();

		// SHOW THE LOADING SCREEN
		ShowLoading();

		// DEFINE AN ASYNCHRONOUS HTTP REQUEST
		objRequestHTTP.open("GET", txtRequestURL, true);

		// CALL THIS FUNCTION WHEN THE HTTP STATE CHANGES
		objRequestHTTP.onreadystatechange = function()
		{
			// THE REQUEST WAS SUCCESSFUL
			if (objRequestHTTP.readyState == 4)
			{
				// DECLARE BLOCK VARIABLE
				var txtResponse = '';

				// RETRIEVE THE RESPONSE TEXT
				txtResponse = objRequestHTTP.responseText;

				// CLEAR THE MAP
				ClearMap();

				// EVALUATE THE RESPONSE
				eval(txtResponse);
			}
		}

		// PERFORM THE GET
		objRequestHTTP.send(null); 
	}
}

//------------------------------------------------------------------------------------------
// 
//------------------------------------------------------------------------------------------
function GetData_Map_Search()
{
	var objCriteria_Search_Street = document.getElementById('wobjCriteria_Search_Street');
	var objCriteria_Search_City = document.getElementById('wobjCriteria_Search_City');
	var objCriteria_Search_Zip = document.getElementById('wobjCriteria_Search_Zip');
	var txtAddress = '';
	
	txtAddress += objCriteria_Search_Street.value + ',';
	txtAddress += objCriteria_Search_City.value + ', FL ';
	txtAddress += objCriteria_Search_Zip.value;

	map.Find('', txtAddress, null, null, 0, 1, false, false, false, false, GetData_Map_Search_Callback);
}

//------------------------------------------------------------------------------------------
// GENERATE A SEARCH RESULT WITH THE SEARCH ADDRESS AS THE CENTER OF THE MAP
//------------------------------------------------------------------------------------------
function GetData_Map_Search_Callback(a,b,c,d,e)
{
	// THE LOCATION WAS NOT FOUND?
	if (c == null)
	{
		// DISPLAY A MESSAGE: ADDRESS NOT FOUND
		alert("The address could not be found.");
	}
	else
	{
		// DECLARE BLOCK VARIABLES
		var objRequestHTTP = GetHTTP();
		var txtRequestURL;

		// THERE IS AN HTTP OBJECT?
		if (objRequestHTTP)
		{
			// GENERATE THE REQUEST URL
			txtRequestURL = 'Server.aspx?Cmd=GetSearch';
			txtRequestURL += '&MapID=' + GetCriteria_Shared_MapID();
			txtRequestURL += "&POITypes=" + GetCriteria_Search_POITypes();
			txtRequestURL += '&AdrStreet=' + GetCriteria_Search_Street();
			txtRequestURL += '&AdrCity=' + GetCriteria_Search_City();
			txtRequestURL += '&AdrState=' + GetCriteria_Search_State();
			txtRequestURL += '&AdrZip=' + GetCriteria_Search_Zip();
			txtRequestURL += "&CenterLat=" + escape(c[0].LatLong.Latitude);
			txtRequestURL += "&CenterLong=" + escape(c[0].LatLong.Longitude);
			txtRequestURL += "&Radius=" + GetCriteria_Search_Radius();

			// SHOW THE LOADING SCREEN
			ShowLoading();

			// DEFINE AN ASYNCHRONOUS HTTP REQUEST
			objRequestHTTP.open("GET", txtRequestURL, true);

			// CALL THIS FUNCTION WHEN THE HTTP STATE CHANGES
			objRequestHTTP.onreadystatechange = function()
			{
				// THE REQUEST WAS SUCCESSFUL
				if (objRequestHTTP.readyState == 4)
				{
					// DECLARE BLOCK VARIABLE
					var txtResponse = '';

					// RETRIEVE THE RESPONSE TEXT
					txtResponse = objRequestHTTP.responseText;

					// CLEAR THE MAP
					ClearMap();

					// EVALUATE THE RESPONSE
					eval(txtResponse);
					
					// SET THE MAP CENTER AND ZOOM BASED ON THE SEARCH
					GetData_Map_Search_Center(c[0].LatLong);
				}
			}

			// PERFORM THE GET
			objRequestHTTP.send(null); 
		}	
	}	
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetData_Map_Search_POI(intPOIID, txtPOITypes, intRadius)
{
	// DECLARE LOCAL VARIABLES
	var objRequestHTTP = GetHTTP();
	var txtRequestURL;

	// THERE IS AN HTTP OBJECT?
	if (objRequestHTTP)
	{
		// GENERATE THE REQUEST URL
		txtRequestURL = 'Server.aspx?Cmd=GetSearchPOI&Refresh=Map';
		txtRequestURL += '&MapID=' + GetCriteria_Shared_MapID();
		txtRequestURL += "&POITypes=" + txtPOITypes;
		txtRequestURL += "&CenterPOI=" + escape(intPOIID);
		txtRequestURL += "&Radius=" + intRadius;

		// SHOW THE LOADING SCREEN
		ShowLoading();

		// DEFINE AN ASYNCHRONOUS HTTP REQUEST
		objRequestHTTP.open("GET", txtRequestURL, true);

		// CALL THIS FUNCTION WHEN THE HTTP STATE CHANGES
		objRequestHTTP.onreadystatechange = function()
		{
			// THE REQUEST WAS SUCCESSFUL
			if (objRequestHTTP.readyState == 4)
			{
				// DECLARE BLOCK VARIABLE
				var txtResponse = '';

				// RETRIEVE THE RESPONSE TEXT
				txtResponse = objRequestHTTP.responseText;

				// CLEAR THE MAP
				ClearMap();

				// EVALUATE THE RESPONSE
				eval(txtResponse);
			}
		}

		// PERFORM THE GET
		objRequestHTTP.send(null); 
	}	
}

//------------------------------------------------------------------------------------------
// GENERATE A SEARCH RESULT WITH A POINT OF INTEREST AS THE CENTER OF THE MAP
//------------------------------------------------------------------------------------------
function GetData_Map_Search_Pushpin(intPOIID)
{
	GetData_Map_Search_POI( 
		intPOIID, 
		GetElementValue('Pushpin_POIType_' + intPOIID), 
		GetElementValue('Pushpin_Radius_' + intPOIID)
	);
}

//------------------------------------------------------------------------------------------
// RECENTER THE MAP ON THE SPECIFIED LOCATION AND SET THE ZOOM BASED ON THE SEARCH RADIUS
//------------------------------------------------------------------------------------------
function GetData_Map_Search_Center(objCenter)
{
	// RETRIEVE THE SEARCH RADIUS FROM THE FORM
	var fltRadius = GetCriteria_Search_Radius();
	
	// THE RADIUS WAS PARSED?
	if (!isNaN(fltRadius))
	{
		// DECLARE BLOCK VARIABLES
		var fltLatitude;
		var fltMilesPerPixel;
		var intShortAxis;
		
		// RETRIEVE THE LATITUDE AT THE CENTER OF THE MAP (RADIANS)
		fltLatitude = map.GetCenter().Latitude * (Math.PI / 180);
		
		// RETRIEVE THE SHORT AXIS OF THE WINDOW'S DIMENSIONS
		if (document.documentElement.clientWidth >= document.documentElement.clientHeight)
			// THE HEIGHT IS SHORTER OR EQUAL TO THAN THE WIDTH
			intShortAxis = document.documentElement.clientHeight;
		else
			// THE WIDTH IS SHORTER THAT THE HEIGHT
			intShortAxis = document.documentElement.clientWidth;

		// ITERATE THROUGH EACH ZOOM LEVEL (HIGH ZOOM TO LOW ZOOM)
		for (var intZoomLevel = 19; intZoomLevel >= 1; intZoomLevel--)
		{
			// CALCULATE THE APPROXIMATE MILES PER PIXEL RESOLUTION BASED ON THE LATITUDE
			fltMilesPerPixel = 156543.04 * Math.cos(fltLatitude) / Math.pow(2, intZoomLevel);
			fltMilesPerPixel = fltMilesPerPixel / 1609.344;

			// THE SHORT AXIS (MILES) IS LARGER THAN THE SEARCH DIAMETER (MILES)
			if ((intShortAxis * fltMilesPerPixel) > (fltRadius * 2))
			{
				// FOUND THE APPROXIMATE ZOOM LEVEL
				map.SetCenterAndZoom(objCenter, intZoomLevel);
				break;
			}
		}
	}
}

//------------------------------------------------------------------------------------------
// 
//------------------------------------------------------------------------------------------
function GetData_Map_Browse(fltCenterLat, fltCenterLong, txtScope)
{
	// DECLARE LOCAL VARIABLES
	var objRequestHTTP = GetHTTP();
	var txtRequestURL;

	// THERE IS AN HTTP OBJECT?
	if (objRequestHTTP)
	{
		// PARSE THE CENTER LATITUDE AND LONGITUDE
		fltCenterLat = parseFloat(fltCenterLat);
		fltCenterLong = parseFloat(fltCenterLong);

		// FALL BACK TO THE CENTER OF THE MAP IF THE LATLONG IS NOT A NUMBER
		if (isNaN(fltCenterLat))  fltCenterLat  = map.GetCenter().Latitude;
		if (isNaN(fltCenterLong)) fltCenterLong = map.GetCenter().Longitude;
  
		if (txtScope == null) txtScope = 'Auto';
  
		// GENERATE THE REQUEST URL
		txtRequestURL = "Server.aspx?Cmd=GetBrowse";
		txtRequestURL += "&MapID=" + GetCriteria_Shared_MapID();
		txtRequestURL += "&POICity=" + GetCritieria_Browse_POICity();
		txtRequestURL += "&POITypes=" + GetSelectedTypes();
		txtRequestURL += "&CenterLat=" + fltCenterLat;
		txtRequestURL += "&CenterLong=" + fltCenterLong;
		txtRequestURL += "&Radius=" + '5';
		txtRequestURL += "&ShortAxis" + GetShortAxis();
		txtRequestURL += "&Scope=" + txtScope
   
		//alert(txtRequestURL);
   
		// SHOW THE LOADING SCREEN
		ShowLoading();

		// DEFINE AN ASYNCHRONOUS HTTP REQUEST
		objRequestHTTP.open("GET", txtRequestURL, true);

		// CALL THIS FUNCTION WHEN THE HTTP STATE CHANGES
		objRequestHTTP.onreadystatechange = function()
		{
			// THE REQUEST WAS SUCCESSFUL
			if (objRequestHTTP.readyState == 4)
			{
				// DECLARE BLOCK VARIABLE
				var txtResponse = '';

				// RETRIEVE THE RESPONSE TEXT
				txtResponse = objRequestHTTP.responseText;

				// CLEAR THE MAP
				ClearMap();

				// THE RESPONSE POPULATES THE MAP
				eval(txtResponse);
			}
		}

		// PERFORM THE GET
		objRequestHTTP.send(null);     
	}
}

//------------------------------------------------------------------------------------------
// 
//------------------------------------------------------------------------------------------
function GetPinShow(txtPOIID)
{	
	// DECLARE LOCAL VARIABLES
	var objHTTP = GetHTTP();
	var txtRequest = '';

	// THERE IS AN HTTP OBJECT?
	if (objHTTP)
	{
		// GENERATE THE REQUEST URL
		txtRequest += 'Server.aspx?Cmd=GETPINSHOW';
		txtRequest += '&MapID=' + GetCriteria_Shared_MapID();
		txtRequest += '&POIID=' + txtPOIID;

		// DEFINE AN ASYNCHRONOUS HTTP REQUEST
		objHTTP.open("GET", txtRequest, true);

		// CALL THIS FUNCTION WHEN THE HTTP STATE CHANGES
		objHTTP.onreadystatechange = function()
		{	
			// THE REQUEST WAS SUCCESSFUL
			if (objHTTP.readyState == 4)
			{
				// DECLARE BLOCK VARIABLE
				var txtResponse = '';

				// RETRIEVE THE RESPONSE TEXT
				txtResponse = objHTTP.responseText;

				// EVALUATE THE RESPONSE
				eval(txtResponse);

				document.getElementById('Visible_' + txtPOIID).innerHTML = 'Hide';
				document.getElementById('Visible_' + txtPOIID).href = 'JavaScript:SetPinHide(' + txtPOIID + ');';
			}
		}

		// PERFORM THE GET
		objHTTP.send(null); 
	}
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function SetPinHide(txtPOIID)
{	
	// DECLARE LOCAL VARIABLES
	var objHTTP = GetHTTP();
	var txtRequest = '';

	// THERE IS AN HTTP OBJECT?
	if (objHTTP)
	{
		// GENERATE THE REQUEST URL
		txtRequest += 'Server.aspx?Cmd=SETPINHIDE';
		txtRequest += '&MapID=' + GetCriteria_Shared_MapID();
		txtRequest += '&POIID=' + txtPOIID;

		// DEFINE AN ASYNCHRONOUS HTTP REQUEST
		objHTTP.open("GET", txtRequest, true);

		// CALL THIS FUNCTION WHEN THE HTTP STATE CHANGES
		objHTTP.onreadystatechange = function()
		{	
			// THE REQUEST WAS SUCCESSFUL
			if (objHTTP.readyState == 4)
			{
				// DECLARE BLOCK VARIABLE
				var txtResponse = '';

				// RETRIEVE THE RESPONSE TEXT
				txtResponse = objHTTP.responseText;

				// DELETE THE PUSHPIN
				map.DeletePushpin(txtPOIID);
				
				document.getElementById('Visible_' + txtPOIID).innerHTML = 'Show';
				document.getElementById('Visible_' + txtPOIID).href = 'JavaScript:GetPinShow(' + txtPOIID + ');';
			}
		}

		// PERFORM THE GET
		objHTTP.send(null); 
	}
}

//------------------------------------------------------------------------------------------
// HANDLE A DISPLAY COMMAND: RECENTER THE MAP TO THE SPECIFIED COORDINATES
//------------------------------------------------------------------------------------------
function Display_Map_Recenter(fltCenterLat, fltCenterLong)
{
	// DECLARE LOCAL VARIABLES
	var objCenterLat = document.getElementById('wtxtHidden_CenterLat');
	var objCenterLong = document.getElementById('wtxtHidden_CenterLong');

	// SAVE THE SPECIFIED CENTER TO THE HIDDEN FIELDS
	objCenterLat.value = fltCenterLat;
	objCenterLong.value = fltCenterLong;
	
	// SET THE CURRENT CENTER OF THE MAP TO THE SPECIFIED VALUES
	map.SetCenter(new VELatLong(fltCenterLat, fltCenterLong));
}

//------------------------------------------------------------------------------------------
// PROCESS A RESULT RETRIEVED FROM THE SERVER: ADD A PUSHPIN TO THE MAP
//------------------------------------------------------------------------------------------
function Result_AddPin(
	intPin,			txtIcon,
	intPOIID,		intPOIType,	
	fltLatitude,	fltLongitude,
	txtTitle,		txtDesc
){
	// DECLARE LOCAL VARIABLES
	var objLocation;
	var objPushpin;
	var txtIconUrl;

	// APPEND THE PUSHPIN OPTIONS TO THE DESCRIPTION
	if (intPOIID != 0) txtDesc += '<br/><br/>' + GetData_Pushpin_Options(intPOIID, 5);

	// APPEND TO THE DESCRIPTION: VISIBLITY LINK (HIDE)
	txtDesc += '<a href="JavaScript:SetPinHide(' + intPOIID + ');"';
	txtDesc += '>Hide</a>';	

	// GENERATE THE LOCATION OF THE PUSHPIN
	objLocation = new VELatLong(fltLatitude, fltLongitude);

	// GENERATE THE URL TO THE ICON WITH THE PIN NUMBER OVERLAYED BY THE ICON HANDLER
	txtIconUrl = 'Icon.ashx?Icon=' + txtIcon + '&Number=' + intPin
	
	// GENERATE THE PUSHPIN AND ADD THE PUSHPIN TO THE MAP
	objPushpin = new VEPushpin(intPOIID, objLocation, txtIconUrl, txtTitle, txtDesc)
	map.AddPushpin(objPushpin);
}

//------------------------------------------------------------------------------------------
// PROCESS A RESULT RETRIEVED FROM THE SERVER: ADD A POINT OF INTEREST TO THE MAP
//------------------------------------------------------------------------------------------
function Result_AddPOI(
	intPin,			txtIcon, 
	intPOIID,		intPOITypeID, 
	fltLatitude,	fltLongitude, 
	txtTitle,		txtAddr,	
	txtDesc,		bitHidden
){
	// DECLARE LOCAL VARIABLE
	var objResultPanel;

	// RETRIEVE THE RESULT PANEL BASED ON THE CURRENT MODE AND POI TYPE
	if (document.getElementById('wtxtHidden_Mode').value == 0)
		objResultPanel= document.getElementById('wobjBrowse_Results_' + intPOITypeID);
	if (document.getElementById('wtxtHidden_Mode').value == 1)
		objResultPanel= document.getElementById('wobjSearch_Results_' + intPOITypeID);

	// WAS THE RESULT PANEL FOUND?
	if (objResultPanel != null)
	{
		// DECLARE BLOCK VARIABLE
		var txtResultIcon = '';
		var txtResultDesc = '';

		// GENERATE THE TAG FOR THE ICON IMAGE (THE ICON HANDLER GENERATES THE NUMBER)
		txtResultIcon += '<img src="Icon.ashx?Icon=' + escape(txtIcon) + '&Number=' + intPin + '" ';
		txtResultIcon += 'alt="Pushpin ' + intPin + '" />';

		// APPEND TO THE DESCRIPTION: TITLE AND ADDRESS
		txtResultDesc += '<div class="ResultContentTitle">' + txtTitle + '</div>';
		txtResultDesc += '<div class="ResultContentDesc">' + txtAddr + '</div>';

		// IS THE POI HIDDEN ON THE MAP?
		if (bitHidden == true)
		{
			// APPEND TO THE DESCRIPTION: VISIBLITY LINK (SHOW)
			txtResultDesc += '<a id="Visible_' + intPOIID + '" ';
			txtResultDesc += 'href="JavaScript:GetPinShow(' + intPOIID + ');"';
			txtResultDesc += '>Show</a>';
		}
		else
		{
			// APPEND TO THE DESCRIPTION: VISIBLITY LINK (HIDE)
			txtResultDesc += '<a id="Visible_' + intPOIID + '" ';
			txtResultDesc += 'href="JavaScript:SetPinHide(' + intPOIID + ');"';
			txtResultDesc += '>Hide</a>';

			// ADD THE MATCHING PUSHPIN TO THE MAP FOR THIS POI
			Result_AddPin(intPin, txtIcon, intPOIID, intPOITypeID, 
				fltLatitude, fltLongitude, txtTitle, txtAddr + txtDesc);
		}

		// BEGIN: GENERATE THE HTML OF THE RESULT
		objResultPanel.innerHTML += '<div class="ResultAreaL">' + txtResultIcon + '</div>';
		objResultPanel.innerHTML += '<div class="ResultAreaR">' + txtResultDesc + '</div>';
		objResultPanel.innerHTML += '<div style="clear: both;">&nbsp;</div>';
	}
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function Result_ZoomLevel(intZoomLevel)
{
	if (intZoomLevel != null) map.SetZoomLevel(intZoomLevel);	
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetShortAxis()
{
	// DECLARE LOCAL VARIABLES
	var intShortAxis;

	// RETRIEVE THE SHORT AXIS OF THE WINDOW'S DIMENSIONS
	if (document.documentElement.clientWidth >= document.documentElement.clientHeight)
		// THE HEIGHT IS SHORTER OR EQUAL TO THAN THE WIDTH
		intShortAxis = document.documentElement.clientHeight;
	else
		// THE WIDTH IS SHORTER THAT THE HEIGHT
		intShortAxis = document.documentElement.clientWidth;
	
	// RETURN VALUE	
	return intShortAxis;
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function GetHTTP()
{
 	// DECLARE LOCAL VARIABLES
	var objXMLHTTP = null;
	
	try
	{
		// THE XML HTTP OBJECT FOR INTERNET EXPLORER (NEW)
		objXMLHTTP = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e)
	{
		try
		{
			// THE XML HTTP OBJECT FOR INTERNET EXPLORER (OLD)
			objXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e)
		{
			// THE XML HTTP IS NOT INSTANCED
			objXMLHTTP = null;
		}      
	}
	
	// THE XML HTTP OBJECT WAS NOT INSTANCED (TYPE IS DEFINED)
	if (!objXMLHTTP && typeof XMLHttpRequest != "undefined")
	{
		// NON-IE BROWSERS USE THIS
		objXMLHTTP = new XMLHttpRequest();      
	}
	
	// RETURN VALUE
	return objXMLHTTP
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function ShowLoading()
{
  var el = document.createElement("div"); 
  el.setAttribute('id',"VELoading");
  //Now we should know the width and height of the VE map or else go and get it.
  var curr_width = document.documentElement.clientWidth;
  var curr_height = document.documentElement.clientHeight;
  el.style.top = ((curr_height - 25) / 2) + "px";
  el.style.left = ((curr_width - 105) / 2) + "px";
  el.style.border = "1px solid gray";
  el.style.font = "12px arial";
  el.style.background = "White";
  el.style.padding = "2px";
  el.style.verticalAlign = "middle";
  el.innerHTML = "<img src='images/spinner.gif' /> Please Wait. Loading data....";  
  map.AddControl(el);
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function HideLoading()
{
	var el = document.getElementById("VELoading");
	el.parentNode.removeChild(el);
}

//------------------------------------------------------------------------------------------
// HEADER MENU COMMAND: BROWSE MAP
//------------------------------------------------------------------------------------------
function HeaderMenu_Browse()
{
	SidebarSearch_Action('Close');
	SidebarBrowse_Action('Restore');
}

//------------------------------------------------------------------------------------------
// HEADER MENU COMMAND: SEARCH MAP
//------------------------------------------------------------------------------------------
function HeaderMenu_Search()
{
	SidebarBrowse_Action('Close');
	SidebarSearch_Action('Restore');
}

//------------------------------------------------------------------------------------------
// HEADER MENU COMMAND:
//------------------------------------------------------------------------------------------
function HeaderMenu_Print()
{
	var txtMapSendURL = 'MapPrint.aspx?MapID=' + GetCriteria_Shared_MapID();
	
    window.open(txtMapSendURL,'MapPrint_new','fullscreen=no,toolbar=yes,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,resizable=yes'); 
}

//------------------------------------------------------------------------------------------
// HEADER MENU COMMAND: SAVE/LOAD
//------------------------------------------------------------------------------------------
function HeaderMenu_Disk(txtMode, txtAction)
{
	// GENERATE THE EXTRA I-FRAME'S URL
	var txtFrameUrl = 'MapDisk.aspx?Mode=' + txtMode + '&MapID=' + GetCriteria_Shared_MapID();
	HeaderMenu_Extra(txtAction, txtFrameUrl);
}

//------------------------------------------------------------------------------------------
// HEADER MENU COMMAND: SEND
//------------------------------------------------------------------------------------------
function HeaderMenu_Send(txtAction)
{
	// GENERATE THE EXTRA I-FRAME'S URL
	var txtFrameUrl = 'MapSend.aspx?MapID=' + GetCriteria_Shared_MapID();
	HeaderMenu_Extra(txtAction, txtFrameUrl);
}

//------------------------------------------------------------------------------------------
// HEADER MENU COMMAND: EXTRA
//------------------------------------------------------------------------------------------
function HeaderMenu_Extra(txtAction, txtFrameUrl)
{
	// RETRIEVE A REFERENCE TO THE MAP EXTRA ELEMENTS
	var wobjMapExtra = document.getElementById('wobjMapExtra');
	var wobjMapExtraFrame = document.getElementById('wobjMapExtraFrame');

	// CALCULATE THE LEFT AND TOP STYLE PROPERTY VALUES
	var intLeft = Math.round((document.documentElement.clientWidth - 
		parseInt(wobjMapExtra.style.width)) / 2);
	var intTop = Math.round((document.documentElement.clientHeight - 
		parseInt(wobjMapExtra.style.height)) / 2);

	// DEFAULT ACTION
	if (txtAction == null)
	{
		// THE EXTRA PANEL IS NOT DISPLAYED?
		if (wobjMapExtra.style.display == 'none')
			// SET ACTION: OPEN
			txtAction = 'Open';
		else
		{
			// THE URL IS ALREADY OPEN IN THE EXTRA I-FRAME
			if (wobjMapExtraFrame.src == txtFrameUrl)
				// SET ACTION: CLOSE
				txtAction = 'Close';
			else
				// SET ACTION: OPEN
				txtAction = 'Open';
		}
	}

	// HANDLE ACTION: CLOSE
	if (txtAction == 'Close')
	{
		// HIDE THE MAP EXTRA ELEMENT
		wobjMapExtra.style.display = 'none';
	}

	// HANDLE ACTION: OPEN
	if (txtAction == 'Open')
	{
		// SET THE SOURCE FOR THE MAP EXTRA I-FRAME
		wobjMapExtraFrame.src = txtFrameUrl;

		// DISPLAY THE MAP EXTRA ELEMENT
		wobjMapExtra.style.display = 'block';
		wobjMapExtra.style.left = intLeft + 'px';
		wobjMapExtra.style.top = intTop + 'px';
	}
}

//------------------------------------------------------------------------------------------
// TOOLS: CHANGE THE MAP ZOOM LEVEL
//------------------------------------------------------------------------------------------
function Tools_MapZoom(txtDirection)
{
	switch (txtDirection)
	{
		case "In": 
			map.ZoomIn();
			break;

		case "Out": 
			map.ZoomOut();
			break;
	}
}

//------------------------------------------------------------------------------------------
// TOOLS: CHANGE THE MAP STYLE (Road, Aerial, Hybrid)
//------------------------------------------------------------------------------------------
function Tools_MapStyle(txtStyle)
{
	switch(txtStyle)
	{
        case "Road": 
            map.SetMapStyle(VEMapStyle.Road);
	        break;
    
        case "Aerial": 
		    map.SetMapStyle(VEMapStyle.Aerial);
			break;

        case "Hybrid": 
            map.SetMapStyle(VEMapStyle.Hybrid);
	        break;

        default: 
			map.SetMapStyle(VEMapStyle.Road);
	}           
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function SidebarBrowse_Refresh_City(txtCity)
{
	// DECLARE LOCAL VARIABLES
	var objCenterLat = document.getElementById('wtxtHidden_CenterLat');
	var objCenterLong = document.getElementById('wtxtHidden_CenterLong');
	
	// CENTER THE MAP ON THE CITY
	Map_CenterOnCity(txtCity);
	
	// LOAD THE MAP INFORMATION BASED AROUND THE CITY'S CENTER
	GetData_Map_Browse(objCenterLat.value, objCenterLong.value);
}

//------------------------------------------------------------------------------------------
// HANDLE A CLICK FROM SIDEBAR ACTION BUTTON (BROWSE)
//------------------------------------------------------------------------------------------
function SidebarBrowse_Action(txtActionName)
{
	var objDivTitle = document.getElementById('wobjSidebarBrowseTitle');
	var objDivContent = document.getElementById('wobjSidebarBrowseContent');

	var objLinkRestore = document.getElementById('wobjSidebarBrowseTitle_Restore');
	var objLinkMinimize = document.getElementById('wobjSidebarBrowseTitle_Minimize');

	var objMode = document.getElementById('wtxtHidden_Mode');

	switch(txtActionName)
	{
		case 'Restore':
			objDivTitle.style.display = 'block';
			objDivContent.style.display = 'block';
			
			objLinkRestore.style.display = 'none';
			objLinkMinimize.style.display = 'block';
	
			objMode.value = '0';

			break;
			
		case 'Minimize':
			objDivTitle.style.display = 'block';
			objDivContent.style.display = 'none';

			objLinkRestore.style.display = 'block';
			objLinkMinimize.style.display = 'none';

			objMode.value = '0';

			break;

		case 'Close':
			objDivTitle.style.display = 'none';
			objDivContent.style.display = 'none';

			objMode.value = '-1';

			break;
	}
}

//------------------------------------------------------------------------------------------
// 
//------------------------------------------------------------------------------------------
function SidebarSearch_Refresh_Radius(fltRadius)
{
	// PARSE THE RADIUS AS A FLOAT
	fltRadius = parseFloat(fltRadius);
	
	// THE RADIUS WAS PARSED?
	if (!isNaN(fltRadius))
	{
		// DECLARE BLOCK VARIABLES
		var fltLatitude;
		var fltMilesPerPixel;
		var intShortAxis;
		
		// RETRIEVE THE LATITUDE AT THE CENTER OF THE MAP (RADIANS)
		fltLatitude = map.GetCenter().Latitude * (Math.PI / 180);
		
		// RETRIEVE THE SHORT AXIS OF THE WINDOW'S DIMENSIONS
		if (document.body.clientWidth >= document.body.clientHeight)
			// THE HEIGHT IS SHORTER OR EQUAL TO THAN THE WIDTH
			intShortAxis = document.body.clientHeight;
		else
			// THE WIDTH IS SHORTER THAT THE HEIGHT
			intShortAxis = document.body.clientWidth;

		// ITERATE THROUGH EACH ZOOM LEVEL (HIGH ZOOM TO LOW ZOOM)
		for (var intZoomLevel = 19; intZoomLevel >= 1; intZoomLevel--)
		{
			// CALCULATE THE APPROXIMATE MILES PER PIXEL RESOLUTION BASED ON THE LATITUDE
			fltMilesPerPixel = 156543.04 * Math.cos(fltLatitude) / Math.pow(2, intZoomLevel);
			fltMilesPerPixel = fltMilesPerPixel / 1609.344;

			// THE SHORT AXIS (MILES) IS LARGER THAN THE SEARCH DIAMETER (MILES)
			if ((intShortAxis * fltMilesPerPixel) > (fltRadius * 2))
			{
				// USE THE CURRENT ZOOM LEVEL
				map.SetZoomLevel(intZoomLevel);
				break;
			}
		}
	}
}

//------------------------------------------------------------------------------------------
// HANDLE A CLICK FROM SIDEBAR ACTION BUTTON (SEARCH)
//------------------------------------------------------------------------------------------
function SidebarSearch_Action(txtActionName)
{
	var objDivTitle = document.getElementById('wobjSidebarSearchTitle');
	var objDivContent = document.getElementById('wobjSidebarSearchContent');

	var objLinkRestore = document.getElementById('wobjSidebarSearchTitle_Restore');
	var objLinkMinimize = document.getElementById('wobjSidebarSearchTitle_Minimize');

	var objMode = document.getElementById('wtxtHidden_Mode');

	switch(txtActionName)
	{
		case 'Restore':
			objDivTitle.style.display = 'block';
			objDivContent.style.display = 'block';
			
			objLinkRestore.style.display = 'none';
			objLinkMinimize.style.display = 'block';
			
			objMode.value = '1';
			
			break;
			
		case 'Minimize':
			objDivTitle.style.display = 'block';
			objDivContent.style.display = 'none';

			objLinkRestore.style.display = 'block';
			objLinkMinimize.style.display = 'none';

			objMode.value = '1';

			break;

		case 'Close':
			objDivTitle.style.display = 'none';
			objDivContent.style.display = 'none';

			objMode.value = '-1';

			break;
	}
}

//------------------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------------------
function Result_Toggle(txtLinkID, txtDivID)
{
	var objLink = document.getElementById(txtLinkID);
	var objDiv = document.getElementById(txtDivID);
	
	if (objLink != null && objDiv != null)
	{
		if (objDiv.style.display != 'none')
		{
			objLink.innerHTML = 'show';
			objDiv.style.display = 'none';
		}
		else
		{
			objLink.innerHTML = 'hide';
			objDiv.style.display = 'block';
		}
	}
}

//------------------------------------------------------------------------------------------
// 
//------------------------------------------------------------------------------------------
function GetElementValue(txtElementID)
{
	// RETRIEVE THE ELEMENT BASED ON THE SPECIFIED ID
	var objElement = document.getElementById(txtElementID);
	
	// WAS THE ELEMENT FOUND?
	if (objElement != null)
		// THE ELEMENT HAS A VALUE?
		if (objElement.value != null)
			// RETURN VALUE
			return objElement.value;
	
	// RETURN DEFAULT	
	return '';		
}