var overlays=new Array();
// Add click listener to Map
//GEvent.addListener(map, "click", function(overlay,point) {
 //       addLeg(point.y, point.x);
//});

function initializeMap(){
	//	rehydrateMapFromUrl();
}

var xArray = new Array(0);
var yArray = new Array(0);
var locationArray = new Array(0);
var legArray = new Array(0);
var distancesArray = new Array(0);
var pointArray = new Array(0);
var gPointArray = new Array(0);
var distance = 0;
var bRecordPoints = true;
var REMOVE = 0;
var ADD = 1;
var pl;
var ENGLISH = "0";
var METRIC = "1";
var DISTANCE = "2";
var WEIGHT = "3";
var SHOW = "4";
var HIDE = "5";
var LEFT = "6";
var RIGHT = "7";
var currentWeightUnits = getCurrentUnits();
var bIsIE;

distancesArray.push(0);

function addLeg(xCoord, yCoord) {
	if (bRecordPoints) { 
		xCoord=Math.round(xCoord*10000)/10000;
		yCoord=Math.round(yCoord*10000)/10000;
		xArray.push(xCoord);
		yArray.push(yCoord);
		pointArray.push(xCoord + ',' + yCoord);
		gPointArray.push(new GLatLng(xCoord, yCoord));
		updateDistances(xArray, yArray, ADD);
		drawPolyLine(gPointArray);
	}
}
	
function updateDistances(xArray, yArray, addOrRemove){
	if (addOrRemove == ADD){
		fLastLeg = getLastLegDistance(xArray, yArray);
		distancesArray.push(distancesArray[distancesArray.length-1]+fLastLeg)
		legArray.push(fLastLeg);
	} else if (addOrRemove == REMOVE) {
		distancesArray.pop();
		legArray.pop();
	}
	updateDistanceBoxes(addOrRemove);
}

function updateDistanceBoxes(addOrRemove) {
	var lint_total=Math.round(returnDistanceInChosenUnits(distancesArray[distancesArray.length-1])*100)/100;
	var fLastLeg = 0;
	if (legArray.length > 0) { fLastLeg = legArray[legArray.length-1]; }
	var lint_lastleg=Math.round(returnDistanceInChosenUnits(fLastLeg)*100)/100;
	if (lint_lastleg==0) {lint_lastleg="start";}
	if (lint_lastleg!="start") lint_lastleg=lint_lastleg+" mi";
	lint_total=lint_total+" mi";
	mt.updateDistance(lint_lastleg,lint_total);
	//if (addOrRemove==ADD) {	
//		irmt.addRow(lint_lastleg,legArray.length,'iroute');
//	} else {
//		irmt.deleteLastRow('iroute');
//	}
}

function returnDistanceInMiles2(point1y, point1x, point2y, point2x) {

	return (3963.0 * (Math.acos(Math.sin(point1y/57.2958) * Math.sin(point2y/57.2958) + Math.cos(point1y/57.2958) * Math.cos(point2y/57.2958) *  Math.cos((point2x/57.2958) - (point1x/57.2958)))));

}

function returnDistanceInMiles(y1, x1, y2, x2) {
         // Alert("TESTING" & y1 & x1 & y2 & x2); 
        //  alert("TESTING: y1=" + y1 + "  x1=" + x1 + "  y2=" + y2 + "  x2=" + x2); 
          
          //3963.0 * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) *  cos(lon2/57.2958 -lon1/57.2958)]
          
        var a =  Math.sin(x1/57.296) * Math.sin(x2/57.296); 
        var b =  Math.cos(x1/57.296) * Math.cos(x2/57.296) * Math.cos((y2/57.296) - (y1/57.296)); 
        return (3963.0 * Math.acos(a+b)); 
        
        

} 

	
function initializeParameter(nameOfParameter, defaultValue){
	var returnVal = '';
	var qstringVal = getQuerystringParameter(nameOfParameter);
	if (qstringVal.length > 0) { returnVal = qstringVal; } 
	else { returnVal = defaultValue; }
	return returnVal;
}

