﻿OpenLayers.Control.LocationSearch = OpenLayers.Class(OpenLayers.Control.Button, {

    /** 
    * Property: coordinat_layer 
    * {<OpenLayers.Layer.Markers>} address marker layer  
    */
    coordinat_search_layer: null,

    /**
    * Property: type
    * TYPE_BUTTON.
    */
    type: OpenLayers.Control.TYPE_BUTTON,

    /**
    * 
    */
    initialize: function() {
        OpenLayers.Control.Button.prototype.initialize.apply(this, arguments);

    },

    /**
    * Method: trigger
    */
    trigger: function(event) {
    },

    /**
    * Method: active_locationSearch
    * Setup event for search button
    */
    active_locationSearch: function() {

        var panel = document.createElement('div');
        panel.id = "location_search_div";
        panel.className = "olControlLocationSearchDiv";

        var coordinatlogo = document.createElement("img");
        coordinatlogo.id = "logo_imgID";
        coordinatlogo.className = "olControlLocationSearchCoodImg";
        coordinatlogo.src = "MapImages/marker.png";

        var labelx = document.createElement('label');
        labelx.className = "olControlLocationSearchXLabel";
        labelx.id = "xCoorLabel";
        var textNodeX = document.createTextNode("E:");
        labelx.appendChild(textNodeX);

        var xinput = document.createElement('input');
        xinput.type = "Text";
        xinput.id = "locationsearch_x_input";
        xinput.className = "olControlLocationSearchXinput";

        var labely = document.createElement('label');
        labely.className = "olControlLocationSearchYLabel";
        labely.id = "yCoorLabel";
        var textNodey = document.createTextNode("N:");
        labely.appendChild(textNodey);

        var yinput = document.createElement('input');
        yinput.type = "Text";
        yinput.id = "locationsearch_y_input";
        yinput.className = "olControlLocationSearchYinput";

        var dropdown = document.createElement("select");
        dropdown.id = "projectionSelectID";
        dropdown.className = "olControlprojectionSelect";

        var opt = document.createElement("option");
        opt.text = "EPSG:25832";
        opt.value = "EPSG:25832";
        opt.title = "EPSG:25832";

        var opt2 = document.createElement("option");
        opt2.text = "WGS84";
        opt2.value = "WGS84";
        opt2.title = "WGS84";

        dropdown.options.add(opt);
        dropdown.options.add(opt2);

        var link = document.createElement("a");
        link.className = "olControlLocationSearchButton";
        link.href = "#";
        link.name = "Find";
        link.innerHTML = "Find";

        panel.appendChild(coordinatlogo);
        panel.appendChild(labelx);
        panel.appendChild(xinput);
        OpenLayers.Event.observe(xinput, "click", OpenLayers.Function.bindAsEventListener(this.onDivEvent2, xinput));
        panel.appendChild(labely);
        panel.appendChild(yinput);
        OpenLayers.Event.observe(yinput, "click", OpenLayers.Function.bindAsEventListener(this.onDivEvent2, yinput));
        panel.appendChild(dropdown);
        OpenLayers.Event.observe(dropdown, "click", OpenLayers.Function.bindAsEventListener(this.onDivEvent2, dropdown));
        panel.appendChild(link);

        var br = document.createElement("br");
        panel.appendChild(br);
        var resultDiv = document.createElement("div");
        resultDiv.className = "olControlLocationSearchResultDiv";
        resultDiv.id = "srDivID";

        panel.appendChild(resultDiv);
        var eventhandlerfunc = function(e) { this.sender.do_locationSearch(); };
        OpenLayers.Event.observe(link, "click", OpenLayers.Function.bindAsEventListener(eventhandlerfunc, { sender: this }));
        this.div.appendChild(panel);

        // Init eventhandler
        var eventhandler = function(e) { this.sender.choose_projection(this.dropdown); };
        OpenLayers.Event.observe(dropdown, "change", OpenLayers.Function.bindAsEventListener(eventhandler, { sender: this, dropdown: dropdown.id }));

        this.coordinat_search_layer = new OpenLayers.Layer.Markers("Matrikel");
        this.coordinat_search_layer.displayInLayerSwitcher = false;
        this.map.addLayer(this.coordinat_search_layer);

        OpenLayers.Event.observe(this.div, "mousemove", OpenLayers.Function.bindAsEventListener(this.onDivEvent, this));
    },

    onDivEvent: function(evt) {
        OpenLayers.Event.stop(evt);
    },

    /*
    Handles event for input field
    */
    onDivEvent2: function(evt) {
        this.focus();
        OpenLayers.Event.stop(evt);
    },

    choose_projection: function(id) {
        var selectbox = document.getElementById(id);
        var textx = document.getElementById("xCoorLabel");
        var texty = document.getElementById("yCoorLabel");
        if (selectbox && textx && texty) {
            var value = selectbox[selectbox.selectedIndex].value;
            if (value == "WGS84") {
                textx.innerHTML = "Lon:";
                texty.innerHTML = "Lat:";
            } else {
                textx.innerHTML = "E:";
                texty.innerHTML = "N:";
            }
        }
    },

    /**
    * ClickEvent: do_locationSearch
    * Handles clickevent do_location search button
    */
    do_locationSearch: function() {
        var x = document.getElementById("locationsearch_x_input");
        var y = document.getElementById("locationsearch_y_input");
        if (x && y && (x.value != "" || y.value != "")) {
            var easting = x.value;
            var northing = y.value;

            var selectbox = document.getElementById("projectionSelectID");
            if (selectbox && selectbox[selectbox.selectedIndex].value == "WGS84") {
                // OpenLayers.Projection convert lonlat to EPSG:25832
                var wgs84 = new OpenLayers.Projection('WGS84');
                var point = new OpenLayers.Geometry.Point(easting, northing);
                OpenLayers.Projection.transform(point, wgs84, this.map.getProjectionObject());
                easting = point.x;
                northing = point.y;
            }

            this.coordinat_search_layer.clearMarkers();
            this.coordinat_search_layer.redraw(true);
            var lonlat = new OpenLayers.LonLat(easting, northing);
            var services = new VisKort.Utils.Services();
            services.getAddressAndMatrikelKey(lonlat, this.CallbackGeosearch.bind(this));
        } else {
            alert("Der skal indtastes et x og y koordinat");
        }
    },

    CallbackGeosearch: function(result) {
        // Zoom and draw
        if (result && result.length > 1) {
            var address = "Nærmeste adresse:<br /><b>" + result[0].StreetName + " " + result[0].StreetBuildingIdentifier + ", " + result[0].PostCodeIdentifier + " " + result[0].DistrictName + "</b>";
            var matNr = "Mat<br />" + result[1].MatrikelNumber;
            var distance = "Afstand<br />" + result[0].DistanceToCoordinat;
            var lonlat1 = new OpenLayers.LonLat(result[0].Easting_point, result[0].Northing_point);
            var lonlat2 = new OpenLayers.LonLat(result[1].Easting_point, result[1].Northing_point);
            var resultHTML = "<table style='margin: 0px 0px 0px 0px;padding:0px 0px 0px 0px !important;' id='nearest_result_table' class='olControlLocationSearchResultTable'>" +
            "<tr style='margin: 0px 0px 0px 0px;padding:0px 0px 0px 0px !important;' class='olControlLocationSearchResultTableTr1'><td style='margin: 0px 0px 0px 0px;padding:0px 0px 0px 0px !important;' class='srTd1' ><img alt='' class='nearestIcon_img' src='MapImages/marker-default.png' /></td><td style='margin: 0px 0px 0px 0px;padding:0px 0px 0px 0px !important;' class='srTd2'>" + address + "</td><td style='margin: 0px 0px 0px 0px;padding:0px 0px 0px 0px !important;' class='srTd3'>" + matNr + "</td><td style='margin: 0px 0px 0px 0px;padding:0px 0px 0px 0px !important;' class='srTd4'>" + distance + "</td></tr>" +
            "</table>";

            var rsdiv = document.getElementById("srDivID");
            if (rsdiv) {
                rsdiv.innerHTML = resultHTML;
            }

            var lsdiv = document.getElementById("location_search_div");
            if (lsdiv) {

                var div_heigth = 25 + parseInt(rsdiv.clientHeight);
                lsdiv.style.height = "" + div_heigth;
            }

            // Update map with icons
            var size = new OpenLayers.Size(12, 12);
            var offset = new OpenLayers.Pixel(-(size.w / 2), -size.h);
            icon_coordinat = new OpenLayers.Icon('MapImages/marker.png', size, offset);
            icon_addressMarker = new OpenLayers.Icon('MapImages/marker-default.png', size, offset);
            marker1 = new OpenLayers.Marker(lonlat1, icon_addressMarker);
            marker2 = new OpenLayers.Marker(lonlat2, icon_coordinat);
            var markerLayer = this.map.getLayersByName("Matrikel")[0];
            markerLayer.clearMarkers();
            markerLayer.addMarker(marker1);
            markerLayer.addMarker(marker2);
            markerLayer.redraw(true);
            var extent = markerLayer.getDataExtent()
            this.map.zoomToExtent(extent);
        }
    },

    CLASS_NAME: "OpenLayers.Control.LocationSearch"
});
