var map, baseLayer,selectControl;

function init() {
	
	var extent = new OpenLayers.Bounds(499900,  140013,  579999,  220013);
	map = new OpenLayers.Map('div_mapper', { 
		maxExtent: extent,
		restrictedExtent: extent,
		projection: "EPSG:27700", 
		controls: [new OpenLayers.Control.ScaleLine({maxWidth:200,bottomInUnits:''}),
			new OpenLayers.Control.ImgLayerSwitcher({
				div: document.getElementById('legend'),
				legendDimension: {height:18,width:19},
				categories: _layer_cats
			}),
			new OpenLayers.Control.PanZoomBar2()
		
		]
	});
	
	var cSearch = new OpenLayers.Control.MJSearch({
				div: document.getElementById('search'),
				searchTitle: '',
				searchLabel: 'Enter a postcode or street'
			});
	var cNearest = new OpenLayers.Control.ImgNearest({
				div: document.getElementById('nearest'),
				selectedResultsDiv: document.getElementById('div_selected_destinations'),
				legendDimension: {height:18,width:19},
				categories: _nearest_layer_cats,
				searchControl: cSearch,
				showDetails: true
			});
	map.addControl(cSearch);	
	map.addControl(cNearest);	
	
	// registering event to update zoom indicator
	//map.events.register('zoomend',null,updateZoomIndicator);
	
	// URL definitions
	var mapDir = "/ms/mapfiles/";
	//var mapFile = mapDir + "collins.map";
	//var mapFile = mapDir + "navteq-mj.map";
	var mapFile = mapDir + "wms-5-myjourney.map";
	
	//var wmsURL = "http://172.25.81.9/cgi-bin/mapserv?map=" + mapFile;
	var wmsURL = getWMSURL() + "?map=" + mapFile;

	// ------- Base Layer -------
	var layerNames = 'basemap';
/*
	var wmsLayer = new OpenLayers.Layer.WMS("PIE WMS", wmsURL,
		{layers: layerNames, format: 'png'},
		{	//scales: [49580, 32390, 21000, 9447, 3770],
			scales: [26000, 9447, 7750, 3770], 
			buffer: 0, 
			projection:'EPSG:27700', 
			units:'m', 
			attribution: '&copy; 2008 PIE Ltd, map data &copy; Collins'
		}
		
	);
	*/
	
	var wmsLayer = new OpenLayers.Layer.WMS("PIE WMS", wmsURL,
					{layers: layerNames, format: 'png'},
					{
						//scales: [4582360,1201120,165300,129900,35430,18420,14170,7790,4950,2830,2120],
						scales: [129900,35430,14170,7790,4950,2830,2120], 
						buffer: 0, 
						projection:'EPSG:27700', 
						units:'m',
						attribution: '&copy;PIE 2010 and map data &copy;Navteq 2009'
					}
					
				);
								
    map.addLayers([wmsLayer]);

	// ------- Controls -------
	//map.addControl(new OpenLayers.Control.PanZoomBar());

	// This allows for dragging of map
	//var navToolbar = new OpenLayers.Control.NavToolbar();
	var navToolbar = new OpenLayers.Control.Navigation();
	map.addControl(navToolbar);
	//navToolbar.div.style.display="none";

	var attribution = new OpenLayers.Control.Attribution();
	map.addControl(attribution);
	var mapsize = map.getCurrentSize();
	// if map is resized this might need to be evented
	//attribution.moveTo(new OpenLayers.Pixel(500,mapsize.h-20));

	// ------- Add Layers to Map -------
	map.addLayer(wmsLayer);
	//533844, 184872
	map.setCenter(new OpenLayers.LonLat(529961,184808), 1);
	
	
	// URL definitions
	var mapDir = "/ms/mapfiles/";
	var mapFile = mapDir + "andes.map";
	var wfsFile = mapDir + "myjourney.map";
	var linewfsFile = mapDir + "line-wfs.map";
	var polygonwfsFile = mapDir + "polygon-wfs.map";
	
	//var wmsURL = getBaseURL() + "cgi-bin/mapserv?map=" + mapFile;
	var wmsURL = getWMSURL() + "?map=" + mapFile;
	//var wfsURL = "http://172.25.81.9/cgi-bin/mapserv?map=" + wfsFile;
	var wfsURL = getWFSURL() + "?map=" + wfsFile;
	var linewfsURL = getBaseURL() + "cgi-bin/mapserv?map=" + linewfsFile;
	var polygonwfsURL = getBaseURL() + "cgi-bin/mapserv?map=" + polygonwfsFile;
	
	
	var layer_defs = [];
	
	var layers = [];
	
	for (var i = 0, l = _layer_feats.length; i < l; i++) {
		var layer_def = _layer_feats[i];
		//console.log(layer_def['typeId']);
		layer_def['ms_url'] = getWFSURL() + '?map=' + layer_def['ms_url'];
		var layer = new OpenLayers.Layer.WFS(layer_def['name'], layer_def['ms_url'], layer_def['options'], layer_def['options2'], layer_def['featuretypes'], layer_def['typeId']);
		layers.push(layer);
	}


	map.addLayers(layers);
	
	var select = new OpenLayers.Control.SelectTemplateFeature({'layers':layers});
	map.addControl(select);
	select.activate();

	
	// hide pan control bar
	//jQuery('.olControlPanZoomBar').hide();
	toggleTabs('legend');
}		


