var geocoder;
//var format_olon = new OpenLayers.Format.OLON();


//<!-- export_map-------------------------------------------------------->
function export_map() {
    expImp = $('exportImport');
    if (expImp.checked)
        export_olon();
    else
        export_wmc();
} //export_map

//<!-- import_map-------------------------------------------------------->
function import_map() {
    expImp = $('exportImport');
    if (expImp.checked)
        import_olon();
    else
        import_wmc();
} //import_map


//<!-- export_olon-------------------------------------------------------->
function export_olon() {
    try {
        //map.removeControl(vectPanel);
        //vectPanel = null;

        map.bounds = map.getExtent();
        map.resolution = map.getResolution();
        map.projection = map.getProjection();
        var content = format_olon.write(map, true);
        $("export_area").value = content;
        $("export_area").style.display = "block";

        //vectPanel = new OpenLayers.Control.EditingToolbar(vector);
        //map.addControl(vectPanel);
    }
    catch (e) { alert("export_olon: " + e.message); }

} //export_olon


function handleMeasurements(event) {
    var geometry = event.geometry;
    var units = event.units;
    var order = event.order;
    var measure = event.measure;
    var element = document.getElementById('mapOutput');
    if (element) {
        var out = "";
        if (order == 1) {
            out += "Distance: " + measure.toFixed(3) + " " + units;
            if (map.getProjection() == "EPSG:4326") {
                out += ", Great Circle Distance: " +
                        calcVincenty(geometry).toFixed(3) + " km";
            }
        } else {
            out += "<span class='mapAreaOutput'>Area: " + measure.toFixed(3) + " " + units + "<sup style='font-size:6px'>2</" + "sup></span>";
        }
        element.innerHTML = out;
    }
}


function load_map_controls() {
        
        // set up the right vector control panel(if any vector exist)

        for (var i = 0; i < map.layers.length; i++) {
            var layer = map.layers[i];
            //is this vector layer ?
            if (layer.CLASS_NAME && layer.CLASS_NAME == "OpenLayers.Layer.Vector") {
                // set up editing toolbar
                vector = map.layers[i];
                vectPanel = new OpenLayers.Control.EditingToolbar(vector);
                map.addControl(vectPanel);
                break;
            }
        }

    

    OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
    OpenLayers.Util.onImageLoadErrorColor = 'transparent';


    map.addControl(new OpenLayers.Control.MousePosition({ div: document.getElementById('mapMousePosition'), numdigits: 5 }));
    map.addControl(new OpenLayers.Control.Scale('mapScale'));
    //map.addControl(new OpenLayers.Control.ScaleLine());
    map.addControl(new OpenLayers.Control.PanZoomBar());

    // display the map projection

    var mapProj = document.getElementById('mapProjection');
    if (mapProj) {
        mapProj.innerHTML = map.projection;
    }

    layerSwitcher = new OpenLayers.Control.LayerSwitcher();
    map.addControl(layerSwitcher);
    layerSwitcher.maximizeControl();


    var navHistory = new OpenLayers.Control.NavigationHistory();
    navHistory.previous.title = "Pohled zpět";
    navHistory.next.title = "Pohled vpřed";
    map.addControl(navHistory);


    var zoomToContextExtent = new OpenLayers.Control.Button({
        title: "Celý výřez", displayClass: "olControlZoomToMaxExtent", trigger: function() { map.zoomToExtent(map.maxExtent); }
    });

    // build the measure controls
    var optionsLine = {
        handlerOptions: {
            persist: true
        },
        displayClass: "olControlMeasureDistance",
        title: "Měřit vzdálenosti"
    };

    var optionsPolygon = {
        handlerOptions: {
            persist: true
        },
        displayClass: "olControlMeasureArea",
        title: "Měřit plochy"
    };

    measureControls = {
        line: new OpenLayers.Control.Measure(
                      OpenLayers.Handler.Path,
                      optionsLine
                    ),
        polygon: new OpenLayers.Control.Measure(
                        OpenLayers.Handler.Polygon,
                        optionsPolygon
                    )
    };

    for (var key in measureControls) {
        control = measureControls[key];
        control.events.on({
            "measure": handleMeasurements,
            "measurepartial": handleMeasurements
        });
    }

    // create the panel where the controls will be added


    var zoomBox = new OpenLayers.Control.ZoomBox({ title: "Detail výřezem" });
    var dragMap = new OpenLayers.Control.DragPan({ title: 'Táhnout mapu', displayClass: 'olControlPanMap' });
    var zoomOut = new OpenLayers.Control.ZoomBox({ title: "Odstup výřezem", displayClass: 'olControlZoomOutBox', out: true });



    var panel = new OpenLayers.Control.Panel({ defaultControl: dragMap });

    panel.addControls([
                    dragMap,
                    zoomBox,
                    zoomOut,
                    zoomToContextExtent,
                    navHistory.previous,
                    navHistory.next,
                    measureControls.line,
                    measureControls.polygon
                    ]);

    // add the panel to the map
    map.addControl(panel);
    map.addControl(new OpenLayers.Control.Permalink());

    // google geocoding
    geocoder = new OpenLayers.Control.Geocoder();
    map.addControl(geocoder);



}

