﻿var selectTimeout = null;

var planoLayer = "";

function onMapMouseOver(event) {
    var layer = map.getLayersByName("selection")[0];
    
    layer.setVisibility(false);
}

function DoZoomLoc(x, y, draw, zoomLevel) {

    map.setCenter(new OpenLayers.LonLat(x, y), zoomLevel, false, false);
    
    return true;
}

function DoZoomStreet(streetId) {
     Geo.Plugins.Ajax.panelLocations.DoSelectStreetLine(streetId, "", DoZoomStreet_CallBack);		    
}
function DoZoomStreet_CallBack(response) {
    if (response == null) {
        //ChangeToMain();

        return;
    }

    if (response.error != null) {
        alert(response.error);

        //ChangeToMain();

        return;
    }

    if (response.value == null) {
        //ChangeToMain();
    }

    var layer = map.getLayersByName("features")[0];
    
    layer.destroyFeatures();

    var feature = wkt_trans.read(response.value[1]);

    var popupHTML = "<div style='font-size:.8em'>" + "<br />" + response.value[3] + "<br />" + "</div>";

    if (feature != null && feature != undefined) {
        feature.data = { html: popupHTML };

        layer.addFeatures(feature);
    }

    if (MAPSERVER_SELECTION) {
        var l = map.getLayer("ol_layer_mapserver1");

        if (l != null) {
            l.params["streetid"] = response.value[0];
        }
    }        

    var extent = wkt_trans.read(response.value[2]);

    if (extent != null && extent != undefined) {
        map.zoomToExtent(extent.geometry.getBounds());
    }        
}

function DoZoomPlano(planoCod, layer, adminUnit) {

    if (adminUnit == null) adminUnit = ""; 

    if (planos != null) {
        for (var i = 0; i < planos.length; i++) {

            var plano = planos[i];

            if ($j.inArray(planoCod, plano) >= 0) {

                if (MAPSERVER_SELECTION) {
                    var l = map.getLayer("ol_layer_mapserver1");

                    if (l != null) {
                        l.params["planoid"] = plano[0];
                    }
                }

                setLayerVisible(layer);

                var extent = wkt_trans.read(plano[2]);

                if (extent != null && extent != undefined) {
                    var bnd = extent.geometry.getBounds().clone();

                    bnd.left = bnd.left - 50;
                    bnd.right = bnd.right + 50;
                    bnd.top = bnd.top + 50;
                    bnd.bottom = bnd.bottom - 50;

                    map.zoomToExtent(bnd);
                }

                break;
            }
        }
    }

    Geo.Plugins.Ajax.panelPlanos.GetPlanoGeometry(planoCod, adminUnit, DoZoomPlano_CallBack);    
}
function DoZoomPlano_CallBack(response) {
    if (response == null) {
        //ChangeToMain();

        return;
    }

    if (response.error != null) {
        alert(response.error);

        //ChangeToMain();

        return;
    }

    if (response.value == null) {
        //ChangeToMain();
    }

    //Selecção a partir do Vector
    var layer = map.getLayersByName("features")[0];
    layer.destroyFeatures();

    var feature = wkt_trans.read(response.value[1]);

    if (feature != null && feature != undefined) {

        var extent = wkt_trans.read(response.value[2]);

        if (extent != null && extent != undefined) {
            map.zoomToExtent(extent.geometry.getBounds());
        }

        var popupHTML = "<div style='font-size:.8em'>" + response.value[4] + "<br />" + response.value[5] + "</div>";

        feature.data = { tipo: "planos",
                         html: popupHTML};

        layer.addFeatures(feature);
    }      
}

