// Global vars
var gMap;
var gMarkers = new Object();
var gCurrMarker, gBusyMarker, gSpotmeMarker, gDnArrowMarker;
var gMarkerMgr;
var gMapAction;
var gBusyIcon, gHomeIcon, gZoomIcon, gDnArrow, gSpotmeIcon;
var gHomeMarker;
var gGeocoder;
var gStreetLevelZoom=15;
var gCurrTabIndex=0;
var GRID_SIZE=4;
var gZoomInPoint;
var gPrevBounds=null;
var gIsInfoOpen=false;
var gTabNo=0;
var gMtypes=new Object();
var gNumPages=0;
var gInfoOpenCenter=null;
var gshowmarkerid=null;
var gEditMarker=null;
var gSubType=null;
var gSelTypeid=null;
// only fit the bounds the first time the page is refreshed.
// donot fit the bounds on subsequent map activities such as pan or zoom
var gFitBounds=true;
var gWards=new Object();

var btnMsg = new Array()
btnMsg[1] = "Now find your home location on the map and click to set it."
btnMsg[2] = "Now click on the map to place the marker."
var gSpotmeText=null;

function SubType(id, title, ispublic, grouptype) {
this.typeid = id;
this.title = title;
this.ispublic = ispublic;
this.grouptype = grouptype;
}

function setMapAction(n) {
	gMapAction = n;
	var msg;
	var clear='';
	if (n == 1 && !gUserInfo) {
		msg = '<span style="margin:5px;">You will need to login before using this feature.<br>&nbsp;Click <a href="local/login/">here</a> to login.<br>&nbsp;Click <a href="signup.php">here</a> to signup for a FREE account.</span>';
		clear='clearBtns();';
	} else if (n == 1 && gUserInfo != null && gUserInfo.homelat != "" && gUserInfo.homelng != "") {
		go2Spotme(new GLatLng(gUserInfo.homelat, gUserInfo.homelng));
		return;
	} else {
		msg = btnMsg[n];
	}
	win.populate(msg);
	win.offsetY = 30;
	win.offsetX = 5;
	win.showPopup('btnMessage');
	setTimeout('win.hidePopup();'+clear, 3000);;
}

function getMM() {
	if (!gMarkerMgr || gMarkerMgr == undefined) {
		gMarkerMgr = new MarkerManager(gMap);
	}
	return gMarkerMgr;
}

function placeItFinalize() {
	gMap.closeInfoWindow();
	if (gCurrMarker) {
		gMap.setCenter(gCurrMarker.getPoint(), 16);
	}
	removeIt(); // remove the temp marker
	var dropdown = document.addPlaceForm.addplacetype;
	var typeid = dropdown.options[dropdown.selectedIndex].value;
	if (typeid != "") { gSelTypeid = typeid; }
//	showMsg('Marker was successfully added.');
	// Refresh the Map
	refreshMap();
}

function showAddPlace(flag) {
var div = document.getElementById("addplace");
if (!div || div == undefined) { return; }
if (flag) {
	div.style.display = "block";
	tinyMCE_geckoFix();
}
else { div.style.display = "none"; }
}

function removeIt() {
	showAddPlace(false);
	if (gCurrMarker) {
		gCurrMarker.remove();
		gCurrMarker=null;
	}
}

// convert the markerId number into a text value - otherwise the array size becomes from [0] to [highest-marker-id]
function getIndex(num) {
	return 'm'+num;
}

function fillMarkerInfoSync(markerId) {
	var action = "getMarkerInfo.php";
	makeSyncRequest(action, "mid="+markerId, function(data) {
		var elem = document.getElementById("markerInfo");
		if (elem) elem.innerHTML = data;
		linkhtml = '[&nbsp;<a href="javascript:{};" onclick="javascript:gMap.closeInfoWindow();">Close</a>&nbsp;]';
		var zoomhtml="";
		if (gMap.getZoom() <= gStreetLevelZoom) {
			gZoomInPoint = marker.getPoint();
			linkhtml += '&nbsp;&nbsp;[&nbsp;<a href="javascript:{};" onclick="javascript:zoomtostreet();">Zoom to Street Level</a>&nbsp;]';
		}
		var edithtml="";
		if (gUserInfo != null && marker.createdby == gUserInfo.userid) {
			gEditMarker = marker;
			linkhtml += '&nbsp;&nbsp;[&nbsp;<a href="javascript:{};" onclick="javascript:editmarker();">Edit Me</a>&nbsp;]';
		}
		var infoHtml = '<div id="markerInfo" class="infoWindow">'+data+'</div><div class="infolinks">'+linkhtml+'</div>';
		var revwHtml = '<div id="reviewInfo" class="infoWindow">'+getLoadingHTML()+'</div>';
		var infoTabs = [
			new GInfoWindowTab("Info", infoHtml),
			new GInfoWindowTab("Reviews", revwHtml)
		];
		marker.openInfoWindowTabsHtml(infoTabs);
		fillReviewInfo(markerId);
	});
}

function fillMarkerInfo(markerId) {
	var action = "getMarkerInfo.php";
	makeSyncRequest(action, "mid="+markerId, function(data) {
		var elem = document.getElementById("markerInfo");
		if (elem) elem.innerHTML = data;
	});
}

function addResponseSuccess(markerId) {
	setTimeout('fillMarkerInfo('+markerId+')', 1000);;
}

function addReviewSuccess(markerId) {
	setTimeout('fillReviewInfo('+markerId+')', 1000);;
}

function setUserHomeLocation(lat, lng) {
	GDownloadUrl("saveHomeLocation.php?lat="+lat+"&lng="+lng, function(data, responseCode) {
		// show the spotmeurl
		spotmeClick();
	});
}

function fillReviewInfo(markerId) {
	GDownloadUrl("getReviewInfo.php?mid="+markerId, function(data, responseCode) {
		document.getElementById("reviewInfo").innerHTML = data;
	});
}

