﻿// display_measure.js

var m_currentMeasureToolbarTool = "polyline";
var m_measureToolbarImagePath = "images/";
var m_measureToolbarImageExtension = ".gif";
var m_measureMessage = "MeasureMessage";
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[0] = "polyline";
m_MeasureTypes[1] = "polygon";
var m_measureGeometryType = "";
var m_measureMoveFunction = null;
var m_measureCoords = "";
var m_measureLastCoords = "";
var m_measureMouseUpSet = false;
var m_measureMouseMoveSet = false;
var m_measureUnits = "Miles";
var m_areaUnits = "Sq_Miles";
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(false);
			}
			else {
				cellObj.style.borderColor = "White";
				cellObj.style.backgroundColor = "White";
			}
		}
	}
}


// Polyline Measure action ... for distances
function MeasurePolyline(map) {
	if (map!=null) {
		map.getGeometry(ESRI.ADF.Graphics.ShapeType.Path, MapMeasureClick, null, 'black', 'blue','crosshair', true);
        vectortoolbar = "MeasureToolbar";
	}
}

// Polygon Measure action ... for areas
function MeasurePolygon(map) {
	if (map!=null) {
		map.getGeometry(ESRI.ADF.Graphics.ShapeType.Ring,MapMeasureClick,null,'black','black','crosshair', true);        
        vectortoolbar = "MeasureToolbar";
	}
}

// Point Measure action ... for location coordinates
//function MeasurePoint(map) {
//	if (map!=null) {
//		map.getGeometry(ESRI.ADF.Graphics.ShapeType.Point,MapCoordsClick,null,'black',null,'pointer', true);        
//	}    
//}

// OnComplete Handler - called on double-click, when geometry is complete
function MapMeasureClick(geom, evtArgs) {
	var geomString = '';
	var type = '';
    removeMeasureGraphic();
    var style = null; 
	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_measureGeometryType = type;
	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 = "";

	UpdateMeasurements(geomString);

/***
	var argument = 'ControldID='+map.get_id()+'&EventArg='+type+'&coords='+geomString+'&VectorMode=measure';
	if ($get("MeasureUnits") != null) 
            argument += "&MeasureUnits=" + $get("MeasureUnits").value;
    if ($get("AreaUnits") != null) 
            argument += "&AreaUnits=" + $get("AreaUnits").value;
//    if ($get("MapUnits") != null) 
//            argument += "&MapUnits=" + $get("MapUnits").options[$get("MapUnits").selectedIndex].value;
	var context = this;
	eval(measureVectorCallbackFunctionString);
***/
	
	//measure complete -start again
	startMeasure(true);
}

function MeasureCoordsMouseUp(sender, args) {
    
    m_measureToolbar = $get(m_measureToolbarId);
    if (m_measureToolbar!=null) {
        m_measureToolbar.style.display = ""; //if display="none", make visible here
    }
    if (m_currentMeasureToolbarTool!="point") {
        var coords = args.coordinate;
        if (coords!=null && !isNaN(coords.get_x()) && !isNaN(coords.get_y())) {
            // ignore null or non-numeric input
            if (m_measureCoords.length>0) {
                if (args.button==Sys.UI.MouseButton.rightButton) {
                    var pos = m_measureCoords.lastIndexOf("|");
                    m_measureCoords =  m_measureCoords.substring(0,pos);
                } else if (args.button==Sys.UI.MouseButton.leftButton){  
                    m_measureCoords += "|" + coords.get_x() + ":" + coords.get_y();
                } else
                    return;
/***                    
	            var argument = 'ControldID='+map.get_id()+'&EventArg='+m_currentMeasureToolbarTool+'&coords='+m_measureCoords+'&VectorMode=measure';
	            if ($get("MeasureUnits") != null) 
                    argument += "&MeasureUnits=" + $get("MeasureUnits").value;
                if ($get("AreaUnits") != null) 
                    argument += "&AreaUnits=" + $get("AreaUnits").value;
////                if ($get("MapUnits") != null) 
////                    argument += "&MapUnits=" + $get("MapUnits").options[$get("MapUnits").selectedIndex].value;
                var context = this;
	            
	            eval(measureVectorCallbackFunctionString);
**/
                UpdateMeasurements(m_measureCoords);
	        } else {
	            //first node in the geometry
                removeMeasureGraphic();
                if (args.button==Sys.UI.MouseButton.rightButton)
                    m_measureCoords = "";
                else if (args.button==Sys.UI.MouseButton.leftButton)
                    m_measureCoords = coords.get_x() + ":" + coords.get_y();

                UpdateMeasurements(m_measureCoords);
	                
	        }
	        m_measureLastCoords = m_measureCoords;
//	    } else {
//	        window.status = "no coords";
	    }
	}
}

