// April 3, 2003 - Started.
var map = null;
var url = null;
var domainName = "";
var icon = null;
var tooltip = null;
var message = null;
var mapMarkers = new Array();
var memberTypes = new Array();
var memberSubTypes = new Array();
var type_id_array = new Array();
var userMapType = null;
var checkbox_id = null;
var type_id = null;
var request = null;
var windowOpen = 0;
var tempClickedMemberTypes = new Array();
var timeoutID = 0;
var timeOut = 50;  //Set in ms. Currently: 50ms
//var photosOn = 0;
var timeOutSet = 0;
var timeOutItem;
var display_count = 0;
var current_count = 0;
var gMenu = "";
var myGEInstance = null;

var mapChange = 0; //OFF
var noReload = 0; //Load pinpoints is OFF.

function setDomainName(temp)	{	domainName = temp;	}

function getURL()
{	url = "http://" + domainName + "/lib/members.php?stuff=" + new Date().getTime() + "&site_id=" + site_id + "&client_id=" + client_id;	}

function createRequest()
{
	try
	{	request = new XMLHttpRequest();	}
	catch(trymicrosoft)
	{
		try
		{	request = new ActiveXObject("Msxm12.XMLHTTP");	}
		catch(othermicrosoft)
		{
			try
			{	request = new ActiveXObject("Microsoft.XMLHTTP");	}
			catch(fail)
			{	request = null;	}
		}
	}

	if(request == null)
	{	alert("Error creating XMLHttpRequest!");	}
}

var mapEarth = "";
function  buildMap()
{
	icon = new GIcon();
	icon.iconSize=new GSize(26,30);
	icon.shadowSize=new GSize(26,30);
	icon.iconAnchor=new GPoint(16,32);
	icon.infoWindowAnchor=new GPoint(16,0);
	icon.image = "http://" + domainName + "/images/pinpoint.png";
   	icon.shadow = "http://" + domainName + "/images/pinpoint_shadow.png";
   	
	map = new GMap2(document.getElementById("map"));
	new GKeyboardHandler(map);
	map.enableDoubleClickZoom();
	map.enableScrollWheelZoom();
	map.addControl(new YSliderControl("std", map));
	map.addControl(new zoomInControl("std", map));
	map.addControl(new zoomOutControl());
	
	map.addControl(new GOverviewMapControl());
	map.addControl(new GScaleControl());
	map.addControl(new photoControl());
	map.addControl(new threeDControl());
	map.addControl(new mapMenuControl());
	map.addControl(new loadingImage());
	map.addControl(new mapMessages());
	map.addMapType(G_PHYSICAL_MAP);
	//map.addMapType(G_SATELLITE_3D_MAP);
	//map.addControl(new GMenuMapTypeControl());
	gMenu = new GMenuMapTypeControl();

	if(navigator.platform != "MacIntel" && navigator.platform != "MacPPC")	
	{	map.getEarthInstance(function(ge){ myGEInstance = ge; });	} 	 
	
	/* first set of options is for the visual overlay.*/
	var boxStyleOpts = null;
	/* second set of options is for everything else */
	var otherOpts = 
	{
	  	buttonHTML: "<img src='http://www.northwestidx.com/images/map/zoom_select_tool_off.png' title='Start Zoom Box' />",
	  	buttonZoomingHTML: "<img src='http://www.northwestidx.com/images/map/zoom_select_tool_on.png' " 
	  		+ " title='Close Zoom Box' />&nbsp;<span style='vertical-align:top;font-size:12px;color:#ffffff;font-weight:bold;' >"
	  		+ "Click and Drag on Map to Zoom In</span>",
	  	buttonStartingStyle: {width: '32px'},
	  	overlayRemoveTime: 2000
	};

	map.addControl(new DragZoomControl(boxStyleOpts, otherOpts), new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(7,7)));
	
	
	switch(map_type)
	{
		case "road": var new_map_type = G_NORMAL_MAP; break;
		case "aerial": var new_map_type = G_SATELLITE_MAP; break;
		case "hybrid": var new_map_type = G_HYBRID_MAP; break;
		case "terrain": var new_map_type = G_PHYSICAL_MAP; break;
	}

   	mapZoom = parseInt(zoom);
	lat = parseFloat(lat);
	lng = parseFloat(lng);
   	map.setCenter(new GLatLng(lat, lng), mapZoom, new_map_type); 

	// ====== set up marker mouseover tooltip div ======
	tooltip = document.createElement("div");
	document.getElementById("map").appendChild(tooltip);
	tooltip.style.visibility="hidden";
   	// ======================================

	//GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel)	{	createMemberPoints();  	});
   	//GEvent.addListener(map, 'dragend', function(overlay, point) {  	createMemberPoints();  	});
   	GEvent.addListener(map, 'infowindowopen', function() {  	windowOpen = 1;  	});
   	GEvent.addListener(map, 'infowindowclose', function() {  	windowOpen = 0;  	});
   	GEvent.addListener(map, 'maptypechanged', function() { saveClientMapType(map.getCurrentMapType()); });
   	GEvent.addListener(map, 'moveend', function(overlay, point) { if(windowOpen == 0) { myTimeOut();  } });
	 
	if(link > 0) 
	{ 
		mapChange = 1; 
		createMemberPoints(); 
	}  	 
   	else if(loadMembers == 1) { createMemberPoints(); }
   	else if(searchTerm != "")
   	{
   		mapChange = 1;
   		createMemberPoints();	
   	}
}