function showarrow(flag, num) {
	if (num == undefined) { return; }
	marker = gMarkers[getIndex(num)];
	if (marker == undefined) { return; }
	if (flag) {
		gDnArrowMarker = new GMarker(marker.getPoint(), gDnArrow);
		gDnArrowMarker.markerId = num;
		gMap.addOverlay(gDnArrowMarker);
	} else {
		gDnArrowMarker.remove();
	}
}

function showgrouparrow(flag, num) {
	if (num == undefined) { return; }
	marker = gMarkers[getIndex(num)];
	if (marker == undefined) { return; }
	if (flag) {
		gDnArrowMarker = new GMarker(marker.getPoint(), gDnArrow);
		gMap.addOverlay(gDnArrowMarker);
	} else {
		gDnArrowMarker.remove();
	}
}

function markerClick(num) {
	if (num == undefined) { return; }
	marker = gMarkers[getIndex(num)];
	if (!marker) {
		alert("marker #"+num+" not found");
		return;
	}
	if (gTabNo == 1) {
		linkhtml = '[&nbsp;<a href="javascript:{};" onclick="javascript:gMap.closeInfoWindow();">Close</a>&nbsp;]';
		if (gMap.getZoom() <= gStreetLevelZoom) {
			gZoomInPoint = marker.getPoint();
			linkhtml += '&nbsp;&nbsp;[&nbsp;<a href="javascript:{};" onclick="javascript:zoomtostreet();">Zoom to Street Level</a>&nbsp;]';
		}
		var infoHtml = '<div id="markerInfo" class="infoWindow">'+getLoadingHTML()+'</div><div class="infolinks">'+linkhtml+'</div>';
		marker.openInfoWindowHtml(infoHtml);
		setTimeout('fillMarkerInfo('+num+')', 500);
	} else {
		fillMarkerInfoSync(num);
	}
}

function editmarker() {
gMap.closeInfoWindow();
if (!gEditMarker) { alert("Edit not available right now. Please try again later"); return; }

fillMtypes();
showAddPlace(true);
document.getElementById("placetitle").innerHTML="Edit Place";
document.addPlaceForm.typeid.value=gEditMarker.typeid;
document.addPlaceForm.title.value=gEditMarker.title;
tinyMCE_setDetails(gEditMarker.details);
document.addPlaceForm.submitplace.value="Update";
document.addPlaceForm.markerid.value=gEditMarker.markerId;

gEditMarker=null;
}

function homeMarkerClick(marker) {
	var infoHtml = '<div id="markerInfo" class="infoWindow">'+getLoadingHTML()+'</div>';
	marker.openInfoWindowHtml(infoHtml);
	GDownloadUrl("getHomeMarkerInfo.php", function(data, responseCode) {
		document.getElementById("markerInfo").innerHTML = data;
	});
}

function showLoginReqd() {
	gMapAction = 0;
	createWindow('<b>Signup Required</b>', 320, '#f6f494', 1, 0, 100, 175);
}

function showMapLoading(flag) {
/*
	if (flag) showMsg("Loading, please wait...");
	else showMsg("Ready");
*/
	if (flag) {
		gBusyMarker = new GMarker(gMap.getCenter(), gBusyIcon);
		gMap.addOverlay(gBusyMarker);
	} else {
		// add a little delay before removing the busy-marker
		setTimeout('removeBusyMarker()', 600);
	}
}

function removeBusyMarker() {
	gBusyMarker.remove();
}

function addPlace(point) {
	var mType = 1;
	if (gTabNo == 1) { mType = 2; }

	// add temp marker
	var markerType = gMtypes[mType];
	var icon=null;
	if (markerType != null) {
		icon = markerType.icon;
	}
	gCurrMarker = new GMarker(point, icon);
	gMap.addOverlay(gCurrMarker);
	// end add temp marker

fillMtypes();
document.getElementById("placetitle").innerHTML="Add Place";
document.addPlaceForm.submitplace.value="Place It";
document.addPlaceForm.markerid.value="";
	document.addPlaceForm.lat.value=point.lat();;
	document.addPlaceForm.lng.value=point.lng();;
	document.addPlaceForm.title.value="";
	showAddPlace(true);
tinyMCE_setDetails('<p>Please select a Type from the dropdown list above</p>');
typeidchange();
}

function addMessage(point) {
	var mType = 2;
	var markerType = gMtypes[mType];
	var icon=null;
	if (markerType != null) {
		icon = markerType.icon;
	}
	gCurrMarker = new GMarker(point, icon);
	gMap.addOverlay(gCurrMarker);
	var infoHtml = '<div id="placeitdiv" class="infoWindow">'+getLoadingHTML()+'</div>';
	gCurrMarker.openInfoWindowHtml(infoHtml);
	var action = "getPostitForm.php";
	GDownloadUrl(action+"?lat="+point.lat()+'&lng='+point.lng(), function(data, responseCode) {
		document.getElementById("placeitdiv").innerHTML = data;
	});
}

function tinyMCE_setDetails(html) {
var inst = tinyMCE.getInstanceById('map_details');
if (inst) {
inst.setContent(html);
}
}

function typeidchange() {
	var dropdown = document.addPlaceForm.addplacetype;
	var typeid = dropdown.options[dropdown.selectedIndex].value;
	GDownloadUrl("getTypeHtml.php?typeid="+typeid, function(data, responseCode) {
		tinyMCE_setDetails(data);
	});
}