function charFill(string, length, charToFillWith, leftOrRight){
	var initStringLength = string.length;
	for (k=0; k<(length-initStringLength); k++){
		if (leftOrRight == LEFT) { string = charToFillWith + string; } 
		else if (leftOrRight == RIGHT) { string = string + charToFillWith; }
	}
	return string;
}

function expandNumber(num) {
	var isNegative;
	//remove minus sign for calculation of sig digits
	if (num.charAt(0)=="-") {
		isNegative = true;
		num = num.replace('-','');
	} else {
		isNegative = false;
	}
	
	var expandedNumFloat = parseFloat(num) * 100000;
	var stringExpandedNum = expandedNumFloat.toString();
	if (stringExpandedNum.indexOf(".") > 0) {
		stringExpandedNum = stringExpandedNum.substr(0,stringExpandedNum.indexOf("."))
	}
				
	if (stringExpandedNum.length < 5) {
		stringExpandedNum = charFill(stringExpandedNum, 5, "0", LEFT);
	}
	
	if (isNegative) { stringExpandedNum = '-' + stringExpandedNum; }

	return stringExpandedNum;
}

function fixNumber(num){
	if (num.charAt(0)=="-") {
		isNegative = true;
		num = num.replace('-','');
	} else {
		isNegative = false;
	}

	var stringExpandedNum = new String(num);
	if (stringExpandedNum.length < 5) { stringExpandedNum = charFill(stringExpandedNum, 5, "0", LEFT); }
	if (isNegative) { stringExpandedNum = '-' + stringExpandedNum; }
	return stringExpandedNum;
}

function contractNumber(num) {
	var numObj = fixNumber(new String(num));
	var lenNum = numObj.length;
	var decimalLoc = lenNum-5;
	var afterDecimal = numObj.substr(decimalLoc, 5);
	var beforeDecimal = numObj.substr(0, decimalLoc);
	return beforeDecimal + '.' + afterDecimal;
}

function getLine(pointArray){
	var sReturn = '';
	var sIndCoords;
	for (i=0;i<pointArray.length;i++){
		sReturn += pointArray[i].y + ' ' + pointArray[i].x;
		if (i<pointArray.length-1) sReturn += ',';
	}
	return sReturn;
}
function prepPointArray(pointArray){
	var sReturn = '';
	var sIndCoords;
	for (i=0;i<pointArray.length;i++){
		sReturn += (expandNumber(new String(pointArray[i].y)) + ',' + expandNumber(new String(pointArray[i].x)));
		if (i<pointArray.length-1) sReturn += ',';
	}
	return sReturn;
}

function getLastLegDistance(xArray, yArray){
	var distanceToReturn = 0;
	lastPointIdx = xArray.length - 1;
	secondToLastPointIdx = xArray.length - 2;
	if (xArray.length > 1) {
		var fLastLeg;
		distanceToReturn = returnDistanceInMiles(yArray[lastPointIdx], xArray[lastPointIdx], yArray[secondToLastPointIdx], xArray[secondToLastPointIdx]);
	}
	return distanceToReturn;
}
	
// return all the points in this polyline as WKT
function getWKT(booAlert) {
	// needs to be a polygon
	if (gPointArray.length < 3) {
		if (booAlert) alert(gTnotenough); 
		else return "";
		return false;
	}
	// first & last pts must be same
	if (gPointArray[0].y!=gPointArray[gPointArray.length-1].y||
		gPointArray[0].x!=gPointArray[gPointArray.length-1].x) {
		if (booAlert) alert(gTclosearea); 
		else return "";
		return false;
	}
	var l_points='';
	for (i = 0; i < gPointArray.length; ++i) {
		if (i > 0) l_points+=',';
		l_points+=gPointArray[i].x+'+'+gPointArray[i].y;
	}
	return "'"+l_points+"'";
}

