/*
Javascript file for wold wallmaps page
Called from custom-world-wall-maps.php
July 2009
*/

//------------------------------------------------------------GLOBALS	
var map;								//Openelayers map layer
var mapfilePath = "/var/www/html/mi/";	//Path to the map file
var http;
var vlayer;								//Layer that contains the mapping
var baselayer;							//Layer that contains the mapping
var polygonExtentFeature;
var drawFeatureControl;
var modifyControl;
	
OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '3';
OpenLayers.Feature.Vector.style['default']['fillColor'] = '#ff0000';
OpenLayers.Feature.Vector.style['default']['strokeColor'] = '#ff0000';
OpenLayers.Feature.Vector.style['default']['fillOpacity'] = '0.3';
OpenLayers.Feature.Vector.style['default']['graphicOpacity'] = '1';
OpenLayers.Feature.Vector.style['select']['strokeWidth'] = '3';
OpenLayers.Feature.Vector.style['select']['fillColor'] = 'red';
OpenLayers.Feature.Vector.style['select']['strokeColor'] = 'red';
OpenLayers.Feature.Vector.style['select']['fillOpacity'] = '0.3';
OpenLayers.Feature.Vector.style['select']['graphicOpacity'] = '1';

var avaialableMapsArrayIndex = -1;			//Index in the array of the current map
var avaialableMaps = new Array (4);			//Array to store available maps	("name id",minx,miny,maxx,maxy,mapfile name,map layers,base map scale,zoom resolutions array)
avaialableMaps[0] = new Array("worldpol",0,0,1325,807,"miworldpol","world1 world2 world3 world4",20000000);
avaialableMaps[1] = new Array("worldfiz",0,0,1325,807,"miworldfiz","world1 world2 world3 world4",20000000);
avaialableMaps[2] = new Array("europol",0,0,1340,982,"mieuropol","euro1 euro2 euro3 euro4",4300000);
avaialableMaps[3] = new Array("eurofiz",0,0,1340,982,"mieurofiz","euro1 euro2 euro3 euro4",4300000);
avaialableMaps[0][8]  = new Array(1.9,1,0.5,0.2);
avaialableMaps[1][8]  = new Array(1.9,1,0.5,0.2);
avaialableMaps[2][8]  = new Array(2.2,1,0.5,0.2);
avaialableMaps[3][8]  = new Array(2.2,1,0.5,0.2);

