/**
 * @author Peter Goulborn
 * @modifiedby David Cordner
 *
 * Date: 03/05/2009
 * 
 * Class: none
 * Returns a functional map
 */
 
function atCreateMap(atElements, atRasterLayer, atMapOptions, atDataServiceUrl, atDistances, atResults, atForceThematic, atLatestDate){
			
			var mapElement = $(atElements.map || 'map');
			
			var mapCallbacks = {
				'click': function(e){
					this.map.wrapper.mapElement.fire('astun:mapClick', {
						mapEvent: e
					});
				},
				'hoverPause': function(e){
					/*this.map.wrapper.mapElement.fire('astun:mapHover', {
						mapEvent: e
					});*/
				},
				'hoverMove': function(e){
					//clearTimeout(this.map.wrapper.timers.hover);
				}
			};
			
			var mapStateManager = new Astun.iSharemaps.StateManager(mapElement);			
			var mapWrapper = new Astun.iSharemaps.OLMap(mapElement, atDataServiceUrl, atRasterLayer.url, {
				callbacks: mapCallbacks
			});	
			if (!!atLatestDate) {
				mapWrapper.date = atLatestDate;
			}
					
			

			var mapInteractions = new Astun.iSharemaps.OLInteractCtrl();
			mapWrapper.interactions = mapInteractions;
			
			var thematicsPanel = new Astun.iSharemaps.OLLayerPanel.Thematic(mapWrapper, atElements.thematics || 'thematics');
			
			var layerControl = new Astun.iSharemaps.OLLayerControl(mapWrapper,null,atForceThematic);
			mapWrapper.layerControl = layerControl
			
			var mapSourceLoad = function(evt){
				// astun:mapSourceLoad returns current mapSource as evt.memo
				var mapSource = evt.memo;
				mapWrapper.mapsource = mapSource.mapName;
				var loadOptions = {
					map: Object.extend(atMapOptions, {restrictedExtent: new OpenLayers.Bounds.fromArray(atRasterLayer.bbox)}),
					raster: Object.extend({}, atRasterLayer.options),
					rasterType: atRasterLayer.type,
					data: {}
				};
				var loadMap = function () {			
					var loadCurrentLocation = function (locationSetting){
						if (locationSetting) {
							var currentLocation = locationSetting.evalJSON();
							var locationLocation = new OpenLayers.LonLat(currentLocation.x, currentLocation.y);
							mapWrapper.currentLocation = currentLocation;
							mapWrapper.currentPosition = locationLocation;
							var checkLocationChange = function (previousSetting) {
								if (previousSetting) {
									previousLocation = previousSetting.evalJSON();
								}
								var locationChanged =  (!previousSetting || (previousLocation.uid !== this.currentLocation.uid)) ? true : false;
								if (locationChanged) {
									this.mapElement.fire('astun:saveSetting', {setting: 'previousLocation', value : Object.toJSON(this.currentLocation)});
									if (!loadOptions.forceInitial) {
										loadOptions.deferDraw = true;
									}
								}
													
								mapWrapper.loadMap(mapSource.mapName, atRasterLayer.bbox, loadOptions);
								layerControl.importLayerGroups(mapSource.layerGroups);		
									
								if (locationChanged && loadOptions.deferDraw) {
									//should do zoomToFeature here but can't as boundary information not available
									mapWrapper.draw( { 'easting': currentLocation.x, 'northing': currentLocation.y, 'zoom': mapWrapper.locationZoom });
								}								
								
								if (layerControl.thematicInfo && layerControl.thematicInfo.themeBeingProcessed) {	
									Event.observe(mapWrapper.mapElement, 'astun:thematicLoaded', function(evt){
										
										if (locationChanged && loadOptions.deferDraw && mapWrapper.map.thematic.homeFeature) {
											mapWrapper.zoomToFeature(mapWrapper.map.thematic.homeFeature.current.attributes.name); //hack hack hack
										} 
										mapWrapper.showLocation(mapWrapper.currentPosition);
									});
								}
								else {
									mapWrapper.showLocation(mapWrapper.currentPosition);
								}
								
							}
							
							this.mapElement.fire('astun:loadSetting', {setting: 'previousLocation', loadFunction: checkLocationChange.bind(this)});
						
						}
						else {			
							var doMap = true;
							if (astun.mypages.mymaps.doMap!=null) {
								doMap = astun.mypages.mymaps.doMap;
							}
							if (doMap) {
							    /*
								if (astun.mypages.mymaps.mapSource.bounds)
					                {
					                atRasterLayer.bbox = astun.mypages.mymaps.mapSource.bounds;
					                }*/
                                mapWrapper.loadMap(mapSource.mapName, atRasterLayer.bbox, loadOptions);								
							}
							layerControl.importLayerGroups(mapSource.layerGroups);	
							
						}
					}
					
					setTimeout( function() {
                        mapWrapper.mapElement.fire('astun:loadSetting', { setting: 'currentLocation', loadFunction: loadCurrentLocation.bind( mapWrapper ) } ) 
                        }, 0 );
			
				};
				// Handle parameters
				mapWrapper.queryHandler = new Astun.iSharemaps.Common.QueryHandler({
					'StartEasting': 'x',
					'StartNorthing': 'y',
					'StartZoom': 'z',
					'SearchLayer': 'sl',
					'SearchField': 'sf',
					'SearchValue': 'sv',
					'ServiceAction': 'sa',
					'Address': 'a',
					'UPRN': 'u'
				});
				
				var setInitialView = function( viewArray ) {
					loadOptions.initialView = {
						'easting': viewArray[0],
						'northing': viewArray[1],
						'zoom': viewArray[2]
					}
					loadOptions.forceInitial = true;
				}
				
				mapWrapper.queryHandler.addCase(
					'zoom', 
					'StartEasting, StartNorthing, StartZoom', 
					function( values ) {
						// set initial view according to passed in parameters
						setInitialView( [values.starteasting, values.startnorthing, values.startzoom] );
						loadMap();
					}
				);
				
				mapWrapper.queryHandler.addCase(
					'searchLayer',
					'SearchLayer, SearchField, SearchValue',
					function( values ){
						// perform search on data layer and load map with appropriate view
						var setLocationView = function ( view ) {
							if (view) {
								setInitialView( [view.easting, view.northing, view.zoom] );
								loadOptions.data.defaultLayers = [astun.mypages.queryParameters.SearchLayer];
							}
							if (layerControl.thematicInfo) {
								layerControl.thematicInfo.force = 'off';
							}
							loadMap();	
						}
						mapWrapper.searchISMLayer( values.searchlayer, values.searchfield, values.searchvalue, setLocationView );
					}
				);
				
				if (mapWrapper.queryHandler.cases.matched) {
					mapWrapper.queryHandler.processFirstCase();
				}
				else {
					// load map normally
					
					loadMap();
					//setInitialView([434928, 386323, 1]);
				}
				
				
				
			};
			
			Event.observe(mapWrapper.mapElement, 'astun:mapSourceLoad', mapSourceLoad);
			
			var msm = new Astun.iSharemaps.MapSourceManager(atDataServiceUrl, mapElement);

			
			
			//alert('msm:' + !!msm);
			//Event.observe(mapWrapper.mapElement, 'astun:mapClick', mapInteractions.onInfoClick.bindAsEventListener(mapWrapper));
			//Event.observe(mapWrapper.mapElement, 'astun:mapClick', mapInteractions.showThematicPopUp.bindAsEventListener(mapWrapper));
			//Event.observe(mapWrapper.mapElement, 'astun:mapHover', mapInteractions.showMapToolTip.bindAsEventListener(mapWrapper));
			//Event.observe(mapWrapper.mapElement, 'astun:layerQuery', mapInteractions.findNearest.bindAsEventListener(mapWrapper));
			/*
			Event.observe(mapWrapper.mapElement, 'astun:resultsReceived', function(e){
				$('atResults').update(e.memo.html);
			});
			Event.observe(mapWrapper.mapElement, 'astun:resultsCleared', function(e){
				$('atResults').update('<p>Perform a \'Find Nearest\' search or click on a map icon to show information.</p>');
			});
			*/
			return mapWrapper;
		}