function myTimeOut()
{
	if(loadMembers == 1)
	{
		if(timeOutSet == 1)
		{	window.clearTimeout(timeOutItem);	}
			
		timeOutItem = window.setTimeout("createMemberPoints()", 500);
		timeOutSet = 1;
		current_count = 0;
	}
}

function setMapCookie()
{
	createRequest();
	getURL();
	                 
	var centerLat = map.getCenter().lat();
	var centerLng = map.getCenter().lng();
	var zoomLevel = map.getZoom();
	var mapType = map.getCurrentMapType();
	
	switch(mapType)
	{
		case G_NORMAL_MAP: var temp_map_type = "road"; break;
		case G_SATELLITE_MAP: var temp_map_type = "aerial"; break;
		case G_HYBRID_MAP: var temp_map_type = "hybrid"; break;
		case G_PHYSICAL_MAP : var temp_map_type = "terrain"; break;
	}

	mapUrl = url + "&function=setClientMapData&map_lat=" + centerLat + "&map_lng=" + centerLng + "&map_zoom=" + zoomLevel + "&map_type=" + temp_map_type;
	         
	request.open("GET", mapUrl, true);
	request.send(null);
}

function createMemberPoints()
{	
	if(mapChange == 0) 
	{ 
		mapChange = 1;
		return false; 
	}
	
	if(current_count == 0)
	{
		document.getElementById("loading_image").style.display = "";
		map.clearOverlays();
		mapMarkers = new Array();
	}

	timeOutSet = 0;
	timeOutItem = "";
    	
	createRequest();
	getURL();
	
	//------START: Get Map Coord -------//
	var mapBounds = map.getBounds();
	var swBound = mapBounds.getSouthWest();
	var swLat = swBound.lat();
	var swLng = swBound.lng();
	
	var neBound = mapBounds.getNorthEast();
	var neLat = neBound.lat();
	var neLng = neBound.lng();
	
	var tempMapBounds = swLat + "|" + swLng + "|" + neLat + "|" + neLng;
	//------END: Get Map Coord -------//
	
	var centerLat = map.getCenter().lat();
	var centerLng = map.getCenter().lng();
	var centerBounds = centerLat + "|" + centerLng;
	var zoomLevel = map.getZoom();
	var mapType = map.getCurrentMapType();
	
	switch(mapType)
	{
		case G_NORMAL_MAP: mapType = "road"; break;
		case G_SATELLITE_MAP: mapType = "aerial"; break;
		case G_HYBRID_MAP: mapType = "hybrid"; break;
		case G_PHYSICAL_MAP : mapType = "terrain"; break;
	}

	mapUrl = "&function=members&mapbounds=" + tempMapBounds + "&mapCenter=" + centerBounds + "&zoomLevel=" + zoomLevel;
	mapUrl += "&mapType=" + mapType;
	
	//Get Selected Categories
	if(category != "")
	{	mapUrl += "&category=" + category;	}
	else
	{
		var selectedCategories = useCategory();
		if(selectedCategories == "" && searchTerm == "")
		{
			document.getElementById("loading_image").style.display = "none";
			document.getElementById("mapMessages").innerHTML = "Please Select a Category";
			document.getElementById("mapMessages").style.display = "";
			return false;
		}
		else if(selectedCategories != '') 
		{	
			document.getElementById("mapMessages").style.display = "none";
			mapUrl += "&category=" + selectedCategories;		
			searchTerm = "";
		}
	}
	
	//Get Selected Sub-Categories
	if(subCategory != "" || link != "")
	{	mapUrl += "&sub_category=" + subCategory;	}
	else
	{	
		var selectedSubCategories = useSubCategory();
		if(selectedSubCategories != '') 
		{	
			mapUrl += "&sub_category=" + selectedSubCategories;
			searchTerm = "";		
		}
	}
	
	mapUrl += "&count=" + current_count + "&display_count=" + display_count + "&searchTerm=" + searchTerm;
	mapUrl = url + mapUrl;
	
	if(debug == 1)
	{	document.getElementById("debug").innerHTML = mapUrl;	}
		
	request.open("GET", mapUrl, true);
	request.onreadystatechange = updateMap;
	request.send(null);
}
var testPointCount = 0;
function updateMap()
{
	if(request.readyState == 4)
	{
		var mapPoints = request.responseText;
		var tempMap = mapPoints.split("|");

		tempMap.reverse();
		var showMembers = tempMap.pop();
		var pointCount = tempMap.pop();
		var memberCount = tempMap.pop();
        

		if(showMembers == 1)
		{
			while(tempMap.length != 0)
			{
				var member_id = tempMap.pop();
               	var toolTipData = tempMap.pop();
				var lat = parseFloat(tempMap.pop());
				var lng = parseFloat(tempMap.pop());
				var memberIcon = tempMap.pop();

				map.addOverlay(createMarkerFunction(new GLatLng(lat, lng), member_id, toolTipData));
                testPointCount++;
			}
		}
		
		current_count++;
		if(memberCount > 0)
		{	createMemberPoints();	}
		else 
		{ 
			//document.getElementById("countTesting").innerHTML = "MP: " + pointCount + " -- " + testPointCount + " ";
            testPointCount = 0;
            current_count = 0;
			
			if(photosOn == 1){	addPhotoLayer();	}
			document.getElementById("loading_image").style.display = "none";
			setMapCookie();
		}
	}
}

