// S GIRVIN 10/2005

//GLOBAL VARIABLES

var totalMeasure=0;
var currentMeasure=0;

// variables for interactive clicks
var clickCount = 0;
var clickPointX = new Array();
var clickPointY = new Array();
var clickMeasure = new Array();
var numDecimals = 2;

// MEASURE FUNCTIONS

// zero out all clicks in clickCount
function resetClick() {
	var c1 = clickCount;
	clickCount=0;
	clickPointX.length=1;
	clickPointY.length=1;
	currentMeasure=0;
	totalMeasure=0;
	clickMeasure.length=1;
}


// put a point at click and add to clickCount
function clickAddPoint(x,y) {
	clickPointX[clickCount]=x;
	clickPointY[clickCount]=y;
	clickCount += 1;
	totalMeasure = totalMeasure + currentMeasure;
	clickMeasure[clickCount]=totalMeasure;
	
	var num = clickPointY[clickCount - 1];
	num = convertUnits(num);
	num = makeRealWorldY(num);
	// alert(num);
}

// calculate distance to current scalebarunits
function calcDistance(mX,mY) {
	// Note: decimal are not hard coded to allow use with locales 
	// using commas instead of points.
	if (clickCount>0) {
		var mDistance = 0;
		var p = clickCount-1;
		var xD = Math.abs(mX - clickPointX[p]);
		var yD = Math.abs(mY - clickPointY[p]);
		mDistance = Math.sqrt(Math.pow(xD,2) + Math.pow(yD,2));
		// alert(clickPointX[p] + ':' + mX);
		var theDist = convertUnits(mDistance);
		var u = Math.pow(10,numDecimals);
		currentMeasure = parseInt(theDist*u+(5/10))/u;
	}
}

// convert the amounts to new units
function convertUnits(theDist1) {
	// Note: decimal are not hard coded to allow use with locales 
	// using commas instead of points.	

	var theDist = parseFloat(theDist1);
	var mDistance = theDist;
	var txtBox = xGetElementById("displayScale")
	var dispScale = parseFloat(txtBox.value);
	mDistance = theDist * dispScale; 
	var u = Math.pow(10,numDecimals);
	mDistance = parseInt(mDistance * u + (5/10)) / u 
	return mDistance;
}

// update measureBox layer

function updateMeasureBox() {
	var frmID = "sspsFormIF";
	var id = "measureBoxFrm";
		
	var theForm = document.all? (top.document.frames(frmID).document.all[id] || null)
	 	: document.getElementById? (top.document.getElementById(frmID).contentDocument.getElementById(id) || null)
	 	: null ;
	 	
	var j = 1;
	var u = Math.pow(10,numDecimals);
	var tMeas = 0;

	if (totalMeasure!=0) tMeas = parseInt(totalMeasure*u+0.5)/u;
	
	var strMeas = (tMeas > 1000) ? roundNumber((tMeas / 1000),2) + " km" : tMeas + " m";
	theForm.theMeasTotal.value = strMeas
	
	strMeas = (currentMeasure > 1000) ? roundNumber((currentMeasure / 1000),2) + " km" : 
	currentMeasure + " m";
	
	theForm.theMeasSegment.value = strMeas;
	theForm.theCurrSegment.value = strMeas; 

}

function updateMeasureBoxDynamic() {
	var frmID = "sspsFormIF";
	var id = "measureBoxFrm";
		
	var theForm = document.all? (top.document.frames(frmID).document.all[id] || null)
	 	: document.getElementById? (top.document.getElementById(frmID).contentDocument.getElementById(id) || null)
	 	: null ;

	strMeas = (currentMeasure > 1000) ? roundNumber((currentMeasure / 1000),2) + " km" : 
	currentMeasure + " m";
	
	theForm.theCurrSegment.value = strMeas;
}

function roundNumber(myNum, numDecimals) {
	var newNum = Math.round(myNum*Math.pow(10,numDecimals))/
	Math.pow(10,numDecimals);
	return newNum;
}


