
var MAX_CLUSTER_ZOOM = 14;
var markers = [];
var ds_map;
var geocoder;
var address;
var defaultZoomLevel = 16;
var isNewEvent = 0;
var resizeId = null;
var mapChangeId = null;
var geocoderInterval = 100;
var infowindow = new google.maps.InfoWindow();
var doDebug = 0;
var includeSecure = 0;
var includeOutOfTolerance = 0;
var includeUnknownNetworks = 0;
var showSearchResults = false;

var softGPSLat;
var softGPSLon;

var resultsPageSize=5;

window.onresize = handleResize;
function handleResize() {
	infowindow.close();
	if (!isEmptyDSObj(resizeId)) {
		clearTimeout(resizeId);
	}
	resizeId = setTimeout("doResize()", 200);
}
function handleMapEvent() {
	if (mapChangeId) {
		clearTimeout(mapChangeId);
	}
	mapChangeId = setTimeout("updateMap()", 1000);
}
function initialize() {

	document.getElementById("addressInput").value = "Enter an address";
	geocoder = new google.maps.Geocoder();
	var lat = parseFloat("37.7872696");
	var lon = parseFloat("-122.4032488");
	
	var initZoomLevel = defaultZoomLevel - 2;
	var prevloc = getCookie("dsmapcenter");
	if (!isEmptyDSObj(prevloc)) {
		var coord = prevloc.split(",");
		lat = parseFloat(coord[0]);
		lon = parseFloat(coord[1]);
		
		initZoomLevel = parseInt(coord[2]);
		defaultZoomLevel = initZoomLevel;
      // alert("going to: " + lat + " , " + lon + " zoom = " + initZoomLevel); 
	}
	
	if (getQueryVariable("lat") != null && getQueryVariable("lon") != null ) {
			lat=parseFloat(getQueryVariable("lat"));
			lon=parseFloat(getQueryVariable("lon"));
			
			softGPSLat=lat;
			softGPSLon=lon;
			initZoomLevel=16;
	}
	
	var myOptions = {zoom:initZoomLevel, center:new google.maps.LatLng(lat, lon), mapTypeId:google.maps.MapTypeId.ROADMAP};
	ds_map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
	google.maps.event.addListener(ds_map, "zoom_changed", function () {
		handleMapEvent();
	});
	google.maps.event.addListener(ds_map, "dragend", function () {
		handleMapEvent();
	});
	if (getQueryVariable("debug") != null) {
		var logDiv = document.getElementById("debugLog");
		logDiv.style.display = "block";
		doDebug = 1;
	}
	if (getQueryVariable("includeSecure") != null) {
		includeSecure = getQueryVariable("includeSecure");
	}
	if (getQueryVariable("includeOutOfTolerance") != null) {
		includeOutOfTolerance = getQueryVariable("includeOutOfTolerance");
	}
	if (getQueryVariable("includeUnknownNetworks") != null) {
		includeUnknownNetworks = getQueryVariable("includeUnknownNetworks");
	}
	createMap();
}
function createMap() {
	doResize();
	setTimeout("ds_map.setZoom(defaultZoomLevel);", 300);
}
function doResize() {
	alterSize();
	if (!isEmptyDSObj(ds_map)) {
		updateMap();
	}
}
function alterSize() {
   // not needed anymore.
	return;
}
function processResults() {
	debugLog("<BR/>processResults()");
	isNewEvent = 0;
	if (!isEmptyDSObj(dsLocSearchResults) && !(isEmptyDSObj(dsLocSearchResults.rsp)) && !(isEmptyDSObj(dsLocSearchResults.rsp.status)) && (dsLocSearchResults.rsp.status == "ok") && dsLocSearchResults.rsp.locations.count > 0) {
		resetMarkers();
	} else {
		resetMarkers();
		document.getElementById("resultsHeaderNav").innerHTML = "";
	}
}
function updateMap() {
	debugLog("<BR/>updateMap()");
	isNewEvent = 1;
	var mapWidth = document.getElementById("map_canvas").clientWidth;
	var mapHeight = document.getElementById("map_canvas").clientHeight;
	var currentZoom=ds_map.getZoom();
	if (!isEmptyDSObj(infowindow)) {
		infowindow.close();
	}
	if (!isEmptyDSObj(ds_map) && !isEmptyDSObj(ds_map.getBounds())) {
		var dsMapCenter = ds_map.getCenter();
		
		if (!isEmptyDSObj(dsMapCenter) && !isEmptyDSObj(ds_map)) {
			setCookie("dsmapcenter", dsMapCenter.lat() + "," + dsMapCenter.lng() + "," + ds_map.getZoom(), 7);
		}
		
		if (softGPSLat != null && softGPSLon != null ) {
			var latlon = new google.maps.LatLng(softGPSLat, softGPSLon);
			var markerIcon=new google.maps.MarkerImage("/images/locator_icon.png");
			var marker = new google.maps.Marker({position:latlon, map:ds_map, icon:markerIcon});
		}
		
		var dsMapSW = ds_map.getBounds().getSouthWest();
		var dsMapNE = ds_map.getBounds().getNorthEast();
		var needAcctFlg = document.getElementById("NeedAcct");
		var extFlg = "0";
		if (needAcctFlg.checked == 1) {
			extFlg = "1";
		}
        
        var getSecureLocations=0;
        if(currentZoom>15 && includeSecure==true)
        {
        	getSecureLocations=1;
        }
        
        var getOutofTolerance=0;
        if(currentZoom>15 && includeOutOfTolerance==true)
        {
        	getOutofTolerance=1;
        }
        
        var getUnknownNetworks=0;
        if(currentZoom>15 && includeUnknownNetworks==true)
        {
        	getUnknownNetworks=1;
        }
        
        debugLog("mapWidth"+mapWidth+" mapHeight"+mapHeight+"Bounds:"+dsMapSW.lat()+" "+dsMapSW.lng()+" "+ dsMapNE.lat()+" "+ dsMapNE.lng());
	   //Get Locations
		locations_get("", "json", "e179db201ce59cedb264da1bfd86282cec8634d6", "", "", "", dsMapCenter.lat(), dsMapCenter.lng(), mapWidth, mapHeight, "1", "65", dsMapSW.lat(), dsMapSW.lng(), dsMapNE.lat(), dsMapNE.lng(), extFlg, "", getSecureLocations, getOutofTolerance, getUnknownNetworks);
	}
}
function resetMarkers() {
	debugLog("resetMarkers");
	removeMarkers();
	geocoderInterval = 100;
	renderMarkers();
}
function removeMarkers() {
	debugLog("removeMarkers");
	resetNavBar();
	for (var i = 0; i < markers.length; i++) {
		var marker = markers[i][0];
		marker.setMap(null);
	}
	markers = [];
}
function resetNavBar() {
	debugLog("resetNavBar");
	document.getElementById("searchResults").innerHTML = "";
	document.getElementById("resultsHeaderNav").innerHTML = "";
}
function renderMarkers() {
	var markersPresent = false;
	debugLog("renderMarkers");
	var zoomlevel = ds_map.getZoom();
	debugLog("zoomlevel:"+zoomlevel);
	
	var currentLocation;
	if (isNewEvent == 1) {
		resetNavBar();
		return;
	}
	if (!isEmptyDSObj(dsLocSearchResults) && !isEmptyDSObj(dsLocSearchResults.rsp) && !isEmptyDSObj(dsLocSearchResults.rsp.locations) && !isEmptyDSObj(dsLocSearchResults.rsp.locations.count) && dsLocSearchResults.rsp.locations.count > 0) {
		if (dsLocSearchResults.rsp.locations.count > 1 && !isEmptyDSObj(dsLocSearchResults.rsp.locations.location)) {
			do {
				currentLocation = dsLocSearchResults.rsp.locations.location.pop();
				var currentLocationType=currentLocation.type;
				if (!isEmptyDSObj(currentLocationType) &&  currentLocationType=="venue"){
					markersPresent = true;
					renderMarker(currentLocation);
				} else {
					renderCluster(currentLocation);
				}
			} while (dsLocSearchResults.rsp.locations.location.length != 0);
			if (dsLocSearchResults.rsp.locations.location.length == 0) {
				dsLocSearchResults = null;
			}
		} else {
			currentLocation = dsLocSearchResults.rsp.locations.location;
			var currentLocationType=currentLocation.type;
			var latlng = new google.maps.LatLng(parseFloat(currentLocation.lat), parseFloat(currentLocation.long));
			if (!isEmptyDSObj(currentLocationType) && currentLocationType=="venue"){
				markersPresent = true;
				renderMarker(currentLocation);
			} else {
				renderCluster(currentLocation);
			}
			dsLocSearchResults = null;
		}
	} else {
		dsLocSearchResults = null;
	}
    if (showSearchResults == true) {
    	if (markersPresent) {
    	    getMoreResults(1);
    	}
    	else {
			document.getElementById("searchResults").innerHTML='<div id="searchHolder"><div id="holderHeadLeft"><img src="images/cluster_ring_simple.png" width="25" /></div><div id="holderHeadText">Please click on the icon to zoom in and get address information.</div></div>';
			document.getElementById("resultsHeaderNav").innerHTML='';
    	}
    }
}
function renderCluster(currentLocation) {
	var markerIcon = renderIcon(currentLocation);
	var lat = parseFloat(currentLocation.lat);
	var lon = parseFloat(currentLocation.long);
	var latlon = new google.maps.LatLng(lat, lon);
	if (!isEmptyDSObj(markerIcon)) {
		var marker = new google.maps.Marker({position:latlon, map:ds_map, icon:markerIcon, title:"Please click to zoom"});
		var pos = markers.length;
		var addressInfo = "";
		var imgInfo = "<img src=\"" + renderImageReference(currentLocation) + "\" width=\"25\" />";
		var networkInfo = getTitleSubtitleString(currentLocation.title,currentLocation.subtitle, '<BR/>');
		var searchInfo = "";
		var bubbleInfo = "";
		var markerInfo = new Array();
		markerInfo[0] = marker;
		markerInfo[1] = bubbleInfo;
		markers[pos] = markerInfo;
		google.maps.event.addListener(marker, "click", function () {
			handleMarkerClick(pos);
		});
		document.getElementById("resultsHeaderNav").innerHTML = "";
	}
}
function renderMarker(currentLocation) {
	var markerIcon = renderIcon(currentLocation);
	var shadowReference=renderShadowReference(currentLocation);
	var lat = parseFloat(currentLocation.lat);
	var lon = parseFloat(currentLocation.long);
	var latlon = new google.maps.LatLng(lat, lon);
	
	if (!isEmptyDSObj(markerIcon)) {
		var markerTitle=getTitleSubtitleString(currentLocation.title,currentLocation.subtitle, ' - ');
		
		var marker = new google.maps.Marker({position:latlon, map:ds_map, icon:markerIcon, title:decode(markerTitle),shadow:shadowReference});
		var pos = markers.length;
		var addressInfo = "<div id='addr_" + pos + "' style='overflow: hidden; width: 150px; height: 47px;'></div>";
		var imgInfo = "<img src=\"" + renderImageReference(currentLocation) + "\" width=\"25\"/>";
		var networkInfo = getTitleSubtitleString(currentLocation.title,currentLocation.subtitle, '<BR/>');
		var searchInfo = "<div id=\"searchHolder\" onclick=\"javascript:handleMarkerClick(" + pos + ");\"><div id=\"holderHeadLeft\">" + imgInfo + "</div><div id=\"holderHeadText\"><span>" +getTitleSubtitleString(currentLocation.title,'', '<BR/>') + "</span><BR/>";
		var bubbleInfo = "<div id=\"location\"><div id=\"holderHeadLeft\">" + imgInfo + "</div><div id=\"holderHeadText\"><span>" + networkInfo + "</span><BR/>" + addressInfo + "</div></div>";
		var markerInfo = new Array();
		var venueAddress = currentLocation.venue.venue_address;
		markerInfo[0] = marker;
		markerInfo[1] = bubbleInfo;
		markerInfo[2] = searchInfo;
		markerInfo[3] = venueAddress;
		markers[pos] = markerInfo;
		google.maps.event.addListener(marker, "click", function () {
			handleMarkerClick(pos);
		});
	}
}

