// global map variable
var map;

// global setting will be based on the user preference
var includeOM = true; // overlay maps
var includeGM = true; // Google maps
var includeYM = true; // Yahoo! maps
var includeVE = true; // Virtual Earth

function addScriptLocation(scriptLocation) {
    var agent = navigator.userAgent;
    var docWrite = (agent.match("MSIE") || agent.match("Safari"));
    if(docWrite) {
        document.write("<script src='" + scriptLocation + "' type='text/javascript'></script>");
    }
    else {
        var s = document.createElement("script");
        s.src = scriptLocation;
        var h = document.getElementsByTagName("head").length ? 
                   document.getElementsByTagName("head")[0] : 
                   document.body;
        h.appendChild(s);
    }
}

addScriptLocation("http://maps.spotsnel.nl/scripts/cloudmade.js");
if(includeGM) {
   addScriptLocation("http://maps.google.com/maps?file=api&v=2&hl=en&key=ABQIAAAA93zwkWL4D6WZT0OVuORskBTXvK6r9IyRd9bbaZI6dCdk95sn4RRqVjK5GDgsYcw-nSMMv13P7E5QiQ");
}
if(includeYM) {
   addScriptLocation("http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=dnTS1OjIkY0HJFk6Dry99aw7QN51WT4-");
}
if(includeVE) {
   addScriptLocation("http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.1");
}


function addMarker(position) {
    // TODO: should be done once in init
    var markers = new OpenLayers.Layer.Markers("Markers");
    map.addLayer(markers);

    var size = new OpenLayers.Size(16, 16);
    var offset = new OpenLayers.Pixel(-7, -7); // center pin
    var icon = new OpenLayers.Icon("//img.spotsnel.nl/spotmark-small.png", size, offset);
    markers.addMarker(new OpenLayers.Marker(position, icon));
}

function updateActualPosition(position) {
    var sphericalLongLat = OpenLayers.Layer.SphericalMercator.forwardMercator(position.longitude, position.latitude);
    addMarker(sphericalLongLat);
    map.setCenter(sphericalLongLat, 10);
}

function handlePositionError(positionError) {
}

function getActualPositionGears() {
    var geo = google.gears.factory.create("beta.geolocation");
    geo.getCurrentPosition(updateActualPosition, handlePositionError, {enableHighAccuracy: true, gearsRequestAddress: true});
}

function getActualPositionGeode() {
    navigator.geolocation.getCurrentPosition(updateActualPosition, handlePositionError, {});
}

function getOSMTileURL(bounds) {
    var res = this.map.getResolution();
    var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
    var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
    var z = this.map.getZoom();
    var limit = Math.pow(2, z);

    if (y < 0 || y >= limit) {
        // TODO: variable for site url
        return "http://img.spotsnel.nl/404.png";
    }
    else {
        x = ((x % limit) + limit) % limit;
        return this.url + z + "/" + x + "/" + y + "." + this.type;
    }
}