function saveCoordinateString(){
	var txtBox = xGetElementById("strCoords")
	var strCoords = "";
    for(i = 0; i < clickCount; i++) {
		strCoords = strCoords + makeRealWorldX(convertUnits(clickPointX[i])) + 
		"," + makeRealWorldY(convertUnits(clickPointY[i])) + ";";
    }
    strCoords = strCoords.substring(0,strCoords.length-1)  // trim last comma
    txtBox.value = strCoords;
}

// take into account map offset

function makeRealWorldX(num){
	var txtBox = xGetElementById("storageOffsetX")
	var theOffset = parseFloat(txtBox.value);
	num = (num + theOffset);
	return num;
}

function makeRealWorldY(num){
	var txtBox = xGetElementById("storageOffsetY")
	var theOffset = parseFloat(txtBox.value);
	num = (theOffset - num);
	return num;
}
// END OF MEASURE FUNCTIONS


function init() {
    mylayer = xGetElementById("placeHolder")
    xAddEventListener(mylayer,'mousedown',layerDownHandler)
    xAddEventListener(mylayer,'mouseup',layerUpHandler)
    xAddEventListener(mylayer,'mousemove',layerMoveHandler)
    xAddEventListener(mylayer,'Click',layerClickHandler)
    // xAddEventListener(mylayer,'DblClick',layerDoubleClickHandler)
}

function deinit() {
    mylayer = xGetElementById("placeHolder")
    xRemoveEventListener(mylayer,'mousedown',layerDownHandler)
    xRemoveEventListener(mylayer,'mouseup',layerUpHandler)
    xRemoveEventListener(mylayer,'mousemove',layerMoveHandler)
    xRemoveEventListener(mylayer,'Click',layerClickHandler)
    // xRemoveEventListener(mylayer,'DblClick',layerDoubleClickHandler)
}

//stops events bubbling back up to the tranparent PNG

function stopBubbling(e)
{
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}


function layerDownHandler(evt) {
    if (evt.button == 2) {
        layerDoubleClickHandler(evt);
        stopBubbling(evt);
        return false;
    }
    return true
}

function layerUpHandler(evt) {
    return false
}

function layerMoveHandler(evt) {
    // return false
    var e = new xEvent(evt)
    var x = e.offsetX
    var y = e.offsetY
    calcDistance(x,y);
    updateMeasureBoxDynamic();
}

function layerDoubleClickHandler(evt) {

    var sX = GetXCoords();
    var sY = GetYCoords();

    var Xpoints = new Array(GetXCoords());
    var Ypoints = new Array(GetYCoords());

    sX = sX.split(',')
    sY = sY.split(',')
    
    for(i = 0; i < sX.length; i++) {
	Xpoints[i] = eval(sX[i]);
    }

    for(i = 0; i < sY.length; i++) {
	Ypoints[i] = eval(sY[i]);
    }

    // UPDATE LENGTHS BY TAKING DISTANCE BETWEEN FIRST AND LAST POINTS IN ARRAY
    // THEN RESET VARIABLES

    calcDistance(Xpoints[0],Ypoints[0]);
	totalMeasure = totalMeasure + currentMeasure;
	clickMeasure[clickCount]=totalMeasure;
    updateMeasureBox();
    saveCoordinateString();
    resetClick();
    

    // END

    jg.clear();
    jg.setColor("#00ffff"); // light blue
    // jg.fillPolygon(Xpoints, Ypoints);
    jg.drawPolygon(Xpoints, Ypoints);
    jg.paint();

    // need this or layers in DIVs come back on
    setLegend();
    
    RemoveAllCoords();
}

