﻿// display_measure.js

//

var m_currentMeasureToolbarTool = "polyline";
var m_measureToolbarImagePath = "images/";
var m_measureToolbarImageExtension = ".gif";
var m_measureDisplay = "MeasureDisplay";
var m_measureToolbarId = "MeasureToolbar";
var m_measureLengthsTotal = 0.0;
var m_measureAreasTotal = 0.0;
var m_measureXOffset = 0;
var m_measureYOffset = 0;
var m_MeasureTypes = new Array();
m_MeasureTypes[0] = "point";
m_MeasureTypes[1] = "polyline";
m_MeasureTypes[2] = "polygon";
var m_measureMoveFunction = null;
var m_measureCoords="";
var m_measureToolbar = null;
var m_measureGraphicFeature = null;

function checkMeasureToolbarBorder(cell, type) {
    if (type.toLowerCase()==m_currentMeasureToolbarTool)
        cell.style.borderColor = "Black";
    else
        cell.style.borderColor = "White";  
}

// set current measure tool
function setMeasureToolbarTool(type) {
	m_currentMeasureToolbarTool = type.toLowerCase();
	var cellObj;
	var buttonId = "";
	for (var i=0; i<m_MeasureTypes.length; i++) {
		buttonId = "MeasureToolbarButton_" + m_MeasureTypes[i];
		cellObj = document.getElementById(buttonId);
		if (cellObj!=null) {
			if (m_MeasureTypes[i]==m_currentMeasureToolbarTool) {
				cellObj.style.borderColor = "Black";
				cellObj.style.backgroundColor = "#EEEEEE";
				startMeasure();
			}
			else {
				cellObj.style.borderColor = "White";
				cellObj.style.backgroundColor = "White";
			}
		}
	}
}


// Polyline Measure action ... for distances
function MeasurePolyline(divid) {
//	map = Maps[divid];
//	if (map!=null) {
//        map.vectorCallbackFunctionString = measureVectorCallbackFunctionString;
//        vectortoolbar = "MeasureToolbar";
//		map.setTool("Measure", false, "ClickShape", "crosshair", 1, "visible", 
//		"Measure-Polyline - Click to start line. Click again to add vectors. Double-click to add last vector and complete polyline.", false, measureVectorCallbackFunctionString);
//	}
    var map = $find("Map1");
   if (map != null) {
        map.getGeometry(ESRI.ADF.Graphics.ShapeType.Path, MapCoordsClick, null, 'black', 'blue', 'crosshair', true);
        vectortoolbar = "MeasureToolbar";
    }
}

// Polygon Measure action ... for areas
function MeasurePolygon(divid) {
//	map = Maps[divid];
//	if (map!=null) {
//        map.vectorCallbackFunctionString = measureVectorCallbackFunctionString;
//        vectortoolbar = "MeasureToolbar";
//		map.setTool("Measure", false, "ClickShape", "crosshair", 2, "visible", 
//		"Measure-Polygon - Click to start line. Click again to add vectors. Double-click to add last vector and complete polygon.", false, measureVectorCallbackFunctionString);
//	}
    var map = $find("Map1");
    if (map != null) {
        map.getGeometry(ESRI.ADF.Graphics.ShapeType.Ring, MapCoordsClick, null, 'black', 'black', 'crosshair', true);
        vectortoolbar = "MeasureToolbar";
    }
}

// Point Measure action ... for location coordinates
function MeasurePoint(divid) {
//	map = Maps[divid];
//	if (map!=null) {
//        vectortoolbar = "MeasureToolbar";
//        //MapPoint(map.controlName, "Measure", false, "pointer");
//        map.setTool("Measure", false, "Point", "pointer", -1, "visible","");
//        map.divObject.onmousedown = MapCoordsClick;
//        map.mode = "MeasurePoint";
//        var vo = map.vectorObject;
//        showLayer(vo.divId);
//        vo.clear();
//        vo.draw();
//	}    
    var map = $find("Map1");
    if (map != null) {
        map.getGeometry(ESRI.ADF.Graphics.ShapeType.Point, MapCoordsClick, null, 'black', null, 'pointer', true);
    }
}

