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

function InitMap() {

  OpenLayers.ImgPath='images/ol/';

  map = new OpenLayers.Map('map', {
      controls: [
         //new OpenLayers.Control.ArgParser(),
         new OpenLayers.Control.Attribution(),
         new OpenLayers.Control.LayerSwitcher({activeColor:"#737373"}),
         new OpenLayers.Control.Navigation(), 
         new OpenLayers.Control.PanZoomBar(),
	 new OpenLayers.Control.ScaleLine(),
	 new OpenLayers.Control.Permalink(),
	 new OpenLayers.Control.Permalink(document.getElementById("viewanchor")),
	 new OpenLayers.Control.Permalink(document.getElementById("orgviewanchor"),"http://www.openstreetmap.org/")
      ],
      units: "m",
      maxResolution: 156543.0339,
      numZoomLevels: 20,
      theme: null,
      displayProjection: epsg4326
   });


   if(/MSIE/.test(navigator.userAgent)) {
   	$('map').style.bottom = "";
	$('menu').style.width = (document.documentElement.clientWidth - 200)+"px";
	$('map').style.height = (document.documentElement.clientHeight - 86)+"px";
	$('map').style.width = (document.documentElement.clientWidth - 200)+"px";
	$('sidebar').style.height = (document.documentElement.clientHeight - 106)+"px";
	window.onresize = function () {
		$('menu').style.width = (document.documentElement.clientWidth - 200)+"px";
		$('map').style.height = (document.documentElement.clientHeight - 86)+"px";
		$('map').style.width = (document.documentElement.clientWidth - 200)+"px";
		$('sidebar').style.height = (document.documentElement.clientHeight - 106)+"px";
	}
   }

   var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
   });
   map.addLayer(mapnik);

   var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", { displayOutsideMaxExtent: true });
   map.addLayer(osmarender);

   var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
   });
   map.addLayer(cyclemap);

   var numZoomLevels = Math.max(mapnik.numZoomLevels, osmarender.numZoomLevels);

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

   mobility = new OpenLayers.Layer.Text("Mobility", {
      numZoomLevels: numZoomLevels,
      maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
      maxResolution: 40,
      units: "m",
      visibility: false,
      location: "/markers/mobility.txt",
   });
   map.addLayer(mobility);

   map.events.register("moveend", map, updateLocation);
   map.events.register("changelayer", map, updateLocation);

}

/**
 * Sidebar
 */
function openSidebar() {
    var centre = map.getCenter();
    var zoom = map.getZoom();

    $("sidebar").style.display = "block";
    $("map").style.left = "200px";

    map.setCenter(centre, zoom);
}

function closeSidebar() {
    var centre = map.getCenter();
    var zoom = map.getZoom();

    $("sidebar").style.display = "none";
    $("map").style.left = "0px";

    map.setCenter(centre, zoom);
}

/**
 *  Convert
 */

function mercatorToLonLat(merc) {
   var lon = (merc.lon / 20037508.34) * 180;
   var lat = (merc.lat / 20037508.34) * 180;

   lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

   return new OpenLayers.LonLat(lon, lat);
}

function lonLatToMercator(ll) {
   var lon = ll.lon * 20037508.34 / 180;
   var lat = Math.log(Math.tan((90 + ll.lat) * Math.PI / 360)) / (Math.PI / 180);

   lat = lat * 20037508.34 / 180;

   return new OpenLayers.LonLat(lon, lat);
}

/**
 *  Update
 */

function updateLocation() {
    var lonlat = mercatorToLonLat(map.getCenter());
    var zoom = map.getZoom();
    var layers = getMapLayers();

    //updatelinks(lonlat.lon, lonlat.lat, zoom, layers);

    document.cookie = "_osmch_location=" + lonlat.lon + "," + lonlat.lat + "," + zoom + "," + layers;
}

function updatelinks(lon,lat,zoom,layers) {
  var decimals = Math.pow(10, Math.floor(zoom/3));
  var node;

  lat = Math.round(lat * decimals) / decimals;
  lon = Math.round(lon * decimals) / decimals;

  node = document.getElementById("viewanchor");
  if (node) {
    var args = getArgs(node.href);
    args["lat"] = lat;
    args["lon"] = lon;
    args["zoom"] = zoom;
    if (layers) {
      args["layers"] = layers;
    }
    node.href = setArgs(node.href, args);
  }

  node = document.getElementById("orgviewanchor");
  if (node) {
    var args = getArgs(node.href);
    args["lat"] = lat;
    args["lon"] = lon;
    args["zoom"] = zoom;
    node.href = setArgs(node.href, args);
  }
}

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[unescape(match[1])] = unescape(match[2]);
        } else {
           args[unescape(queryitems[i])] = null
        }
     }
  }

  return args;
}

function setArgs(url, args) {
   var queryitems = new Array();

   for (arg in args)
   {
      if (args[arg] == null) {
         queryitems.push(escape(arg));
      } else {
         queryitems.push(escape(arg) + "=" + escape(args[arg]));
      }
   }

   return url.replace(/\?.*$/, "") + "?" + queryitems.join("&");
}

function getMapLayers() {
   var 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";
      }
   }

   return layers;
}

function setMapLayers(layers) {
   for (var i=0; i < layers.length; i++) {
      var layer = map.layers[i];
      var c = layers.charAt(i);

      if (c == "B") {
         map.setBaseLayer(layer);
      } else if ( (c == "T") || (c == "F") ) {
         layer.setVisibility(c == "T");
      }
   }
}

/*
 * Search
 */
function startSearch() {
};
function endSearch(request) {
  nodes = request.responseXML.getElementsByTagName('searchresults')[0].childNodes;
  for (i=0; i < nodes.length; i++) {
   if (nodes[i].nodeName != 'named') {
    continue;
   }
   alert(nodes[i].getAttribute('name')+" "+nodes[i].getAttribute('lat')+"/"+nodes[i].getAttribute('lon'));
  }
}

/*
 * Gotos
 */
function gotoWinterthur() {
p1 = lonLatToMercator(new OpenLayers.LonLat(8.68698, 47.5197));
p2 = lonLatToMercator(new OpenLayers.LonLat(8.76058, 47.4863));
ext = new OpenLayers.Bounds(p1.lon,p2.lat,p2.lon,p1.lat);
zoom = map.getZoomForExtent(ext);
map.zoomToExtent(ext);
map.panTo(ext.getCenterLonLat());
map.zoomTo(zoom);
}