function layerClickHandler(evt) {

    var e = new xEvent(evt)
    var x = e.offsetX
    var y = e.offsetY
    
    if(x != 0 && y != 0) {
	AddCoords(x,y);
    }
    else {
	return;    
    }

    // UPDATE MEASUREMENT BOX

    calcDistance(x,y);
    clickAddPoint(x,y);
    updateMeasureBox();

    // END

    var sX = GetXCoords();
    var sY = GetYCoords();

    var Xpoints = new Array(GetXCoords());
    var Ypoints = new Array(GetYCoords());

    sX = sX.split(',')
    sY = sY.split(',')
    
    for(i = 0; i < sX.length; i++) {
	Xpoints[i] = eval(sX[i]);
    }

    for(i = 0; i < sY.length; i++) {
	Ypoints[i] = eval(sY[i]);
    }
   
    if (Xpoints != null) {

	    // alert(Xpoints + ':' + Ypoints);
	    jg.clear();
	    jg.setColor("#ffff00"); // yellow

	    jg.fillOval(eval(x),eval(y),2,2); 

	    jg.setStroke(2);
	    // jg.setStroke(Stroke.DOTTED);
	    jg.drawPolyLine(Xpoints, Ypoints); // co-ordinates related to "myCanvas"
	    jg.paint();
    }
    // need this or layers in DIVs come back on
    setLegend();
}

function clearAll()
{
  jg.clear();
  RemoveAllCoords();
}

function validateCoords(){
	return true;
}

function AddCoords(sX, sY){
	var myListBox = document.getElementById("lstCoords");	
	var iLength = myListBox.options.length;
	// myListBox.options[iLength] = new Option(sX + ',' + sY,iLength);
	myListBox.options[iLength] = new Option(sX,sY);

	myListBox = document.getElementById("lstCoords2");
	var iLength = myListBox.options.length;
	myListBox.options[iLength] = new Option(sX + ',' + sY,iLength);

}

function GetLastCoord(){
	var sCoords;
	myListBox = document.getElementById("lstCoords");
	var iLength = myListBox.options.length;
	if (iLength > 0) {
		sCoords = myListBox.options[iLength - 1].text;
		return sCoords;
	}
}

function GetAllCoords(){
	var sCoords;
	myListBox = document.getElementById("lstCoords");

	for (var i = 0; i < myListBox.length; i++) {
		sCoords = sCoords + ',' + myListBox.options[i].text;
	}
	return sCoords;
}

function GetXCoords(){
	var sCoords = '';
	myListBox = document.getElementById("lstCoords");
	for (var i = 0; i < myListBox.length; i++) {
		if(sCoords.length > 0) {
			sCoords = sCoords + ',' + myListBox.options[i].text;
		} else {
			sCoords = myListBox.options[i].text;
		}
	}

	return sCoords;
}

function GetYCoords(){
	var sCoords = '';
	myListBox = document.getElementById("lstCoords");
	for (var i = 0; i < myListBox.length; i++) {
		if(sCoords.length > 0) {
			sCoords = sCoords + ',' + myListBox.options[i].value;
		} else {
			sCoords = myListBox.options[i].value;
		}
	}

	return sCoords;
}


function RemoveAllCoords() {
	myListBox = document.getElementById("lstCoords");

	var intCount = myListBox.options.length;
	for (var i = (myListBox.length -1); i >= 0; i--){
		myListBox.options[i] = null;
	}
}

// following used for zoom

function saveCoord(x,y){
	var myX = makeRealWorldX(convertUnits(x));
	var myY = makeRealWorldY(convertUnits(y));
	// alert("X:" + myX + " Y:" + myY);
	
	xGetElementById("mapX").value = myX;
	xGetElementById("mapY").value = myY;

	xGetElementById("mapForm").action = "genMap.aspx"; // this strips out the querystring
	xGetElementById("mapForm").submit();
}

function setLegend() {
	
	// on first load, legIF not ready - error trap this
	try{	
		runScript('legIF','setDisplay');
	}
	catch(ex){}
}

function setUserHelp(sUserHelp) {
// trap errors for when ssps.aspx has not yet loaded 
// then text is loaded in onLoad event in the ssps.aspx page
	try{ 
		var objTxtArea = getObject('sspsFormIF','txtHelp');
		objTxtArea.value = sUserHelp;
	}
	catch(ex){}
}

function refreshTools() {
		parent.sspsFormIF.location.href = 'ssps.aspx';  
}

