﻿//*************************************************************************************************
//	This script contains all measure functions to the map.
//	AUTOR: Pablo Sebastián Calderón Maldonado
//  MODIFIED BY: Pablo Pinargote
//	VERSION: 0.04
//	LAST UPDATE: March 13, 2009.
//************************************************************************************************

//***************************************************************************************
//FUNCTIONS TO HANDLE MEASURES (DISTANCE AND AREA CALCULATIONS) OVER THE MAP.
//***************************************************************************************

//Essential variable to handle the measures calculations and visaluzations.
var _theDrawConnect;
var _measureLine;
var _lastDrawState;

//Function to show the measure tool panel.
function ShowMeasureTool() {
    _gaq.push(['_trackEvent', 'Eventos Recurrentes', 'Herramienta Regla']);
    var content =
        "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width: 300px; background-color:#00344E; opacity:0.85; filter: alpha(opacity = 85); border-radius:10px; -ms-border-radius: 10px; -moz-border-radius:10px; -webkit-border-radius: 10px; -khtml-border-radius: 10px;\">" +
            "<tr>" +
                "<td>" +
                    "<a style=\"float: right; margin:7px 15px 0px 0px; font-weight:bold; text-decoration:none; color:#fff; font-size:13px; display:block;\" href=\"javascript:void(0);\" onclick=\"return HideMeasureTool();\">" +
                        "X" +
                    "</a>" +
                "</td>" +
            "</tr>" +
            "<tr>" +
                "<td style=\"padding:0px 10px 10px 10px;\">" +
		            "<div id=\"dvMeasurePanel\">" +
		            "</div>" +
		            "<div id=\"dvMeasureContent\" style=\"display:block; color:#fff;\">" +
		                "<div style=\"font-size:13px; font-weight:bold;\">Herramienta de Medición</div>" +
		                "<br />Elija como desea medir:<br />" +
		                "<input id=\"measureDistance\" type=\"radio\" name=\"measureTypes\" checked=\"checked\" value=\"distance\" onclick=\"EnableMeasureAction('distance');\" />Distancia" +
		                "&nbsp;&nbsp;&nbsp;&nbsp;" +
		                "<input id=\"measureArea\" type=\"radio\" name=\"measureTypes\" value=\"area\" onclick=\"EnableMeasureAction('area');\" />Área<br /><br />" +
		                "- Haga click en cada vértice del área o distancia a medir. <br /><br />" +
		                "- Doble click para terminar el trazado y mostrar la información de la medida.<br /><br />" +
		                "<div id=\"dvMeasureResults\"></div>" +
		            "</div>" +		        
                "</td>" +          
            "</tr>" +            
        "</table>";

    //if (dojo.byId("dvMeasureTool").innerHTML == "")
        dojo.byId("dvMeasureTool").innerHTML = content;
    
    dojo.byId("dvMeasureTool").style["display"] = "block";
    EnableMeasureAction("distance");

    DeactivateAddPointOnMap();

    return false;
}

//Function to hide the measure tool panel, clean the measure graphics and set the normal map navigation.
function HideMeasureTool() {
    var measureG = GetGraphic("MeasureGeometry");
    if (measureG) _map.graphics.remove(measureG);

    _toolbar.deactivate();
    //_map.showZoomSlider();
    dojo.disconnect(_theDrawConnect);
    dojo.byId("dvMeasureTool").style["display"] = "none";
    _map.graphics.remove(_measureLine);

    /*if (dojo.byId('userEmail').value != "")
        ActivateAddPointOnMap();*/

    return false;
}

//Function to hide and show the measure content only
function HideMeasurePanel() {
    var dvMeasureContent = dojo.byId("dvMeasureContent");
    if (dvMeasureContent.style["display"] == "block") {
        dvMeasureContent.style["display"] = "none";
        _toolbar.deactivate();
    }
    else {
        dvMeasureContent.style["display"] = "block";
        _toolbar.activate(_lastDrawState);
    }

    return false;
}

