/*
 * Copyright 2007 Help Service Remote Sensing s.r.o. http://www.bnhelp.cz
 */

var map = null;
var pointLayers = {};
var pointLayersURL = "/mapy/mappoints.asp?";
var pointDetailURL = "/mapy/mapdetail.asp?";
var markers = null;
var baseLayers = {};
var overlayLayers = {};
var overview = null;
var grpLayerSwitcher;
var isEditace = false;
var isCyklo = false;
var startPointOrEndPoint = "start";
var shortestPathLayer = null;
var markerImageUrl = "http://www.posazavi.com/images/maps/";
var naturalTrayLayer = null;
var wmsObceLayer = null;
var wmsRegionyLayer = null;
var restrictedExtent = null;
var mapPointsFilter;

var hsMsg = {};

/*
 * OpenLayers initialization
 */
function init(zoomLevel, zoomToCoords) {
    OpenLayers.Util.onImageLoadErrorColor = "transparent";

    OpenLayers.ProxyHost = "/cgi-bin/olproxy.py?url=";

    if (isEditace) {
        initEditationMap();
    }
    else {
        initTouristicMap();
    }
    
    // zoom to desired center
    if (!map.getCenter()) {
        if (zoomLevel || zoomToCoords) {
            if (zoomLevel) {
                map.zoomTo(zoomLevel)
            }
            if (zoomToCoords) {
                map.setCenter(new OpenLayers.LonLat(zoomToCoords[0],zoomToCoords[1]));
            }
        }
        else {
            map.zoomToExtent(map.maxExtent);
            map.zoomTo(1);
        }
    }

    /*
     * logo
     */
    var a = document.createElement("a");
    a.href="http://www.bnhelp.cz";
    var logo = document.createElement("div");
    logo.style.width = "49px";
    logo.style.height = "16px";
    logo.style.background = "url(\"http://www.bnhelp.cz/img/hsrs.png\") no-repeat";
    logo.style.position="absolute";
    logo.style.left = "0.5em";
    logo.style.bottom = "0.5em";
    logo.style.zIndex = "10000";
    a.appendChild(logo);
    document.getElementById("map_OpenLayers_ViewPort").appendChild(a);
    map.events.register("click", map, clicked);
}

/**
 * Handle the click event - it is empty, redefine somewhere else
 * @param {Event} evt click event
 */ 
function clicked(evt) {
    // do something here	
}
    

/* 
 * posunout 
 */
function moveTo(lon,lat) {
    var lonlat = new OpenLayers.LonLat(lon,lat);
    map.setCenter(lonlat);
}

/* 
 * nazoomovat 
 */
function zoomTo(level) {
        map.zoomTo(level);
}

/* 
 * seznam vrstev 
 */
function getListOfLayers() {
    var args = OpenLayers.Util.getArgs();
    return ( args.layers ? args.layers : null);
}

/* 
 * aktuální pozice
 */
function getLocation() {
    var args = OpenLayers.Util.getArgs();
    return (args.lon ? [args.lon,args.lat] : null);
}

/* 
 * aktuální měřítko
 */
function getZoomLevel() {
    var args = OpenLayers.Util.getArgs();
    return (args.zoom ? args.zoom : null);
}


/* 
 * permalink
 */
function getPermalink(){
    var center = this.map.getCenter();
    var zoom = "zoom=" + this.map.getZoom(); 
    var lat = "lat=" + Math.round(center.lat*100000)/100000;
    var lon = "lon=" + Math.round(center.lon*100000)/100000;

    var layers = "layers=";
    for(var i=0; i< this.map.layers.length; i++) {
        var layer = this.map.layers[i];
        if (layer.isBaseLayer) {
            layers += (layer == this.map.baseLayer) ? "B" : "0";
        } else {
            layers += (layer.getVisibility()) ? "T" : "F";           
        }
    }
    var href = lat + "&" + lon + "&" + zoom + "&" + layers;
    return href;   
}

/*
 * zoomToIcon
 */