function fillMtypes() {
	var dropdown = document.addPlaceForm.addplacetype;
	dropdown.options.length=0;
	dropdown.options[dropdown.options.length]=new Option("Select", "");
	var selIndex = -1;
	var isGroupAdded=false;
	for (typeid in gMtypes) {
		markerType = gMtypes[typeid];
		if (markerType.ispublic == "0") { continue; }
		if (typeid == "0") { continue; }
		var index = dropdown.options.length;
		dropdown.options[index]=new Option(markerType.title, typeid);
//U		if (gSubType && gSubType.typeid == typeid) { selIndex = index; }
		if (typeid == gSelTypeid) { selIndex = index; }
		if (gSubType && gSubType.typeid == typeid) { isGroupAdded = true; }
	}
	if (gSubType && !isGroupAdded) {
		index = dropdown.options.length;
		dropdown.options[index]=new Option(gSubType.title, gSubType.typeid);
	}
	if (selIndex == -1) {
		if (gSelTypeid == "0") { selIndex = 0; }
		else if (gSubType) { selIndex = dropdown.options.length-1; }
		else { selIndex = 0; }
	}
	dropdown.selectedIndex = selIndex;
	if (gSubType) { dropdown.disabled = true; }
}

function fillCtg() {
//	GDownloadUrl('/getMarkerTypes.php', function(data, responseCode) {
	makeSyncRequest("getMarkerTypes.php", "", function(data) {
		var xml = GXml.parse(data);
		var markerTypes = xml.documentElement.getElementsByTagName("markertype");
		setMarkerTypes(markerTypes);
	});
}

function groupPlaceitClick(markerId) {
	if (markerId == undefined) { return; }
	marker = gMarkers[getIndex(markerId)];
	if (marker) {
		gZoomInPoint = marker.getPoint();
		/*
		var html = '<div class="groupInfoWindow">There are <b>'+marker.total+'</b> markers in this group. Please <a href="javascript:groupZoomIn();">zoom in</a> to view them.<br></div>';
		marker.openInfoWindowHtml(html);
		*/
		groupZoomIn();
	}
}

function zoomtostreet() {
	if (gMap && gZoomInPoint) {
		gMap.closeInfoWindow();
		gMap.setCenter(gZoomInPoint, gStreetLevelZoom+1);
	}
}

function groupZoomIn() {
	if (gMap && gZoomInPoint) {
		gMap.closeInfoWindow();
		var z = gMap.getZoom();
		var inc = 1;
//		if (z < 9) { inc = 4; }
//		else
		if (z < 14) { inc = 2; }
		inc = 1;
		gMap.setCenter(gZoomInPoint, gMap.getZoom()+inc);
	}
}

function showBounds(x1,y1,x2,y2,xinc,yinc) {
	for (var x=x1; x<x2; x+=xinc) {
		for (var y=y1; y<y2; y+=yinc) {
			var points = [];
			points.push(new GLatLng(x,y));
			points.push(new GLatLng(x+xinc,y));
			points.push(new GLatLng(x+xinc,y+yinc));
			points.push(new GLatLng(x,y+yinc));
			points.push(new GLatLng(x,y));

			points.sort(function(p1, p2) {
				return p1.lng() - p2.lng();
			});
			gMap.addOverlay(new GPolyline(points, '#ff0000'));
		}
	}
}

function nodeValue(node) {
	if (node.textContent) { return node.textContent; }
	else { return node.text; }
}

function setMarkerTypes(mtypes) {
	if (!mtypes) { return; }
	gMtypes = new Object();
	for (var i = 0; i < mtypes.length; i++) {
		var mtype = mtypes[i];
		var typeid = mtype.getAttribute("id");
		var title = mtype.getAttribute("title");
		var hasreview = mtype.getAttribute("hasreview");
		var hasdiscussion = mtype.getAttribute("hasdiscussion");
		var ispublic = mtype.getAttribute("ispublic");
		var grouptype = mtype.getAttribute("grouptype");

		var markertype = new MarkerType(typeid, title, hasreview, hasdiscussion, ispublic);
		gMtypes[typeid] = markertype; // store in global array

		var nodes = mtype.childNodes;
		var iconurl,iconsz,iconshdurl,iconshdsz;
		for (var j=0; j<nodes.length; j++) {
			if (nodes[j].nodeName == "iconurl") { iconurl = nodeValue(nodes[j]); }
			if (nodes[j].nodeName == "iconsz") { iconsz = nodeValue(nodes[j]); }
			if (nodes[j].nodeName == "iconshdurl") { iconshdurl = nodeValue(nodes[j]); }
			if (nodes[j].nodeName == "iconshdsz") { iconshdsz = nodeValue(nodes[j]); }
		}
		if (iconurl && iconsz) {
			markertype.seticon(createIcon(iconurl,iconsz,iconshdurl,iconshdsz));
		}
	}
}

function createIcon(url, size, shdurl, shdsize) {
	if (!url || !size) { return null; }
	var gicon = new GIcon();
	gicon.image = url;
	var arr = size.split(',');
	var w = parseInt(arr[0]);
	var h = parseInt(arr[1]);
	gicon.iconSize = new GSize(w,h);
	gicon.iconAnchor = new GPoint(w/2, h/2);
	gicon.infoWindowAnchor = new GPoint(w/2, 1);
	if (shdurl && shdsize) {
		gicon.shadow = shdurl;
		arr = shdsize.split(',');
		w = parseInt(arr[0]);
		h = parseInt(arr[1]);
		gicon.shadowSize = new GSize(w,h);
	}
	return gicon;
}