// Handler for MeasurePoint clicks
function MapCoordsClick(geom, evtArgs) {
//	var vo = map.vectorObject;
//	var pix = vo.pixelObject;
//	var xycoord = vo.xyCoord;
//	getXY(e);
//	zleft = mouseX - map.containerLeft;
//	ztop = mouseY - map.containerTop;
//	vo.clear();
//	vo.crosshair(zleft, ztop);
//	vo.draw();

//	map.xMin=zleft;
//	map.yMin=ztop;
//	map.getTopLeftTile();
//    coordString = + zleft + ":" + ztop;
//    var argument = "ControlID=" + map.controlName + "&EventArg=Point&ControlType=Map&coords=" + coordString + "&VectorMode=Measure&VectorAction=Coordinates&minx=" + zleft + "&miny=" + ztop;
////DEF:    if (checkForFormElement(document, 0, "MeasureUnits")) argument += "&MeasureUnits=" + document.forms[0].MeasureUnits.value;
////    if (checkForFormElement(document, 0, "AreaUnits")) argument += "&AreaUnits=" + document.forms[0].AreaUnits.value;
////    if (checkForFormElement(document, 0, "MapUnits")) argument += "&MapUnits=" + document.forms[0].MapUnits.options[document.forms[0].MapUnits.selectedIndex].value;

//    if (checkForFormElement(document, 0, "MeasureUnits")) argument += "&MeasureUnits=" + Ext.get('MeasureUnits').dom.value;
//    if (checkForFormElement(document, 0, "AreaUnits")) argument += "&AreaUnits=" + Ext.get('AreaUnits').dom.value
//    if (checkForFormElement(document, 0, "MapUnits")) argument += "&MapUnits=" + Ext.get('MapUnits').dom.options[Ext.get('MapUnits').dom.selectedIndex].value;
//    
//    var context = map.controlName + ",Point";
//    
//    map.vectorCallbackFunctionString = measureVectorCallbackFunctionString;
//    eval(map.vectorCallbackFunctionString);
var map = $find('Map1');
    var geomString = '';
    var type = '';
    var vectorAction = 'measure';
    var spatialRef = '';
    removeMeasureGraphic();
    var style = null;
    if (ESRI.ADF.Geometries.Point.isInstanceOfType(geom)) {
        geomString = geom.toString(':');
        type = 'point';
        style = new ESRI.ADF.Graphics.MarkerSymbol("images/crosshair.png", 6, 6);
        spatialRef = '&WKID=' + geom.get_spatialReference().id;
    }
    else if (ESRI.ADF.Geometries.Polyline.isInstanceOfType(geom)) {
        geomString = geom.getPath(0).toString('|', ':');
        type = 'polyline';
        style = new ESRI.ADF.Graphics.LineSymbol("black", 2);
    }
    else if (ESRI.ADF.Geometries.Polygon.isInstanceOfType(geom)) {
        geomString = geom.getRing(0).toString('|', ':');
        type = 'polygon';
        style = new ESRI.ADF.Graphics.FillSymbol("black", "black", 2);
        style.set_opacity(0.2);
    }
    m_measureGraphicFeature = $create(ESRI.ADF.Graphics.GraphicFeature,
		        { "id": "MeasurePointIcon", "geometry": geom, "symbol": style });
    map.addGraphic(m_measureGraphicFeature);
    coordString = geomString;

    m_measureLastCoords = m_measureCoords;
    m_measureCoords = "";
    
    
    var argument = 'ControlID=' + map.get_id() + '&EventArg=' + type + '&coords=' + geomString + '&VectorMode=' + vectorAction + spatialRef;
    var measU = $get("MeasureUnits");
    var aU = $get("AreaUnits");
    var mU = $get("MapUnits");
    if (measU != null) argument += "&MeasureUnits=" + measU.value;
    if (aU != null) argument += "&AreaUnits=" + aU.value;
    if (mU != null) argument += "&MapUnits=" + mU.options[mU.selectedIndex].value;

    var context = this;
    eval(measureVectorCallbackFunctionString);
}