function createMarkerFunction(point, member_id, toolTipData)
{
 	var myMarker = new GMarker(point, icon);
	myMarker.tooltip = '<div class="tooltip">' + toolTipData + '</div>';
   	GEvent.addListener(myMarker, 'click', function() { getMemberInfo(member_id); });
   	
	//======  The new marker "mouseover" and "mouseout" listeners  ======
    GEvent.addListener(myMarker,"mouseover", function() { showTooltip(myMarker); });
    GEvent.addListener(myMarker,"mouseout", function() {	tooltip.style.visibility="hidden"; });
    	
    mapMarkers[member_id] = myMarker;
   	return myMarker;
}

function getMemberInfo(member_id)
{
	getURL();
	var memberUrl = url + "&function=memberLookup&member_id=" + member_id + "&trip_id=" + trip_id;;

	request.open("GET", memberUrl, true);
	request.onreadystatechange = bubbleInfo;
	request.send(null);
}

function bubbleInfo()
{
	if(request.readyState == 4)
    {
		var mapInfo = request.responseText;
		tempMapInfo = mapInfo.split("|");
	  	var member_id = tempMapInfo[0];
	  	var member_info = tempMapInfo[3];
	  	
	  	if(map.getCurrentMapType() == G_SATELLITE_3D_MAP )
	  	{
	  		var balloon = myGEInstance.createHtmlStringBalloon('');
			balloon.setMaxWidth(400);
			balloon.setMaxHeight(300);
			// Google logo.
			balloon.setContentString(member_info);
			
			myGEInstance.setBalloon(balloon);
	  	}
	  	else
	  	{
		  	var infoTabs = "";
		  	window["infoTabs_" + member_id] = [ new GInfoWindowTab("Contact Info", member_info)];
		  	mapMarkers[member_id].openInfoWindowTabsHtml(window["infoTabs_" + member_id]);
	  	}
    }
}