function zoomToIcon(x,y) {
    map.setCenter(new OpenLayers.LonLat(x,y));
    var size = new OpenLayers.Size(45,35);
    var offset = new OpenLayers.Pixel(13, -size.h);
    var icon = new OpenLayers.Icon('http://www.posazavi.com/images/maps/mark.png ',size,offset);
    label = new OpenLayers.Marker(new OpenLayers.LonLat(14.82,49.92), icon);
    markers.addMarker(label);
}

/*
 * onZoomChanged
 */
function onZoomChanged() {
    var extent = this.map.getExtent();
    var zoomLevel = this.map.getZoom();
    var tolerance = 0.75;

    if (!this.lastExtent) {
        this.lastExtent = this.map.getExtent();
    }
    if (!this.lastZoom) {
        this.lastZoom = this.map.getZoom()-1;
    }

    var currentDiffY = Math.abs(this.lastExtent.top-extent.top)/Math.abs(this.lastExtent.top-this.lastExtent.bottom)
    var currentDiffX = Math.abs(this.lastExtent.right-extent.left)/Math.abs(this.lastExtent.right-this.lastExtent.left);

    //if (currentDiffY>tolerance || currentDiffX > tolerance || this.lastZoom != zoomLevel) {
    if (this.layerContent != "") {
        if (this.lastZoom != zoomLevel ) {
            this.clearFeatures();
            diffx = Math.abs(extent.right-extent.left)*tolerance;
            diffy = Math.abs(extent.top-extent.bottom)*tolerance;
            extent.left -= diffx;
            extent.bottom -= diffy;
            extent.right += diffx;
            extent.top += diffy;

            var url = getPointsURL(this.name, this.layerContent);

            this.initialize(this.name,{'location':url, visibility:this.visibility} );
            this.lastExtent = extent;
            this.lastZoom = zoomLevel;
        }
    }

}

/*
 * Sestaveni url pro bodove vrstvy
 */
function getPointsURL(layername,layers) {
    var extent = this.map.getMaxExtent();
    var lang = mapLanguage;
    if (!lang) {
        lang = 1;
    }

    return pointLayersURL+"lang="+lang+"&bbox="+extent.left+","+extent.bottom+","+extent.right+","+extent.top+ "&zoomlevel="+map.getZoom()+"&layer="+layername+"&displayLayers="+layers+(mapPointsFilter ? mapPointsFilter : "");
}

/*
 * vlastni marker clicked
 */
function  markerClick(evt) {

        var sameMarkerClicked = (this == this.layer.selectedFeature);
        this.layer.selectedFeature = (!sameMarkerClicked) ? this : null;
        var lang = mapLanguage;
        if (!lang) {
            lang = 1;
        }

        if (!sameMarkerClicked) {
            OpenLayers.loadURL(pointDetailURL + "lang="+lang+"&id="+this.layer.selectedFeature.data.id, null, 
                               this, displayPointDetail);
        }
        OpenLayers.Event.stop(evt);
}

/*
 * pridat popis do stranky
 */
function displayPointDetail(xmlHttp) {
    document.getElementById("mapDetail").innerHTML = xmlHttp.responseText;
}

/*
 * bodove vrstvy
 */
function displayLayer(layername, layers) {
    if (pointLayers[layername]) {
        pointLayers[layername].setVisibility(!pointLayers[layername].getVisibility());
    }
    else {
        if (!layers) {
            layers = layername;
        }
        pointLayers[layername] = new OpenLayers.Layer.Text(layername,{location: getPointsURL(layername,layers),visibility:true,displayInLayerSwitcher:false});
        pointLayers[layername].markerClick = markerClick;
        pointLayers[layername].layerContent = layers;
        map.addLayer(pointLayers[layername]);
        map.events.register("zoomend",pointLayers[layername],onZoomChanged);
        //map.events.register("moveend",pointLayers[layername],onZoomChanged);
    }
}

/*
 * bodove vrstvy
 */
function setObjects(layername, newLayers)
{
    if (!pointLayers[layername]) {
        displayLayer(layername,newLayers);
    }

    if (!newLayers) {
        newLayers = layername;
    }

    pointLayers[layername].clearFeatures();
    pointLayers[layername].initialize(
        pointLayers[layername].name,
        {'location': getPointsURL(layername,newLayers),
        visibility:pointLayers[layername].visibility} );
    pointLayers[layername].layerContent = newLayers;
}