function DoZoomPredio(predio, seccao, freguesia, concelho) {
    Geo.Plugins.Ajax.panelLocations.DoSelectPredio(predio, seccao, freguesia, concelho, DoZoomPredio_CallBack);
}
function DoZoomPredio_CallBack(response) {
    if (response == null) {
        //ChangeToMain();

        return;
    }

    if (response.error != null) {
        alert(response.error);

        //ChangeToMain();

        return;
    }

    if (response.value == null) {
        //ChangeToMain();
    }

    var layer = map.getLayersByName("edition")[0];
    
    layer.removeFeatures(layer.features, true);

    var feature = wkt_trans.read(response.value[1]);
    feature.id = "predio_pol";

    var popupHTML = "<div style='font-size:.8em'>Freguesia: " + response.value[5] + "<br />";
    popupHTML += "Sec&ccedil;&atilde;o: " + response.value[4] + "<br />";
    popupHTML += "Pr&eacute;dio: " + response.value[3] + "</div>";

    if (feature != null && feature != undefined) {
        feature.data = { html: popupHTML };

        layer.addFeatures(feature);
    }

    if (MAPSERVER_SELECTION) {
        var l = map.getLayer("ol_layer_mapserver1");

        if (l != null) {
            l.params["predioid"] = response.value[0];
        }
    }

    var extent = wkt_trans.read(response.value[2]);

    if (extent != null && extent != undefined) {
        var bnd = extent.geometry.getBounds().clone();

        bnd.left = bnd.left - 50;
        bnd.right = bnd.right + 50;
        bnd.top = bnd.top + 50;
        bnd.bottom = bnd.bottom - 50;

        map.zoomToExtent(bnd);
    }
}

function DoZoomProcObras(id, concelho) {
    Geo.Plugins.Ajax.panelUtils.DoSelectObra(id, concelho, DoZoomProcObras_CallBack);
}
function DoZoomProcObras_CallBack(response) {
    if (response == null) {
        //ChangeToMain();

        return;
    }

    if (response.error != null) {
        alert(response.error);

        //ChangeToMain();

        return;
    }

    if (response.value == null) {
        //ChangeToMain();
    }

    var layer = map.getLayersByName("edition")[0];

    layer.removeFeatures(layer.features, true);

    var feature = wkt_trans.read(response.value[1]);
    feature.id = "obra_pol";

    var popupHTML = "<div style='font-size:.8em'>Processo: " + response.value[3] + "<br />";
    popupHTML += "Tipo: " + response.value[4] + "</div>";

    if (feature != null && feature != undefined) {
        feature.data = { html: popupHTML };

        layer.addFeatures(feature);
    }

    if (MAPSERVER_SELECTION) {
        var l = map.getLayer("ol_layer_mapserver1");

        if (l != null) {
            l.params["obraid"] = response.value[0];
        }
    }

    var extent = wkt_trans.read(response.value[2]);

    if (extent != null && extent != undefined) {
        var bnd = extent.geometry.getBounds().clone();

        bnd.left = bnd.left - 50;
        bnd.right = bnd.right + 50;
        bnd.top = bnd.top + 50;
        bnd.bottom = bnd.bottom - 50;
        
        map.zoomToExtent(bnd);
    }
}


function onFeatureHighlight(evt) {

    if (map.getControlsBy("id", "ctrlModifyPolygon")[0].active) return true;

    var feature = evt.feature;
    var l = feature.layer;

    if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point")
    {    
        style_mark_sel.fillOpacity = 1;
    } else {
        style_mark_sel.fillOpacity = 0;
    }

    
    l.drawFeature(feature, style_mark_sel)

    selectTimeout = setTimeout(function() { onFeatureSelect(feature); }, 500);
}
function onFeatureUnhighlight(evt) {
    if (selectTimeout != null) clearTimeout(selectTimeout);

    var feature = evt.feature;

    if (feature != null && feature.popup != null) {
        map.removePopup(feature.popup);
    }    
}

function onFeatureSelect(feature) {

    selectedFeature = feature;

    var l = feature.layer;

    if (feature.geometry.CLASS_NAME == "OpenLayers.Geometry.Point")
    {
        style_mark_sel.fillOpacity = 1;
    } else {
        style_mark_sel.fillOpacity = 0;
    }

    l.drawFeature(feature, style_mark_sel)

    var ll = map.getLonLatFromPixel(currentPixelPos);

    var popup = new OpenLayers.Popup.FramedCloud("popupPOI",
                         ll,
                         null,
                         feature.data["html"],
                         null,
                         false, function() { onPopupClose(feature); });

    popup.panMapIfOutOfView = false;
    popup.closeOnMove = true;

    feature.popup = popup;

    map.addPopup(popup, true);

}
function onFeatureUnselect(feature) {
}
function onPopupClose(feature) {
    map.removePopup(feature.popup);
}


function onBeforeFeatureModified(feature) {
    if ($j("#sidebar").attr("panel") == "plantas") {
        DoPlantasGoBack();
    }
}