// measure tool is selected... call current type (polyline for distance, polygon for area)
function startMeasure() {
    var md;
    if (m_measureDisplay!=null) {
        md = document.getElementById(m_measureDisplay);
    }
	if (m_currentMeasureToolbarTool=="point") {
		//alert("MeasurePoint");
        if (md!=null) md.innerHTML = "Click on the map to return the coordinate location of the point.<br />";
		MeasurePoint();
	} else if (m_currentMeasureToolbarTool=="polyline") {
		//alert("MeasurePolyline");
        if (md!=null) md.innerHTML = "Click on the map and draw a line. Double-click to end the line.<br />";
		MeasurePolyline();
	} else {
		//alert("MeasurePolygon");
        if (md!=null) md.innerHTML = "Click on the map and draw a polygon. Double-click to end the polygon.<br />";
		MeasurePolygon();
	}
}

function closeMeasureToolbarTool(id) {
//    if (id!=null) m_measureToolbarId = id;
//    m_measureToolbar = document.getElementById(m_measureToolbarId);
//    if (m_measureToolbar!=null) {
//        m_measureToolbar.style.visibility = "hidden";
//    }
//    map.vectorObject.clear();
//    map.vectorObject.draw(); 
    var map = $find('Map1');
    //hideMeasureToolbarTool(id);
    removeMeasureGraphic();
    map.cancelGetGeometry();
    //map.remove_mouseUp(MeasureCoordsMouseUp);
    m_measureMouseUpSet = false;
}

// update distance unit settings... request new totals from server
//
function changeMeasureUnits() {
    var f = document.forms[docFormID];
    var i = f.MeasureUnits2.selectedIndex;
    var m = f.MeasureUnits2.options[i].value;
    MeasureUnits.value = m;
    munits.value = m; 
    coordString = map.coords;
    if (coordString==null) coordString="";
    var argument = "ControlID=" + map.controlName + "&EventArg=" + m_currentMeasureToolbarTool + "&ControlType=Map&coords=" + coordString + "&VectorMode=" + map.mode + "&VectorAction=AddPoint&MeasureUnits=" + m;
   if (checkForFormElement(document, 0, "AreaUnits")) {
        argument += "&AreaUnits=" + f.AreaUnits.value;
   } 
    var context = map.controlName + "," + m_currentMeasureToolbarTool;

    	// Debug stuff to be removed, or at least commented out
   	if (checkForFormElement(document, 0, "MapDebugBox")) document.forms[0].MapDebugBox.value += ("Vector Request: " + context + ": MeasureUnits=" + m + "\n"); 
		                
    eval(map.vectorCallbackFunctionString);    
}

// update area unit settings... request new totals from server
function changeAreaUnits() {
//    var f = document.forms[docFormID];
//    var i = f.AreaUnits2.selectedIndex;
//    var a = f.AreaUnits2.options[i].value;
//    f.AreaUnits.value = a
//    coordString = map.coords;
//    if (coordString==null) coordString="";
//    var argument = "ControlID=" + map.controlName + "&EventArg=" + m_currentMeasureToolbarTool + "&ControlType=Map&coords=" + coordString + "&VectorMode=" + map.mode + "&VectorAction=AddPoint&AreaUnits=" + a;
//   if (checkForFormElement(document, 0, "MeasureUnits")) {
//        argument += "&MeasureUnits=" + f.MeasureUnits.value;
//   } 
//    var context = map.controlName + "," + m_currentMeasureToolbarTool;

//    	// Debug stuff to be removed, or at least commented out
//   	if (checkForFormElement(document, 0, "MapDebugBox")) document.forms[0].MapDebugBox.value += ("Vector Request: " + context + ": AreaUnits=" + a + "\n"); 
//		                
//	eval(map.vectorCallbackFunctionString);   
    var map = $find('Map1');
    var m2 = $get("MeasureUnits2");
    var a2 = $get("AreaUnits2");
    var i = m2.selectedIndex;
    var m = m2.options[i].value;
    var mu = $get("MeasureUnits");
    mu.value = m;
    if (coordString == null) coordString = "";
    var argument = "ControlID=" + map.get_id() + "&EventArg=" + m_currentMeasureToolbarTool + "&ControlType=Map&coords=" + m_measureLastCoords + "&VectorMode=measure&VectorAction=AddPoint&MeasureUnits=" + m + "&refresh=true";
    if (a2 != null) {
        argument += "&AreaUnits=" + a2.value;
    }
    var context = map.get_id() + "," + m_currentMeasureToolbarTool;
    eval(measureVectorCallbackFunctionString); 
}