// ajax/getMarkers.php?b=37.365246,-122.257576,37.51844,-122.026176&z=12?=0.030638900200
function displayMarkers(x1, y1, x2, y2, xinc, yinc) {
	if (!gMap) { return; }
var fitBounds=null;

	gNumPages=0;
	var action = "getMarkers.php";
	if (gTabNo == 1) { action = "getChatter.php"; }
	var gm=1; // get markertypes
	if (gMtypes[1] != null) { gm=0; } // if markertypes already in memory - dont refetch

	var sm="";
	if (gshowmarkerid!=null) { sm=gshowmarkerid; }
//	showMsg('getMarkers.php?tid='+gMtype+'&gm='+gm+'&a='+getRandomStr()+'&b='+x1+','+y1+','+x2+','+y2+'&z='+gMap.getZoom()+'&xi='+xinc+'&yi='+yinc+'&pg='+gCurrPg);

//  add tid parameter here in the future to select specific places
//  by default - dont set tid so as to get all the places
//	showMsg('getMarkers.php?gm='+gm+'&a='+getRandomStr()+'&b='+x1+','+y1+','+x2+','+y2+'&z='+gMap.getZoom()+'&xi='+xinc+'&yi='+yinc+'&pg='+gCurrPg+'&sm='+sm);
	showMapLoading(true);
	var params = 'gm='+gm;
	params += '&a='+getRandomStr();
	params += '&b='+x1+','+y1+','+x2+','+y2;
	params += '&z='+gMap.getZoom();
	params += '&xi='+xinc;
	params += '&yi='+yinc;
	params += '&pg='+gCurrPg;
	params += '&sm='+sm;
	if (gFitBounds && gSubType != null && sm == "") {
		fitBounds=new GLatLngBounds();
		gFitBounds = false;
	}
	if (gSelTypeid != null && gSelTypeid != "0") {
		params += '&st='+gSelTypeid;
	}

	var actionUrl = action+'?'+params;
	makeSecureRequest(action, params, function(data) {
		var xml = GXml.parse(data);
		var summaryTag = xml.documentElement.getElementsByTagName("summary");
		if (summaryTag != undefined && summaryTag.length > 0) {
			gNumPages = summaryTag[0].getAttribute("numpages");
			var pageno = summaryTag[0].getAttribute("page");
			if (pageno != undefined && pageno != null) {  gCurrPg = pageno; }
		}
		var markers = xml.documentElement.getElementsByTagName("marker");
		var batch = [];
		var showid = null;
		for (var i = 0; i < markers.length; i++) {
			var marker = markers[i];
			var markerId = marker.getAttribute("id");
			var iszoom = (marker.getAttribute("iszoom") == "1");
			var avgrating = marker.getAttribute("avgrating");
			if (avgrating == undefined) { avgrating = 0; }
			var mType = marker.getAttribute("typeid");

			var nodes = marker.childNodes;
			var lat, lng;
			var title=null, details=null, total=null, permlink=null, createdby=null, numresp=null;
			lat = GXml.value(marker.getElementsByTagName("lat")[0]);
			lng = GXml.value(marker.getElementsByTagName("lng")[0]);
			title = GXml.value(marker.getElementsByTagName("title")[0]);
			details = GXml.value(marker.getElementsByTagName("details")[0]);
			details=details.slice(10, -4); // remove enclosing CDATA tags
			total = GXml.value(marker.getElementsByTagName("total")[0]);
			permlink = GXml.value(marker.getElementsByTagName("permlink")[0]);
			createdby = GXml.value(marker.getElementsByTagName("createdby")[0]);
			numresp = GXml.value(marker.getElementsByTagName("numresp")[0]);

			var point = new GLatLng(lat, lng);
			if (!gMap.getBounds().contains(point)) { continue; }

			var icon;
			if (iszoom) {
				icon = gZoomIcon;
				title = total + " marks. Click to zoom in.";
			} else {
				var markerType = gMtypes[mType];
				if (!markerType) {
				postLog("1", "markertype not found : "+mType);
				continue; } // remote chance
				icon = markerType.icon;
			}
			var mapMarker = new GMarker(point, { title: title, icon: icon});
if (fitBounds) { fitBounds.extend(point); }
			mapMarker.markerId = markerId;
			mapMarker.title = title;
			mapMarker.details = details;
			mapMarker.total = total;
			mapMarker.iszoom = iszoom;
			mapMarker.avgrating = avgrating;
			mapMarker.typeid = mType;
			mapMarker.permlink = permlink;
			mapMarker.createdby = createdby;
			mapMarker.numresp = numresp;

			gMarkers[getIndex(markerId)] = mapMarker;
			if (markerId == gshowmarkerid) { showid = markerId; }

			batch.push(mapMarker);
		}
		if (batch.length > 0) {
			bestFit(gMap, fitBounds);
			getMM().addMarkers(batch, 0);
			getMM().refresh();
		}
		fillSideBar();
		showMapLoading(false);
		if (showid != null) { showarrow(true, showid); }
		gshowmarkerid = null;
	});
}

function bestFit(map, bounds) {
if (!bounds) { return; }
map.setZoom(map.getBoundsZoomLevel(bounds));
map.setCenter(bounds.getCenter());
}

// adjust the bounds
function moveEndCB() {
	if (!gMap) { return; }
	if (gIsInfoOpen) { return; } // dont refresh map if the moveend is caused by an open infowindow
	setCookie("smLastPos", gMap.getCenter().lat()+","+gMap.getCenter().lng()+","+gMap.getZoom());
	gCurrPg=1;
	refreshMap();
}

function initMap() {
	gPrevBounds = null;
	refreshMap();
}

function changeCategory() {
	var dropdown = document.ctgform.ctgselect;
	var typeid = dropdown.options[dropdown.selectedIndex].value;
/*U
	var mtype = null;
	if (typeid != "") { mtype = gMtypes[typeid]; }
	if (mtype) { gSubType = new SubType(mtype.typeid, mtype.title); }
	else { gSubType = null; }
*/
	gSelTypeid = typeid;
	gCurrPg=1;
	refreshMap();
}

