// Start position for the map (hardcoded here for simplicity,
// but maybe you want to get from URL params)
var lat=52.33
var lon=19.9
var zoom=6
var marker;
var markers;
var permLinker;
var keyHandler;
var popup;

var mapUMP; //complex object of type OpenLayers.Map

UMP = {};

function tracelog(e){
    alert(e+"\n"+e.fileName+"\n"+e.lineNumber);
}
function preloadImages(){
    if (document.images){
        pic1 = new Image(); pic1.src = "http://www.openlayers.org/api/img/marker.png";
        pic2 = new Image(); pic2.src = "http://www.openlayers.org/api/img/cloud-popup-relative.png";
    }
}

function queryString(parameter) {
    var loc = location.search.substring(1, location.search.length);
    var param_value = false;
    var params = loc.split("&");
    for (i=0; i<params.length;i++) {
        param_name = params[i].substring(0,params[i].indexOf('='));
        if (param_name == parameter) {
            param_value = params[i].substring(params[i].indexOf('=')+1)
        }
    }
    if (param_value) {
        return param_value;
    } else {
        return false;
    }
}

var epsg4326 = new OpenLayers.Projection("EPSG:4326");

function getMapCenter(center, zoom) {
   return mapUMP.getCenter().clone().transform(mapUMP.getProjectionObject(), epsg4326);
}

