

var map;
var container;
var zoom = 13;
var centerPoint = new GLatLng(54, -3);
var loadingControl = new MLoadingControl();
var requestSent = false;
var polygons = Array();
var properties = Array();
var clusters = Array();
var iwTemplates = Array();
var pixelThreshold = 256;
var infoWindow;
var centerBeforeMove;
var timeout;
var baseIcon;

function load() {
	doLoad();

	// Load the templates for the infoWindows
	iwTemplates = Array();
	var oTemplateContainers = document.getElementById('infoWindow_containers');
	var children = oTemplateContainers.getElementsByTagName('DIV');
	for (var c = 0 ; c < children.length ; c++ ) {
		var childObj = children[c];
		if (childObj.className == 'iwTabContainer') {
			iwTemplates.push(childObj);
		}
	}
	doSearch();
}


function doLoad() {
	if (GBrowserIsCompatible()) {
		baseIcon = new GIcon();

		baseIcon.iconSize=new GSize(20,34);
		baseIcon.iconAnchor=new GPoint(10,34);
		baseIcon.infoWindowAnchor=new GPoint(10,0);

		container = document.getElementById('mapDiv');
		map = new GMap2(container, {draggableCursor:'crosshair'});
		map.addMapType(G_PHYSICAL_MAP)
		map.setCenter(centerPoint, zoom);
		map.enableScrollWheelZoom();

		map.addControl(new GScaleControl());
		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(loadingControl);

		

		infoWindow = map.getInfoWindow();
		centerBeforeMove = map.getCenter();
		GEvent.addListener(map, "moveend", moveEnd);
		GEvent.addListener(map, "zoomend", zoomEnd);
	}
}



function moveEnd() {
	if (loadingControl.isVisible() || !infoWindow.isHidden()) {
		return;
	}
	var proj = map.getCurrentMapType().getProjection();
	var zoom = map.getZoom();
	var centerAfterMove = map.getCenter();
	var beforePx = proj.fromLatLngToPixel(centerBeforeMove, zoom);
	var afterPx = proj.fromLatLngToPixel(centerAfterMove, zoom);
	var d = Math.sqrt(Math.pow((beforePx.x - afterPx.x),2) + Math.pow((beforePx.y - afterPx.y),2));
	if (d < pixelThreshold) {
		return;
	}	
	centerBeforeMove = centerAfterMove;
	doSearch();
};


function zoomEnd(oldZ,zoom) {
	if (loadingControl.isVisible() || !infoWindow.isHidden()) {
		return;
	}
	var centerBeforeMove = map.getCenter();

// Limit the zoomend event firing multiple times when zooming with the mouse wheel.
	if (timeout) {
		window.clearTimeout(timeout);
	}
	timeout = window.setTimeout(function(){
		doSearch();
	},200);

};





function doSearch() {
	if (requestSent) {
		return;
	}
    
	var zoom = map.getZoom();
	var proj = map.getCurrentMapType().getProjection();
	var NEPx = proj.fromLatLngToPixel(map.getBounds().getNorthEast(), zoom);
	var tileNEPx = new GPoint(NEPx.x - (NEPx.x % 256) + 256,NEPx.y - (NEPx.y % 256));
	var searchNE = proj.fromPixelToLatLng(tileNEPx,zoom);

	var SWPx = proj.fromLatLngToPixel(map.getBounds().getSouthWest(), zoom);
	var tileSWPx = new GPoint(SWPx.x - (SWPx.x % 256),SWPx.y - (SWPx.y % 256) + 256);
	var searchSW = proj.fromPixelToLatLng(tileSWPx,zoom);

	var lat1 = searchSW.lat().toFixed(6);
	var lon1 = searchSW.lng().toFixed(6);
	var lat2 = searchNE.lat().toFixed(6);
	var lon2 = searchNE.lng().toFixed(6);

	var deltaLat = Math.abs(lat1-lat2);
	var deltaLon = Math.abs(lon1-lon2);
	
	if( zoom > 7 && zoom <13)
	{
		var url = '/server_dc.php?lat1=' + lat1 + '&lon1=' + lon1 + '&lat2=' + lat2 + '&lon2=' + lon2 + '&zoom=' + zoom  + '&citypage=y&city=&city=' + city ;
	}
	else if ( zoom <=7 )
	{
		var url = '/server_dc_low.php?lat1=' + lat1 + '&lon1=' + lon1 + '&lat2=' + lat2 + '&lon2=' + lon2 + '&zoom=' + zoom + '&citypage=y&city=' + city;
	}
	else
	{
		var url = '/server_dc_high.php?lat1=' + lat1 + '&lon1=' + lon1 + '&lat2=' + lat2 + '&lon2=' + lon2 + '&zoom=' + zoom  + '&citypage=y&city=' + city ;
	}

	
		url += '&r=' + Math.random();
	
	

//GLog.write(url + ' - Approx. Cells: ' + cellCount);
	requestSent = true;
	loadingControl.show();
	ajaxLoad(url,readMarkers);

};



function clearMarkers(){
	var marker = properties.shift();
	while (marker) {
		map.removeOverlay(marker);
		marker = properties.shift();
	}
	var marker = clusters.shift();
	while (marker) {
		map.removeOverlay(marker);
		marker = clusters.shift();
	}
	var poly = polygons.shift();
	while (poly) {
		map.removeOverlay(poly);
		poly = polygons.shift();
	}
}


function togglePolys() {
	var oPolys = document.getElementById('cbPolys');
	for (var n = 0 ; n < polygons.length ; n++ ) {
		if (oPolys.checked) {
			polygons[n].show();
		}
		else {
			polygons[n].hide();
		}
	}
}