function displayCounts(x1,y1,x2,y2) {
	var bounds=x1+','+y1+','+x2+','+y2;
	GDownloadUrl('getMarkerCounts.php?b='+bounds, function(result, responseCode) {
		var lines = result.split("\n");
		var countarr = new Object();
		var total = 0;
		for (i=0; i<lines.length; ++i) {
			if (lines[i] == "") { continue; }
			var idx=lines[i].indexOf("=");
			var typeid = lines[i].substr(0,idx);
			var count = lines[i].substr(idx+1);
			var mType = gMtypes[typeid];
			if (mType && mType.ispublic == "0" && (gSubType == null || typeid != gSubType.typeid)) {
//			if (mType && mType.ispublic == "0" && typeid != gSelTypeid) {
				continue;
			}
			countarr[typeid] = count;
			total += parseInt(count);
		}

		var dropdown = document.ctgform.ctgselect;
		dropdown.options.length=0;
		var selIndex = -1;
		dropdown.options[dropdown.options.length]=new Option("Show All ("+total+")", "0");
		var isGroupAdded=false;
		for (typeid in gMtypes) {
			markerType = gMtypes[typeid];
			if (!countarr[typeid]) { continue; }
			var index = dropdown.options.length;
			dropdown.options[index]=new Option(markerType.title+" ("+countarr[typeid]+")", typeid);
//U			if (gSubType && gSubType.typeid == typeid) { selIndex = index; }
			if (typeid == gSelTypeid) { selIndex = index; }
			if (gSubType && gSubType.typeid == typeid) { isGroupAdded = true; }
		}
//U		if (selIndex == 0 && gSubType != null && gSubType.typeid != 0) {
		if (gSubType && !isGroupAdded) {
			index = dropdown.options.length;
			dropdown.options[index]=new Option(gSubType.title+" (0)", gSubType.typeid);
		}
		if (selIndex == -1) {
			if (gSelTypeid == "0") { selIndex = 0; }
			else if (gSubType) { selIndex = dropdown.options.length-1; }
			else { selIndex = 0; }
		}
		dropdown.selectedIndex = selIndex;
	});
}

function refreshMap(bounds) {
	gMarkers = new Object(); // empty the global var
	if (!gMap) { return; }
	getMM().clearMarkers();
	gMap.clearOverlays();
	refreshGrids(bounds);
	if (gSpotmeMarker) {
		gMap.addOverlay(gSpotmeMarker);
		if (!gSpotmeMarker.visited) {spotmeClick();}
	}
	if (gHomeMarker) { gMap.addOverlay(gHomeMarker); }
	redisplayWards();
}

function refreshGrids(bounds) {
	if (!gMap) { return; }

	if (!bounds || bounds == undefined) {
		bounds = gMap.getBounds();
	}
	//showMsg('ajax/getMarkers.php?sw='+bounds.getSouthWest().toUrlValue(6)+'&ne='+bounds.getNorthEast().toUrlValue(6)+'&z='+gMap.getZoom());
	var x1 = bounds.getSouthWest().lat();
	var y1 = bounds.getSouthWest().lng();
	var x2 = bounds.getNorthEast().lat();
	var y2 = bounds.getNorthEast().lng();
	if (y1 > y2) { y2 = y2+360; }
	displayCounts(x1,y1,x2,y2);

	var xinc = (x2-x1)/GRID_SIZE;
	var yinc = (y2-y1)/GRID_SIZE;

	// adjust bounds to align with the grids of the previous bounds
	if (gPrevBounds) {
		var x11 = gPrevBounds.getSouthWest().lat();
		var y11 = gPrevBounds.getSouthWest().lng();
		var x22 = gPrevBounds.getNorthEast().lat();
		var y22 = gPrevBounds.getNorthEast().lng();
		while(x11 < x1) { x11 = x11 + xinc; }
		while(x11 > x1) { x11 = x11 - xinc; }
		while(y11 < y1) { y11 = y11 + yinc; }
		while(y11 > y1) { y11 = y11 - yinc; }
		while(x22 > x2) { x22 = x22 - xinc; }
		while(x22 < x2) { x22 = x22 + xinc; }
		while(y22 > y2) { y22 = y22 - yinc; }
		while(y22 < y2) { y22 = y22 + yinc; }
		x1 = x11; y1 = y11; x2 = x22; y2 = y22;
	}

	displayMarkers(x1, y1, x2, y2, xinc, yinc);

	gPrevBounds = new GLatLngBounds(new GLatLng(x1,y1), new GLatLng(x2,y2));
}

function mapGo2Home() {
	if (gHomeMarker) {
		gMap.setCenter(gHomeMarker.getPoint(), gStreetLevelZoom);
		document.getElementById("btn2").className="";
	}
}

function go2Spotme(point) {
	if (!gUserInfo) { return; }
	if (gSpotmeMarker && gSpotmeMarker.username != gUserInfo.username) {
		gSpotmeMarker.remove();
		gSpotmeMarker=null;
	}
	if (!gSpotmeMarker) {
		createHomeMarker(point);
	}
	if (gSpotmeMarker) {
		gMap.setCenter(point, gStreetLevelZoom+1);
		spotmeClick();
	}
}

function showAddress(address) {
	gGeocoder.getLatLng(address, function(point) {
		if (!point) {
			alert(address + " not found. Please try to be more specific.");
		} else {
			gMap.setCenter(point, gStreetLevelZoom);
		}
	});
}

function getFullUrl(suburl) {
if (gBaseUrl) return gBaseUrl + "/" + suburl;
else return suburl;
}