function setLayersVisibility(elem) {

    if (elem != null) {
        var olLyrType = elem.parents("div:eq(0)").attr("olLayerType");
        var olLyrName = elem.parents("div:eq(0)").attr("olLayerName");

        if (olLyrType == "mapserver") {

            //Alterado por ser incompatível com a versão 1.3.2 do jquery
            //var groups = $j("#toc>div[@olLayerType=mapserver]").filter("[@olLayerName=" + olLyrName + "]");
            var groups = $j("#toc>div[olLayerType=mapserver]").filter("[olLayerName=" + olLyrName + "]");        

            var mslayersnames = "";
            var mslayer = "";

            $j(groups).each(function() {
                var olname = $j(this).attr("olLayerName");

                var vLayers = $j(this).find("ul li").not(":has(ul)").filter(":has(label:first.checked)");

                mslayer = "";

                for (var i = 0; i < vLayers.length; i++) {
                    var l = $j(vLayers[i]).parents("li");

                    mslayer = $j("label:first", vLayers[i]).attr("olLayerName");

                    for (var j = 0; j < l.length; j++) {
                        var e = $j(l[j]);

                        //Alterado por ser incompatível com a versão 1.3.2 do jquery
                        //if ($j("label:first.checked", e).length == 0) {
                        if (!$j("label:first", e).hasClass("checked")) {                         
                            mslayer = "";

                            break;
                        }
                    }

                    if (mslayer.length > 0) mslayersnames += " " + mslayer
                }
            });
            
            if (map.getLayer(olLyrName) != null) {
                map.getLayer(olLyrName).params["layers"] = mslayersnames;
                map.getLayer(olLyrName).redraw();
            }

        } else {
            if (!elem.is(":has(ul)")) {
                olLyrName = $j("label:first", elem).attr("olLayerName");

                var p = elem.parents("ul:eq(0)");

                $j("li", p).each(function() {

                    olLyrName = $j("label:first", this).attr("olLayerName");
                    if (map.getLayer(olLyrName) != null) {
                        //Alterado por ser incompatível com a versão 1.3.2 do jquery
                        //map.getLayer(olLyrName).setVisibility($j("label:first.checked", this).length && $j("label:first.checked", elem.parents("li:eq(0)")).length);
                        map.getLayer(olLyrName).setVisibility($j("label:first", this).hasClass("checked") && $j("label:first", elem.parents("li:eq(0)")).hasClass("checked"));
                    }
                });
            } else {
                $j("li", elem).each(function() {
                    olLyrName = $j("label:first", this).attr("olLayerName");
                    if (map.getLayer(olLyrName) != null) {
                        //Alterado por ser incompatível com a versão 1.3.2 do jquery
                        //map.getLayer(olLyrName).setVisibility($j("label:first.checked", this).length && $j("label:first.checked", elem).length);
                        map.getLayer(olLyrName).setVisibility($j("label:first", this).hasClass("checked") && $j("label:first", elem).hasClass("checked"));
                    }
                });
            }
        }
    } else {
        var groups = $j("#toc>div");

        $j(groups).each(function() {
        
            var olLyrName = $j(this).attr("olLayerName");

            if ($j(this).attr("olLayerType") == "mapserver") {

                //Alterado por ser incompatível com a versão 1.3.2 do jquery
                //var g = $j("#toc>div[@olLayerType=mapserver]").filter("[@olLayerName=" + olLyrName + "]");
                var g = $j("#toc>div[olLayerType=mapserver]").filter("[olLayerName=" + olLyrName + "]");

                var mslayersnames = "";
                var mslayer = "";

                $j(g).each(function() {
                    var olname = $j(this).attr("olLayerName");

                    var vLayers = $j(this).find("ul li").not(":has(ul)").filter(":has(label:first.checked)");

                    mslayer = "";

                    for (var i = 0; i < vLayers.length; i++) {
                        var l = $j(vLayers[i]).parents("li");
                        
                        //Zona de Debug
                        mslayer = $j("label:first", vLayers[i]).attr("olLayerName");

                        for (var j = 0; j < l.length; j++) {
                            var e = $j(l[j]);

                            //Alterado por ser incompatível com a versão 1.3.2 do jquery
                            //if ($j("label:first.checked", e).length == 0) {
                            if (!$j("label:first", e).hasClass("checked")) {
                                mslayer = "";

                                break;
                            }
                        }

                        if (mslayer.length > 0) mslayersnames += " " + mslayer
                    }
                });

                if ((map != null) && (map.getLayer(olLyrName) != null)) {
                    map.getLayer(olLyrName).params["layers"] = mslayersnames;
                    map.getLayer(olLyrName).redraw();
                }

            } else {

                $j("li", this).not(":has(ul)").each(function() {

                    olLyrName = $j("label:first", this).attr("olLayerName");
                    if (map.getLayer(olLyrName) != null) {
                        //Alterado por ser incompatível com a versão 1.3.2 do jquery
                        //map.getLayer(olLyrName).setVisibility($j("label:first.checked", this).length && $j("label:first.checked", $j(this).parents("li:eq(0)")).length);
                        map.getLayer(olLyrName).setVisibility($j("label:first", this).hasClass("checked") && $j("label:first)", $j(this).parents("li:eq(0)")).hasClass("checked"));
                    }
                });
            }
        });            
    }       
}

