﻿
var WMS_FORMAT_DEFAULT = "image/png";
var MERC_ZOOM_DEFAULT = 15;

var g;
var map;
var layers = [];
var markers = [];
var mainLayerDiv;
var geocoder = null;
var show_lw1944_foto = true;
var show_lw1944_index = false;
var show_hist = false;
var show_search = false;
var resumeSearch = false;
var cookiename = "mapinfo";  // name for this cookie
var expiretime = 30;          // number of days before cookie expiry
var LW1944counter = 1;

if (!numMapRequest) {
    numMapRequest = 4;
}

function isBrowserOK() {
    return (!disableBrowserTest ? g.BrowserIsCompatible() : true);
}

GetLW1944MapUrl = function(a, b, c) {
    var url = LW1944_FOTO_URL + "/" + b + "/" + a.x + "/" + a.y + ".png"

    if (url.indexOf("{n}") > -1) {

        url = url.replace("{n}", LW1944counter);

        LW1944counter = (LW1944counter == numMapRequest ? 1 : LW1944counter + 1)
    }
    
    return url;
}

GetLW1944IndexUrl = function(a, b, c) {
    if (this.myFormat == undefined) this.myFormat = WMS_FORMAT_DEFAULT;
    var lULP = new g.Point(a.x * 256, (a.y + 1) * 256);
    var lLRP = new g.Point((a.x + 1) * 256, a.y * 256);
    var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP, b, c);
    var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP, b, c);
    var lURL = LW1944_INDEX_URL;

    lURL += "&REQUEST=GetMap";
    lURL += "&SERVICE=WMS";
    lURL += "&VERSION=1.1.1";
    lURL += "&SHOWSCALEBAR=false";
    lURL += "&SERVICENAME=lw1944index";
    var lay = "lw1944";
    var sty = "default";
    if ((b > 9) && (b < 15)) {
        lay += ",label";
        sty += ",default";
    }
    lURL += "&LAYERS=" + lay;
    lURL += "&STYLES=" + sty;
    lURL += "&FORMAT=image/png";
    lURL += "&BGCOLOR=0x00FF0101";
    lURL += "&TRANSPARENT=TRUE";
    lURL += "&SRS=EPSG:4326";
    lURL += "&BBOX=" + lUL.x + "," + lUL.y + "," + lLR.x + "," + lLR.y;
    lURL += "&WIDTH=256";
    lURL += "&HEIGHT=256";

    return lURL;
}

function toggleLayer(index, ctrl) {

    if (layers != null && (index >= 0 && index < layers.length)) {
        if (layers[index].isHidden()) {
            layers[index].show();
            if (ctrl != null) {
                ctrl.className += " layerSelected";    
            }
        } else {
            layers[index].hide();
            if (ctrl != null) {
                ctrl.className = ctrl.className.replace(" layerSelected", "");
            }
        }
    }
}

function showDefaultLayer(layer) {
    layer.show();
    if (document.getElementById(layer.ctrName) != null) {
        document.getElementById(layer.ctrName).className += " layerSelected";
    }
}

function setCookie() {
    
    // This Javascript is based on code provided by the
    // Community Church Javascript Team
    // http://www.bisphamchurch.org.uk/
    // http://econym.org.uk/gmap/
    maptype = 0;
    var i;
    
    for (i = 0; i < map.getMapTypes().length; i++) {
        if (map.getCurrentMapType() == map.getMapTypes()[i]) {
            maptype = i;
        }
    }

    overlays = "";
    for (i = 0; i < layers.length; i++) {
        overlays += i + ":" + !layers[i].isHidden() + ",";
    }

    overlays = overlays.substring(0, overlays.length - 1);

    search = (markers != null ? "1:" : "0:") + document.getElementById("address").value;

    var cookietext = cookiename + "=" + map.getCenter().lat() + "|" + map.getCenter().lng() + "|" + map.getZoom() + "|" + maptype + "|" + search + "|" + overlays;
    if (expiretime) {
        var exdate = new Date();
        exdate.setTime(exdate.getTime() + expiretime*60000);
        cookietext += ";expires=" + exdate.toGMTString();
    }
    // == write the cookie ==
    document.cookie = cookietext;
    
    // == Call GUnload() on exit ==
    g.Unload();
}