//Function to set the mesure action (Distance or Area) exclusively.
function EnableMeasureAction(type) {
    if (type == "distance") {
        _lastDrawState = esri.toolbars.Draw.POLYLINE;        
    }
    else {
        _lastDrawState = esri.toolbars.Draw.POLYGON;        
    }

    _toolbar.activate(_lastDrawState);
    _map.enableKeyboardNavigation();

    _theDrawConnect = dojo.connect(_toolbar, "onDrawEnd", DoMeasure);
    //_map.hideZoomSlider();
}

//Function to make the measure when the user finish to draw the geometry on the map.
function DoMeasure(geometry) {
    if (geometry.type == "polyline")
        MeasureDistance(geometry);
    else if (geometry.type == "polygon")
        MeasureArea(geometry);
}

//Function to Calculate and Visualize the Distance.
function MeasureDistance(geometry) {
    if (geometry.paths.length == 0) return;

    if (_measureLine) _map.graphics.remove(_measureLine);
    _measureLine = new esri.Graphic(geometry, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("#ff7000"), 2));
    _map.graphics.add(_measureLine);

    var distance = CalculateDistance(geometry.paths[0]);
    distance = distance.toFixed(2);
    //alert(distance);					
    var content;
    content =
		"<input type=\"hidden\" name=\"hfMeasureValue\" value=\"" + distance + "\" />" +
		"<select name=\"ddlMeasures\" onchange=\"ConvertMeasure();\">" +
		"	<option value=\"m\" selected=\"selected\">Metros</option>" +
		"	<option value=\"km\">Kilómetros</option>" +
		"	<option value=\"ft\">Pies</option>" +
		"	<option value=\"mi\">Millas</option>" +
		"</select><br />" +
		"<span id=\"spMeasureValue\"><b>Distancia:&nbsp;" + distance + "&nbsp;m.</b></span>";
    dojo.byId("dvMeasureResults").innerHTML = content;
}

//Function to Calculate and Visualize the Area.
function MeasureArea(geometry) {
    if (geometry.rings.length == 0) return;

    if (_measureLine) _map.graphics.remove(_measureLine);
    _measureLine = new esri.Graphic(geometry, new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color("#ff7000"), 2), new dojo.Color([255, 112, 0, 0.25])));

    _map.graphics.add(_measureLine);

    var area = CalculateArea2(geometry.rings[0]);
    area = area.toFixed(2);
    //alert(area);
    var content;
    content =
		"<input type=\"hidden\" name=\"hfMeasureValue\" value=\"" + area + "\" />" +
		"<select name=\"ddlMeasures\" onchange=\"ConvertMeasure2();\">" +
		"	<option value=\"m2\" selected=\"selected\">Metros Cuadrados</option>" +
		"	<option value=\"km2\">Kilómetros Cuadrados</option>" +
		"	<option value=\"ft2\">Pies Cuadrados</option>" +
		"	<option value=\"mi2\">Millas Cuadradas</option>" +
		"	<option value=\"acres\">Acres</option>" +
		"</select><br />" +
		"<span id=\"spMeasureValue\"><b>Área:&nbsp;" + area + "&nbsp;m2.</b></span>";
    dojo.byId("dvMeasureResults").innerHTML = content;
}

//Function to Calculate the Distance from a point collection.
function CalculateDistance(points) {
    var distance = 0;
    
    var p = new esri.geometry.Point(parseFloat(points[0][0]), parseFloat(points[0][1]), _map.spatialReference);

    if (_currentMapType == "BING")
        p = esri.geometry.webMercatorToGeographic(p);

    var lastLong = p.x;
    var lastLat = p.y;

    for (var z = 0; z < points.length; z++) {
        
        p = new esri.geometry.Point(parseFloat(points[z][0]), parseFloat(points[z][1]), _map.spatialReference);

        if (_currentMapType == "BING")
            p = esri.geometry.webMercatorToGeographic(p);

        var longitude = p.x;
        var latitude = p.y;
        distance += Math.sqrt(Math.pow(longitude * 111319.46 - lastLong * 111319.46, 2) + Math.pow(latitude * 110574.27 - lastLat * 110574.27, 2));
        lastLong = longitude;
        lastLat = latitude;
    }
    return distance;
}