function getSubCategory()
{
	var selectedCategories = useCategory();
	
	createRequest();
	getURL();
		
	var subCategoryUrl = url + "&function=subCategoryLookup&category=" + selectedCategories;
		
	request.open("GET", subCategoryUrl, true);
	request.onreadystatechange = updateSubCategory;
	request.send(null);
}

function updateSubCategory()
{
	if(request.readyState == 4)
	{
		var subCategory = request.responseText;
		subCategory = subCategory.split("|");
		
		if(subCategory[0] == 1)
		{	
			document.getElementById("subCategoriesOptions").innerHTML = "";
			document.getElementById("subCategoriesOptions").innerHTML = subCategory[1];		
		}
	}
}

function useCategory()
{	return getSelected(document.getElementById("categories").options).join("|");  	}

function useSubCategory()
{	return getSelected(document.getElementById("subCategories").options).join("|");	}


function getSelected(opt) 
{
  	var selected = new Array();
  	var index = 0;
  	for (var intLoop=0; intLoop < opt.length; intLoop++) 
  	{
  		if (opt[intLoop].selected) 
  		{
        		index = selected.length;
        		selected[index] = opt[intLoop].value;
     		}
  	}
  	
  	return selected;
}

function applyArea()
{
	mapChange = 1;
	loadMembers = 1;
	
	category = "";
	subCategory = "";
	link = "";	
	
	var newSelectedArea = document.getElementById("mapArea").selectedIndex;
	var newAreaData = document.getElementById("mapArea").options[newSelectedArea].value;	
	
	searchTerm = "";
	
	if(newSelectedArea == currentSelectedArea)
	{	createMemberPoints();	}
	else if(newAreaData != "")
	{
		currentSelectedArea = newSelectedArea;
    	newAreaData = newAreaData.split("|");

    	if(userMapType == "")
    	{
		switch(newAreaData[3])
	    	{
	    		case "road": var new_map_type = G_NORMAL_MAP; break;
	    		case "aerial": var new_map_type = G_SATELLITE_MAP; break;
	    		case "hybrid": var new_map_type = G_HYBRID_MAP; break;
    			case "terrain": var new_map_type = G_PHYSICAL_MAP; break;
	    		default: var new_map_type = G_NORMAL_MAP; break;
	    	}
    	}
    	else
    	{	var new_map_type = userMapType;	}
	
		mapZoom = parseInt(newAreaData[2]);
    	map.setCenter(new GLatLng(newAreaData[0], newAreaData[1]), mapZoom, new_map_type);
    	createMemberPoints();
	}
}

// ====== This function displays the tooltip ======
// it can be called from an icon mousover or a sidebar mouseover
function showTooltip(marker)
{
	tooltip.innerHTML = marker.tooltip;

	var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.getBounds().getSouthWest(),map.getZoom());
	var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	var anchor=marker.getIcon().iconAnchor;
	var width=marker.getIcon().iconSize.width;

	var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize((offset.x - point.x - anchor.x - 10) + width,- offset.y + point.y +anchor.y - 10));

	pos.apply(tooltip);
	tooltip.style.visibility="visible";
}

function getSubType(type_id)
{
	createRequest();
	getURL();
	typeUrl = url + "&function=subTypeLookup&type_id=" + type_id;
	request.open("GET", typeUrl, true);
	request.onreadystatechange = updateSubTypes;
	request.send(null);
}

