var map;
var mapOptions;
var osmLayer;
var kmlLayer;
var wmsLayer;
var wfsLayer;
var layer;
var dataSources = new Array();

OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;

dataSources["servicerequests"] = { "url" : "http://apps.dcmapguide.com/ci/src_current.kml" };
dataSources["buildingpermits"] = { "url": "http://apps.dcmapguide.com/ci/data/dcra_building_permits_current.kml" };
dataSources["abra"] = { "url" : "http://128.241.235.139:8080/geoserver/wms", "name" : "ABRA", "layerName" : "dc:abralicenseept" };
dataSources["trafficsignals"] = { "url" : "http://128.241.235.139:8080/geoserver/wms", "name" : "Traffic Signals", "layerName" : "dc:trafficsignals" };


	function init() {

                mapOptions = {
	                projection: new OpenLayers.Projection("EPSG:900913"),
        	        displayProjection: new OpenLayers.Projection("EPSG:4326"),
	                units: "m",
        	        maxResolution: 156543.0339,
	                maxExtent: new OpenLayers.Bounds(
					-20037508.34, -20037508.34,
                                        20037508.34, 20037508.34 )
                };

	        map = new OpenLayers.Map('map', mapOptions);
	        osmLayer = new OpenLayers.Layer.OSM();
		map.addLayers([osmLayer]);

//		addVector();
		addKml('http://apps.dcmapguide.com/ci/src_current.kml');
/*
		var wfsStyle = new OpenLayers.StyleMap({
			"default": new OpenLayers.Style(OpenLayers.Util.applyDefaults({
				externalGraphic: 'http://boston.openguides.org/markers/AQUA.png',
				graphicOpacity: 1,
				pointRadius: 10
			})
		});


 		layer = new OpenLayers.Layer.Vector( 
			'ABRA WFS',
			{
	                	strategy: new OpenLayers.Strategy.BBOX(),
				protocol: new OpenLayers.Protocol.WFS.v1_0_0({
					url: 'http://128.241.235.139:8080/geoserver/ows',
					maxFeatures: 50,
					featureType: 'abralicenseept',
					srsName: 'EPSG:4326',
					featureNS: 'http://apps.dcmapguide.com',
					geometryName: 'the_geom'					
				}),
				format: new OpenLayers.Format.GML.v2({
					featureNS: 'http://apps.dcmapguide.com',
					featurePrefix: 'dc',
					featureType: 'abralicenseept'
				}),
			},
			{styleMap: wfsStyle},
			{reproject: 'true'}
		);

           	map.addLayer(layer);
*/
/*
		for ( i = 0; i < layers.length; i++ ) {
			switch ( layers[i] ) {
				case 'abra':
//					addWMS( dataSources["abra"]["name"], dataSources["abra"]["layerName"] );
					break;
				case 'trafficsignals':
//					addWMS( dataSources["trafficsignals"]["name"], dataSources["trafficsignals"]["layerName"] );
					break;
				default: 
					addKml( dataSources[layers[i]]["url"] );
			}
		}	
*/
		map.setCenter(
			new OpenLayers.LonLat( -77.02, 38.89 ).transform(
				map.displayProjection, map.projection ),
			12 );

		/* 
		 *  HIDE attribution
		 */
		var controlList = map.getControlsBy( "displayClass", "olControlAttribution" );
		var cnt = controlList.length;
		for ( i = 0; i < cnt; i ++ ) {
			map.removeControl( controlList[i] );
		}

		map.addControl(new OpenLayers.Control.LayerSwitcher());
		map.addControl(new OpenLayers.Control.MousePosition());
	}

	function addKml( urladdress ) {
                kmlLayer = new OpenLayers.Layer.Vector("KML", {
                       projection: map.displayProjection,
                        strategies: [new OpenLayers.Strategy.Fixed()],
                        protocol: new OpenLayers.Protocol.HTTP({
                            url: urladdress,
                            format: new OpenLayers.Format.KML({
                                extractStyles: true,
                                extractAttributes: true
                            })
                        })
                });

                map.addLayers([kmlLayer]);
                map.setCenter(new OpenLayers.LonLat(-77.02961,38.904114).transform(new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject()), 12);

                select = new OpenLayers.Control.SelectFeature( kmlLayer );

                kmlLayer.events.on({
                        "featureselected": onFeatureSelect,
                        "featureunselected": onFeatureUnselect
                });

                map.addControl(select);
                select.activate();
	}

	function addWMS( name, layerName ) {
                wmsLayer = new OpenLayers.Layer.WMS(
                name, "http://128.241.235.139:8080/geoserver/wms",
                {
                        layers: layerName,
                        styles: '',
                        srs: 'EPSG:4326',
                        format: 'image/png',
                        transparent: 'true',
                        tiled: 'true',
                        tilesOrigin : "-77.107,38.803"
                },
                {buffer: 0},
                {reproject: 'true'}
                );
                map.addLayers([wmsLayer]);
	}

        function addGML() {
                var gmlLayer = new OpenLayers.Layer.Vector("GML", {
			strategy: new OpenLayers.Strategy.BBOX(),
			projection: new OpenLayers.Projection("EPSG:4326"),
			protocol: new OpenLayers.Protocol.WFS({
				version: "1.1.0",
				srsName: "EPSG:4326",
				featureNS: "http://apps.dcmapguide.com",
				featureType: "abralicenseept",				
				url: 'http://128.241.235.139:8080/geoserver/ows',
				params: { typename: 'dc:abralicenseept' }			
//				format: new OpenLayers.Format.GML.v2()
			}),
                        styleMap: new OpenLayers.StyleMap({'default':{
                            strokeColor: "#00FF00",
                            strokeOpacity: 1,
                            strokeWidth: 3,
                            fillColor: "#FF5500",
                            fillOpacity: 0.5,
                            pointRadius: 9,
                            pointerEvents: "visiblePainted"
	                }})

        	},
		{ reproject: 'true' }
		);
                map.addLayer(gmlLayer);
        }

	function addVector() {
		var vectorLayer = new OpenLayers.Layer.Vector("Simple Geometry", {
			styleMap: new OpenLayers.StyleMap({'default':{
			    strokeColor: "#00FF00",
			    strokeOpacity: 1,
			    strokeWidth: 3,
			    fillColor: "#FF5500",
			    fillOpacity: 0.5,
			    pointRadius: 9,
			    pointerEvents: "visiblePainted",
			    label : "${name}",
			    fontColor: "${favColor}",
			    fontSize: "12px",
			    fontFamily: "Courier New, monospace",
			    fontWeight: "bold",
			    labelAlign: "${align}"
			}})
		});

		var point = new OpenLayers.Geometry.Point(-76.99, 38.89).transform(new OpenLayers.Projection('EPSG:4326'), map.getProjectionObject());
		var pointFeature = new OpenLayers.Feature.Vector(point);
		pointFeature.attributes = {
			name: "Robbery",
		};

		vectorLayer.addFeatures([pointFeature]);
		map.addLayer(vectorLayer);
	}

	function onPopupClose(evt) {
	    select.unselectAll();
	}

	function onFeatureSelect(event) {
	    var feature = event.feature;
	    var content = "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description;
	    if (content.search("<script") != -1) {
		content = "Content contained Javascript! Escaped content below.<br />" + content.replace(/</g, "&lt;");
	    }
	    popup = new OpenLayers.Popup.FramedCloud("chicken", 
			     feature.geometry.getBounds().getCenterLonLat(),
			     new OpenLayers.Size(100,100),
			     content,
			     null, true, onPopupClose);
	    feature.popup = popup;
	    map.addPopup(popup);
	}

	function onFeatureUnselect(event) {
	    var feature = event.feature;
	    if(feature.popup) {
		map.removePopup(feature.popup);
		feature.popup.destroy();
		delete feature.popup;
	    }
	}
