var map;


function createMap(divName, centre, zoom) {
   OpenLayers.Util.onImageLoadError = function() {
      this.src = "cycle_map_more_soon.png";
   }

   map = new OpenLayers.Map(divName,
                            { maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
                              numZoomLevels: 19,
                              maxResolution: 156543,
                              units: 'm',
                              projection: "EPSG:900913",
                              controls: [
				new OpenLayers.Control.LayerSwitcher(),
				new OpenLayers.Control.Permalink('permalink'),
				new OpenLayers.Control.PanZoomBar(),
				new OpenLayers.Control.MouseDefaults()
                              ],
                              displayProjection:  new OpenLayers.Projection("EPSG:4326") });



   var cycle = new OpenLayers.Layer.TMS("OSM Cycle Map", 
                                        ["http://a.andy.sandbox.cloudmade.com/tiles/cycle/",
                                         "http://b.andy.sandbox.cloudmade.com/tiles/cycle/",
                                         "http://c.andy.sandbox.cloudmade.com/tiles/cycle/"],
                                        { type: 'png', getURL: getTileURL, displayOutsideMaxExtent: true,
                                           transitionEffect: 'resize'});
   map.addLayer(cycle);
   
markersAndPopups();   // setup the popups and markers for bike shops

   if (!map.getCenter()) map.setCenter(centre, zoom);
   return map;
}

function getTileURL(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)
   {
     return null;
   }
   else
   {
     x = ((x % limit) + limit) % limit;

     var url = this.url;
     var path = z + "/" + x + "/" + y + ".png";

     if (url instanceof Array) {
         url = this.selectUrl(path, url);
     }
     return url + path;

   }
}

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);
}

function scaleToZoom(scale) {
   return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
}

function markersAndPopups() {

var criticalMassLayer = new OpenLayers.Layer.Markers("Critical Mass");
var CM = lonLatToMercator(new OpenLayers.LonLat(-76.8842532,40.2593912));

var iconSize =  new OpenLayers.Size(67,90);
var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);
var marker = new OpenLayers.Marker(
	new OpenLayers.LonLat(-76.8842532,40.2593912),
	new OpenLayers.Icon('http://bonius.com/maps/cyclemap/Toilets.png',iconSize,iconOffset)
);
var criticalMassMarker = new OpenLayers.Marker(CM, new OpenLayers.Icon('./nocar.png',iconSize,iconOffset));	
criticalMassMarker.events.register('mousedown', marker, function(evt) { alert('Critical Mass'); OpenLayers.Event.stop(evt); });

criticalMassLayer.setVisibility(true);
criticalMassLayer.addMarker(criticalMassMarker);
map.addLayer(criticalMassLayer);


// -- Bike Shops 
var bikeShopLayer = new OpenLayers.Layer.Markers("Bike Shops");
var holmes = lonLatToMercator(new OpenLayers.LonLat(-76.9207521,40.2398996));
var pedalPusher = lonLatToMercator(new OpenLayers.LonLat(-76.8344004,40.2903538));
var wildware = lonLatToMercator(new OpenLayers.LonLat(-76.8183658,40.2762067));
var mountainside = lonLatToMercator(new OpenLayers.LonLat(-76.9778315,40.2225786));
var worldcup = lonLatToMercator(new OpenLayers.LonLat(-76.9556939,40.2143422));



var iconSize =  new OpenLayers.Size(55,110);
var iconOffset = new OpenLayers.Pixel(-(iconSize.w/2), -iconSize.h);
var holmesMarker = new OpenLayers.Marker(holmes, new OpenLayers.Icon('./bicycle.gif',iconSize,iconOffset));	
var pedalpusherMarker = new OpenLayers.Marker(pedalPusher, new OpenLayers.Icon('./bicycle.gif',iconSize,iconOffset));	
var wildwareMarker = new OpenLayers.Marker(wildware, new OpenLayers.Icon('./bicycle.gif',iconSize,iconOffset));	
var mountainsideMarker = new OpenLayers.Marker(mountainside, new OpenLayers.Icon('./bicycle.gif',iconSize,iconOffset));	
var worldcupMarker = new OpenLayers.Marker(worldcup, new OpenLayers.Icon('./bicycle.gif',iconSize,iconOffset));	



bikeShopLayer.setVisibility(false);
bikeShopLayer.addMarker(holmesMarker);
bikeShopLayer.addMarker(wildwareMarker);
bikeShopLayer.addMarker(pedalpusherMarker);
bikeShopLayer.addMarker(mountainsideMarker);
bikeShopLayer.addMarker(worldcupMarker);

map.addLayer(bikeShopLayer);


}