function doSearch()
{
	var searchData = parent.categories.document.getElementById("searchText").value;
	var mapBounds = map.getBounds();

	createRequest();
	getURL();
	searchUrl = url + "&function=searchMembers&searchData=" + searchData + "&mapLocation=" + mapBounds;
	request.open("GET", searchUrl, true);
	request.onreadystatechange = updateSearch;
	request.send(null);
}


function setClearCreate()
{
	map.clearOverlays();
    createMemberPoints();
}


function checkArray(check_item, checkArray)
{
	var tempArray = new Array();

	if(checkArray.length > 1)
	{
		for(var i = 0; i <= checkArray.length; i++)
		{
        	var tempItem = checkArray.pop();

			if(tempItem != check_item)
			{	tempArray.unshift(tempItem);	}
		}

		return tempArray;
	}
	else if(checkArray.length == 1)
	{
		if(checkArray[0] == check_item)
		{	return tempArray;	}
	}
	else
	{	return tempArray;	}
}


function addToTrip(member_id, my_trip_id)
{
	getURL();
	createRequest();

    var tripUrl = url + "&function=addToTrip&member_id=" + member_id + "&trip_id=" + my_trip_id;
	request.open("GET", tripUrl, true);
	request.onreadystatechange = updateAdd2Trip;
	request.send(null);
}

function updateAdd2Trip()
{
    if(request.readyState == 4)
    {
        var data = request.responseText;
   		data = data.split("|");

		if(data[0] != 0)
		{ document.getElementById(data[1]).innerHTML = data[2];   }
    }
}

function unloadPlanner()
{
	//Destroy non-complete clients
	//Destroy trip-planner for non-complete clients
	GUnload();
}


function changeMap(type) { 	map.setMapType(type);	}

function saveClientMapType(userMapType)
{
	setMapCookie();
	mapChange = 0; //Turns OFF member reload when the map type is changed.
	
	map.removeControl(gMenu);
	gMenu = new GMenuMapTypeControl();
	
	switch(userMapType)
	{
		case G_NORMAL_MAP: var temp_map_type = "road"; break;
		case G_SATELLITE_MAP: var temp_map_type = "aerial"; break;
		case G_HYBRID_MAP: var temp_map_type = "hybrid"; break;
		case G_PHYSICAL_MAP : var temp_map_type = "terrain"; break;
	}

	getURL();
	createRequest();
    var saveClientMapTypeUrl = url + "&function=saveMapType&trip_id=" + trip_id;
   	saveClientMapTypeUrl += "&mapType=" + temp_map_type;

    request.open("GET", saveClientMapTypeUrl, true);
	request.send(null);
}


/////------------------------- START: RESIZE FUNCTIONS --------------------------------////
function resizeMap()
{
    //var newMapSize = GetMapWidth();
    //document.getElementById("map").style.width = newMapSize;
}

function GetMapWidth()
{
	var x;
	if (self.clientWidth) // all except Explorer
	{
		x = self.innerWidth;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
		// Explorer 6 Strict Mode
	{
		x = document.documentElement.clientWidth;
	}
	else if (document.body) // other Explorers
	{
		x = document.body.clientWidth;
	}

	//GetMapHeight();
	return x - 261;
}

function GetMapHeight()
{
	var tempHeight;
	if (self.innerHeight) // all except Explorer
	{
		tempHeight = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight)
		// Explorer 6 Strict Mode
	{
		tempHeight = document.documentElement.clientHeight;
	}
	else if (document.body) // other Explorers
	{
		tempHeight = document.body.clientHeight;
	}

	//tempHeight = tempHeight - 330;

	document.getElementById("dropdown-content").style.height = tempHeight - 330;
	document.getElementById("dropdown-content-info-request").style.height = tempHeight - 330;

	//x = x-300;
	//if(x<300){x=300;}
	//if(x>400){x=400;}
	//alert(x);
	//return x;
}
/////------------------------- END: RESIZE FUNCTIONS --------------------------------////