function loadMap() {

	// create home icon
	gHomeIcon = new GIcon();
	gHomeIcon.image = getFullUrl("images/home1.png");
	gHomeIcon.iconSize = new GSize(22, 22);
	gHomeIcon.iconAnchor = new GPoint(11, 22);
	gHomeIcon.infoWindowAnchor = new GPoint(5, 1);

	// create mapbusy icon
	gBusyIcon = new GIcon();
	gBusyIcon.image = getFullUrl("images/mapbusy.gif");
	gBusyIcon.iconSize = new GSize(48, 48);
	gBusyIcon.iconAnchor = new GPoint(24, 24);
	gBusyIcon.infoWindowAnchor = new GPoint(5, 1);

	// create dbarrow icon
	gDnArrow = new GIcon();
	gDnArrow.image = getFullUrl("images/mapicons/himark.gif");
	gDnArrow.iconSize = new GSize(32,32);
	gDnArrow.iconAnchor = new GPoint(16,16);

	// create zoom icon
	gZoomIcon = new GIcon();
	gZoomIcon.image = getFullUrl("images/placeitGroup4.png");
	gZoomIcon.iconSize = new GSize(20, 34);
	gZoomIcon.iconAnchor = new GPoint(10, 17);
	gZoomIcon.infoWindowAnchor = new GPoint(10, 1);

	// spotme icon
	gSpotmeIcon = new GIcon();
	gSpotmeIcon.image = getFullUrl("images/spotme.png");
	gSpotmeIcon.iconSize = new GSize(32, 32);
	gSpotmeIcon.iconAnchor = new GPoint(16, 32);
	gSpotmeIcon.infoWindowAnchor = new GPoint(16,16);

	// read the cookie for the home location
/*
	if (gUserInfo != null && gUserInfo.homelat != "" && gUserInfo.homelng != "") {
		createHomeMarker(new GLatLng(gUserInfo.homelat, gUserInfo.homelng));
	}
*/

	gMap = new GMap2(document.getElementById("gmap"));
	gMap.addControl(new GLargeMapControl());
	gMap.addControl(new GMapTypeControl());
	gMap.enableScrollWheelZoom();

	// if the user is logged in and the home location is set, then go to the home location

	var mydiv = document.getElementById("mydiv").innerHTML;
	gshowmarkerid=null;
	var centerSet=false;
	if (mydiv != undefined && mydiv != null) {
		if (gSpotmeMarker) gSpotmeMarker.visited = true; // dont show spotmewindow if mydiv is present
		var mydivarr = mydiv.split(',');
		if (mydivarr[0] == 'p' || mydivarr[0] == 'm') {
			gshowmarkerid=mydivarr[1];
			gMap.setCenter(new GLatLng(parseFloat(mydivarr[2]), parseFloat(mydivarr[3])), gStreetLevelZoom+1);
			centerSet=true;
		} else
		if (mydivarr[0] == "spotme") {
			tagme(mydivarr[1]);
			setSpotmeUser(mydivarr[1],parseFloat(mydivarr[2]),parseFloat(mydivarr[3]));
			gMap.setCenter(gSpotmeMarker.getPoint(), gStreetLevelZoom+1);
			centerSet=true;
		} else
		if (mydivarr[0] == "sub") {
			gSubType = new SubType(mydivarr[1],mydivarr[2],mydivarr[3],mydivarr[4]);
			gSelTypeid = gSubType.typeid;
			if (mydivarr.length >= 8) {
				gshowmarkerid=mydivarr[5];
				gMap.setCenter(new GLatLng(parseFloat(mydivarr[6]), parseFloat(mydivarr[7])), gStreetLevelZoom+1);
				centerSet=true;
			}
		}
	} else if (gHomeMarker) {
		mapGo2Home();
		centerSet=true;
	}

	if (!centerSet) { // center should be set before MarkerManager is created
		// read the cookie for the last position
		var smLastPos = getCookie("smLastPos");
		if (smLastPos && (gSelTypeid == null || gSelTypeid == "0")) {
			var arr = smLastPos.split(',');
			gMap.setCenter(new GLatLng(parseFloat(arr[0]), parseFloat(arr[1])), parseInt(arr[2]));
		} else {
			gMap.setCenter(new GLatLng(22.998852,79.277344), 5); // center around India
		}
	}

	initMap();

	GEvent.addListener(gMap, "infowindowopen", function() {
//		gMap.savePosition();
		gInfoOpenCenter=gMap.getCenter();
		gIsInfoOpen=true;
	});
	GEvent.addListener(gMap, "infowindowclose", function() {
//		gMap.returnToSavedPosition();
		gMap.setCenter(gInfoOpenCenter);
		gIsInfoOpen=false;
		removeIt();
	});
//		GEvent.addListener(gMap, "mousemove", function(point) { showMsg(point.lat()+":"+point.lng()); });
	GEvent.addListener(gMap, "click", function(marker, point, overlaypoint) {
		if (overlaypoint) { point = overlaypoint; }
		if (marker) {
			if (marker.iszoom) { // group place
				gZoomInPoint = marker.getPoint();
				groupPlaceitClick(marker.markerId);
			} else if (marker.isHomeMarker) { // click on home marker
				homeMarkerClick(marker);
			} else { // individual place
				markerClick(marker.markerId);
			}
		} else if (gMapAction == 1) { // click on home
			createHomeMarker(point);
			gMap.addOverlay(gSpotmeMarker);
			setUserHomeLocation(point.lat(), point.lng());
		} else if (gMapAction == 2) { // click on place-marker
			if (gTabNo == 0) { addPlace(point); }
			else             { addMessage(point); }
		}
	});
	GEvent.addListener(gMap, "moveend", moveEndCB);
}

function load() {
	fillCtg();
	if (GBrowserIsCompatible()) {
		gGeocoder = new GClientGeocoder();
		loadMap();
	} else {
		alert("Browser is not compatible: Supported browsers are Firefox v2 and IE v6 and above");
	}
}

function createHomeMarker(point) {
	if (gSpotmeMarker) { gSpotmeMarker.remove(); }
	gSpotmeMarker = new GMarker(point, gSpotmeIcon);
	gSpotmeMarker.username = gUserInfo.username;
	GEvent.addListener(gSpotmeMarker, "click", spotmeClick);
}