function useCookiesSettings() {
    // This Javascript is based on code provided by the
    // Community Church Javascript Team
    // http://www.bisphamchurch.org.uk/
    // http://econym.org.uk/gmap/
    
    if (document.cookie.length > 0) {
        
        cookieStart = document.cookie.indexOf(cookiename + "=");
        if (cookieStart != -1) {
            cookieStart += cookiename.length + 1;
            cookieEnd = document.cookie.indexOf(";", cookieStart);
            if (cookieEnd == -1) {
                cookieEnd = document.cookie.length;
            }
            cookietext = document.cookie.substring(cookieStart, cookieEnd);
            // == split the cookie text and create the variables ==
            bits = cookietext.split("|");

            if (bits.length >= 6) {
                lat = parseFloat(bits[0]);
                lng = parseFloat(bits[1]);
                zoom = parseInt(bits[2]);
                maptype = parseInt(bits[3]);
                search = bits[4];
                overlays = bits[5];
                
                map.setCenter(new g.LatLng(lat, lng), zoom, map.getMapTypes()[maptype]);

                if (search != "") {
                    document.getElementById("address").value = search.substring(2, search.length);
                    if (search.substring(0, 1) == "1") {
                        showAddress("address", true);
                    }
                }

                if (overlays != "") {
                    overlays = overlays.split(",");
                    if (overlays.length == 3) {
                        show_lw1944_foto = (overlays[0] == "0:true" ? true : false);
                        show_lw1944_index = (overlays[1] == "1:true" ? true : false);
                        show_hist = (overlays[2] == "2:true" ? true : false);
                    }
                }

                return true;
            }
        }
    }

    return false;
}

function onBodyLoad() {
    google.load("maps", "2", { "callback": initGMaps, "language": "da" });
}