function showAddress(address) {
    if (geocoder) {
        geocoder.getLocation(
                    address,
                    function(lonlat) {
                        if (!lonlat) {
                            alert(address + " nenalezena");
                        } else {

                            if (map.projection == "EPSG:102067") {
                                map.setCenter(lonlat, 11, false, true);
                            }
                            else if ((map.projection == "EPSG:900913") || (map.projection == "EPSG:4326")){
                                map.setCenter(lonlat, map.numZoomLevels - 1, false, true);
                            }
                            else {
                                alert("pro tuto projekci nelze lokalizovat");
                            }



                        }
                    }
                );
    }
}


function MSLoad(olon) {
    load_olon_map(olon);
    load_map_controls();
    var permalink = map.getControlsByClass("OpenLayers.Control.Permalink");
    if (permalink[0]) {
        map.removeControl(permalink[0]);
    }
}

function MSSnapshot() {
    numCtrl = map.controls.length;
    for (var i = numCtrl; i >= 0; i--) {
        map.removeControl(map.controls[i]);
    }
    var textArea = document.getElementById("SnapShot");
    if (textArea) {
        textArea.value = '<div id="mapsnap" style="width: 650px; height: 350px; float:left;">' + map.div.innerHTML + '</div>';

    }
    var mapsnap = document.getElementById("mapsnap");
    if (mapsnap) {
        mapsnap.innerHTML = map.div.innerHTML;
    }


}


function load_olon_map(olon_text) {

    // if previous map exist destroy it 
    if (map) {
        if (vectPanel) {
            map.removeControl(vectPanel);
            vectPanel = null;
        }
        // destroy layers
        if (map.layers) {
            for (var i = map.layers.length - 1; i >= 0; --i) {
                if (i < 0)
                    break;
                map.layers[i].destroy();
            }
        }

        map.destroy();
    }

    if (typeof (format_olon) == 'undefined') {
        format_olon = new OpenLayers.Format.OLON();
    }

    context = format_olon.read(olon_text);
    var cloned_context = format_olon.read(olon_text);

    var newOptions = new Object();
    newOptions.resolutions = context.resolutions;
    newOptions.maxExtent = context.bounds;
    newOptions.numZoomLevels = context.numZoomLevels;
    newOptions.projection = context.projection;
    newOptions.maxResolution = context.maxResolution;
    newOptions.units = context.units;

    map = null;
    map = new OpenLayers.Map($('map'), newOptions);

    if (context.layers) {

        //SSU fix for CloudMade
        for (var i = context.layers.length - 1; i >= 0; --i) {
            context.layers[i].map = null;
        }

        map.addLayers(context.layers);

        // fix layer scale dependency
        for (var i = map.layers.length - 1; i >= 0; --i) {
            map.layers[i].maxResolution = cloned_context.layers[i].maxResolution;
            map.layers[i].minResolution = cloned_context.layers[i].minResolution;
            map.layers[i].numZoomLevels = cloned_context.layers[i].numZoomLevels;
        }

        //fix base layer visibility - A (e.g. google)
        //set all on
        for (var i = map.layers.length - 1; i >= 0; --i) {
            if (map.layers[i].isBaseLayer)
                map.setBaseLayer(map.layers[i]);

        }

        //fix base layer visibility - B  (e.g. google)
        //2nd switch base layer on off
        for (var i = map.layers.length - 1; i >= 0; --i) {
            if ((map.layers[i].isBaseLayer) && (cloned_context.layers[i].visibility)) {
                map.setBaseLayer(map.layers[i]);
                break; //only one base layer can be visible
            }
        }

    }
    else {
        var dumpImage = OpenLayers.Util.getImagesLocation() + 'blank.gif';
        map.addLayer(new OpenLayers.Layer.WMS('OverView', dumpImage, { layers: 'void' }, { isBaseLayer: true, singleTile: true, displayInLayerSwitcher: false }));

    }


    var zoom = map.getZoomForResolution(context.resolution, true);
    if (!map.getCenter()) {
        map.setCenter(context.center, zoom, false, true);
    }


    //permalink
    var argParser = map.getControlsByClass('OpenLayers.Control.ArgParser');
    var args = OpenLayers.Util.getParameters();
    if (argParser && argParser[0] && (args.layers)) {
        argParser[0].configureLayers(); argParser[0].setCenter();
    }






} //import_olon