//------------------------------------------------------------MAP SETUP
//**************************************Defines which map to use
function defineMap(theMap,passedCoordinates){
	for(c=0; c < avaialableMaps.length;c++){
		if(avaialableMaps[c][0] == theMap){
			avaialableMapsArrayIndex = c;
		}
	}	
	//If a map has been found initialize it
	if(avaialableMapsArrayIndex != -1){
		initMap(avaialableMapsArrayIndex,passedCoordinates);
		if((avaialableMapsArrayIndex == 0) || (avaialableMapsArrayIndex == 2)){
			var layerObj = document.getElementById("colorContainer");
		  	layerObj.className='layerOn';
		}else{
			var layerObj = document.getElementById("colorContainer");
		  	layerObj.className='layerOff';
			resetColor();			//Clear any previously selected custom colours
		}
	}else{
		alert("Map could not be found");
	}
}
//**************************************Initializes the map
function initMap(avaialableMapsArrayIndex,passedCoordinates){

	//Define graphic map styles
	var layer_style = OpenLayers.Util.extend({}, OpenLayers.Feature.Vector.style['default']);
	layer_style.fillOpacity = 0.2;
	layer_style.graphicOpacity = 1;

	//Map extent styles
	mapextenstyle = OpenLayers.Util.extend({}, layer_style);
	mapextenstyle.strokeColor = "#ff0000";
	mapextenstyle.fillColor = "#ff0000";
	mapextenstyle.strokeWidth = 3;
	mapextenstyle.fillOpacity = 0.3;
	
	//If a map already set destroy it
	if(map != null){
		map.destroy();
	}
			 
	//Define the map and relvant options
	map = new OpenLayers.Map( $('worldmap'), { controls: [], 
		units:'m',  
		maxExtent: new OpenLayers.Bounds(avaialableMaps[avaialableMapsArrayIndex][1],avaialableMaps[avaialableMapsArrayIndex][2],avaialableMaps[avaialableMapsArrayIndex][3],avaialableMaps[avaialableMapsArrayIndex][4]), 				
		resolutions: avaialableMaps[avaialableMapsArrayIndex][8]});

	//Create base mapping layer				  
	baselayer = new OpenLayers.Layer.MapServer( "Base",
					"http://www.planvu.co.uk/cgi-bin/mapserv",
					{ map: mapfilePath + avaialableMaps[avaialableMapsArrayIndex][5] + ".map",
					  layers: avaialableMaps[avaialableMapsArrayIndex][6]}, { singleTile: false, isBaseLayer: true, transitionEffect: 'resize'});				  
	
	//Create layer for Extents to be drawn on
	vlayer = new OpenLayers.Layer.Vector( "Vector Layer" );
			
	//Add layers to the map and zoom to map extent		
	map.addLayers([baselayer, vlayer]);
	map.fractionalZoom = true;
	var bounds = new OpenLayers.Bounds(avaialableMaps[avaialableMapsArrayIndex][1],avaialableMaps[avaialableMapsArrayIndex][2],avaialableMaps[avaialableMapsArrayIndex][3],avaialableMaps[avaialableMapsArrayIndex][4]);
	if (!map.getCenter()) map.zoomToExtent(bounds);
	 	 
	//Add map controls 
	map.addControl(new OpenLayers.Control.PanZoomBar());
  	map.addControl(new OpenLayers.Control.Navigation());
	//map.addControl(new OpenLayers.Control.Scale()); 
	//map.addControl(new OpenLayers.Control.MousePosition());
	//map.addControl(new OpenLayers.Control.LayerSwitcher());
	//map.addControl(new OpenLayers.Control.MouseToolbar());
	//map.addControl(new OpenLayers.Control.MousePosition());
	//map.addControl(new OpenLayers.Control.NavToolbar());
	//map.addControl(new OpenLayers.Control.EditingToolbar(vlayer));
 
	drawFeatureControl = new OpenLayers.Control.DrawFeature(vlayer,
				OpenLayers.Handler.RegularPolygon,
				{handlerOptions: {sides: 4}})	  
	map.addControl(drawFeatureControl);
	 
	modifyControl =  new OpenLayers.Control.ModifyFeature(vlayer);	
	map.addControl(modifyControl);	  
	  
	//Register map evemts 
	//Re-Centre the map if the extent is moved or edited
	vlayer.events.register('featureadded', vlayer, function(evt) { 
	if(vlayer.features.length > 0){
		  //Zoom to shape
		  var theGeometryasBounds = vlayer.features[0].geometry.getBounds();
		  var theExtentWidth = theGeometryasBounds.getWidth();
		  var theExtentHeight = theGeometryasBounds.getHeight();
		  
		  
		  //Define full map extent is being used
		  if(avaialableMapsArrayIndex == -1){
		  	var isFullExtent = false;
		  }else{
		  	var minX = avaialableMaps[avaialableMapsArrayIndex][1];
		  	var minY = avaialableMaps[avaialableMapsArrayIndex][2];
		  	var maxX = avaialableMaps[avaialableMapsArrayIndex][3];
		  	var maxY = avaialableMaps[avaialableMapsArrayIndex][4];
			var theFullExtentWidth = maxX - minX;
			var theFullExtentHeight = maxY - minY;				  
			if((theExtentWidth == theFullExtentWidth) && (theExtentHeight == theFullExtentHeight)){
				var isFullExtent = true;
			}else{
				var isFullExtent = false;
		    }
		  }

		  if(isFullExtent){
		  	  map.zoomToMaxExtent();  
		  }else{
			  var centreLatLon = theGeometryasBounds.getCenterLonLat();
			  var theX = centreLatLon.lon;
			  var theY = centreLatLon.lat; 
			  var blx = (theX - (theExtentWidth/2)) - (theExtentWidth/4);
			  var bly = (theY - (theExtentHeight/2)) - (theExtentHeight/4);
			  var urx = (theX + (theExtentWidth/2)) + (theExtentWidth/4);
			  var ury = (theY + (theExtentHeight/2)) + (theExtentWidth/4);
			  var bounds = new OpenLayers.Bounds(blx,bly,urx,ury);		  
			  map.zoomToExtent(bounds);
			  drawFeatureControl.deactivate();
			  modifyControl.deactivate();
			  document.getElementById("drawTool").src = "images/btnDraw.png";
			  document.getElementById("moveTool").src = "images/btnModify.png";
			  document.getElementById("panTool").src = "images/btnPanON.png";	
		  }
	  }  
	}); 
	vlayer.events.register('featuremodified', vlayer, function(evt) { 
		if(vlayer.features.length > 0){
			thegeometryasBounds = vlayer.features[0].geometry.getBounds();
			var centreLatLon = thegeometryasBounds.getCenterLonLat();
			map.setCenter(centreLatLon,map.getZoom(),false,false);    
		}
	}); 
	
	//Remove existing map extent before a new one is added
	vlayer.events.register('beforefeaturesadded', vlayer, function(evt) { 
			vlayer.removeFeatures(vlayer.features[0]);		
	}); 
			
		
	//
	//map.events.register('moveend', map, function(evt) { 
			//SHOW MORE DETAILED MAPPING MESSAGEalert("ok")		
	//});		
				
	//Redraw any passed extent over the map
	if(passedCoordinates != ""){
		recreateExtent(passedCoordinates);		
	}	
		
}