function readMarkers(http_request) {
	var xml = http_request.responseXML;
	loadingControl.hide();
	requestSent = false;
	clearMarkers();
	var propCount = 0;


	var elements = xml.documentElement.getElementsByTagName('e');
	var resInfo = xml.documentElement.getElementsByTagName('results');
	
	for (var i = 0; i < elements.length; i++) {
		var element = parseElement(elements[i])

		// Element is a cluster
		if (parseInt(element.cnt) > 1) 
		{			
			var marker = parseCluster(element);
			clusters.push(marker)
			map.addOverlay(marker);
			propCount += parseInt(element.cnt);						
		}
		// Element is a property
		else if (typeof element.lat != 'undefined') {
			var marker = parseMarker(element);
			properties.push(marker)
			map.addOverlay(marker);
		}
		/*
		var poly = drawPolygon(element);
		poly.hide();
		map.addOverlay(poly);
		polygons.push(poly);*/
	}

	
	//togglePolys();
}


function parseElement(elem) {
	var str = '';
	str += '{';
	var attrs = elem.attributes;
	for ( var n = 0; n < attrs.length ; n++) {
		str += attrs[n].name + ': "' + attrs[n].value + '",';
	}
	str = str.replace(/,$/,"");
	str += '}';

	return element = eval("(" + str + ")");

}



function parseCluster(element) 
{	
	
		
		var markerName = element.cnt + ' businesses';
		var mIcon = getIcon(element.cnt, 1);
		var bounds = new GLatLngBounds();
		bounds.extend(new GLatLng(parseFloat(element.y1),parseFloat(element.x1)));
		bounds.extend(new GLatLng(parseFloat(element.y2),parseFloat(element.x2)));
		var point = bounds.getCenter();
		var marker = createMarker(element.gridX+'_'+element.gridY, point, markerName,'',mIcon, bounds);
		return marker;
	
}

function parseMarker(element) {
	var point = new GLatLng(parseFloat(element.lat),parseFloat(element.lon));


	function templateComplete(str, p1) {
	  return eval(p1);
	}

	var infoTabs = Array();
	for (var c = 0 ; c < iwTemplates.length ; c++ ) {
		var html = iwTemplates[c].innerHTML;
		html = html.replace(/%%([^%]+)%%/g,templateComplete);
		var tabTitle = iwTemplates[c].title ? iwTemplates[c].title : "Tab " + c;
		var newTab = new GInfoWindowTab(tabTitle, html);
		infoTabs.push(newTab);
	}

	var markerName = element.obj_name ;
	var mIcon = getIcon(0, element.mType);
	var marker = createMarker(properties.length,point,markerName,infoTabs,mIcon,null);
	marker.type = element.type;				
	return marker;
}




function createMarker(i,point,markerName,infoTabs,mIcon,bounds) 
{
	var marker = new GMarker(point,{icon:mIcon,title:markerName});
	marker.ix = i;
	marker.markerName = markerName;
	if (infoTabs) {
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowTabsHtml(infoTabs);
		});
	}
	if (bounds) {
		marker.bounds = bounds;
		GEvent.addListener(marker, "click", function() {
			if( map.getZoom() <=7 )
			{
				map.setCenter(marker.getLatLng(), map.getZoom() + 2); 
			}
			else
			{
				map.setCenter(marker.bounds.getCenter(), map.getBoundsZoomLevel(marker.bounds)); 
			}
		});
	}


	return marker;
};






function getIcon(count, type) 
{
	
	if( count == 0 )
	{
		if( type == 1 || type == 3 )
		{
			return new GIcon(baseIcon, '/marker/pub.png');
		}
		else if( type == 5 ) {
			return new GIcon(baseIcon, '/marker/night.png');
		}
		else
		{
			return new GIcon(baseIcon, '/marker/club.png');
		}
	}
	if( count <=20 )
	{
		return new GIcon(baseIcon, '/marker/number'+ count +'.png');
	}
	if( count < 100 )
	{
		return new GIcon(baseIcon, '/marker/star1.png');
	}
	if( count < 1000 )
	{
		return new GIcon(baseIcon, '/marker/star2.png');
	}
	if( count < 5000 )
	{
		return new GIcon(baseIcon, '/marker/star3.png');
	}
	
	return new GIcon(baseIcon, '/marker/star4.png');
	
}






function drawPolygon(element) {
	var polyPoints = Array();

	polyPoints.push(new GLatLng(parseFloat(element.gridSWLat).toFixed(6),parseFloat(element.gridSWLon).toFixed(6)));
	polyPoints.push(new GLatLng(parseFloat(element.gridSWLat).toFixed(6),parseFloat(element.gridNELon).toFixed(6)));
	polyPoints.push(new GLatLng(parseFloat(element.gridNELat).toFixed(6),parseFloat(element.gridNELon).toFixed(6)));
	polyPoints.push(new GLatLng(parseFloat(element.gridNELat).toFixed(6),parseFloat(element.gridSWLon).toFixed(6)));
	polyPoints.push(new GLatLng(parseFloat(element.gridSWLat).toFixed(6),parseFloat(element.gridSWLon).toFixed(6)));

	return new GPolygon(polyPoints, '#ff8888', 2,  1,  '#bbbbbb', 0.2);
};





function unload() {
	GUnload();
}

function get_map_center(x1,x2,y1,y2)
{
    if(x1==0 && x2==0 && y1==0 && y2==0)
    {
        centerPoint = new GLatLng(54, -3);  
    
    }else{
        var bounds = new GLatLngBounds();
        bounds.extend(new GLatLng(parseFloat(y1),parseFloat(x1)));
        bounds.extend(new GLatLng(parseFloat(y2),parseFloat(x2)));
        centerPoint = bounds.getCenter();
    }
}