function setLayerVisible(layerKey) {

    var elem = $j("li[olKey='" + layerKey + "']");

    if (elem != null) {
    
        if (elem.parent().length > 0 && elem.parent().is("ul") && elem.parent().attr("olLayerGroup")) {
            var p = elem.parent()[0];

            $j(elem.parent().children("li")).each(function() {
                if (this != elem[0]) {
                    var ss = $j(this);

                    ss.children("label:first").removeClass("checked");
                    ss.children("input:checkbox:first").attr("checked", "");
                }
            });
        }

        elem.find("label:first").prev().attr("checked", true);
        if (!elem.find("label:first").hasClass("checked")) elem.find("label:first").addClass("checked");

        elem.parents("li").each(function() {
            var lbl = $j(this).find("label:first").prev().attr("checked", true).next();
            if (!lbl.hasClass("checked")) lbl.addClass("checked");         
        });                      
    
        var olLyrType = elem.parents("div:eq(0)").attr("olLayerType");
        var olLyrName = elem.parents("div:eq(0)").attr("olLayerName");

        if (olLyrType == "mapserver") {
            //Alterado por ser incompatível com a versão 1.3.2 do jquery
            //var groups = $j("#toc>div[@olLayerType=mapserver]").filter("[@olLayerName=" + olLyrName + "]");
            var groups = $j("#toc>div[olLayerType=mapserver]").filter("[olLayerName=" + olLyrName + "]");                        

            var mslayersnames = "";
            var mslayer = "";

            $j(groups).each(function() {
                var olname = $j(this).attr("olLayerName");

                var vLayers = $j(this).find("ul li").not(":has(ul)").filter(":has(label:first.checked)");

                mslayer = "";

                for (var i = 0; i < vLayers.length; i++) {
                    var l = $j(vLayers[i]).parents("li");

                    mslayer = $j("label:first", vLayers[i]).attr("olLayerName");

                    for (var j = 0; j < l.length; j++) {
                        var e = $j(l[j]);

                        if ($j("label:first.checked", e).length == 0) {
                            mslayer = "";

                            break;
                        }
                    }

                    if (mslayer.length > 0) mslayersnames += " " + mslayer
                }
            });

            if (map.getLayer(olLyrName) != null) {
                map.getLayer(olLyrName).params["layers"] = mslayersnames;
                map.getLayer(olLyrName).redraw();
            }

        } else {
            if (!elem.is(":has(ul)")) {
                olLyrName = $j("label:first", elem).attr("olLayerName");

                var p = elem.parents("ul:eq(0)");

                $j("li", p).each(function() {

                    olLyrName = $j("label:first", this).attr("olLayerName");
                    if (map.getLayer(olLyrName) != null) {
                        //Alterado por ser incompatível com a versão 1.3.2 do jquery
                        //map.getLayer(olLyrName).setVisibility($j("label:first.checked", this).length && $j("label:first.checked", elem.parents("li:eq(0)")).length);
                        map.getLayer(olLyrName).setVisibility($j("label:first", this).hasClass("checked") && $j("label:first", elem.parents("li:eq(0)")).hasClass("checked"));
                    }
                });
            } else {
                $j("li", elem).each(function() {
                    olLyrName = $j("label:first", this).attr("olLayerName");
                    if (map.getLayer(olLyrName) != null) {
                        //Alterado por ser incompatível com a versão 1.3.2 do jquery
                        //map.getLayer(olLyrName).setVisibility($j("label:first.checked", this).length && $j("label:first.checked", elem).length);
                        map.getLayer(olLyrName).setVisibility($j("label:first", this).hasClass("checked") && $j("label:first", elem).hasClass("checked"));
                    }
                });
            }
        }                                
    }
}