//------------------------------------------------------------MAP EXTENT SCRIPTS

//**************************************Retrieves info on map extents drawn on the map and move through to the confirm page
function getFeatures(){
	if(vlayer.features.length > 0){
		var proceedToConfirm = true;
	}else{
		var answer = confirm ('Please ensure that you select an area to be covered before proceeding. Do you want to choose the whole map?')
		if(answer){
			var proceedToConfirm = true;
			chooseFullMap();
		}else{
			var proceedToConfirm = false;
		}
	}	
		
	if(proceedToConfirm){
		thegeometryasstring = vlayer.features[0].geometry;
		document.frmSearch1.extentInfo.value = thegeometryasstring;
		document.frmSearch1.baseScale.value = avaialableMaps[avaialableMapsArrayIndex][7];
		document.frmSearch1.baseMapType.value = avaialableMaps[avaialableMapsArrayIndex][0];
		document.frmSearch1.action = "custom-world-wall-maps-confirm.asp"
		document.frmSearch1.submit();			
	}	
		
}		

//**************************************Function to add an extent to the map
function addExtent(theSize, theType){
   
	//Get the map centre
	var theMapCentre = map.getCenter(); 
	var centreX = theMapCentre.lon; 
	var centreY = theMapCentre.lat;  
	
	if(theType == "rect"){  

		//Remove any existing
		if(polygonExtentFeature != null){
			vlayer.destroyFeatures()
		}
	
		var pointList = [];
		var newPoint = new OpenLayers.Geometry.Point(centreX - (theSize/2),centreY - (theSize/2));
		pointList.push(newPoint); 
		var newPoint = new OpenLayers.Geometry.Point(centreX - (theSize/2),centreY + (theSize/2));
		pointList.push(newPoint);  
		var newPoint = new OpenLayers.Geometry.Point(centreX + (theSize/2),centreY + (theSize/2));
		pointList.push(newPoint);  
		var newPoint = new OpenLayers.Geometry.Point(centreX + (theSize/2),centreY - (theSize/2));
		pointList.push(newPoint);    
		pointList.push(pointList[0]);
		
		var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
		polygonExtentFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([linearRing]),null,mapextenstyle);		
		vlayer.addFeatures(polygonExtentFeature);
		
		//Zoom to shape
		var theGeometryasBounds = vlayer.features[0].geometry.getBounds();
		var theExtentWidth = theGeometryasBounds.getWidth();
		var theExtentHeight = theGeometryasBounds.getHeight();
		var centreLatLon = theGeometryasBounds.getCenterLonLat();
		var theX = centreLatLon.lon;
		var theY = centreLatLon.lat; 
		var blx = (theX - (theExtentWidth/2)) - (theExtentWidth/4);
		var bly = (theY - (theExtentHeight/2)) - (theExtentHeight/4);
		var urx = (theX + (theExtentWidth/2)) + (theExtentWidth/4);
		var ury = (theY + (theExtentHeight/2)) + (theExtentWidth/4);
		var bounds = new OpenLayers.Bounds(blx,bly,urx,ury);
		map.zoomToExtent(bounds);
	}
}