function decode(txt){
  var sp = document.createElement('span');
  sp.innerHTML = txt;
  return sp.innerHTML;
}

function getTitleSubtitleString(title,subtitle, delimiter){
	var titleSubtitleString="";
	var isTitleGood=!(title=='' || title.length==0);
	var isSubtitleGood=!(subtitle=='' || subtitle.length==0);
	
	if(!isTitleGood && !isSubtitleGood)
		return titleSubtitleString;
	
	if(title == subtitle){
		 return title;
	}
	else if(!isTitleGood){
		titleSubtitleString=subtitle;
	}
	else if(!isSubtitleGood){
		titleSubtitleString=title;
	}
	else {
		titleSubtitleString = (title +delimiter+subtitle);
	}
	return unescape(titleSubtitleString);
}
function getMoreResults(start) {
	document.getElementById("searchResults").innerHTML = "";
	var prevText = "";
	var nextText = "";
	var endIndex=resultsPageSize-1;
	var div = document.getElementById("searchResults");
	for (var i = start - 1; i < (start + endIndex); i++) {
		if (i >= markers.length) {
			break;
		}
		div.innerHTML += "<div id=\"searchResult" + i + "\"></div>" ;
		var address = markers[i][3];

		if(isEmptyDSObj(address)) {
     			displaySearchResult(i, "Loading...");
     			setTimeout("getSearchResult(" + i + ")", 100);
		} else {
     			displaySearchResult(i, address);
		}
	}
	if (start > 1) {
		prevText = "<div id=\"holderHeadLeft\" onclick=\"javascript:getMoreResults(" + (start - resultsPageSize) + ");\"> << Prev </div>";
	}
	if (((start - 1) + resultsPageSize) < markers.length) {
		nextText = "<div id=\"holderHeadRight\" onclick=\"javascript:getMoreResults(" + (start + resultsPageSize) + ");\" style=\"text-align:center;\"> Next >> </div>";
	}
	document.getElementById("resultsHeaderNav").innerHTML = "<div id=\"resultsHeader\">" + prevText + nextText + "</div><div id=\"clear\">&nbsp;</div>";
}
function displaySearchResult(indx, address) {
	var div = document.getElementById("searchResult" + indx);
	var searchInfo=markers[indx][2];
	div.innerHTML = (searchInfo+address+"</div></div>");
}
function getSearchResult(indx) {
	var m = markers[indx][0];
	geocoder.geocode({"latLng":m.getPosition()}, function (geocoderResults, status) {
		if (status == google.maps.GeocoderStatus.OK) {
			markers[indx][3] = geocoderResults[0].formatted_address;
			displaySearchResult(indx, markers[indx][3]);
		} else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
			if (markers[indx][4] == undefined)
				markers[indx][4] = 1;
			else
				markers[indx][4] += 1;

			if (markers[indx][4] < 5) {
     				setTimeout("getSearchResult(" + indx + ")", 2000 + 1000 * markers[indx][4]);
			} else {
				displaySearchResult(indx, "Address unavailable.");
			}
		}
	});
}
function renderIcon(currentLocation) {
	var imageRef = renderImageReference(currentLocation);
	var zoomlevel = ds_map.getZoom();
	if (!isEmptyDSObj(imageRef)) {
		var currentLocationType=currentLocation.type;
		if (!isEmptyDSObj(currentLocationType) &&  currentLocationType=="venue"){			
			return new google.maps.MarkerImage(imageRef, new google.maps.Size(50, 50), new google.maps.Point(0, 0), new google.maps.Point(25, 25));
		} else {
			return new google.maps.MarkerImage(imageRef);
		}
	} else {
		return "";
	}
}
function renderImageReference(currentLocation) {
	var score = currentLocation.score;
	var count = currentLocation.count;
	var extendedFlg = (!isEmptyDSObj(currentLocation.extended)) ? new Number(currentLocation.extended) : new Number(0);
	var zoomlevel = ds_map.getZoom();
	var imagePathPrefix = "images/";
	var imageFile = "";
	var currentLocationType=currentLocation.type;
	if (!isEmptyDSObj(currentLocationType) &&  currentLocationType=="venue"){			
		if (extendedFlg ==0) {
			if (score > 6) {
				imageFile = "blue_pin_3.png";
			} else {
				if (score > 3) {
					imageFile = "blue_pin_2.png";
				} else {
					if (score > 0) {
						imageFile = "blue_pin_1.png";
					} else {
						imageFile = "blue_pin_0.png";
					}
				}
			}
		} else {
			if (score > 6) {
				imageFile = "red_pin_3.png";
			} else {
				if (score > 3) {
					imageFile = "red_pin_2.png";
				} else {
					if (score > 0) {
						imageFile = "red_pin_1.png";
					} else {
						imageFile = "red_pin_0.png";
					}
				}
			}
		}
	} else {
		imageFile = "cluster_ring_simple.png";
	}
	return isEmptyDSObj(imageFile) ? "" : (imagePathPrefix + imageFile);
}
function renderShadowReference(currentLocation) {
	var score = currentLocation.score;
	var count = currentLocation.count;
	var extendedFlg = (!isEmptyDSObj(currentLocation.extended)) ? new Number(currentLocation.extended) : new Number(0);
	var zoomlevel = ds_map.getZoom();
	var imagePathPrefix = "images/";
	var imageFile = "";
	var currentLocationType=currentLocation.type;
		if (!isEmptyDSObj(currentLocationType) &&  currentLocationType=="venue"){			
			if (score > 6) {
				imageFile = "pin_shadow_3.png";
			} else {
				if (score > 3) {
					imageFile = "pin_shadow_2.png";
				} else {
					if (score > 0) {
						imageFile = "pin_shadow_1.png";
					} else {
						imageFile = "pin_shadow_0.png";
					}
				}
			}
		}
	return isEmptyDSObj(imageFile) ? "" : (imagePathPrefix + imageFile);
}
function handleMarkerClick(indx) {
	var markerInfo = markers[indx];
	var m = markerInfo[0];
	var bubbleInfo = markerInfo[1];

	if (bubbleInfo != "") {
		showInfoWindow(indx);
	} else {
		var zoomlevel = ds_map.getZoom();
		var newZoomLevel = ds_map.getZoom() + 3;
		if (newZoomLevel > MAX_CLUSTER_ZOOM) {
			newZoomLevel = MAX_CLUSTER_ZOOM + 1;
		}
		ds_map.setCenter(m.getPosition());
		ds_map.setZoom(newZoomLevel);
	}
}
function showInfoWindow(indx) {
	if (!isEmptyDSObj(infowindow)) {
		infowindow.close();
	} else {
		return;
	}
	var markerInfo = markers[indx];
	var m = markerInfo[0];
	var p = markerInfo[1];
	infowindow.setContent(p);
	infowindow.open(ds_map, m);
	setTimeout("geocodeAddress(" + indx + ")", 100);
}
function geocodeAddress(indx) {
	var m = markers[indx][0];
	var venueAddress = markers[indx][3];
	var divid = "addr_" + indx;
	var div = document.getElementById(divid);
	if (isEmptyDSObj(div)) {
		setTimeout("geocodeAddress(" + indx + ")", 100);
		return;
	}
	if (!isEmptyDSObj(venueAddress)) {
		geocoder.geocode({"address":venueAddress}, function (geocoderResults, status) {
			var divid = "addr_" + indx;
			var div = document.getElementById(divid);
			div.innerHTML = geocoderResults[0].formatted_address;
		});
	}
	else {
		geocoder.geocode({"latLng":m.getPosition()}, function (geocoderResults, status) {
			var divid = "addr_" + indx;
			var div = document.getElementById(divid);
			div.innerHTML = geocoderResults[0].formatted_address;
		});
	}
	
}
function debugLog(newLog) {
	if (doDebug == 1) {
		document.getElementById("debugLog").innerHTML += newLog + "<br/>";
	}
}
function clearDebugLog() {
	document.getElementById("debugLog").innerHTML = "<a href=\"javascript:clearDebugLog();\">Clear</a><br/>";
}
function processDefaultAddress() {
	document.getElementById("addressInput").value = "900 Cherry Ave, San Bruno, ca";
	processAddress();
}
function processAddress() {
	var targetAddress = document.getElementById("addressInput").value;
	if (isEmptyDSObj(targetAddress) || targetAddress == "Enter an address") {
		alert("Please enter a valid address");
		return;
	}
	if (geocoder) {
		geocoder.geocode({"address":targetAddress}, function (results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
				if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
					if (!isEmptyDSObj(results[0].geometry.location)) {
						ds_map.setCenter(results[0].geometry.location);
					}
					if (!isEmptyDSObj(results[0].geometry) && !isEmptyDSObj(results[0].geometry.bounds)) {
						ds_map.fitBounds(results[0].geometry.bounds);
					} else {
				                         	//Update the map anyways even if the bounds are not there..Instead of showing a blank map
						updateMap();
					}
				} else {
					alert("No search results. Please try again.");
				}
			} else {
				debugLog("Geocode was not successful for the following reason: " + status);
				alert("No search results. Please try again.");
			}
		});
	}
}
function isEnterKeyPressed(field, e) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	} else {
		if (e) {
			keycode = e.which;
		} else {
			return true;
		}
	}
	if (keycode == 13) {
		processAddress();
		return false;
	} else {
		return true;
	}
}
function toggleNeedAccount() {
	updateMap();
}
function getQueryVariable(variable) {
	var query = window.location.search.substring(1);
	var vars = query.split("&");
	for (var i = 0; i < vars.length; i++) {
		var pair = vars[i].split("=");
		if (pair[0] == variable) {
			return pair[1];
		}
	}
	return null;
}
function getCookie(c_name) {
	var c_start;
	var c_end;
	if (document.cookie.length > 0) {
		c_start = document.cookie.indexOf(c_name + "=");
		if (c_start != -1) {
			c_start = c_start + c_name.length + 1;
			c_end = document.cookie.indexOf(";", c_start);
			if (c_end == -1) {
				c_end = document.cookie.length;
			}
			return unescape(document.cookie.substring(c_start, c_end));
		}
	}
	return "";
}
function setCookie(c_name, value, expiredays) {
	var exdate = new Date();
	exdate.setDate(exdate.getDate() + expiredays);
	document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : "; expires=" + exdate.toGMTString());
}
function checkCookie() {
	username = getCookie("username");
	if (username != null && username != "") {
		debugLog("Welcome again " + username + "!");
	}
}
function toggleSearchBar() {
	debugLog("center b4 searchResults"+ds_map.getCenter());
    if (showSearchResults == false) {
        document.getElementById("map-menu").style.width = '600px';
        document.getElementById("map_canvas").style.width = '600px';
        document.getElementById("searchTab").style.right = '250px';
        document.getElementById("searchResultsPane").style.display = 'block';
        showSearchResults = true;
        debugLog("center after searchResults"+ds_map.getCenter());
    } else {
        document.getElementById("map-menu").style.width = '850px';
        document.getElementById("map_canvas").style.width = '850px';
        document.getElementById("searchTab").style.right = '0px';
        document.getElementById("searchResultsPane").style.display = 'none';
        showSearchResults = false;
     }
     //Center and trigger resize event for google
     var center = ds_map.getCenter();
     google.maps.event.trigger(ds_map, 'resize');
     ds_map.setCenter(center);
     
     doResize();
}