/*
 * prekryvajici se vrstvy
 * cyklo
 */
function displayOverlayLayer(layername,visibility)
{
    if (visibility === undefined) {
        visibility = !overlayLayers[layername].getVisibility();
    }
    if (layername == "stin") {
        return;
    }
    overlayLayers[layername].setVisibility(visibility);
}

var prevScale = 20000000;
function onEditMapZoomed() {
        // 1:2000
        // cenia + adresni body
        //
        // 1:2000
        // topo
        var scale = Math.round(map.getScale());

        if (prevScale > 2000 && scale <= 2000){
            displayOverlayLayer("adresy",true);
            baseLayers["cenia_wms"].setVisibility(true);
            map.setBaseLayer(baseLayers["cenia_wms"]);
        }
        else if (prevScale <= 2000 && scale > 2000){
            displayOverlayLayer("adresy",false);
            baseLayers["topo"].setVisibility(true);
            map.setBaseLayer(baseLayers["topo"]);
        }
        prevScale = scale;
}

function naturalTray(id) {
    if (naturalTrayLayer) {
        map.removeLayer(naturalTrayLayer);
        naturalTrayLayer.destroy();
        naturalTrayLayer = null;
    }

    if (id) {
        naturalTrayLayer =  new OpenLayers.Layer.WFS("Natural Way",
                "http://www.bnhelp.cz/ows/posazavi",
                {typename:"naucne",
                filter:"<Filter><PropertyIsEqualTo><PropertyName>ID_TRASY</PropertyName><Literal>"+id+"</Literal></PropertyIsEqualTo></Filter>",
                bbox:null},
                {displayInLayerSwitcher:false,
                 style:{strokeColor:"green",
                        strokeOpacity:"0.5",
                        strokeWidth:"5px"}
                });
        naturalTrayLayer.onFeatureInsert = function(f) {
                    map.zoomToExtent(f.geometry.getBounds());
                    this.onFeatureInsert = function() {};
        }

        map.addLayer(naturalTrayLayer); 
    }
}

/**
 * Function: wmsObceSLD
 * Add WMS layer for regions with SLD url
 *
 * If sld is *null*, layer will be removed
 * Only one layer at once can be added
 *
 * Parameters:
 * sld - {String} url with sld
 */
function wmsObceSLD(sld) {
    if (wmsObceLayer) {
        map.removeLayer(wmsObceLayer);
        wmsObceLayer.destroy();
        wmsObceLayer = null;
    }

    if (sld) {
        wmsObceLayer =  new OpenLayers.Layer.WMS("WMS SLD",
                "http://www.bnhelp.cz/ows/posazavi",
                {layers:"obce",
                sld:sld,
                transparent:true,
                format:"image/gif"},
                {displayInLayerSwitcher:false,
                visibility:true,
                singleTile:false,
                buffer: 0,
                tileSize: new OpenLayers.Size(512,512),
                isBaseLayer:false});
        map.addLayer(wmsObceLayer); 
        wmsObceLayer.setVisibility(true);
        wmsObceLayer.setOpacity(0.7);
    }
}

/**
 * Function: wmsRegionySLD
 * Add WMS layer for cities with SLD url
 *
 * If sld is *null*, layer will be removed
 * Only one layer at once can be added
 *
 * Parameters:
 * sld - {String} url with sld
 */
function wmsRegionySLD(sld) {
    if (wmsRegionyLayer) {
        map.removeLayer(wmsRegionyLayer);
        wmsRegionyLayer.destroy();
        wmsRegionyLayer = null;
    }

    if (sld) {
        wmsRegionyLayer =  new OpenLayers.Layer.WMS("WMS SLD",
                "http://www.bnhelp.cz/ows/posazavi",
                {layers:"obce",
                sld:sld,
                transparent:true,
                format:"image/gif"},
                {displayInLayerSwitcher:false,
                visibility:true,
                singleTile:false,
                buffer: 0,
                tileSize: new OpenLayers.Size(512,512),
                isBaseLayer:false});
        map.addLayer(wmsRegionyLayer); 
        wmsRegionyLayer.setVisibility(true);
        wmsRegionyLayer.setOpacity(0.3);
    }
}