//**************************************Draws extent that covers the full map
function chooseFullMap(){

	var minX = avaialableMaps[avaialableMapsArrayIndex][1];
	var minY = avaialableMaps[avaialableMapsArrayIndex][2];
	var maxX = avaialableMaps[avaialableMapsArrayIndex][3];
	var maxY = avaialableMaps[avaialableMapsArrayIndex][4];

	//Remove any existing
	if(polygonExtentFeature != null){
		vlayer.destroyFeatures()
	}
	
	var pointList = [];
	var newPoint = new OpenLayers.Geometry.Point(minX,minY);
	pointList.push(newPoint); 
	var newPoint = new OpenLayers.Geometry.Point(minX,maxY);
	pointList.push(newPoint);  
	var newPoint = new OpenLayers.Geometry.Point(maxX,maxY);
	pointList.push(newPoint);  
	var newPoint = new OpenLayers.Geometry.Point(maxX,minY);
	pointList.push(newPoint);    
	pointList.push(pointList[0]);
		
	var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
	polygonExtentFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([linearRing]),null,mapextenstyle);		
	vlayer.addFeatures(polygonExtentFeature);
	
	/*Zoom to shape
	var theGeometryasBounds = vlayer.features[0].geometry.getBounds();
	var theExtentWidth = theGeometryasBounds.getWidth();
	var theExtentHeight = theGeometryasBounds.getHeight();
	var centreLatLon = theGeometryasBounds.getCenterLonLat();
	var theX = centreLatLon.lon;
	var theY = centreLatLon.lat; 
	var blx = (theX - (theExtentWidth/2)) - (theExtentWidth/4);
	var bly = (theY - (theExtentHeight/2)) - (theExtentHeight/4);
	var urx = (theX + (theExtentWidth/2)) + (theExtentWidth/4);
	var ury = (theY + (theExtentHeight/2)) + (theExtentWidth/4);
	var bounds = new OpenLayers.Bounds(blx,bly,urx,ury);
	map.zoomToExtent(bounds);*/
	
}

//**************************************Resets the map session
function destroyMap(){
	vlayer.destroyFeatures()
	map.zoomToMaxExtent();
}

//**************************************Deletes all drawn extents
function destroyExtent(){
	vlayer.destroyFeatures()
}