/** updates the zoom level indicator to show the correct level 
 * This function is attached as event handler for map zoomend event - no messing around plz :) see I knew you will forget 
 * develping it outside the world of amazing conding :p
 */
function updateZoomIndicator() {
	var zoom = map.getZoom();
	jQuery('.zoom_current').removeClass();
	var id = 'map_zoom_' + zoom;
	var elem = document.getElementById(id);
	jQuery(elem).addClass('zoom_current'); 	
}

/** zoom to provided map level*/
function zoomTo(level) {
	map.zoomTo(level);
}

/** zoom in one level */
function zoomIn() {
	var curr_zoom = map.getZoom();
	if ((curr_zoom+1) != map.getNumZoomLevels())
		zoomTo(curr_zoom + 1); 
}

/** zoom out one level */
function zoomOut() {
	var curr_zoom = map.getZoom();
	if (curr_zoom != 0)
		zoomTo(curr_zoom - 1); 
}

/** pans map to given direction */
function pan(direction) {
	
	var panFactor = 70;
	if (direction == 'top')
		map.pan(0,0-panFactor);
	else if (direction == 'bottom')
		map.pan(0,panFactor);
	else if (direction == 'left')
		map.pan(0-panFactor,0);
	else if (direction == 'right')
		map.pan(panFactor,0);
		 
}




function toggleTabs(what) {
	if (what == 'nearest') {
		jQuery('#legend').hide();
		jQuery('#nearest').show();
		jQuery('#tabLegend').removeClass('tabLegendSelected').addClass('tabLegendUnselected');
		jQuery('#tabNearest').removeClass('tabNearestUnselected').addClass('tabNearestSelected');
	} else if (what == 'legend') {
		jQuery('#legend').show();
		jQuery('#nearest').hide();
		jQuery('#tabLegend').removeClass('tabLegendUnselected').addClass('tabLegendSelected');
		jQuery('#tabNearest').removeClass('tabNearestSelected').addClass('tabNearestUnselected');
	}
}

		
		function onPopupClose(evt) {
            selectControl.unselect(selectedFeature);
        }
        function onFeatureSelect(feature) {
            selectedFeature = feature;
			var template = feature.layer.getFeatureTemplate(feature.layer.options.typename);
			var htmlContent = template.process(feature.attributes);
			//console.log(feature.geometry);
            popup = new OpenLayers.Popup.FramedCloud("chicken", 
                                     feature.geometry.getBounds().getCenterLonLat(),
                                     null,
                                     //"<div style='font-size:.8em'>Feature: " + feature.id +" " + getAttributes(feature)+"</div>",
									 //"<div style='font-size:.8em'>"+processTemplate(feature,feature.layer.template)+"</div>",
									 "<div style='font-size:.8em'>"+htmlContent+"</div>",
                                     null, true, onPopupClose);
            feature.popup = popup;
            map.addPopup(popup);
        }
        function onFeatureUnselect(feature) {
            map.removePopup(feature.popup);
            feature.popup.destroy();
            feature.popup = null;
        }
		
		function processTemplate(feature,template) {
			var TP = TrimPath.parseTemplate(template);
			return TP.process(feature.attributes);
		}
		
		function getAttributes(feature) {
			var str = "";
			for (key in feature.attributes) {
				var val = feature.attributes[key];
				if ( val != undefined) 
					str += "<br/><b>" + key + "</b>: " + val;
			}
			
			return str;
		}

function log(obj) {
	if (typeof console != 'undefined') {
		console.log(obj);
	}
}


/**
 * @returns URL in address bar without page or file name with trailing '/'
 */
function getBaseURL() {
	var url = document.URL;
	// Remove page name if exists in url
	url = url.substring(0, (url.lastIndexOf("/") + 1));
	// check trailing '/'
	url = (url.charAt(url.length - 1) == '/') ? url : url + '/';
	return url;
}