/**
 * Initialize the touristic map
 */
var initTouristicMap = function() {
    var options = { 
            restrictedExtent: restrictedExtent,
            maxExtent: new OpenLayers.Bounds(-905000,-1230000,-400000,-900000),
            maxResolution: "auto",
            resolutions : [ 1763.8879363894034, 705.5551745557614,
                        352.7775872778807, 176.38879363894034, 70.55551745557612, 35.27775872778806, 17.63887936389403,
                        7.055551745557612, 3.527775872778806, 1.763887936389403, 0.7055551745557613, 0.35277758727788, 0.17638879363],
            controls: [],
            units: "m",
            projection: "EPSG:102067"
            };
    map =  new OpenLayers.Map("map", options);

    /* controls */
    map.addControl(new OpenLayers.Control.Navigation());
    map.addControl(new OpenLayers.Control.ArgParser());
    map.addControl(new OpenLayers.Control.PanZoomBar(options));
    map.addControl(new OpenLayers.Control.Scale());
    map.addControl(new OpenLayers.Control.KeyboardDefaults());

    var topoTiles = new OpenLayers.Layer.TileCache("Topografická mapa",
            "http://apps.esdi-humboldt.cz/data/tilecache/",
            "topoJTSK/5M",
            {
                isBaseLayer: false,
                displayInLayerSwitcher: true,
                format: "image/png",
                projections: ["EPSG:102067"],
                visibility:true,
                buffer:0,
                transitionEffect:"resize",
                //resolutions: map.resolutions.slice(0,6),
                saveWMC: false,
                group:"topo",
                isBaseGroup:true
        });

    var topoWMS = new OpenLayers.Layer.WMS(
    	"Topografická mapa","http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi",
    	{layers: 'ceniaTopoJTSK',format:"image/png"},
    	{
            isBaseLayer: false,
            format: "image/png",
            displayInLayerSwitcher: true,
            visibility:true,
            projections: ["EPSG:102067"],
            buffer:0,
            transitionEffect:"resize",
            resolutions: map.resolutions.slice(6,25),
            group:"topo",
            saveWMC:false
        });

    var orthoTiles = new OpenLayers.Layer.TileCache("Letecké snímky",
            "http://apps.esdi-humboldt.cz/data/tilecache/",
            "ceniaJTSK/5M",
            {
                isBaseLayer: false,
                format: "image/jpeg",
                displayInLayerSwitcher: true,
                visibility:false,
                buffer:0,
                projections: ["EPSG:102067"],
                isBaseGroup:true,
                resolutions: map.resolutions.slice(0,6),
                saveWMC: false,
                group:"foto",
                transitionEffect:"resize"
            });
    
    var orthoWMS = new OpenLayers.Layer.WMS( "Letecké snímky",
        "http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi",
    	{layers: 'ceniaJTSK',format:"image/jpeg"},
        {
            displayInLayerSwitcher: true,
            isBaseLayer: false,
            format: "image/jpeg",
            visibility:false,
            buffer:0,
            projections: ["EPSG:102067"],
            transitionEffect:"resize",
            saveWMC:false,
            group:"foto",
            resolutions: map.resolutions.slice(6,25)
        });

    var cyklotrasy = new OpenLayers.Layer.WMS( "Cyklotrasy", 
                                "http://www.bnhelp.cz/ows/posazavi",
                                {layers: 'cyklotrasy',
                                transparent:true,
                                format: "image/gif"},
                                {isBaseLayer:false,
                                opacity: 0.5,
                                visibility:false,
                                singleTile:false,
                                gutter: 50,
                                displayInLayerSwitcher:false});

    var naucnetrasy = new OpenLayers.Layer.WMS("Naucnetrasy", 
                                "http://www.bnhelp.cz/ows/posazavi",
                                {layers: 'naucne',
                                transparent:true,
                                format: "image/gif"},
                                {isBaseLayer:false,
                                opacity: 0.5,
                                visibility:false,
                                singleTile:false,
                                gutter: 50,
                                displayInLayerSwitcher:false});

    var extent = new OpenLayers.Layer.Boxes( "Extent", {visibility:true});

    var stin = new OpenLayers.Layer.WMS( "stin",
                                "http://www.bnhelp.cz/cgi-bin/crtopo2",
                                {layers: 'stin',
                                format:"image/png",
                                transparent:true},
                                {isBaseLayer:false,
                                opacity:0.3,
                                visibility: false,
                                group:"relief",
                                displayInLayerSwitcher:false});

    var cenia_wms = new OpenLayers.Layer.WMS( "Cenia",
                                "http://geoportal.gov.cz/ArcGIS/services/CENIA/cenia_rt_ortofotomapa_aktualni/mapserver/WMSServer",
                                {layers: '0'},
                                {visibility:false,
                                gutter:50});

    markers = new OpenLayers.Layer.Markers("Znacky",
                                {displayInLayerSwitcher: false});

    // region bounding box
    if (restrictedExtent) {
        var extentBox = new OpenLayers.Marker.Box(this.map.restrictedExtent);
        extentBox.setBorder("green",3);
        extent.addMarker(extentBox);
    }

    // add layers
    var topoReliefTiles = topoTiles.clone();
    topoReliefTiles.group = "relief";
    topoReliefTiles.layername = "topoJTSK/5M";
    var topoReliefWMS = topoWMS.clone();
    topoReliefWMS.group = "relief";
    map.addLayers([topoTiles, topoWMS,
                   orthoTiles, orthoWMS,
                   cyklotrasy,
                   markers,naucnetrasy,
                   topoReliefWMS,topoReliefTiles,
                   stin
                   ]);
    map.setBaseLayer(topoTiles);

    // define array of base layers and overlays
    baseLayers = {"cenia":orthoTiles,"topo":topoTiles};
    overlayLayers = {"cyklo":cyklotrasy,"naucne":naucnetrasy};

    // layerswitcher control
    var grpLayerSwitcher = new OpenLayers.Control.GroupLayerSwitcher({div:document.getElementById("buttons"),
        groupTitles:{foto: hsMsg.foto,topo: hsMsg.topo,
                    detail:"Detail",
                    relief:hsMsg.relief}});
    map.addControl(grpLayerSwitcher);
    grpLayerSwitcher.setGroupVisible("topo");

    // overview map
    var overviewLayer = new OpenLayers.Layer.WMS( "OverView",
                        "http://www.bnhelp.cz/cgi-bin/crtopo2",
                        {layers: 'doprava,sidla,hr_cr,voda'},
                        {gutter:100}); 
    var overviewOptions = {
                        maxExtent: new OpenLayers.Bounds(-905000,-1227585,-430000,-934410),
                        maxResolution: "auto",
                        resolutions: [3500,750,250],
                        units: "m",
                        projection: "EPSG:102067"
                    };
    if (OpenLayers.Util.getElement("mapPreview")) {
        overview = new
        OpenLayers.Control.OverviewMap({layers:[overviewLayer.clone(),extent],mapOptions:overviewOptions, 
        div:OpenLayers.Util.getElement("mapPreview"),
        size:new OpenLayers.Size(140,90),
        maxRatio: 50
        });
        OpenLayers.Util.getElement("mapPreview").innerHTML = "";
        map.addControl(overview);
    }
};

