//  ======== JavaScript for Google Maps LivePolygon Marcelo MontagnaŠ2008 - http://maps.forum.nu ======

var startMarker = null;
var endMarker = null;
var routePoints = new Array();
var pointsPoly = new Array();
var routeOverlays = new Array();
var polyClose = null;
var totalDistance = 0.0;
var bufferActive=false;
flagPoly=false;
/*function createCustomLayer(minRes,maxRes,theme) {
	var newLayer = new GTileLayer(cRight,minRes,maxRes);
	newLayer.getTileUrl = function (a,b) {return tileURL(a,b)};
	newLayer.getOpacity = function () {return opacity;};
	return newLayer;
}*/

 
function tileURL(a,b) {
	var rand = Math.random();
        url="";
	//var url = 'http://'+window.location.host+'/cgi-bin/tile_maker_special_demo2.pl?t=none&x='+a.x+'&y='+a.y+'&z='+b+'&rand='+rand;
	return url;
}

function polyBegin(marker, point) {
        
	if (!marker && !flagPoly) { 
              addRoutePoint(point);
	}
	else {
                if (flagPoly)  { 
                    resetRoute(); 
                    addRoutePoint(point);
                } else {
                       if (activeForm=='frmLIVEPOLY') {
                        closeMarker=marker;
                        closeRoute(); 
                      }  
                       // semiReset();
                  }
	}
}


function addRoutePoint(point) {
	var dist = 0;

	routePoints.push(point);

	if (routePoints.length > 1)	{
		plotRoute();
		dist = getDistance(routePoints[routePoints.length-2].y, routePoints[routePoints.length-2].x, point.y, point.x, 'MI');
		totalDistance += dist ;
                if (limitBuffer(totalDistance)) {
                    document.getElementById("dist").innerHTML = '<br> Total Distance: '+ totalDistance.toFixed(3)  + ' mi <br>';
                    document.getElementById("dist2").innerHTML = '<br> Total Distance: '+ totalDistance.toFixed(3)  + ' mi <br>';
                } else { undoPoint(); }
	}
	else {  
                
		startMarker = cMarker(point,'Start - end','', 1)
		map.addOverlay(startMarker);
		routeOverlays.push( new GPolyline(routePoints,'#00FF00',3,1));
	}
	//document.getElementById("route").innerHTML += point.y.toFixed(6) + ' ' + point.x.toFixed(6) + ' : ' + dist.toFixed(3) +"<br>";
        
        // Prints out the LAT/LONG values for each point clicked.
	//var url = 'http://maps.forum.nu/cgi-bin/tile_maker_special_demo2.pl?task=add&lat=' + point.y + '&lon=' + point.x;
        //sendToServer(url);
}



function plotRoute() {
        
	if (routeOverlays[routeOverlays.length-1]) map.removeOverlay(routeOverlays[routeOverlays.length-1]);
        if (polyClose) map.removeOverlay(polyClose);
        
	routeOverlays[routeOverlays.length-1] = new GPolyline(routePoints,'#00FF00',3,1);
	map.addOverlay(routeOverlays[routeOverlays.length-1]); 

	
	if (routePoints.length > 2) {
		var pClose = Array();
		pClose.push(routePoints[0]);
		pClose.push(routePoints[routePoints.length-1]);
		polyClose = new GPolyline(pClose,'#00FF00',1,0.5);
		//map.addOverlay(polyClose);
	}

}




function closeRoute() {
        if (routeOverlays[routeOverlays.length-1]) map.removeOverlay(routeOverlays[routeOverlays.length-1]);
        if (polyClose)	map.removeOverlay(polyClose);
	if (startMarker) map.removeOverlay(startMarker);
        
	routePoints.push(routePoints[0]);
	//var url = 'http://maps.forum.nu/cgi-bin/tile_maker_special_demo2.pl?task=add&close=1&lat=' + routePoints[0].y + '&lon=' + routePoints[0].x;
	//routeOverlays[routeOverlays.length-1] = new GPolygon(routePoints,'#00FF00',3,1,'#EE3405',0.4);
	//map.addOverlay(routeOverlays[routeOverlays.length-1]);
        map.addOverlay(new GPolygon(routePoints,'#00FF00',3,1,'#EE3405',0.4));
        pointsPoly=routePoints;
        routePoints = [];
        flagPoly=true; 
        //sendToServer(url);
        document.getElementById("searchbuttonPoly").innerHTML ="<center><input name=\"btnType\" value=\"Clear\" onclick=\"map.clearOverlays();  gmarkers=[];\" type=\"button\"></center>";
}
function semiReset() {
    flagPoly=false;
    totalDistance = 0;
}