function MeasureCoordsMouseMove(sender, args) {
    var coords = args.coordinate;
    if (m_measureCoords.length>0 && coords != null && !isNaN(coords.get_x()) && !isNaN(coords.get_y())) {
        var tmp_measureCoords = m_measureCoords + "|" + coords.get_x() + ":" + coords.get_y();
        UpdateMeasurements(tmp_measureCoords);
    }
}

function UpdateMeasurements(measureCoords) {
    var coordPairs = measureCoords.split("|");

    var points = new Array();
    var distances = new Array();
    var totalDistance = 0.0;
    var segmentDistance = 0.0;
    var perimeter = 0;
    var area = 0;
    var roundFactor = Math.pow(10, 3);
    var xD = 0;
    var yD = 0;

    for (var cp = 0; cp < coordPairs.length; cp++) {
        var xys = coordPairs[cp].split(":");
        points.push(xys);

        if (cp > 0) {
            var prevXYs = points[cp - 1];
            // check for duplicate points from double click.... Firefox will send coords for both clicks, causing segmentDistance to be zero.
            if (prevXYs[0] != xys[0] || prevXYs[1] != xys[1]) {
                // get third side of triangle for distance
                xD = Math.abs(xys[0] - prevXYs[0]);
                yD = Math.abs(xys[1] - prevXYs[1]);
                var tempDist = Math.sqrt(Math.pow(xD, 2) + Math.pow(yD, 2));
                var segmentDistance = ConvertUnits(tempDist, "Feet", m_measureUnits);


                distances.push(segmentDistance);
                totalDistance += segmentDistance;

                segmentDistance = Math.round(segmentDistance * roundFactor) / roundFactor;
                totalDistance = Math.round(totalDistance * roundFactor) / roundFactor;
            }
        }

    }


    if (m_measureGeometryType == "polygon") {
        xD = Math.abs(points[points.length - 1][0] - points[0][0]);
        yD = Math.abs(points[points.length - 1][1] - points[0][1]);
        var tempDist = Math.sqrt(Math.pow(xD, 2) + Math.pow(yD, 2));
        var tempDist2 = ConvertUnits(tempDist, "Feet", m_measureUnits);
        perimeter = totalDistance + tempDist2;
        perimeter = Math.round(perimeter * roundFactor) / roundFactor;

        distances.push(tempDist2);
        points.push(points[0]);

        // add area calculation
        var tempArea = 0;
        var xDiff, yDiff;
        for (var j = 0; j < points.length - 1; j++) {
            var x1 = points[j][0];
            var x2 = points[j + 1][0];
            var y1 = points[j][1];
            var y2 = points[j + 1][1];
            xDiff = x2 - x1;
            yDiff = y2 - y1;
            tempArea += x1 * yDiff - y1 * xDiff;
        }
        tempArea = Math.abs(tempArea) / 2;
        area = ConvertAreaUnits(tempArea, "Feet", m_areaUnits);
        area = Math.round(area * roundFactor) / roundFactor;
    }



    //var md = $get(m_measureDisplay);
    if (m_measureGeometryType == "polygon") {
        $get("PerimeterValue").innerHTML = perimeter;
        $get("AreaValue").innerHTML = area;
    }
    else {
        $get("SegmentValue").innerHTML = segmentDistance;
        $get("DistanceValue").innerHTML = totalDistance;
        $get("DistanceUnitsDisplay").innerHTML = m_measureUnits;
    }
}


function removeMeasureGraphic() {
    
    if (m_measureGraphicFeature!=null) {
        map.removeGraphic(m_measureGraphicFeature);
        m_measureGraphicFeature.dispose();
        m_measureGraphicFeature = null;
    }

}