function getArgs(url) {
    var args = new Object();
    var querystart = url.indexOf("?");

    if (querystart >= 0) {
        var querystring = url.substring(querystart + 1);
        var queryitems = querystring.split("&");

        for (var i = 0; i < queryitems.length; i++) {
            if (match = queryitems[i].match(/^(.*)=(.*)$/)) {
                args[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
            } else {
                args[decodeURIComponent(queryitems[i])] = null
            }
        }
    }

    return args;
}

function setArgs(url, args) {
    var queryitems = new Array();
    for (arg in args) {
        if (args[arg] == null) {
            queryitems.push(encodeURIComponent(arg));
        } else {
            queryitems.push(encodeURIComponent(arg) + "=" + encodeURIComponent(args[arg]));
        }
    }
    return url.replace(/\?.*$/, "") + "?" + queryitems.join("&");
}

function initLanguage(){
  try{
    var myEnglishStrings = {
        'permalink': " ",
        'scale': "Skala = 1 : ${scaleDenom}",
        'baseLayer': "Warstwa bazowa"
    }

    OpenLayers.Util.extend(OpenLayers.Lang.en, myEnglishStrings);
  }catch(e){
  }
}

function isdefined( variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}


//Initialise the 'map' object
function initUMP(mapDiv,mapOptions) {
  try{
    preloadImages();
    if (!mapDiv) {
        mapDiv="map";
    }
    if (!mapOptions){
        mapOptions={};
    }
    initLanguage();
    var permLinked = 0;

    if (queryString('lat') || mapOptions.lat){
        lat = queryString('lat');
        if (!lat)
            lat = mapOptions.lat;
        else
            permLinked++;
    }
    if (queryString('lon') || mapOptions.lon){
        lon = queryString('lon');
        if (!lon)
            lon = mapOptions.lon;
        else
            permLinked++;
    }
    if (queryString('zoom') || mapOptions.zoom){
        zoom = queryString('zoom');
        if (!zoom)
            zoom = mapOptions.zoom;
        else
            permLinked++;
    }

    mapUMP = new OpenLayers.Map (mapDiv, {
        controls:[
            ],
        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
        maxResolution: 156543.0399,
        numZoomLevels: 19,
        units: 'm',
        projection: new OpenLayers.Projection("EPSG:900913"),
        displayProjection: new OpenLayers.Projection("EPSG:4326")
    } );
    mapUMP.mapOptions = mapOptions;

    layerTilesAtHome0 = new OpenLayers.Layer.OSM("UMP@Mapnik",
                [
		    "http://1.tiles.ump.waw.pl/ump_tiles/",
		    "http://2.tiles.ump.waw.pl/ump_tiles/",
		    "http://3.tiles.ump.waw.pl/ump_tiles/"
		],
                {numZoomLevels: 19, 'buffer':0,
                attribution: "Data by <a href='http://ump.waw.pl/'>UMP-pcPL</a>+<a target='_blank' href='http://www2.jpl.nasa.gov/srtm/'>SRTM</a>"});
    mapUMP.addLayer(layerTilesAtHome0);

    layerTilesAtHome3 = new OpenLayers.Layer.OSM.Mapnik("OpenStreetMaps");
    mapUMP.addLayer(layerTilesAtHome3);

    if (mapOptions.devLayers) {
        layerTilesAtHome = new OpenLayers.Layer.OSM("UMP@Mapnik-dev",
                    ["http://marcom.homeip.net/osm_tiles2.stg/"],
                    {numZoomLevels: 19, 'buffer':0,
                    attribution: "Data by <a href='http://ump.waw.pl/'>UMP-pcPL</a>+<a target='_blank' href='http://www2.jpl.nasa.gov/srtm/'>SRTM</a>"});
        mapUMP.addLayer(layerTilesAtHome);

        layerTilesAtHome2 = new OpenLayers.Layer.OSM.SharpMap("UMP@SharpMap",
                    {attribution: "Data by <a href='http://ump.waw.pl/'>UMP-pcPL</a>"});
        //mapUMP.addLayer(layerTilesAtHome2);
    }

    if (mapOptions.enableGoogle) {
        try{
            if (isdefined('G_NORMAL_MAP')) {
                google1 = new OpenLayers.Layer.Google( "Google Ulice" , {type: G_NORMAL_MAP, sphericalMercator:true });
                mapUMP.addLayer(google1);
                google2 = new OpenLayers.Layer.Google( "Google Sat" , {type: G_SATELLITE_MAP, sphericalMercator:true });
                mapUMP.addLayer(google2);
                google3 = new OpenLayers.Layer.Google( "Google Hybryda" , {type: G_HYBRID_MAP, sphericalMercator:true });
                mapUMP.addLayer(google3);
            }
        } catch(e){
            //alert(e);
        }
    }


    markers = new OpenLayers.Layer.Markers("Markers", {
        displayInLayerSwitcher: false,
        numZoomLevels: 20,
        maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
        maxResolution: 156543.0399,
        units: "m",
        projection: "EPSG:900913"
        });
    mapUMP.addLayer(markers);


    var lonLat = new OpenLayers.LonLat(lon, lat).transform(new OpenLayers.Projection("EPSG:4326"), mapUMP.getProjectionObject());

    mapUMP.permLinked = (permLinked>=3);
    if (permLinked<3)
        mapUMP.setCenter (lonLat, zoom);



    // wymagane, aby dalo sie drag/zoom
    mapUMP.addControl(new OpenLayers.Control.Navigation());
    mapUMP.addControl(UMP.attribution=new OpenLayers.Control.Attribution());
    UMP.attribution.div.style.bottom='0.5em';
    UMP.attribution.div.style.left='3px';
    UMP.attribution.div.style.right='';
    UMP.attribution.div.style.lineHeight='1.5em';

    if (mapOptions.disableControls){
        if (mapOptions.simpliestZoom){
            mapUMP.addControl(UMP.zoom=new OpenLayers.Control.ZoomPanel());
            UMP.zoom.div.style.top='14px';
        }
//        UMP.attribution
    } else {
        mapUMP.addControl(permLinker = new OpenLayers.Control.Permalink());
        UMP.permLinker = permLinker;
        var href = permLinker.base;
        if (href.indexOf('?') != -1) {
            href = href.substring( 0, href.indexOf('?') );
        }
        permLinker.base=href;
        if (mapOptions.permBase)
            permLinker.base=mapOptions.permBase;
        permLinker.updateLink();

        if (mapOptions.simpliestZoom){
            mapUMP.addControl(new OpenLayers.Control.ZoomPanel());
        } else {
            if (mapOptions.simpleZoom)
                mapUMP.addControl(UMP.panZoom=new OpenLayers.Control.PanZoom());
            else
                mapUMP.addControl(UMP.panZoomBar=new OpenLayers.Control.PanZoomBar());
        }
        if (!mapOptions.disableKeyboard)
            mapUMP.addControl(UMP.keyHandler = keyHandler = new OpenLayers.Control.KeyboardDefaults());
    }
    //mapUMP.addControl(UMP.scaleLine=new OpenLayers.Control.ScaleLine());
    //mapUMP.addControl(UMP.overview=new OpenLayers.Control.OverviewMap());

    if (document.getElementById('paneldiv')) {
        mapUMP.addControl(UMP.navToolBar=new OpenLayers.Control.NavToolbar({'div':OpenLayers.Util.getElement('paneldiv')}));
    }

    if (document.getElementById('updatehome')){
        mapUMP.events.register("click", mapUMP, setHome);
        mapUMP.events.register("moveend", mapUMP, updatelinks);
    }
    // pobranie punktu markera z requestu
    if ((queryString('mlat') && queryString('mlon')) || (mapOptions.mlon && mapOptions.mlat)){
        mlat = queryString('mlat');
        if (!mlat) mlat = mapOptions.mlat;
        mlon = queryString('mlon');
        if (!mlon) mlon = mapOptions.mlon;
        mlonlat = new OpenLayers.LonLat(mlon, mlat);
        if (queryString('mbody'))
            mapOptions.mbody=queryString('mbody');
        marker = addMarkerToMap(mlonlat, null, mapOptions.mbody, markers);
        mlinkAddon = "&mlat="+mlat+"&mlon="+mlon;
        if (mapOptions.mbody)
            mlinkAddon += "&mbody="+ mapOptions.mbody;

        if (document.getElementById('home_poz'))
            document.getElementById('home_poz').value = mlat+","+mlon;
        if (document.getElementById('home_lat'))
            document.getElementById('home_lat').value = mlat;
        if (document.getElementById('home_lon'))
            document.getElementById('home_lon').value = mlon;
    }
    updatelinks();

  }catch(e){
    tracelog(e);
  }
}


function decodeBB(inText){
    inText = inText.replace(/</g,"&lt;");
    search = new Array(
                /\[br\]/g,
                /\[img\](.*?)=\1\[\/img\]/g,
                /\[url=([\w]+?:\/\/[^ \\"\n\r\t<]*?)\](.*?)\[\/url\]/g,
                /\[url\]((www|ftp|)\.[^ \\"\n\r\t<]*?)\[\/url\]/g,
                /\[url=((www|ftp|)\.[^ \\"\n\r\t<]*?)\](.*?)\[\/url\]/g,
                /\[email\](([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)?[\w]+))\[\/email\]/g,
                /\[b\](.*?)\[\/b\]/g,
                /\[i\](.*?)\[\/i\]/g,
                /\[u\](.*?)\[\/u\]/g,
                /\[url\](http:\/\/[^ \\"\n\r\t<]*?)\[\/url\]/g);
    replace = new Array(
                "<br/>",
                "<img src=\"$1\" alt=\"obrazek\">",
                "<a href=\"$1\" target=\"blank\">$2</a>",
                "<a href=\"http://$1\" target=\"blank\">$1</a>",
                "<a href=\"$1\" target=\"blank\">$1</a>",
                "<a href=\"mailto:$1\">$1</a>",
                "<b>$1</b>",
                "<i>$1</i>",
                "<u>$1</u>",
                "<a href=\"$1\" target=\"blank\">$1</a>");
    for(i = 0; i < search.length; i++) {
        inText = inText.replace(search[i],replace[i]);
    }
    return inText;
}

var markerClicked=false;
function addMarkerToMap(position, icon, description, m) {
    UMP.markerBody = description;
    closeMapPopup();
    markers = m;
    var marker = new OpenLayers.Marker(position.clone().transform(epsg4326, mapUMP.getProjectionObject()), icon);

    markers.addMarker(marker);

    if (description) {
        marker.description=decodeBB(decodeURIComponent(description));

        marker.events.register("click", marker, function() { openMapPopup(marker); markerClicked=true; });
        marker.events.triggerEvent("click");
        //openMapPopup(marker);
        markerClicked=true;
        marker.events.register("mouseover", marker, function() { if (!popup || !popup.visible()) openMapPopup(marker) });
        marker.events.register("mouseout", marker, function() { if (!markerClicked) closeMapPopup() });
    }

    return marker;
}

function openMapPopup(marker) {
    closeMapPopup();

    popup = new OpenLayers.Popup.FramedCloud("popup", marker.lonlat, null,
                                                marker.description, marker.icon, true);
    popup.panMapIfOutOfView = false;
	popup.setBackgroundColor("#E3FFC5");
    popup.autoSize = true;
    // fix jednolinojkowcow
    popup.minSize = new OpenLayers.Size(105, 75);
    mapUMP.addPopup(popup);
    return popup;
}

function closeMapPopup() {
    if (popup) {
        mapUMP.removePopup(popup);
        delete popup;
        popup=null;
    }
    markerClicked=false;
}

function removeMarkerFromMap(marker, m){
    markers = m;
    markers.removeMarker(marker);
}
function getEventPosition(event) {
    return mapUMP.getLonLatFromViewPortPx(event.xy).clone().transform(mapUMP.getProjectionObject(), epsg4326);
}

var mlinkAddon;
function updatelinks(lon,lat,zoom) {
    node = document.getElementById("marked_permlink");
    if (node && permLinker) {
        if (mlinkAddon)
            node.href = permLinker.element.href+mlinkAddon;
        else
            node.href = permLinker.element.href;
    }
}


function setHome( e ) {
    var el = document.getElementById('updatehome');
    if ((el.getAttribute('type')!='checkbox' && el.getAttribute('checked'))  || document.getElementById('updatehome').checked) {
        var lonlat = getEventPosition(e);

        mlinkAddon = "&mlat="+lonlat.lat.toFixed(5)+"&mlon="+lonlat.lon.toFixed(5);
        if (UMP.markerBody)
            mlinkAddon += "&mbody="+UMP.markerBody;
        if (document.getElementById('home_poz'))
            document.getElementById('home_poz').value = lonlat.lat.toFixed(5)+","+lonlat.lon.toFixed(5);
        if (document.getElementById('home_lat'))
            document.getElementById('home_lat').value = lonlat.lat.toFixed(5);
        if (document.getElementById('home_lon'))
            document.getElementById('home_lon').value = lonlat.lon.toFixed(5);

        if (marker) {
            removeMarkerFromMap(marker, markers);
        }
        marker = addMarkerToMap(lonlat, null, UMP.markerBody, markers);
        updatelinks();
    }
}

function adjustSize(margin){
    var theWidth, theHeight;
    // Window dimensions:
    if (window.innerWidth) {
        theWidth=window.innerWidth;
    } else if (document.documentElement && document.documentElement.clientWidth) {
        theWidth=document.documentElement.clientWidth;
    } else if (document.body) {
        theWidth=document.body.clientWidth;
    }
    if (window.innerHeight) {
        theHeight=window.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) {
        theHeight=document.documentElement.clientHeight;
    } else if (document.body) {
        theHeight=document.body.clientHeight;
    }
    var mapDiv = document.getElementById("map");
    theHeight-=margin;
    mapDiv.style.height = theHeight+'px';
}

function ValidateForm(forma){
    document.getElementById('return_url').value = permLinker.element.href;
    if (!forma.home_lat.value || !forma.home_lon.value){
        alert('Nie podano wspolrzednych punktu');
        return false;
    }
    if (!forma.email.value){
        alert('Podaj swoj email');
        return false;
    }
    if (!forma.description.value){
        alert('Podaj opis punktu');
        return false;
    }
    //alert('wszystko ok');
    return true;
}

