var epsg4326 = new OpenLayers.Projection("EPSG:4326");
var markers;
var map;
var popup;

function getMapLayers() {
   var layerConfig = "";

   for (var layers = map.getLayersBy("isBaseLayer", true), i = 0; i < layers.length; i++) {
      layerConfig += layers[i] == map.baseLayer ? "B" : "0";
   }

   for (var layers = map.getLayersBy("isBaseLayer", false), i = 0; i < layers.length; i++) {
      layerConfig += layers[i].getVisibility() ? "T" : "F";
   }

   return layerConfig;
}

function removeMarkerFromMap(marker){
   markers.removeMarker(marker);
}

function getMapCenter(center, zoom) {
   return map.getCenter().clone().transform(map.getProjectionObject(), epsg4326);
}

function setMapCenter(center, zoom) {
   var numzoom = map.getNumZoomLevels();
   if (zoom >= numzoom) zoom = numzoom - 1;
   map.setCenter(center.clone().transform(epsg4326, map.getProjectionObject()), zoom);
}

function addMarkerToMap(position, icon, description) {
   var marker = new OpenLayers.Marker(position.clone().transform(epsg4326, map.getProjectionObject()), icon);

   markers.addMarker(marker);

   if (description) {
      marker.events.register("click", marker, function() { openMapPopup(marker, description) });
   }

   return marker;
}

function getArrowIcon() {
   var size = new OpenLayers.Size(25, 22);
   var offset = new OpenLayers.Pixel(-30, -27);
   var icon = new OpenLayers.Icon("images/arrow.png", size, offset);

   return icon;
}

function createMap(divName, options) {
   options = options || {};

   map = new OpenLayers.Map(divName, {
      controls: options.controls || [
         new OpenLayers.Control.ArgParser(),
         new OpenLayers.Control.Attribution(),
         new OpenLayers.Control.LayerSwitcher(),
         new OpenLayers.Control.Navigation(),
         new OpenLayers.Control.PanZoomBar(),
         new OpenLayers.Control.ScaleLine(),
         new OpenLayers. Control. MousePosition()
      ],
      units: "m",
      maxResolution: 156543.0339,
      numZoomLevels: 15,
      displayProjection: new OpenLayers.Projection("EPSG:4326")
   });

   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,
      wrapDateLine: true
   });
   map.addLayer(osmarender);

   var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
   });
   map.addLayer(cyclemap);

   var nonamekey = nonamekeys[document.domain];
   var noname = new OpenLayers.Layer.OSM("NoName", [
      "http://a.tile.cloudmade.com/" + nonamekey + "/3/256/",
      "http://b.tile.cloudmade.com/" + nonamekey + "/3/256/",
      "http://c.tile.cloudmade.com/" + nonamekey + "/3/256/"
   ], {
      displayOutsideMaxExtent: true,
      wrapDateLine: true,
      numZoomLevels: 19
   });
   map.addLayer(noname);

   var maplint = new OpenLayers.Layer.OSM.Maplint("Maplint", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
   });
   map.addLayer(maplint);

   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);

   return map;
}