//Function to Calculate the area from a polygon defined by a point collection.
function CalculateArea(vertexs) {
    var k;
    var area = 0;
    if (vertexs.length < 3) return 0;

    for (k = 0; k < vertexs.length - 1; k++) {
        area = (vertexs[k][0] * 111319.46) * (vertexs[k + 1][1] * 110574.27) -
					 (vertexs[k][1] * 110574.27) * (vertexs[k + 1][0] * 111319.46);
    }
    k = vertexs.length - 1;
    area += (vertexs[k][0] * 111319.46) * (vertexs[0][1] * 110574.27) -
					(vertexs[k][1] * 110574.27) * (vertexs[0][0] * 111319.46);
    area = Math.abs(area) / 2;
    return area;
}

//Function to Calculate the area from a polygon defined by a ring collection.
function CalculateArea2(vertexs) {
    var area = 0;
    var x1, x2, y1, y2;
    if (vertexs.length < 3) return 0;

    for (k = 0; k < vertexs.length - 1; k++) {

        var v1 = new esri.geometry.Point(parseFloat(vertexs[k][0]), parseFloat(vertexs[k][1]), _map.spatialReference);
        var v2 = new esri.geometry.Point(parseFloat(vertexs[k+1][0]), parseFloat(vertexs[k+1][1]), _map.spatialReference);

        if (_currentMapType == "BING") {
            v1 = esri.geometry.webMercatorToGeographic(v1);
            v2 = esri.geometry.webMercatorToGeographic(v2);
        }

        /*x1 = vertexs[k][0] * 111319.46;
        x2 = vertexs[k + 1][0] * 111319.46;
        y1 = vertexs[k][1] * 110574.27;
        y2 = vertexs[k + 1][1] * 110574.27;*/

        x1 = v1.x * 111319.46;
        x2 = v2.x * 111319.46;
        y1 = v1.y * 110574.27;
        y2 = v2.y * 110574.27;

        var diffX = x2 - x1;
        var diffY = y2 - y1;
        area += x1 * diffY - y1 * diffX;
    }
    area = Math.abs(area) / 2;
    return area;
}

//Function to Convert Distance Measure Units
function ConvertMeasure() {
    var value = document.forms[0]["hfMeasureValue"].value;
    var measure = document.forms[0]["ddlMeasures"].options[document.forms[0]["ddlMeasures"].selectedIndex].value;
    var lbMeasure = "m.";

    switch (measure) {
        case "km":
            value = (value / 1000).toFixed(2);
            lbMeasure = "&nbsp;km.";
            break;
        case "ft":
            value = (value / 0.3048).toFixed(2);
            lbMeasure = "&nbsp;pies";
            break;
        case "mi":
            value = (value / 0.3048 / 5280).toFixed(2);
            lbMeasure = "&nbsp;millas";
        default:
            break;
    }
    dojo.byId("spMeasureValue").innerHTML = "<b>Distancia:&nbsp;" + value + lbMeasure + "</b>";
}

//Function to Convert Area Measure Units
function ConvertMeasure2() {
    var value = document.forms[0]["hfMeasureValue"].value;
    var measure = document.forms[0]["ddlMeasures"].options[document.forms[0]["ddlMeasures"].selectedIndex].value;
    var lbMeasure = "m2.";

    switch (measure) {
        case "km2":
            value = (value / 1000000).toFixed(2);
            lbMeasure = "&nbsp;km2.";
            break;
        case "ft2":
            value = (value / 0.0929).toFixed(2);
            lbMeasure = "&nbsp;pies2.";
            break;
        case "mi2":
            value = (value / 2590000).toFixed(2);
            lbMeasure = "&nbsp;millas2";
            break;
        case "acres":
            value = (value / 4046.9).toFixed(2);
            lbMeasure = "&nbsp;acres";
            break;
        default:
            break;
    }
    dojo.byId("spMeasureValue").innerHTML = "<b>Área:&nbsp;" + value + lbMeasure + "</b>";
}