function removeLastLeg() {
	if (xArray.length > 0) {
		xArray.pop();
		yArray.pop();			
		pointArray.pop();
		gPointArray.pop();
		drawPolyLine(gPointArray);
		updateDistances(xArray, yArray, REMOVE);
	} else {
		alert(gTnoremove);
	}
}
	
function encodePolyline(a) {
	var p = a.split(',');
	var d = '';
	var xo=0;
	var yo=0;
	
	for(c=0;c<p.length;c+=2) {
		x = p[c];
		xd = x - xo;
		xo = x;
		f = (Math.abs(xd) << 1) - (xd<0);

		do {
			e = f & 31;
			f>>=5;
			if(f){e|=32};
			d+=String.fromCharCode(e+63);
		} while(f!=0);
			
		y = p[c+1];
		yd = y - yo;
		yo = y;
		f = (Math.abs(yd)<<1)-(yd<0);
		
		do {
			e = f & 31;
			f>>=5;
			if(f){e|=32};
			d+=String.fromCharCode(e+63);
		} while (f != 0);
	}
	return d;
} 

function getQuerystringParameter(paramName){
	var sReturnStr = '';
	var queryStringObj = new String(location.href)
	var paramNameObj = new String(paramName+'=');
	paramNameObj = paramNameObj.toLowerCase();
	//parameters were sent
	if (queryStringObj.indexOf('?') > -1) {
		var qStringArray = queryStringObj.split('?');
		if (qStringArray[1].length > 0) {
			var allParams = qStringArray[1]
			var paramArray = allParams.split("&");
			for (i=0; i<= paramArray.length-1; i++){
				var origCaseFullParam = paramArray[i];
				var lcaseFullParam = paramArray[i].toLowerCase();
				if (lcaseFullParam.indexOf(paramNameObj) > -1)
					sReturnStr =  unescape(origCaseFullParam.substr(paramNameObj.length));
			}
		}
	}
	return sReturnStr;
}

function returnPermalinkString(){
	var curCenterX = map.getCenter().getLatDegrees;
	var curCenterY = map.getCenter().getLngDegrees;
	var sPoints = '';
	if (gPointArray.length > 0) { sPoints = encodePolyline(prepPointArray(gPointArray));}
	var locationString = new String(location.href);
	var locationArr = locationString.split('?');
	locationString = locationArr[0];
	return (locationString + '?centerX=' + escape(curCenterX) + '&centerY=' + escape(curCenterY) + '&zl=' + new String(map.getZoom()) + '&fl=' + createFeatureListString() + '&polyline=' + escape(sPoints));
}

function createFeatureListString() {
	var sResult;
	if (map.getCurrentMapType()==G_SATELLITE_TYPE) { sResult = 's'; } 
	else if (map.getCurrentMapType()==G_MAP_TYPE) { sResult = 'm'; } 
	else if (map.getCurrentMapType()==G_HYBRID_TYPE) { sResult = 'h'; }
	sResult += "-";
	sResult += ((getCurrentUnits() == METRIC) ? 'm' : 'e'); 
	sResult += "-";
	sResult += ((document.getElementById('weightRow').style.display=='none') ? 'h' : 's');
	sResult += "-";
	return sResult;
}

function createPermalink(){ location.href=returnPermalinkString(); }

function decodePolyline(a) {
	var b=a.length;
	var c=0;
	var d=new Array();
	var e=0;
	var f=0;
	while(c < b){
		var g;
		var h=0;
		var i=0;
		do{
			g=a.charCodeAt(c++)-63;
			i = i | (g&31)<<h;
			h = h + 5
		}while(g>=32);
		var l;
		if (i & 1){ 			
			l = ~(i >> 1); 	
		} else {				
			l = i >> 1; 	
		}

		e = e + l;
		d.push(e);
		
		h=0;
		i=0;
		do{
			g=a.charCodeAt(c++)-63;
			i = i | (g&31)<<h;
			h = h + 5;
		}while(g>=32);

		var m
		if (i & 1) m = ~(i >> 1);
		else m = i >> 1
				
		f = f + m;
		d.push(f)
	}
	return d;
}