function createMap_ORIG(divName, options) {
   options = options || {};

    map = new OpenLayers.Map('map',{
      controls: options.controls || [
         new OpenLayers.Control.ArgParser(),
         new OpenLayers.Control.Attribution(),
         new OpenLayers.Control.LayerSwitcher(),
         new OpenLayers.Control.Navigation(),
         new OpenLayers.Control.PanZoomBar(),
         new OpenLayers.Control.ScaleLine(),
         new OpenLayers.Control.MousePosition(),
         new OpenLayers.Control.ScaleLine(),
         new OpenLayers.Control.Permalink('permalink')
      ],
    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
    numZoomLevels: 20,
    maxResolution: 156543.0399,
    units: 'm',
    projection: new OpenLayers.Projection("EPSG:900913"),
    displayProjection: new OpenLayers.Projection("EPSG:4326")
    });
/*
      	//Add some controls
    map.addControl(new OpenLayers.Control.ArgParser());
	//map.addControl(new OpenLayers.Control.Attribution());
  	map.addControl(new OpenLayers.Control.LayerSwitcher());
  	//map.addControl(new OpenLayers.Control.Navigation());
  	map.addControl(new OpenLayers.Control.MousePosition());
  	map.addControl(new OpenLayers.Control.ScaleLine());
  	//var navcontrol = new OpenLayers.Control.PanZoomBar () 
    //Uncomment the following line if you want a world icon 
    //navcontrol.zoomWorldIcon = false; 
    //Add the PanZoomBar to the map map.addControl (navcontrol) 
    //map.addControl(navcontrol);
  	map.addControl(new OpenLayers.Control.Permalink('permalink'));
	*/
	var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Cycle Map (updated weekly)", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
	});
	map.addLayer(cyclemap);
	
	var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik (updated hourly)", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
	});
	map.addLayer(mapnik);
	
	var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender", {
      displayOutsideMaxExtent: true,
      wrapDateLine: true
	});
	map.addLayer(osmarender);
	
	// create Google Mercator layers
	var gmap = new OpenLayers.Layer.Google(
		"Google Streets",
		{'sphericalMercator': true}
	);
	var gphy = new OpenLayers.Layer.Google(
		"Google Physical",
		{type: G_PHYSICAL_MAP, 'sphericalMercator':true}
	);
	var gsat = new OpenLayers.Layer.Google(
		"Google Satellite",
		{type: G_SATELLITE_MAP, 'sphericalMercator': true, numZoomLevels: 22}
	);
	var ghyb = new OpenLayers.Layer.Google(
		"Google Hybrid",
		{type: G_HYBRID_MAP, 'sphericalMercator': true}
	);
	
	map.addLayers([gphy,gmap,gsat,ghyb]);
	
	var bing_shaded = new OpenLayers.Layer.VirtualEarth("Bing Shaded", {
        type: VEMapStyle.Shaded, 'sphericalMercator':true}
	);
	var bing_hybrid = new OpenLayers.Layer.VirtualEarth("Bing Hybrid", {
		type: VEMapStyle.Hybrid, 'sphericalMercator':true}
	);
	var bing_aerial = new OpenLayers.Layer.VirtualEarth("Bing Aerial", {
		type: VEMapStyle.Aerial, 'sphericalMercator':true}
	);

	map.addLayers([bing_shaded, bing_hybrid, bing_aerial]);
   
    /*KML Layers */
    map.addLayer(new OpenLayers.Layer.GML("Bikeability Ratings", "kml/road_bikeability_ratings.kml", 
    {
      format: OpenLayers.Format.KML,
      visibility: false,
      projection: map.displayProjection, 
      formatOptions: {
        extractStyles: true, 
        extractAttributes: true
    }
    }));
  
    map.addLayer(new OpenLayers.Layer.GML("Proposed Downtown Loop", "kml/downtown_loop.kml", 
    {
      format: OpenLayers.Format.KML,
      visibility: false,
      projection: map.displayProjection, 
      formatOptions: {
        extractStyles: true, 
        extractAttributes: true
    }
    }));
	
	map.addLayer(new OpenLayers.Layer.GML("Allegheny Springs Ride", "kml/allegheny_springs_ride_sum.kml", 
    {
      format: OpenLayers.Format.KML,
      visibility: false,
      projection: map.displayProjection, 
      formatOptions: {
        extractStyles: true, 
        extractAttributes: true
    }
    }));
  
  /*
      	layer_options.opacity = 1.0;
  	layer_options.displayInLegend = true;
  	var wms_options = {layers: 'basic', format: 'image/png', transparent: 'TRUE'};
  	var wms = new OpenLayers.Layer.WMS('OpenLayers WMS', 'http://labs.metacarta.com/wms/vmap0', wms_options, layer_options);
  	var overview_options = { mapOptions: {} };
  	overview_options.mapOptions.maxExtent = map.maxExtent;
  	overview_options.mapOptions.projection = map.projection;
  	overview_options.mapOptions.units = map.units;
  	wms.setIsBaseLayer(true);
  	overview_options.layers = [wms];
  	var overview = new OpenLayers.Control.OverviewMap(overview_options);
  	map.addControl(overview);
  */
  
  /*Overview Map*/
    var ov = new OpenLayers.Layer.WMS( "OpenLayers WMS", 
    "http://labs.metacarta.com/wms/vmap0", {layers: 'basic'} );
    
    var ov_options = {
    //layers: [ov.clone()],
    layers: [ov],
    minRatio: 8,
    maxRatio: 32
  };

    map.addControl(new OpenLayers.Control.OverviewMap(ov_options));
    var lonLat = new OpenLayers.LonLat(-80.417694,37.229874).transform(map.displayProjection,  map.projection);
    if (!map.getCenter()) map.setCenter (lonLat, 12);
	
	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);

   return map;
}