function initGMaps() {

    g = google.maps;
    var isHighlightMarker = false;
    
    if (isBrowserOK()) {
        
        map = new g.Map2(document.getElementById("map_canvas"));
        // init map

        if (moveToCoord()) {
            isHighlightMarker = true;
        }
        else {
            map.setCenter(new g.LatLng(56.2, 11.5), 7, G_PHYSICAL_MAP);
        }

        geocoder = new g.ClientGeocoder();
        geocoder.setBaseCountryCode('DK');
        geocoder.setCache(null);

        map.setUIToDefault();
        map.enableScrollWheelZoom();

        var boundsDK = new g.LatLngBounds(new g.LatLng(-90, -180), new g.LatLng(90, 180));
        var copyrightJO = new g.Copyright(2, boundsDK, 0, "<a href='http://www.jo-informatik.dk/' target='_blank'>© 2010 JO Informatik ApS</a>");
        var copyrightCollection = new g.CopyrightCollection('Historiske flyfotos - LW1944');
        copyrightCollection.addCopyright(copyrightJO);


        tmpLayers = new g.TileLayer(copyrightCollection, 5, 14);
        tmpLayers.getTileUrl = GetLW1944MapUrl;
        tmpLayers.isPng = function() { return true; };
        tmpLayers.getOpacity = function() { return 1.0; }

        layers[0] = new g.TileLayerOverlay(tmpLayers)
        layers[0].isDefaultOn = show_lw1944_foto;
        layers[0].name = "lw1944";
        layers[0].ctrName = "lw1944";

//      tmpLayers = new g.TileLayer(copyrightCollection, 5, 14);
//      tmpLayers.getTileUrl = GetLW1944IndexUrl;
//      tmpLayers.isPng = function() { return true; };
//      tmpLayers.getOpacity = function() { return 1.0; }
//
//      layers[1] = new g.TileLayerOverlay(tmpLayers)
//      layers[1].isDefaultOn = show_lw1944_index;
//      layers[1].name = "fotokort";
//      layers[1].ctrName = "fotokort";

	var lix = 1;

        layers[lix] = new g.GeoXml(KML_URL);
        g.Event.addListener(layers[lix], "load", function() {
            if (!show_hist) {
                layers[lix].hide();
                if (isHighlightMarker) {
                    showDefaultLayer(layers[lix]);
                }
            }
        });
        layers[lix].isDefaultOn = show_hist;
        layers[lix].name = "brugerhist";
        layers[lix].ctrName = "brugerhist";

        // apply cookies settings..
        // useCookiesSettings();
        // read input parameters...
        readInputParametersAndApply();

        for (var i = 0; i < layers.length; i++) {
            map.addOverlay(layers[i]);

            if (layers[i].isDefaultOn) {
                showDefaultLayer(layers[i]);
            } else {
                layers[i].hide();
            }
        }


        // fundet på http://stackoverflow.com/questions/1184921/how-to-override-target-blank-in-kml-popups-in-embedded-google-map
        GEvent.addListener(map, "infowindowopen", function() {
        
            // Get a reference to the infoWindow
            var infoWindow = $(this.getInfoWindow().getContentContainers());

            // Find all <a> tags in the infoWindow and reset their target attribute
            $("a", infoWindow).attr("target", "_self");
            

        });

	GEvent.addDomListener(document.getElementById("map_canvas"), "click", function(e) {
            if (e.ctrlKey) {
                if (e.x) {
                    var latlng = map.fromContainerPixelToLatLng(new g.Point(e.x, e.y));
                    alert("Der er klikket på koordinaten: x=" + latlng.lng() + ", y=" + latlng.lat() + "\n\nFor at gemme koordinaten trykkes på [ctrl]+[c] og teksten fra dialogboksen er nu gemt i udklipsholderen.\nDen kan indsættes via [ctrl]+[v] eller højre klik i et tekstfelt og vælge sæt ind.");
                }
            }
        });

    }
}

function removeSearchMarkers() {
    removeMarkers(markers);
}

function moveToCoord() {
    var x = parseFloat(getUrlParameterValue("x"));
    var y = parseFloat(getUrlParameterValue("y"));
    var zoom = parseInt(getUrlParameterValue("zoom"));

    if (!isNaN(x) && !isNaN(y)) {
        if (isNaN(zoom) || zoom < 0 || zoom > 16) {
            zoom = 14;
        }
        point = new g.LatLng(y, x);
        map.setCenter(point, zoom, G_PHYSICAL_MAP);

        return true;
    }

    return false;
}

function readInputParametersAndApply() {
    var layersOn = getUrlParameterValue("layers");

    if (layersOn != "") {
        if (layersOn.indexOf(",") > -1) {
            split = layersOn.split(",");
        } else {
            split = new Array(layersOn);
        }
        
        for (j = 0; j < layers.length; j++) {
            layers[j].isDefaultOn = false;
        }

        for (i = 0; i < split.length; i++) {
            switch (split[i]) {
                case layers[0].name:
                    layers[0].isDefaultOn = true;
                    break;
                case layers[1].name:
                    layers[1].isDefaultOn = true;
                    break;
                case layers[2].name:
                    show_hist = true;
                    layers[2].isDefaultOn = true;
                    break;
            }
        }
    }
}

function getUrlParameterValue(argsSearchFor) {
    args = window.location.href;

    if (args.indexOf("?") > -1) {
        if (args.indexOf("#") == args.length-1) {
            args = args.substring(0, args.length - 1);
        }
        
        argList = args.substring(args.indexOf("?") + 1, args.length).split("&");
        for (i = 0; i < argList.length; i++) {
            if (argList[i].indexOf("=") > -1 && argList[i].substring(0, argList[i].indexOf("=")) == argsSearchFor) {
                return unescape(argList[i].split("=")[1]);
            }
        }
    }

    return "";
}