// Clear measured route and all associations 
function funclearLinkHandler(pbooKeepRecording){
	distancesArray.splice(1,distancesArray.length-1);
	legArray.splice(0,legArray.length);
	pointArray.splice(0,pointArray.length);
	gPointArray.splice(0,gPointArray.length);
	xArray.splice(0,xArray.length);
	yArray.splice(0,yArray.length);
			
	//document.total.value='0';
	//document.lastleg.value='0';					

	//map.clearOverlays();
	removeMeasures();
	if (!pbooKeepRecording) bRecordPoints = false;
	//irmt.deleteAllRows('iroute');
}

function removeMeasures() {
	for (var i=0; i< overlays.length;i++) {
		map.removeOverlay(overlays[i]);
	}

}
function drawPolyLine(gPointArray){
	//map.clearOverlays();
	removeMeasures();
	//this function may be called from removeLastLeg, in which case 
	//we still want to clear points (above) but don't want to draw a new one.
	if (gPointArray.length > 0) {
		//start
  		var startMarker = new GMarker(gPointArray[0]);
  		map.addOverlay(startMarker);
	    overlays.push(startMarker);
		startMarker.type="measure";
  		//end
  		var EndMarker = new GMarker(gPointArray[gPointArray.length-1]);
  		map.addOverlay(EndMarker);
	    overlays.push(EndMarker);
		EndMarker.type="measure";
		//var pl=new GPolyline(gPointArray,'#ff00ff',5,.5);
		pl=new GPolyline(gPointArray);
		map.addOverlay(pl);
	    overlays.push(pl);
	    pl.type="measure";
		if (pl.drawElement) { pl.drawElement.className=""; } 

    //    routePolyline = map.addOverlay(new GPolyline(gPointArray));
	}
}

function setCurrentUnits(unitsToSet){
	var unitInput = document.Munits;
	if (unitsToSet == ENGLISH) {
		unitInput[0].checked = true;
		unitInput[1].checked = false;
	} else if (unitsToSet == METRIC) {
		unitInput[0].checked = false;
		unitInput[1].checked = true;
	} 
}

function getCurrentUnits(){
	var curValue;
	curValue=ENGLISH;
	//var unitInput = document.map_form.Munits;
	//if (unitInput[0].checked) { curValue = ENGLISH;} 
	//else if (unitInput[1].checked) { curValue = METRIC; }
	return curValue;
}

function getCurrentMultiplier(type){
	var curValue = getCurrentUnits();		
	var multiplier;
	if (type == DISTANCE) {
		if (curValue==METRIC) { multiplier = 1.609345; } 
		else { multiplier = 1.0; }
	} else if (type ==  WEIGHT) {
		if (curValue==METRIC) { multiplier = 0.45359237; } 
		else { multiplier = 1.0; }
	}
	return multiplier;
}

function returnDistanceInChosenUnits(valueToApplyTo){
	var multiplier = getCurrentMultiplier(DISTANCE);		
	return valueToApplyTo * multiplier;
}	

function handleUnitToggle(unitsToSet){
	setUnitLabels(unitsToSet);
}

function setUnitLabels(unitsToSet){
	if (unitsToSet == METRIC) {
		document.getElementById("dstUnits1").innerHTML = "km";
		document.getElementById("dstUnits2").innerHTML = "km";
		document.getElementById("dstUnits3").innerHTML = "sq km.";
		document.getElementById("dstUnits4").innerHTML = "hectares";
	} else if (unitsToSet == ENGLISH) {                 
		document.getElementById("dstUnits1").innerHTML = "miles";
		document.getElementById("dstUnits2").innerHTML = "miles";
		document.getElementById("dstUnits3").innerHTML = "sq mi.";
		document.getElementById("dstUnits4").innerHTML = "acres";
	}
	updateDistances();
	updateAreaBoxes();
}

function setUnits(unitsToSet){
	if (unitsToSet != getCurrentUnits()) {
		setCurrentUnits(unitsToSet);
		setUnitLabels(unitsToSet);
	}
}