function removeHtmlTags(strIn) {
	if (!strIn) { return ""; }
	strInputCode = strIn.replace(/&(lt|gt);/g, function (strMatch, p1){
		return (p1 == "lt")? "<" : ">";
	});
	var strOut = strInputCode.replace(/<\/?[^>]+(>|$)/g, "");
	return strOut;
}

function fillSideBar() {
	if (!gMap) { return; } // dont process if map is not loaded
	var msg, img;
	if (gTabNo == 1) {
		msg1 = 'messages';
		msg2 = 'post a message';
		img = '<img src="images/chatsm.gif" />';
	} else {
		msg1 = 'marks';
		msg2 = 'add a mark';
		img = '<img src="images/placeit.gif" />';
	}
		
   	var div = document.getElementById("tabcontent");
	var noplacesHtml = '<div style="padding:10px;">No '+msg1+' yet on this portion of the map.<br /><br />Be the first one to '+msg2+' here. Click on the '+img+' icon above the map and then click on the desired location on the map to '+msg2+'.</div>';
	if (!gMarkers || gMarkers.length==0) {
		div.innerHTML = noplacesHtml;
		return; // may cause recursion if no places on map
	}

	var innerHTML="";
	for (mIndex in gMarkers) {
		var markerId = mIndex.substring(1);
		var marker = gMarkers[mIndex];
		if (marker.iszoom) {
			title = marker.title;
			details = "This is a group marker containing " + marker.total + " marks.";
//			innerHTML = innerHTML + '<p><a href="javascript:{}" style="background-color:#ccffcc;" onclick=groupPlaceitClick("'+markerId+'") >'+title+'</a><br />';
			innerHTML = innerHTML + '<p><a href="javascript:{}" style="background-color:#ccffcc;" onclick=groupPlaceitClick("'+markerId+'") onmouseover=showgrouparrow(true,"'+markerId+'") onmouseout=showgrouparrow(false,"'+markerId+'")>'+title+'</a><br />';
			innerHTML = innerHTML + details + '</p>';
		} else if (marker) {
			title = marker.title;
			titleurl = title;
			var mtype = gMtypes[marker.typeid];
			var permlink=marker.permlink;
			details = marker.details;
			details = removeHtmlTags(details);
			if (details.length > 90) {
				details = details.substr(0,80) + "...";
			}
			innerHTML = innerHTML + '<p>';
			if (permlink != null) { innerHTML = innerHTML + '<a href="'+permlink+'">'; }
			innerHTML = innerHTML + '<img src="'+marker.getIcon().image+'" ';
			if (permlink != null) { innerHTML += 'title="sadakLink"'; }
			innerHTML += ' />';
			if (permlink != null) { innerHTML = innerHTML + '</a>'; }
			innerHTML = innerHTML + '&nbsp;<a style="vertical-align:bottom;" href="javascript:{}" onmouseover="showarrow(true, '+markerId+');" onmouseout="showarrow(false,'+markerId+');" onclick=markerClick('+markerId+') title="Click to show ['+title+'] on the map">'+title+'</a>&nbsp;';
			innerHTML = innerHTML + getRatingsHtml(marker.avgrating);
			innerHTML = innerHTML + '&nbsp;' + getCommentsHtml(marker.numresp);
			innerHTML = innerHTML + '<br>';
			innerHTML = innerHTML + details + '</p>';
		}
	}
	if (gNumPages > 0) { buildpg(); }
	else { clearpg(); }
	if (innerHTML == "") { innerHTML = noplacesHtml; }
	div.innerHTML = innerHTML;
}

function getRatingsHtml(rating) {
	if (!rating || rating == "0") { return ""; }
	rating = Math.floor(parseFloat(rating)+0.5);
	var html = "";
	for (i=0; i<rating; i++) { html = html + '<img style="margin-bottom:3px;" src="images/stary.gif" />'; }
	for (i=rating; i<5; i++) { html = html + '<img style="margin-bottom:3px;" src="images/starn.gif" />'; }
	return html;
}

function getCommentsHtml(numresp) {
if (numresp == null || numresp == null || numresp == "") { return ""; }
numresp = parseInt(numresp);
if (numresp == 0) { return ""; }
var alt = numresp + ' comment';
if (numresp > 1) { alt = alt + 's'; } // plural
var html='<img style="vertical-align:bottom" src="images/comments.gif" alt="' + alt + '" title="' + alt + '"/>';
html = html + '&nbsp;<span style="vertical-align:bottom;font-weight:bold;font-size:11px;margin:0px;padding:0px;color:#256;">[' + numresp + ']</span>';
return html;
}

function clearSideBar() {
	var div = document.getElementById("tabcontent");
	div.innerHTML = "";
	clearpg();
}

function showFeedbackForm() {
	GDownloadUrl("getFeedbackForm.php", function(data, responseCode) {
		document.getElementById("tabcontent").innerHTML = data;
	});
}

function showFeedbackResults() {
	GDownloadUrl("getFeedbackResults.php", function(data, responseCode) {
		document.getElementById("tabcontent").innerHTML = data;
	});
}

function getLoadingHTML() {
	return '<img src="images/loading.gif"/>&nbsp;<i>Loading - Please Wait...</i>';
}

function selectTab(tabNo) {
	gTabNo=tabNo;
	gCurrPg=1;
	btnDiv = document.getElementById('btn2');
	if (btnDiv == undefined) { return; }
	if (tabNo == 0) {
		btnDiv.innerHTML='<a href="javascript:{}" onFocus="if(this.blur)this.blur()"><img src="images/placeit.gif" style="margin:0px;padding:0px;"/>&nbsp;Add To Map&nbsp;</a>';
		btnDiv.style.display = "inline";
		refreshMap();
	} else if (tabNo == 1) {
		btnDiv.innerHTML='<a href="javascript:{}" onFocus="if(this.blur)this.blur()"><img src="images/chatsm.gif" style="margin:0px;padding:0px;"/>&nbsp;Post Message&nbsp;</a>';
		btnDiv.style.display = "inline";
		btnDiv.style.margin = "0px";
		btnDiv.style.padding = "0px";
		refreshMap();
	} else if (tabNo == 2) {
		if (gMap) gMap.clearOverlays();
		btnDiv.className="";
		btnDiv.style.display = "none";
		gMapAction = 0;
		getMM().clearMarkers();
		clearSideBar();
		showFeedbackForm();
	}
}