//// event handler for starting to drag toolbar around... mouse down
//function dragMeasureToolbarStart(e, id) {
//    if (id!=null) m_measureToolbarId = id;
//    m_measureToolbar = document.getElementById(m_measureToolbarId);
//    if (m_measureToolbar!=null) {
//        getXY(e);
//        var box = calcElementPosition(m_measureToolbarId);
//        m_measureXOffset = mouseX - box.left;
//        m_measureYOffset = mouseY - box.top;
//    }
//    m_measureMoveFunction = document.onmousemove; 
//    document.onmousemove = dragMeasureToolbarMove;
//    document.onmouseup = dragMeasureToolbarStop;
//    return false;
//}

//// event handler for toolbar drag movement... mousemove
//function dragMeasureToolbarMove(e) {
//    getXY(e);
//    m_measureToolbar.style.left = (mouseX-m_measureXOffset) + "px";;
//    m_measureToolbar.style.top = (mouseY-m_measureYOffset) + "px";
//    return false;
//}

//// event handler for end of toolbar drag movement... mouseup
//function dragMeasureToolbarStop(e) {
//    document.onmousemove = m_measureMoveFunction;
//    document.onmouseup = null;
//    return false;
//}

// set up the images for transparency in IE6
function setIE6MeasureToolbarImages() {
    var imageId = "";
    var imgSrc = ""; 
    var imgObj = document.images["MeasureToolbar_CloseButton"];
    if (imgObj!=null) {
        imgObj.src = "images/blank.gif";
        imgObj.style.filter =  "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=/aspnet_client/ESRI/WebADF/images/dismiss.png)";
    }
    for (var i=0; i<m_MeasureTypes.length; i++) {
	    imageId = "ToolbarImage_" + m_MeasureTypes[i];
	    imgObj = document.images[imageId];
	    if (imgObj!=null) {
	        imgSrc = imgObj.src;
            imgObj.src = "images/blank.gif";
            imgObj.style.filter =  "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + imgSrc + ")";
	    }
    }

}

function measureComplete(result, id, area, perimeter, segment, totaldistance) {
    var md = $get(m_measureDisplay);
    if (result) {
        md.innerHTML = result;
    }
    else {
        //just replace values
        var tdperimeter = $get("tdperimiter");
        var tdarea = $get("tdarea");
        var tdsegment = $get("tdsegment");
        var tdtotaldistance = $get("tdtotaldistance");

        if (tdarea) { tdarea.innerHTML = area; }
        if (tdperimeter) { tdperimeter.innerHTML = perimeter; }
        if (tdsegment && segment) { tdsegment.innerHTML = segment; }
        if (tdtotaldistance && totaldistance) { tdtotaldistance.innerHTML = totaldistance; }
    }
}


function removeMeasureGraphic() {
    var map = $find('Map1');
    if (m_measureGraphicFeature != null) {
        map.removeGraphic(m_measureGraphicFeature);
        m_measureGraphicFeature.dispose();
        m_measureGraphicFeature = null;
        map.refreshGraphics();
    }

}