// measure tool is selected... call current type (polyline for distance, polygon for area)
function startMeasure(preserveprevious) {
    var md;
    if (map== null) map = $find("Map1");
    if (m_measureMessage != null) {
        md = $get(m_measureMessage);
        
        m_measureToolbar = $get(m_measureToolbarId);
        //m_measureToolbar.style.display = ""; //if display="none", make visible here
    }
    if (m_currentMeasureToolbarTool == "polyline") {
        $get("PolylineDisplay").style.visibility = "visible";
        $get("PolylineDisplay").style.display = "block";
        $get("PolygonDisplay").style.visibility = "hidden";
        $get("PolygonDisplay").style.display = "none";
        if (md != null) {
            //if(!append) {
                md.innerHTML = "Click on the map to start the line. Click additional points to add edges to the line. Double-click to end the line.<br />";
            //} else
            //{
            //    md.innerHTML += "Click on the map and draw a line. Double-click to end the line.<br />";
            //}
        }
		MeasurePolyline(map);
	} else {
	    $get("PolygonDisplay").style.visibility = "visible";
	    $get("PolygonDisplay").style.display = "block";
	    $get("PolylineDisplay").style.visibility = "hidden";
	    $get("PolylineDisplay").style.display = "none";
	    
	    if (md != null) {
                //if(!append) {
                md.innerHTML = "Click on the map and draw a polygon. Double-click to end the polygon.<br />";
            //} else {
            //   md.innerHTML += "Click on the map and draw a polygon. Double-click to end the polygon.<br />";
            //}

        }
		MeasurePolygon(map);
    }
    m_measureGeometryType = m_currentMeasureToolbarTool;
    //clear previous totals:
    $get(m_measureDisplay).innerHTML = "";
    
    if (!preserveprevious) {
        removeMeasureGraphic();
        m_measureCoords = "";
        m_measureLastCoords = "";
        $get("PerimeterValue").innerHTML = "";
        $get("AreaValue").innerHTML = "";
        $get("SegmentValue").innerHTML = "";
        $get("DistanceValue").innerHTML = "";
        
    }
    
	if (!m_measureMouseUpSet) {
	    map.add_mouseUp(MeasureCoordsMouseUp);
	    m_measureMouseUpSet = true;
	}
	if (!m_measureMouseMoveSet) {
	    map.add_mouseMove(MeasureCoordsMouseMove);
	    m_measureMouseMoveSet = true;
	}

}

//process callback result from server
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; }
    //	}
    if (m_measureGeometryType == "polygon") {
        $get("PerimeterValue").innerHTML = perimeter;
        $get("AreaValue").innerHTML = area;
    }
    else {
        $get("SegmentValue").innerHTML = segment;
        $get("DistanceValue").innerHTML = totaldistance;
        $get("DistanceUnitsDisplay").innerHTML = m_measureUnits;
    }

}
function closeMeasureToolbarTool(id) {
    //hideMeasureToolbarTool(id);
    map.cancelGetGeometry();
    //IMPORTANT - hack to clear geometry from "acetate" Canvas  
    map._assotateCanvas.clear();
    map.remove_mouseUp(MeasureCoordsMouseUp);
    m_measureMouseUpSet = false;
    map.remove_mouseMove(MeasureCoordsMouseMove);
    m_measureMouseMoveSet = false;
    //IMPORTANT!!! clear coordinates list
    m_measureCoords = "";
    m_measureLastCoords = "";
 }

function hideMeasureToolbarTool(id) {
    m_measureToolbar = $get(m_measureToolbarId);
    if (m_measureToolbar!=null) {
        m_measureToolbar.style.display = "none";
        removeMeasureGraphic();

    }
} 

// update distance unit settings... request new totals from server
function changeMeasureUnits(unitList) {
    //var f = document.forms[docFormID];
    var i = unitList.selectedIndex;
    var m = unitList.options[i].value;
    m_measureUnits = m;
    $get("MeasureUnits").value = m;
    //sync the two measure unit comboboxes
    if ($get("MeasureUnits2").value != m) {
        $get("MeasureUnits2").value = m;
    }
    if ($get("MeasureUnits3").value != m) {
        $get("MeasureUnits3").value = m;
    }

    UpdateMeasurements(m_measureLastCoords);

//    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 ($get("AreaUnits") != null) {
//       argument += "&AreaUnits=" + $get("AreaUnits").value;
//   } 
//    var context = map.get_id() + "," + m_currentMeasureToolbarTool;
//    eval(measureVectorCallbackFunctionString);    
}