//<!-- import_olon-------------------------------------------------------->
function import_olon() {
    var exportArea = $("export_area");
    if (exportArea) {
        try {
            load_olon_map(exportArea.value);
            load_map_controls();
        }
        catch (err) {
            exportArea.value = err;
        }
    }
    generateLegendOverview();

}





//<!-- export_wmc----------------------------------------------------------> 
function export_wmc() {
    try {
        var format_wmc = new OpenLayers.Format.WMC({ 'layerOptions': { buffer: 0} });
        var content = format_wmc.write(map);

        $("export_area").value = content;
        $("export_area").style.display = "block";
    }
    catch (e) { alert("export_wmc: " + e.message); }

} //export_wmc



//<!-- import_wmc---------------------------------------------------------->
function import_wmc() {
    try {
        var format_wmc = new OpenLayers.Format.WMC({ 'layerOptions': { buffer: 0} });
        var content = $("export_area").value;

        var merge = false;
        if (merge) {
            try {
                map = format_wmc.read(content, { map: map });
            }
            catch (err) {
                $("export_area").value = err;
            }
        }
        else {

            try {

                for (i = 1; i < map.layers.length; i++) {
                    map.removeLayer(map.layers[i]);
                }

                context = format_wmc.read(content, { map: null });

                var newOptions = new Object();

                newOptions.maxExtent = context.bounds;
                newOptions.projection = context.projection;
                newOptions.maxResolution = context.maxResolution;
                newOptions.units = context.units;

                //map.setOptions(newOptions);
                //----this will erase whole map...
                map.destroy();
                map = null;
                map = new OpenLayers.Map($('map'), newOptions);
                //----
                map.addLayers(context.layers);

                map.setCenter(context.bounds.getCenterLonLat(),
                           map.getZoomForExtent(context.bounds, true)
                           );



                load_map_controls();



            }
            catch (err) {
                document.getElementById("export_area").value = err;
            }
        }

    }
    catch (e) { alert("import_wmc: " + e.message); }

} //import_wmc






function manual_olon_export() {
    var map_center = '{ "center": {"lon":' + OpenLayers.Class.serialize(map.center.lon) + ',' + OpenLayers.Class.serialize(map.center.lat) + ', "CLASS_NAME": "OpenLayers.LonLat"},';
    var map_resolution = '"resolution":' + OpenLayers.Class.serialize(map.resolution) + ',';
    var map_resolutions = '"resolutions": [' + OpenLayers.Class.serialize(map.resolutions) + '],';
    var map_bounds = '"bounds": {"left":   ' + OpenLayers.Class.serialize(map.maxExtent.left) + ',' +
                               '"bottom": ' + OpenLayers.Class.serialize(map.maxExtent.bottom) + ',' +
                               '"right":  ' + OpenLayers.Class.serialize(map.maxExtent.right) + ',' +
                               '"top":    ' + OpenLayers.Class.serialize(map.maxExtent.top) + ',' +
                               '"CLASS_NAME": "OpenLayers.Bounds"},';
    var map_projection = '"projection": "' + map.projection + '",';
    var map_units = '"units": "' + map.getUnits() + '",';
    var map_maxRes = '"maxResolution": "' + map.maxResolution + '",';
    var map_numZoomLevel = '"numZoomLevels": "' + map.numZoomLevels + '",';
    var map_zoom = '"numZoomLevels": "' + map.zoom + '",';
    var map_class = '""CLASS_NAME": "OpenLayers.Map" }';

    function e(w) {
        d = w.document;
        //    d.write("<textarea id='wmc' rows='100' cols='65'>" + text +"</textarea>");
        d.write(map_center + "<br>");
        d.write(map_resolution + "<br>");
        d.write(map_resolutions + "<br>");
        d.write(map_bounds + "<br>");
        d.write(map_projection + "<br>");
        d.write(map_units + "<br>");
        d.write(map_maxRes + "<br>");
        d.write(map_numZoomLevel + "<br>");
        d.write(map_zoom + "<br>");
        d.write(map_class + "<br>");


        d.close();
        w.focus()
    }




}