function init() {
    var options = {
       projection: new OpenLayers.Projection("EPSG:900913"),
       displayProjection: new OpenLayers.Projection("EPSG:4326"),
       units: "m",
       maxExtent: new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508.34),
       maxResolution: 156543.0339,
       numZoomLevels: 22,
          controls: [ new SpotSnel.Control.PanZoom(),
                      new OpenLayers.Control.Navigation() ]
    };
    map = new OpenLayers.Map('map', options);
    map.addControl(new SpotSnel.Control.LayerSwitcher({'activeColor': 'rgb(240, 240, 240)'}));

    var layerCloudmade = new OpenLayers.Layer.CloudMade("OpenStreetMap (CloudMade)", {key: '0a3f86f9ea0a5f849f1cacda4e28fca8', styleId: 2});
    var layerMapnik = new OpenLayers.Layer.OSM.Mapnik("OpenStreetMap (Mapnik)");
    var layerTah = new OpenLayers.Layer.OSM.Osmarender("OpenStreetMap (Osmarender)");
    var layerCycle = new OpenLayers.Layer.OSM.CycleMap("OpenCycleMap");
    var layerStreet = new OpenLayers.Layer.OSM("OpenStreetBrowser", "http://www.openstreetbrowser.org/tiles/base/", {numZoomLevels: 19});
    map.addLayers([layerCloudmade, layerMapnik, layerTah, layerCycle, layerStreet]);

    // create OpenStreetMap overlay and OpenAerialMap/NASA layer
    if(includeOM) {
       var osmoverlay = new OpenLayers.Layer.TMS("OpenStreetMap", "http://t2-overlay.hypercube.telascience.org/tiles/1.0.0/osm-merc-google-hybrid/", {type: 'png', getURL: getOSMTileURL, displayOutsideMaxExtent: true, isBaseLayer: false, visibility: false});
       //var oam = new OpenLayers.Layer.XYZ("OpenAerialMap", "http://tile.openaerialmap.org/tiles/1.0.0/openaerialmap-900913/${z}/${x}/${y}.png", {sphericalMercator: true});
       var oam = new OpenLayers.Layer.WMS("OpenAerialMap", ["http://oam1.hypercube.telascience.org/tiles/", "http://oam2.hypercube.telascience.org/tiles/", "http://oam3.hypercube.telascience.org/tiles/"], {layers: 'openaerialmap'}, {'wrapDateLine': true, buffer: 1});
       var osmmaxspeed = new OpenLayers.Layer.TMS("Max Speed", "http://maxspeed.openstreet.nl/tiles/", {type:'png', getURL: getOSMTileURL, border:1, isBaseLayer:false, visibility:false});
       var landsat = new OpenLayers.Layer.WMS("NASA Landsat7", ["http://t1.hypercube.telascience.org/tiles/", "http://t3.hypercube.telascience.org/tiles/", "http://t2.hypercube.telascience.org/tiles/"], {'layers': 'landsat7-google'});
       var bm = new OpenLayers.Layer.WMS("NASA Blue Marble", "http://sigma.openplans.org/geoserver/wms?", {layers: 'bluemarble'});
       map.addLayers([osmoverlay]);
       map.addLayers([osmmaxspeed]);
       map.addLayers([oam, landsat, bm]);
    }

    // create Google Maps layers (Speherical Mercator)
    if(includeGM) {
       var gmap = new OpenLayers.Layer.Google("Google Streets", {'sphericalMercator': true});
       var gsat = new OpenLayers.Layer.Google("Google Satellite", {type: G_SATELLITE_MAP, 'sphericalMercator': true});
       var ghyb = new OpenLayers.Layer.Google("Google Hybrid", {type: G_HYBRID_MAP, 'sphericalMercator': true});
       map.addLayers([gmap, gsat, ghyb]);
    }

    // create Yahoo! Maps layer
    if(includeYM) {
       var yahoo = new OpenLayers.Layer.Yahoo("Yahoo Street", {'sphericalMercator': true});
       var yahoosat = new OpenLayers.Layer.Yahoo("Yahoo Satellite", {'type': YAHOO_MAP_SAT, 'sphericalMercator': true});
       var yahoohyb = new OpenLayers.Layer.Yahoo("Yahoo Hybrid", {'type': YAHOO_MAP_HYB, 'sphericalMercator': true});
       map.addLayers([yahoo, yahoosat, yahoohyb]);
    }

    // create Virtual Earth layers
    if(includeVE) {
       var veroad = new OpenLayers.Layer.VirtualEarth("Virtual Earth Roads", {'type': VEMapStyle.Road, 'sphericalMercator': true});
       var veaer = new OpenLayers.Layer.VirtualEarth("Virtual Earth Aerial", {'type': VEMapStyle.Aerial, 'sphericalMercator': true});
       var vehyb = new OpenLayers.Layer.VirtualEarth("Virtual Earth Hybrid", {'type': VEMapStyle.Hybrid, 'sphericalMercator': true});
       map.addLayers([veroad, veaer, vehyb]);
    }

    // show map first
    if (!map.getCenter()) {
       map.zoomToMaxExtent();
    }
	    
    // use Google Gears to find our actual position
    if (window.google && google.gears) {
	// try to center on position
        getActualPositionGears();
    }
    else
    {
    	getActualPositionGeode();
    }
}