// update area unit settings... request new totals from server
function changeAreaUnits(unitList) {
    //var f = document.forms[docFormID];
    var i = unitList.selectedIndex;
    var a = unitList.options[i].value;
    $get("AreaUnits").value = a;
    m_areaUnits = a;

    UpdateMeasurements(m_measureLastCoords);
/**
    coordString = map.coords;
    if (coordString==null) coordString="";
    var argument = "ControlID=" + map.get_id() + "&EventArg=" + m_currentMeasureToolbarTool + "&ControlType=Map&coords=" + m_measureLastCoords + "&VectorMode=measure&VectorAction=AddPoint&AreaUnits=" + a + "&refresh=true";
   if ($get("MeasureUnits") != null) {
        argument += "&MeasureUnits=" + $get("MeasureUnits").value;
   } 
    var context = map.get_id() + "," + m_currentMeasureToolbarTool;
	eval(measureVectorCallbackFunctionString);    
**/
    	
}

// event handler for starting to drag toolbar around... mouse down
//function dragMeasureToolbarStart(e) {
//    m_measureToolbar = $get("MeasureToolbar");
//    if (m_measureToolbar!=null) {
//        var box = calcElementPosition(m_measureToolbar.id);
//        m_measureXOffset =e.clientX - box.left;
//        m_measureYOffset = e.clientY - box.top;
//    }
//    $addHandler(document, "mousemove", dragMeasureToolbarMove);
//    $addHandler(document, "mouseup", dragMeasureToolbarStop);  
//    e.preventDefault();
//    e.stopPropagation();
//}

// event handler for toolbar drag movement... mousemove
//function dragMeasureToolbarMove(e) {
//    m_measureToolbar.style.left = (e.clientX-m_measureXOffset) + "px";;
//    m_measureToolbar.style.top = (e.clientY-m_measureYOffset) + "px";
//    e.preventDefault();
//    e.stopPropagation();
//}

// event handler for end of toolbar drag movement... mouseup
//function dragMeasureToolbarStop(e) {
//    $removeHandler(document, "mousemove", dragMeasureToolbarMove);
//    $removeHandler(document, "mouseup", dragMeasureToolbarStop);  
//    e.preventDefault();
//    e.stopPropagation();
//}

// set up the images for transparency in IE6
function setIE6MeasureToolbarImages() {
    var imageId = "";
    var imgSrc = "";
    var imgObj = null;
//    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 ConvertUnits(distance, fromUnits, toUnits)
{
    var mDistance = distance;
    if (fromUnits == "Feet") {
        if (toUnits == "Miles") {
            mDistance = distance / 5280;
        }
        else if (toUnits == "Meters") {
            mDistance = distance * 0.304800609601;
        }
        else if (toUnits == "Kilometers") {
            mDistance = distance * 0.0003048;
        }
    }
    else {
        if (toUnits == "Miles") {
            mDistance = distance * 0.0006213700922;
        }
        else if (toUnits == "Feet") {
            mDistance = distance * 3.280839895;
        }
        else if (toUnits == "Kilometers") {
            mDistance = distance / 1000;
        }
    }
        
        return mDistance;
}

    function ConvertAreaUnits(area, baseUnits, toUnits)
    {
        var mArea = area;
        if (baseUnits == "Feet")
        {
            if (toUnits == "Acres")
                mArea = area * 0.000022956;
            else if (toUnits == "Sq_Meters")
                mArea = area * 0.09290304;
            else if (toUnits == "Sq_Miles")
                mArea = area * 0.00000003587;
            else if (toUnits == "Sq_Kilometers")
                mArea = area * 0.09290304 / 1000000;
        }
        else if (baseUnits == "Meters")
        {
            if (toUnits == "Acres")
                mArea = area * 0.0002471054;
            else if (toUnits == "Sq_Miles")
                mArea = area * 0.0000003861003;
            else if (toUnits == "Sq_Kilometers")
                mArea = area * 1.0e-6;
            else if (toUnits == "Sq_Feet")
                mArea = area * 10.76391042;
        }

        return mArea;
    }