//**************************************Draws a map extent over the map from the passed coordinate string	  
function recreateExtent(passedCoordinates){	
	//Remove any existing map extents
	vlayer.destroyFeatures();
	
	//Create the map exten from the coordinates and add
	var pointList = [];			
	var theCoordArray = passedCoordinates.split(",");		
	for (c=0; c < theCoordArray.length ;c++){
		var theXY =  theCoordArray[c].split(" ");
		var newPoint = new OpenLayers.Geometry.Point(theXY[0],theXY[1]);
		pointList.push(newPoint);
	}					
	var linearRing = new OpenLayers.Geometry.LinearRing(pointList);
	polygonExtentFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Polygon([linearRing]),null,mapextenstyle);
	vlayer.addFeatures(polygonExtentFeature);

	//Zoom to shape
	var theGeometryasBounds = vlayer.features[0].geometry.getBounds();
	var theExtentWidth = theGeometryasBounds.getWidth();
	var theExtentHeight = theGeometryasBounds.getHeight();
	var centreLatLon = theGeometryasBounds.getCenterLonLat();
	var theX = centreLatLon.lon;
	var theY = centreLatLon.lat;	
	var blx = (theX - (theExtentWidth/2)) - (theExtentWidth/4);
	var bly = (theY - (theExtentHeight/2)) - (theExtentHeight/4);
	var urx = (theX + (theExtentWidth/2)) + (theExtentWidth/4);
	var ury = (theY + (theExtentHeight/2)) + (theExtentWidth/4);
	var bounds = new OpenLayers.Bounds(blx,bly,urx,ury);
	map.zoomToExtent(bounds);

}
	
//------------------------------------------------------------GENRAL SCRIPTS
function showLayers(theLayers){
	var tabImage = document.getElementById('tabImage')
	tabImage.src = "images/" + theLayers + ".jpg"
	var allLayers = new Array("step1ON","step2ON"); 
	for(m=0; m < allLayers.length;m++){
		if (theLayers == allLayers[m]){
		  var layerObj = document.getElementById(allLayers[m])
		  layerObj.className='layerOn'
		}else{
		  var layerObj = document.getElementById(allLayers[m])
		  layerObj.className='layerOff'
		}
	}
}

//****************Create request object
function createRequestObject() {
	var ro;		
	if (window.XMLHttpRequest) { 				// Mozilla, Safari,...
		ro = new XMLHttpRequest();
		//if (ro.overrideMimeType) {
		//	ro.overrideMimeType('text/xml');
		//}
	}else if (window.ActiveXObject) { 			// IE
		try {
			ro = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
			ro = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	return ro;	
}
//**************************************Activates for use the selected tool on the toolbar	 
function activateTool(toolType)	{

	drawFeatureControl.deactivate();
	modifyControl.deactivate();
	
	if (toolType=='draw'){
		if(polygonExtentFeature != null){
			vlayer.destroyFeatures();
		}
		drawFeatureControl.handler.irregular = true;
		drawFeatureControl.activate();
		document.getElementById("drawTool").src = "images/btnDrawON.png";
		document.getElementById("moveTool").src = "images/btnModify.png";
		document.getElementById("panTool").src = "images/btnPan.png";
	}
	else if (toolType=='move'){
		modifyControl.mode = OpenLayers.Control.ModifyFeature.DRAG;
		modifyControl.mode |= OpenLayers.Control.ModifyFeature.RESIZE;
		modifyControl.activate();
		document.getElementById("drawTool").src = "images/btnDraw.png";
		document.getElementById("moveTool").src = "images/btnModifyON.png";
		document.getElementById("panTool").src = "images/btnPan.png";
	}
	else if (toolType=='pan'){
		document.getElementById("drawTool").src = "images/btnDraw.png";
		document.getElementById("moveTool").src = "images/btnModify.png";
		document.getElementById("panTool").src = "images/btnPanON.png";
	}
}	

//**************************************Selects or deselects customer logo
function chooseLogo(){
	if(document.getElementById("chkLogo").checked){
		document.getElementById("chkLogo").value = "yes";
		//Show message
		document.getElementById("logomessage").style.display = "block";
	}else{
		document.getElementById("chkLogo").value = "no";
		//Hide message
		document.getElementById("logomessage").style.display = "none";
	}
}

//**************************************Selects or deselects customer title
function chooseTitle(){
	if(document.getElementById("chkTitle").checked){
		document.getElementById("chkTitle").value = "yes";
	}else{
		document.getElementById("chkTitle").value = "no";
		document.getElementById("txtTitle").value = "";
	}
}
//**************************************Clears the map colour value
function resetColor(){
	document.getElementById('txtColor').value=''
}
//---------------End of file