function setVote(theForm) {
	var val="";
	if (theForm.ctgvote0.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote1.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote2.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote3.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote4.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote5.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote6.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote7.checked) val += "1"; else val += "0";
	val += ":";
	if (theForm.ctgvote8.checked) val += "1"; else val += "0";
	theForm.ctgvote.value = val;
}

function setSpotmeUser(username,lat,lng) {
	var title = 'Home Location:'+username;
	gSpotmeMarker = new GMarker(new GLatLng(lat,lng), { title: title, icon: gSpotmeIcon});
	gSpotmeMarker.username = username;
	GEvent.addListener(gSpotmeMarker, "click", spotmeClick);
}

function ff_textarea_fix(/*Event*/ evt){
return false;
} 

function tagme(username) {
	GDownloadUrl("tagUser.php?u="+username, function(data, responseCode) {
	});
}

function saveSpotmeText(val) {
gSpotmeText=val;
}

function saveSpotmeInfo(imgfile) {
	var url = "saveSpotmeInfo.php?imgfile="+escape(encodeURI(imgfile));
	if (gSpotmeText) { url = url + '&stext='+escape(encodeURI(gSpotmeText)); }	
	GDownloadUrl(url, function(data, responseCode) {
		gMap.closeInfoWindow();
	});
}

function spotmeClick() {
	gSpotmeText=null;
	var linkhtml = '';
	if (gUserInfo && gSpotmeMarker && gUserInfo.username == gSpotmeMarker.username) {
		linkhtml = '[&nbsp;<a href="myspotme">Edit Me</a>&nbsp;]&nbsp;';
	}
	var infoHtml = '<div id="markerInfo" class="spotmewin">'+getLoadingHTML()+'</div><div class="infolinks" style="width:312px;">'+linkhtml+'</div>';
	var url = "spotwidget.php?nomap=1&u="+gSpotmeMarker.username;
	var stext = null;
	if (gSpotmeText) { url = url + '&stext='+escape(encodeURI(gSpotmeText)); }	
	GDownloadUrl(url, function(data, responseCode) {
		gSpotmeMarker.openInfoWindowHtml('<div id="spotmeinfo" style="width:210px;margin:5px;">'+data+'</div>'+linkhtml);
		gSpotmeMarker.visited=true;
	});
}

function clearSpotme() {
	gMap.closeInfoWindow();
	gSpotmeMarker.remove();
	gSpotmeMarker=null;
}

function setSpotme(flag) {
	var val = 0;
	if (flag) val = 1;
	GDownloadUrl("setSpotme.php?flag="+val, function(data, responseCode) {
		gMap.closeInfoWindow();
		homeMarkerClick(gHomeMarker);
	});
}

function showArea(areaid) {
	var poly = gWards[areaid];
	if (poly == null) {
	GDownloadUrl("getArea.php?id="+areaid, function(data, responseCode) {
		var lines = data.split("\n");
		var id=null, areatype=null, title=null, details=null, points=null;
		for (i=0; i<lines.length; ++i) {
			if (lines[i] == "") { continue; }
			var idx=lines[i].indexOf("=");
			var key = lines[i].substr(0,idx);
			var val = lines[i].substr(idx+1);
			if (key == "id") { id = val; }
			if (key == "areatype") { areatype = val; }
			if (key == "title") { title = val; }
			if (key == "details") { details = val; }
			if (key == "points") { points = val; }
		}
		if (id != null && areatype != null && title != null && details != null && points != null) {
			var parr = points.split(":");
			for (i=0; i<parr.length; ++i) {
				var larr = parr[i].split(",");
				parr[i] = new GLatLng(parseFloat(larr[0]),parseFloat(larr[1]));
			}
			poly = createPolygon(id,areatype,title,details,parr,false,"#0000ff","#0000ff");
			gWards[areaid] = poly;
		} else {
			postLog("2", "showArea error for areaid:"+areaid+" data="+data);
			alert("Problem displaying the selected area - we have recorded this issue. Please try again later.");
		}
	});
	}
}

function showAllWards() {
	showMapLoading(true);
	GDownloadUrl("getArea.php", function(data, responseCode) {
		var lines = data.split("\n");
		for (i=0; i<lines.length; ++i) {
			if (lines[i] == "") { continue; }
			var areaid = lines[i];
			if (!areaid || areaid == "") { continue; }
			showArea(areaid);
		}
		showMapLoading(false);
	});
}

function createPolygon(id,areatype,title,details,parr,editable,linecolor,shadecolor) {
	var poly = new GPolygon(parr, linecolor, 2, 1, shadecolor, 0.2);
	poly.areaid=id;
	poly.areatype=areatype;
	poly.title=title;
	poly.details=details;
	if (editable) { poly.enableEditing(); }
	displayPolygon(poly);
	return poly;
}

function displayPolygon(poly) {
gMap.addOverlay(poly);
if (poly.title) {
	GEvent.addListener(poly, "mouseover", function() { showMsg(poly.title); });
	GEvent.addListener(poly, "mouseout", function() { showMsg("Design for Pune"); });
}
}

function redisplayWards() {
if (!gWards) { return; }
for (areaid in gWards) {
	displayPolygon(gWards[areaid]);
}
}
