﻿var g_Controls;
var superDiv;
//var copyRightDiv;

Epos.MeasureToolbar = OpenLayers.Class(OpenLayers.Control.EditingToolbar, {
    paneldiv: null,

    initialize: function(layer, options) {

        OpenLayers.Control.Panel.prototype.initialize.apply(this, [options]);

        this.paneldiv = options.paneldiv;
        //          superDiv = this.paneldiv;

        //          var copyRightElm = document.getElementById("copyRight")
        //          copyRightDiv = copyRightElm;
        //            var styleMap = Vtab.Control.Measure.setStyle();

        var eventListeners = { "activate": this.controlActivated, scope: this };
        var measureOptions = { paneldiv: options.paneldiv, handlerOptions: { freehand: false, persist: true }, eventListeners: eventListeners };
        var modifyOptions = { mode: OpenLayers.Control.ModifyFeature.RESHAPE | OpenLayers.Control.ModifyFeature.DRAG | OpenLayers.Control.ModifyFeature.ROTATE };

        var controls = [
        //            new OpenLayers.Control.Measure(layer, OpenLayers.Handler.Point, OpenLayers.Util.extend({displayClass: 'olControlDrawFeaturePoint', title:"Punkt"}, measureOptions)),
            new OpenLayers.Control.Measure(OpenLayers.Handler.Path, OpenLayers.Util.extend({ displayClass: 'olControlDrawFeaturePath', title: "Mät längd" }, measureOptions)),
        //         new OpenLayers.Control.Measure(layer, OpenLayers.Handler.Polygon, OpenLayers.Util.extend({ displayClass: 'olControlDrawFeaturePolygon', title: "Mät yta" }, measureOptions)),
            new OpenLayers.Control.ModifyFeature(layer, OpenLayers.Util.extend({ displayClass: 'olControlModifyFeature', title: "Ändra mätlinje", eventListeners: eventListeners }, modifyOptions)),
            new OpenLayers.Control.EraseFeature(layer, { title: "Radera mätning", eventListeners: eventListeners }),
        //new OpenLayers.Control.Button({ title: "Radera alla objekt", displayClass: "eraseAllButton", trigger: Vtab.Application.EraseVectorFeatures }),
        //new Vtab.Control.Identify({ title: "Identifiera", displayClass: "olControlIdentify" }),
            new OpenLayers.Control.Button({ title: "Skriv ut", displayClass: "printMapButton", trigger: Vtab.Application.openSaveDialog }),
            new OpenLayers.Control.Button({ title: "Hjälp", displayClass: "aboutVtabButton", trigger: Vtab.Application.About })
        ];
        g_Controls = controls;

        controls[0].events.on({
            "measure": this.handleMeasurements,
            "measurepartial": this.handleMeasurementsPartial
        });
        //          var control;
        //          for(var key in controls) {
        //                    control = controls[key];
        //                control.events.on({
        //            "measure": Vtab.Control.Measure.handleMeasurements,
        //            "measurepartial": Vtab.Control.Measure.handleMeasurements
        //        });
        //        }
        this.addControls(controls);
        //          layer.events.register("beforefeaturemodified", controls[1], function(e) { this.measure(e.feature.geometry) });
        //          layer.events.register("featuremodified", controls[1], function(e) { this.measure(e.feature.geometry) });
        //          layer.events.register("afterfeaturemodified", controls[1], function(e) { this.measure(null) });
        layer.events.register("beforefeaturemodified", this, function(e) {
            if (e.feature.geometry.CLASS_NAME.indexOf('LineString') > -1) {
                order = 1;
                var stat = map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestLength(e.feature.geometry);
            } else {
                order = 2;
                var stat = map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestArea(e.feature.geometry);
            }
            par = { measure: stat[0], units: stat[1], order: order, geometry: e.feature.geometry };
            this.handleMeasurementsPartial(par)
        });
        layer.events.register("featuremodified", this, function(e) {
            if (e.feature.geometry.CLASS_NAME.indexOf('LineString') > -1) {
                order = 1;
                var stat = map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestLength(e.feature.geometry);
            } else {
                order = 2;
                var stat = map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestArea(e.feature.geometry);
            }
            par = { measure: stat[0], units: stat[1], order: order, geometry: e.feature.geometry };
            this.handleMeasurementsPartial(par)
        });
        layer.events.register("afterfeaturemodified", this, function(e) {
            if (e.feature.geometry.CLASS_NAME.indexOf('LineString') > -1) {
                order = 1;
                var stat = map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestLength(e.feature.geometry);
            } else {
                order = 2;
                var stat = map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestArea(e.feature.geometry);
            }
            par = { measure: stat[0], units: stat[1], order: order, geometry: e.feature.geometry };
            //this.handleMeasurementsPartial(par)}

            /**
            * Per cridar finestra de export a kml, automàticament, quan acaba l'edició
            */
            //this.openExportKML();
        });

        OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '2';
        //          OpenLayers.Feature.Vector.style['default']['strokeOpacity'] = '1';
        //          OpenLayers.Feature.Vector.style['default']['strokeColor'] = '#666666';
        //          OpenLayers.Feature.Vector.style['default']['strokeDashstyle'] = 'dash';
        //          OpenLayers.Feature.Vector.style['default']['fillColor'] = 'white';
        //          OpenLayers.Feature.Vector.style['default']['fillOpacity'] = '0.3';

        //          OpenLayers.Feature.Vector.style['select']['cursor'] = 'move';
        //          OpenLayers.Feature.Vector.style['select']['strokeWidth'] = '3';
        //          OpenLayers.Feature.Vector.style['select']['strokeOpacity'] = '1';
        //          OpenLayers.Feature.Vector.style['select']['strokeColor'] = '#666666';
        //          OpenLayers.Feature.Vector.style['select']['strokeDashstyle'] = 'dash';
        //          OpenLayers.Feature.Vector.style['select']['fillColor'] = 'white';
        //          OpenLayers.Feature.Vector.style['select']['fillOpacity'] = '0.6';

        //          OpenLayers.Feature.Vector.style['temporary']['strokeWidth'] = '3';
        //          OpenLayers.Feature.Vector.style['temporary']['strokeOpacity'] = '1';
        //          OpenLayers.Feature.Vector.style['temporary']['strokeColor'] = '#666666';
        //          OpenLayers.Feature.Vector.style['temporary']['strokeDashstyle'] = 'dash';
        //          OpenLayers.Feature.Vector.style['temporary']['fillColor'] = 'white';
        //          OpenLayers.Feature.Vector.style['temporary']['fillOpacity'] = '0.6';

        this.displayClass = 'olControlEditingToolbar';
    },
    handleMeasurements: function(event) {
        /**********************************************
        ** S'executa quan l'usuari acaba de dibuixar **
        **********************************************/
        var geometry = event.geometry;
        var units = event.units;
        var order = event.order;
        var measure = event.measure;
        // Cal recuperar l'àmbit actual que ha passat a Openlayers.Control.Measure
        var scopeThis = map.getControlsByClass("Epos.MeasureToolbar")[0];
        var out = "";
        var geometryStr = geometry.toString();
        if (geometryStr.startsWith('POINT')) {
            // Punt
            //out = _("Coordenades") +" UTM 31N (ED50):<br/>E " + this.numberFormat(geometry.x, 1) + " m - N " + this.numberFormat(geometry.y, 1)+" m";
            out = _("Coordenades") + " UTM 31N (ED50):<br/>E " + scopeThis.numberFormat(geometry.x, 1) + " m - N " + scopeThis.numberFormat(geometry.y, 1) + " m";
        } else {
            if (order == 1) {
                // Línia

                //out = _("Longitud")+": " + measure.toFixed(1) + " " + units; // Mostra punt enlloc de coma en el separador de decimals
                out = "Längd" + ": " + scopeThis.numberFormat(measure, 1) + " " + units;
                // Obrir finestra per fer exportació a kml

                if (map.getProjection() == "EPSG:4326") {
                    out += "<br /> Great Circle Distance: " +
                	        calcVincenty(geometry).toFixed(3) + " km *";
                }
            } else {
                // Polígon
                var perimetre = parseFloat(map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestLength(geometry));
                out = _("Perímetre") + ": " + scopeThis.numberFormat(perimetre, 1) + " " + units + "<br />";
                out += _("Àrea") + ": " + scopeThis.numberFormat(measure, 1) + " " + units + "<sup>2</" + "sup>";
            }
        }

        //alert("class: "+map.getLayersByClass("Vector")[0]);
        /*
        for(var i=0; i<map.layers.length;i++) {
        var ly = map.layers[i];
        alert("ly "+ly.name+" "+ly.CLASS_NAME);
        }
        */

        var vectorLayer = map.getLayersByName("vectorLayer")[0];
        var feature = new OpenLayers.Feature.Vector(geometry);
        //feature.state = OpenLayers.State.INSERT;
        vectorLayer.addFeatures([feature]);
        // Cal la línia de sota ?
        vectorLayer.events.triggerEvent("featureadded", { feature: feature });

        //*** Obre finestra de descàrrega automàticament quan acaba l'edició **
        //scopeThis.openExportKML();

        this.paneldiv.innerHTML = out;
        jQuery("#measureBG").removeClass("hide");
    },
    handleMeasurementsPartial: function(event) {
        var geometry = event.geometry;
        var units = event.units;
        var order = event.order;
        var measure = event.measure;
        // Cal recuperar l'àmbit actual que ha passat a Openlayers.Control.Measure
        var scopeThis = map.getControlsByClass("Epos.MeasureToolbar")[0];
        var out = "";
        if (order == 1) {
            // Línia
            out += "Längd" + ": " + scopeThis.numberFormat(measure, 1) + " " + units;
            if (map.getProjection() == "EPSG:4326") {
                out += "<br /> Great Circle Distance: " +
                        calcVincenty(geometry).toFixed(3) + " km *";
            }
        } else {
            // Polígon
            var perimetre = parseFloat(map.getControlsByClass("OpenLayers.Control.Measure")[0].getBestLength(geometry));
            out = _("Perímetre") + ": " + scopeThis.numberFormat(perimetre, 1) + " " + units + "<br />";
            out += _("Àrea") + ": " + scopeThis.numberFormat(measure, 1) + " " + units + "<sup>2</" + "sup>";
        }
        this.paneldiv.innerHTML = out;
        jQuery("#measureBG").removeClass("hide");
    },

    draw: function() {
        var div = OpenLayers.Control.Panel.prototype.draw.apply(this, arguments);
        //		this.paneldiv.innerHTML = "Välj ett verktyg";
        return div;
    },

    controlActivated: function(evt) {
        var classe = evt.object.CLASS_NAME;

        //          copyRightDiv.style.display = "none";

        if (classe == "OpenLayers.Control.Measure") {
            classe = evt.object.handler.CLASS_NAME;
        }
        textes = {
            "OpenLayers.Handler.Point": "Ritar ut en punkt på kartan och" + "<br> " + "visar dess koordinater.",
            "OpenLayers.Handler.Path": "Mätverktyg för sträcka." + "<br> " + "Dubbelklick avslutar sträckan",
            "OpenLayers.Handler.Polygon": "Verktyg för att mäta area." + "<br> " + "Dubbelklick avslutar mätningen",
            "OpenLayers.Control.ModifyFeature": "Modifieringsverktyg för" + "<br> " + "utritade objekt",
            "OpenLayers.Control.EraseFeature": "Klicka på ett utritat" + "<br> " + "objekt för att ta" + "<br> " + "bort det."
        };
        this.paneldiv.innerHTML = textes[classe];
        jQuery("#measureBG").removeClass("hide");
    },

    activateControl: function(control) {
        if (control.srcElement) {
            for (var i = 0; i < g_Controls.length; i++) {
                if (g_Controls[i].title == control.srcElement.innerText) {
                    if (g_Controls[i].type == OpenLayers.Control.TYPE_BUTTON) {
                        g_Controls[i].trigger();
                        return;
                    }
                    for (var y = 0; y < g_Controls.length; y++) {
                        if (g_Controls[y] != control) {
                            if (g_Controls[y] != g_Controls[i]) {
                                g_Controls[y].deactivate();
                            }
                        }
                    }
                    if (g_Controls[i].active) {
                        g_Controls[i].deactivate();
                        superDiv.innerHTML = "";
                        //                          copyRightDiv.style.display = "block";
                    }
                    else {
                        g_Controls[i].activate();
                    }
                }
            }
        }
        else {
            if (!this.active) { return false; }
            if (control.type == OpenLayers.Control.TYPE_BUTTON) {
                control.trigger();
                return;
            }
            for (var i = 0; i < this.controls.length; i++) {
                if (this.controls[i] != control) {
                    if (this.controls[i].type != OpenLayers.Control.TYPE_TOGGLE) {
                        this.controls[i].deactivate();
                    }
                }
            }
            if (control.active) {
                control.deactivate();
                this.paneldiv.innerHTML = "";
                jQuery("#measureBG").addClass("hide");
                //                  copyRightDiv.style.display = "block";
            } else {
                control.activate();
            }
        }
    },


//    controlActivated: function(evt) {
//        var classe = evt.object.CLASS_NAME;
//        if (classe == "OpenLayers.Control.Measure") {
//            classe = evt.object.handler.CLASS_NAME;
//        }
//        textes = {
////            "OpenLayers.Handler.Point": "Cliqueu per afegir punts i obtenir les coordenades.",
//            "OpenLayers.Handler.Path": "Cliqueu per dibuixar una traça i obtenir la longitud." + "<br> " + "Doble clic finalitza dibuix.",
////            "OpenLayers.Handler.Polygon": "Cliqueu per dibuixar un polígon i obtenir l’àrea." + "<br> " + "Doble clic finalitza dibuix.",
//            "OpenLayers.Control.ModifyFeature": "Cliqueu sobre l'element a modificar."
////            "OpenLayers.Control.Esborra": "Cliqueu sobre l'element a eliminar."
//        };
//        this.paneldiv.innerHTML = textes[classe];
//    },

//    activateControl: function(control) {
//        if (!this.active) { return false; }
//        if (control.type == OpenLayers.Control.TYPE_BUTTON) {
//            control.trigger();
//            return;
//        }
//        for (var i = 0; i < this.controls.length; i++) {
//            if (this.controls[i] != control) {
//                if (this.controls[i].type != OpenLayers.Control.TYPE_TOGGLE) {
//                    this.controls[i].deactivate();
//                }
//            }
//        }
//        if (control.active) {
//            control.deactivate();
//            this.paneldiv.innerHTML = "Utilitzeu la  barra d'eines per dibuixar elements sobre el mapa i obtenir-ne les mesures.";
//        } else {
//            control.activate();
//        }
//    },
//    	
    numberFormat: function(num, dec, tsep, dsep) {
        dec = (typeof dec != "undefined") ? dec : 0;
        tsep = (typeof tsep != "undefined") ? tsep : ".";
        dsep = (typeof dsep != "undefined") ? dsep : ",";

        if (dec != null) {
            num = parseFloat(num.toFixed(dec));
        }

        var parts = num.toString().split(".");
        var integer = parts[0];
        if (tsep) {
            var thousands = /(-?[0-9]+)([0-9]{3})/;
            while (thousands.test(integer)) {
                integer = integer.replace(thousands, "$1" + tsep + "$2");
            }
        }

        if (dec == 0) {
            str = integer;
        } else {
            var rem = parts.length > 1 ? parts[1] : "0";
            if (dec) {
                rem = rem + new Array(dec - rem.length + 1).join("0");
            }
            str = integer + dsep + rem;
        }
        return str;
    },
    CLASS_NAME: "Epos.MeasureToolbar"
});