//MapShakeConnection




//<!-- AJAXInteraction-------------------------------------------------------->
function AJAXInteraction(url, callback) {

    var req = init();
    req.onreadystatechange = processRequest;

    function init() {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest();
        }
        else if (window.ActiveXObject) {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    }

    function processRequest() {
        // readyState of 4 signifies request is complete
        if (req.readyState == 4) {
            if (req.responseText[0] == "0")
                alert("Mapa byla vložena");
            else if (req.responseText[0] == "1")
                alert("Nesprávný email nebo heslo");
            else if (req.responseText[0] == "2")
                alert("Chybí název mapy");
            else if (req.responseText[0] == "3")
                alert("Nesprávná olon data");
            else
                alert("nespecifikovana chyba");

            //popup widow with returned context                 
            //win3 = window.open("", "Window3", "width=320,height=210,scrollbars=yes");
            //win3.document.writeln(req.responseText);

            // status of 200 signifies sucessful HTTP call
            if (req.status == 200) {
                if (callback) callback(req.responseXML);
            }
        }
        return false;
    }

    this.doGet = function() {
        req.open("GET", url, true);
        req.send(null);
    }

    this.doPost = function(str) {
        req.open("POST", url, true);
        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
        req.setRequestHeader("Content-length", "" + str.length);
        req.send(str);
    }

} //AJAXInteraction




//<!-- send-------------------------------------------------------->
function send() {
    var url =
  {
      /**
      * Url encodes a string
      * @return {string}
      */
      encode: function(pValue) {
          var str = escape(pValue);
          str = str.replace(/\+/g, "%2B");
          str = str.replace(/%20/g, "+");

          //aded for mapshake encoding
          //encodedData = encodedData.replace(/\%0A/gi, "%0D%0A");
          str = str.replace(/%0A/gi, "%0D%0A");
          str = str.replace(/\//gi, "%2F");
          str = str.replace(/EPSG%3A102067%26%22%2C/gi, "EPSG%3A102067%22%2C");

          return str;

      },

      /**
      * Decodes a url encoded string
      * @return {string}
      */
      decode: function(pValue) {
          var str = pValue.replace(/\+/g, " ");
          str = unescape(str);
          return str;
      }
  }


    var email = $('mpshk_email').value;
    email = url.encode(email);

    var password = $('mpshk_password').value;
    password = url.encode(password);

    var title = $('mpshk_title').value;
    title = url.encode(title);

    var comment = $('mpshk_comment').value;
    comment = url.encode(comment);

    map.bounds = map.getExtent();
    map.resolution = map.getResolution();
    var content = format_olon.write(map, true);

    //var encodedData = escape(content); //this encoding is not compatible
    var encodedData = url.encode(content);


    if (email == "") {
        alert("Zadejte prosím e-mail");
    }
    else if (password == "") {
        alert("Zadejte prosím heslo");
    }
    else if (title == "") {
        alert("Zadejte prosím titulek");
    }
    /* //comment is not needed necessary 
    else if(comment == "")
    {
    alert("Zadejte prosím komentář");
    } 
    */
    else {
        var dataToSend = "email=" + email + "&password=" + password + "&title=" + title + "&comment=" + comment + "&olon=" + encodedData + "&submit=Vlo%C5%BEit+mapu";
        var approveResponse = null;
        var connection = new AJAXInteraction(proxy_MapShake, approveResponse);
        connection.doPost(dataToSend);
    }

} //send