/**
 * Initialize the editation map
 */
var initEditationMap = function() {

    var options = { 
            maxExtent: new OpenLayers.Bounds(-905000,-1230000,-400000,-900000),
            maxResolution: "auto",
            resolutions : [ 1763.8879363894034, 705.5551745557614,
                        352.7775872778807, 176.38879363894034, 70.55551745557612, 35.27775872778806, 17.63887936389403,
                        7.055551745557612, 3.527775872778806, 1.763887936389403, 0.7055551745557613, 0.35277758727788, 0.17638879363],
            controls: [],
            units: "m",
            projection: "EPSG:102067"
            };
    map =  new OpenLayers.Map("map", options);

    /* controls */
    map.addControl(new OpenLayers.Control.Navigation());
    map.addControl(new OpenLayers.Control.ArgParser());
    map.addControl(new OpenLayers.Control.PanZoomBar({div: document.getElementById("mapControl")}));
    map.addControl(new OpenLayers.Control.Scale());
    map.addControl(new OpenLayers.Control.KeyboardDefaults());
    map.addControl(new OpenLayers.Control.LayerSwitcher());

    /*
     * layers
     */
     
    var katastr_definicni = new OpenLayers.Layer.WMS("Definiční body parcel",
                                "http://wms.cuzk.cz/wms.asp",
                                {layers: "DEF_PARCELY",
                                transparent:true},
                                {isBaseLayer:false,
                                visibility:false
                                });
   
     
    var katastr = new OpenLayers.Layer.WMS("Katastrální mapa",
                                "http://wms.cuzk.cz/wms.asp",
                                {layers: "RST_KN,RST_KMD,dalsi_p_mapy,hranice_parcel,obrazy_parcel,parcelni_cisla",
                                transparent:true},
                                {isBaseLayer:false,
                                visibility:false
                                });

    var katastr_b = new OpenLayers.Layer.WMS("Katastrální mapa (Inverzní)",
                                "http://wms.cuzk.cz/wms.asp",
                                {layers: "RST_KN_I,RST_KMD_I,dalsi_p_mapy_i,hranice_parcel_i,obrazy_parcel_i,parcelni_cisla_i",
                                transparent:true},
                                {isBaseLayer:false,
                                visibility:false
                                });

    var adresy = new OpenLayers.Layer.WMS( "Adresni body", 
                                "http://www.bnhelp.cz/ows/posazavi",
                                {layers: 'adrbody_data',
                                transparent:true,
                                format: "image/gif"},
                                {isBaseLayer:false,
                                visibility:false
                                });

    var obce = new OpenLayers.Layer.WMS( "Obce", 
                                "http://www.bnhelp.cz/ows/posazavi",
                                {layers: 'obce',
                                transparent:true,
                                format: "image/gif"},
                                {isBaseLayer:false,
                                visibility:false,
                                singleTile:false,
                                buffer: 0,
                                tileSize: new OpenLayers.Size(512,512),
                                opacity:0.3
                                });

    var ku_data = new OpenLayers.Layer.WMS( "Katastralni uzemi", 
                                "http://www.bnhelp.cz/ows/posazavi",
                                {layers: 'ku_data',
                                transparent:true,
                                format: "image/gif"},
                                {isBaseLayer:false,
                                ratio: 1,
                                singleTile: true,
                                visibility:false
                                });

    var topo = new OpenLayers.Layer.WMS("Topografická mapa",
                                "http://bnhelp.cz/ows/crtopo",
                                {layers:"les,hr_cr,sidla,voda,doprava",
                                 transparent: true,
                                 format: "image/gif"},
                                {singleTile: true,
                                ratio: 1,
                                isBaseLayer: true});

    var cenia_wms = new OpenLayers.Layer.WMS( "Cenia",
                                "http://geoportal.gov.cz/ArcGIS/services/CENIA/cenia_rt_ortofotomapa_aktualni/mapserver/WMSServer",
                                {layers: '0'},
                                {visibility:false,
                                singleTile: true,
                                ratio: 1,
                                gutter:50});

    markers = new OpenLayers.Layer.Markers("Znacky",
                                {displayInLayerSwitcher: false});

    var orthoWMS = new OpenLayers.Layer.WMS( "Letecké snímky",
        "http://apps.esdi-humboldt.cz/cgi-bin/tilecache/tilecache.cgi",
    	{layers: 'ceniaJTSK',format:"image/jpeg"},
        {
            displayInLayerSwitcher: true,
            isBaseLayer: true,
            format: "image/jpeg",
            visibility:false,
            buffer:0,
            transitionEffect:"resize"
            //resolutions: map.resolutions
        });
    // define array of base layers and overlays
    baseLayers = {"cenia_wms":orthoWMS, "topo":topo};
    overlayLayers = {"adresy":adresy};

    map.addLayers([adresy,obce,ku_data,topo,orthoWMS,katastr,katastr_definicni,katastr_b,markers]);
    map.events.register("zoomend", map, onEditMapZoomed);
};

/*
 * prekresleni bodovych vrstev tak, aby se znovu nacetly body ze serveru
 */