function resetRoute() { 
	//debug('');
	//var url = 'http://maps.forum.nu/cgi-bin/tile_maker_special_demo2.pl?task=add&clr=1';
	//sendToServer(url);
	routePoints = new Array();
        flagPoly=false;
	map.clearOverlays();
	totalDistance = 0;
        bufferActive=false;
        document.getElementById("searchbuttonBuf").innerHTML ="";
        document.getElementById("searchbuttonPoly").innerHTML ="";
	document.getElementById("dist").innerHTML = '';
        document.getElementById("dist2").innerHTML = '';
       //document.getElementById("route").innerHTML = 'Route points:<br>';
}
function hideBuffer() {
    v=routePoints;
    theForm=activeForm;
    eraseThePoly(v,theForm,0);
    document.getElementById("searchbuttonBuf").innerHTML ="<input name=\"btnTypeShow\" value=\"Show Buffer\" onclick=\"showBuffer(); \" type=\"button\"> "+
        "<input name=\"btnType\" value=\"Clear\" onclick=\"resetRoute(); hideTabs(); gmarkers=[];\" type=\"button\">";
    bufferActive=false;
}
function showBuffer() {
        radius=parseFloat(window.document.forms[activeForm].geo_radius.value);
        units=window.document.forms[activeForm].geo_units.value;
        v=routePoints;
        theForm=activeForm;
        if (limitRadius(activeForm)) {
            getBuffer(v,activeForm,"bf",radius*1.0,units); 
            document.getElementById("searchbuttonBuf").innerHTML ="<input name=\"btnTypeShow\" value=\"Hide Buffer\" onclick=\"hideBuffer(); \" type=\"button\"> "+
            "<input name=\"btnType\" value=\"Clear\" onclick=\"resetRoute();  hideTabs(); gmarkers=[];\" type=\"button\">";
            bufferActive=true;
        } 
        
}
function showPoly() {
       
        v=routePoints;
        theForm=activeForm;
        document.getElementById("searchbuttonPoly").innerHTML ="<center><input name=\"btnType\" value=\"Clear\" onclick=\"map.clearOverlays(); gmarkers=[];\" type=\"button\"></center>";
        
}
function undoPoint() {
	if (routePoints.length > 1)	{

		var dist = getDistance(routePoints[routePoints.length-2].y, routePoints[routePoints.length-2].x, routePoints[routePoints.length-1].y, routePoints[routePoints.length-1].x, 'MI');
		totalDistance -= dist;
		document.getElementById("dist").innerHTML = '<BR> Total Distance: '+ totalDistance.toFixed(3) + ' mi <BR>';
                document.getElementById("dist2").innerHTML = '<BR> Total Distance: '+ totalDistance.toFixed(3) + ' mi <BR>';
                
		//var html = document.getElementById("route").innerHTML;
		//html = html.replace(/<br>[^<]+<br>$/,'<br>');
		//document.getElementById("route").innerHTML = html;
                map.panTo(new GLatLng(routePoints[routePoints.length-2].y, routePoints[routePoints.length-2].x));
		routePoints.pop();
		plotRoute();
	}
	else {
		resetRoute();	
	}
}

function cMarker(point,markerName,markerHtml, number,mIcon,mClickable) {
	var latDMS  = DEC2DMS(point.x);
	var longDMS  = DEC2DMS(point.y);
	var re = /(\.\d{4})\d+/g;
	latDMS = latDMS.replace(re,"$1");
	longDMS = longDMS.replace(re,"$1");

	var htmlInfo = ""; 
	htmlInfo += '<div class="bubble">';
	htmlInfo += '<b>' + markerName + '</b><br>';
	htmlInfo += markerHtml;
	htmlInfo += '<hr style="height:1px">';
	htmlInfo += 'Lat (Dec): ' + point.x + '<br>';
	htmlInfo += 'Long (Dec): ' + point.y;
	htmlInfo += '<hr style="height:1px">';
	htmlInfo += 'Lat (DMS): ' + latDMS + '<br>';
	htmlInfo += 'Long (DMS): '+ longDMS;
	htmlInfo += '</div>';

	
	var markerT;
	markerT = new GMarker(point,{icon:mIcon, clickable:mClickable, title:markerName});
	if (mClickable)	{
                
		GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(htmlInfo );});
	}
	return markerT;
}


function DEC2DMS(dec) {

	var deg = Math.floor(Math.abs(dec));
	var min = Math.floor((Math.abs(dec)-deg)*60);
	var sec = (Math.round((((Math.abs(dec) - deg) - (min/60)) * 60 * 60) * 100) / 100 ) ;

	deg = dec < 0 ? deg * -1 : deg;

	var dms  = deg + '&deg ' + min + '\' ' + sec + '"';
	return dms;
}





function getDistance(lat1, lon1, lat2, lon2, unit) {
	var radlat1 = Math.PI * lat1/180
	var radlat2 = Math.PI * lat2/180
	var radlon1 = Math.PI * lon1/180
	var radlon2 = Math.PI * lon2/180
	var theta = lon1-lon2
	var radtheta = Math.PI * theta/180
	var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
	dist = Math.acos(dist)
	dist = dist * 180/Math.PI
	dist = dist * 60 * 1.1515
        if (unit=="MI") { dist = dist }
	if (unit=="K") { dist = dist * 1.609344 }
        if (unit=="N") { dist = dist * 0.8684 }
	return dist;
}     