function showAddress(address, doResumeSearch) {

    if (doResumeSearch) {
        resumeSearch = doResumeSearch;
    } else {
        resumeSearch = false;
    }

    if (geocoder) {
        geocoder.getLocations(
          document.getElementById(address).value,
          function(result) {
              var resultIndex = -1;
              if (!result) {
                  if (!resumeSearch) {
                      alert(address + " blev ikke fundet");
                  }
              } else {
                  if (result.Placemark) {

                      var bounds = null;

                      removeMarkers(markers);

                      var mCounter = 0;
                      for (var ix = 0; ix < result.Placemark.length; ix++) {
                          with (result.Placemark[ix]) {
                              if (AdresseIDK(AddressDetails, address)) {
                                  var point = new g.LatLng(Point.coordinates[1], Point.coordinates[0]);
                                  var lBounds = null;

                                  with (ExtendedData.LatLonBox) {
                                      if (bounds == null) {
                                          bounds = new g.LatLngBounds(
                                            new g.LatLng(south, west),
                                            new g.LatLng(north, east)
                                          );
                                          lBounds = bounds;
                                      } else {
                                          if (!bounds.containsLatLng(point)) {
                                              bounds.extend(point);
                                          }

                                          lBounds = new g.LatLngBounds(
                                            new g.LatLng(south, west),
                                            new g.LatLng(north, east)
                                          );
                                      }
                                  }


                                  markers[mCounter] = new g.Marker(point);
                                  markers[mCounter].lBounds = lBounds;

                                  g.Event.addListener(markers[mCounter], "click", function() {
                                      if (this.lBounds != null) {
                                          map.setCenter(this.lBounds.getCenter(), map.getBoundsZoomLevel(this.lBounds));
                                      } else {
                                          var tbounds = new LatLngBounds(
                                            new LatLng(this.getLatLng().lat() - 20, this.getLatLng().lng() - 20),
                                            new LatLng(this.getLatLng().lat() + 20, this.getLatLng().lng() + 20)
                                          );

                                          map.setCenter(tbounds.getCenter(), map.getBoundsZoomLevel(tbounds));
                                      }
                                  });

                                  markers[mCounter].bindInfoWindowHtml('Adresse: ' + result.Placemark[ix].address);

                                  map.addOverlay(markers[mCounter++]);
                              }
                          }
                      }

                      if (markers.length > 0) {
                          if (!resumeSearch) {
                              map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
                          }
                      } else {
                          if (!resumeSearch) {
                              alert('Ingen DK resultater');
                          }
                      }
                  } else if (!resumeSearch) {
                      alert('Ingen resulter');
                  }
              }
          }
        );
    }
}

function removeMarkers(markersArr) {
    for (ix = 0; ix < markersArr.length; ix++) {
        map.removeOverlay(markersArr[ix]);
    }
    markersArr = [];
}

function AdresseIDK(AddressDetails, adresse) {
    // hvis CountryNameCode = 'DK' så ok ellers hvis denne ikke findes led i 'address' efter 'denmark' 
    if (((AddressDetails) && (AddressDetails.Country) && (AddressDetails.Country.CountryNameCode) &&
            (AddressDetails.Country.CountryNameCode == 'DK'))
       ||
            (adresse.toLowerCase().indexOf('denmark') >= 0 || adresse.toLowerCase().indexOf('danmark') >= 0)
      ) {
        return true;
    }

    return false;
}

function onMoveEnd() {
    geocoder.setViewport(map.getBounds());
}

function detectEnterAndSearch(e) {
    if (!e) e = window.event;
    if (e.keyCode) {
        if (e.keyCode == 13) { // håndtere enter key....
            showAddress('address');
        }
    }
}