function SetLayerExpanded(layerKey)
{
    var elem = $j("li[olKey='" + layerKey + "']");

    if (elem != null) {
        elem.parents("ul").each(function() {
            var SS = "";

            $j(this).show();
            $j(this).prevAll("img:first").attr("src", "images/page/node_closed.gif");
        });   
    }
}

function getAllVisibleLayers() {

    var layer = "";
    var layersList = "";

    $j("#toc").find("label[olLayerName]").each(function() {
        layer = "";

        if ($j(this).hasClass("checked")) {
            layer = $j(this).attr("ollayername");

            var elem = $j(this)

            elem.parents("li:has(ul)").find("label:first").each(function() {
                if (!$j(this).hasClass("checked")) {
                    layer = "";
                }
            });

            if (layer != "") {
                layersList += " " + layer;
            }
        }

    });

    return layersList;
}


function clearMap()
{
    var layer = null;
    
    layer = map.getLayersByName("features")[0];
    if (layer != null) {
        for (var i = layer.features.length - 1; i >= 0; i--) {
            var f = layer.features[i];
            layer.destroyFeatures(f);
        }

    }

    try {
        var ctrl = this.map.getControlsBy("id", "ctrlModifyPolygon")[0];
        if (ctrl.active) ctrl.deactivate();
    } catch (err) {}
    layer = map.getLayersByName("edition")[0];
    if (layer != null) {
        if (layer.features.length > 0 && $j("#sidebar").attr("panel")=="plantas") {            
            DoPlantasGoBack();
        }
    
        for (var i = layer.features.length - 1; i >= 0; i--) {
            var f = layer.features[i];
            layer.destroyFeatures(f);
        }
    }         

    if (MAPSERVER_SELECTION) {
        layer = map.getLayer("ol_layer_mapserver1");

        if (layer != null) {
            $j.each(selectionParams, function(index, val) {

                layer.params[index] = "-1";
            });

            layer.redraw();
        }
    }                
}


function txtScale_onKeyPress(control, e) {
    var characterCode;

    if (e && e.which) { //if which property of event object is supported (NN4)
        e = e;
        characterCode = e.which;
    }
    else {
        e = event;
        characterCode = e.keyCode; //character code is contained in IE's keyCode property
    }

    //(if enter key)
    if (characterCode == 13) {
        DoZoomScale();

        return false;
    }

    return true;
}

function DoZoomScale() {
    map.zoomToScale(parseInt($j("#txtScale").attr("value")));
}

function DoGetInfo(x, y) {

    var layer = map.getLayersByName("edition")[0];

    var point = new OpenLayers.Geometry.Point(x, y);
    var feature = new OpenLayers.Feature.Vector(point, { type: 0 });

    layer.destroyFeatures();
    layer.addFeatures([feature]);

    Geo.Plugins.Ajax.panelLocations.DoGetInfo(x, y, ADMIN_UNIT, DoGetInfo_CallBack);
}

function DoGetInfo_CallBack(response) {
    var ss = response.value;


    $j("#dialogTest").html(ss).dialog("open");
    
    return false;

}

function drawInfoFeature(wkt) {

    //Selecção a partir do Vector
    var layer = map.getLayersByName("features")[0];
    layer.destroyFeatures();

    var feature = wkt_trans.read(wkt);

    if (feature != null && feature != undefined) {

//        var extent = wkt_trans.read(response.value[2]);

//        if (extent != null && extent != undefined) {
//            map.zoomToExtent(extent.geometry.getBounds());
//        }

//        var popupHTML = "<div style='font-size:.8em'>" + response.value[4] + "<br />" + response.value[5] + "</div>";

//        feature.data = { tipo: "planos",
//            html: popupHTML
//        };

        layer.addFeatures(feature);
    }      


}    
