/*----------------------------------------------------------
  MapPanControl Class
  
  
  Basic function:
  Control for Panning: Moves the map in the direction pressed on the pan control

  @package NaviciAjaxApi
  @author Arnd Beyer, arnd.beyer@wmdata.fi
  @copyright WM-data Novo 2006
  @version $Id: MapPanControl.php,v 1.0 2005/07/26 12:44:42 arnd Exp $
  ---------------------------------------------------------*/

var mapLayersIds = new Array();
var LayerNamesInArray = new Array();
var pointLayerNames = new Array();
var routeLayerNames = new Array();
var topmostLayer = null;

function MapLayerList() {
  


  	var containerId = "mapLayerMenu";
	var divId = "mapLayerMenuList";
  	var cssClass = "mapLayerMenuList";		
  	var width = 52;
  	var height = 52;	
    var mapPan = null;  			//Div Object of this control
    var map = null; 				// The mapObject this control is for
    var moveFactor = 0.25;			//Speed factor for moving
    var moveStep = 100;				//Step width in pixel
	var panActive = false  			//true if pan is used	
	var panPressed = false 			//user uses Slider
	var deltaX =0;
	var deltaY =0;
	var mouseMoveEventId = null;			//id from DocumentEvents for setting the onmousemove event
	var mouseUpEventId = null;				//id from DocumentEvents for setting the onmouseup event

	var timerSpeed = 50;
    var timerId =0;							//Timer: e.g. soft map centering
	var timerCount = 0;						//       is also used from outside

	this.start = start;
	this.getpointLayerNames = getpointLayerNames;
	this.getRouteLayerNames = getRouteLayerNames;
    
  /*----------------------------------------------------------
  Methods Declaration 
  ---------------------------------------------------------*/

   
    /*
    * Get the Div of the Pan Control and attach the 
    * functions to onmousedown, onmouseout
    * 
    */
    function start(mapDivId, mapObject){
    	//Get Div Objects
    	
    	map = mapObject;
    	var mapLayerMenu = util.attach(containerId);

//    	var activeSurface = map.getActiveSurface();
    	var activeSurface = util.attach("MapArea");
        activeSurface.appendChild(mapLayerMenu);
        mapLayerMenu.onmouseover = showLayerList;
	    mapLayerMenu.onmouseout = hideLayerList;

    }
    
	function showLayerList(event){
	  var mapLayerMenu = util.attach(divId);
	  mapLayerMenu.className = cssClass + "Shown";
	
	}
	function hideLayerList(event){
	  var mapLayerMenu = util.attach(divId);
	  mapLayerMenu.className = cssClass + "Hidden";
	}
}



 function toggleLayerSelection(srcElement,className){

    var checkedValue = srcElement.checked;
    var parent = srcElement.parentNode;
	var layers_modified = false;
	
	var _stroke = "_s";
	var _restriction = "_r";
	var _restriction_stroke = "_r_s";

	//Go up the DOM tree as long as the parent div is found
    for(var i = 0; i<20; i++){
	if(parent.tagName != "DIV"){
	   parent = parent.parentNode;
   	}else if(parent.className== className){
	   break;
	}
    }	
    
	var children_str = "";

    if(parent.tagName == "DIV" && parent.className== className){
		var childInputs = parent.getElementsByTagName("input");
		for(var j = 0; j <  childInputs.length; j++){
	  	if(childInputs[j].type="checkbox"){
	    	childInputs[j].checked = checkedValue;
			var layer_name = childInputs[j+1].value;
			var layer_color = childInputs[j+2].value;
			var layer_pattern = childInputs[j+3].value;
			var layer_stroke = childInputs[j+4].value;
			var layer_restriction = childInputs[j+5].value;
			var type = childInputs[j+6].value;
			if(layer_name == null || layer_name == "" || layer_name == "undefined")
			{
				j=j+6;
				continue;
			}
				if(checkedValue){
					var test = false;
					for(i = 0; i < LayerNamesInArray.length; i++ ){
						if(LayerNamesInArray[i] == layer_name ){
							test = true;
							break;
						}
					}
					
		//--- Layers is not yet selected, so make layer visible ----
					if(!test){
						if(type == 'area'){
							var id = addShape(layer_name,layer_color,layer_pattern);
							mapLayersIds[layer_name] = id;
							poi.setPoi(layer_name,true,new Array({'attributename':'type','attributevalue':type}));
						}
						//If layer type is poin or line
						else if(type != null){
							if(type == 'line'){
								routeLayerNames.push(new Array(layer_name,type));
								if(layer_name == topmostLayer)							
								setRouteLayer(layer_name,type,1);
							else
								setRouteLayer(layer_name,type,'');
							}							
								
							else if(type == 'point'){
								pointLayerNames.push(new Array(layer_name,type));
								if(layer_name == topmostLayer)							
								setPointLayer(layer_name,type,1);
							else
								setPointLayer(layer_name,type,'');
							}							
								
							
						}	
						
						LayerNamesInArray.push(layer_name);						
						layers_modified = true;
						
						if(type == 'area' && layer_stroke != "" && layer_stroke != null && layer_stroke != "undefined"){
					        id = addShape(layer_name +_stroke,layer_stroke,layer_pattern); 
							mapLayersIds[layer_name +_stroke] = id;
							LayerNamesInArray.push(layer_name +_stroke); 						
						}
						if(type == 'area' && layer_restriction==1){
					        id = addShape(layer_name +_restriction,"FF000044",layer_pattern); 
							mapLayersIds[layer_name +_restriction] = id;
							LayerNamesInArray.push(layer_name +_restriction); 
							if(layer_stroke != "" && layer_stroke != null && layer_stroke != "undefined"){
								id = addShape(layer_name +_restriction_stroke,"830404FF",layer_pattern); 
							    mapLayersIds[layer_name +_restriction_stroke] = id;
							    LayerNamesInArray.push(layer_name +_restriction_stroke); 
							}
						}
					}	
						if(AjaxMapsConfig.SPECIAL_MAPLAYERS[layer_name]!=null){
							for(var i = 0; i < AjaxMapsConfig.SPECIAL_MAPLAYERS[layer_name].length; i++){								
								var ml_checkBox = util.attach('ml_'+AjaxMapsConfig.SPECIAL_MAPLAYERS[layer_name][i]);
									if(ml_checkBox.checked != true){
										ml_checkBox.checked = true;										
										toggleLayerSelection(ml_checkBox,'MapLayerMenuListItem');
									}
							}	
							
 						}
							
				}
				
		//---Layer is already seleted, so unselect it.---
				
				//Area
				else if(type == 'area'){
					//alert(mapLayersIds[layer_name]);
					function delShape(layer_name){
						removeShape( mapLayersIds[layer_name]);
						delete mapLayersIds[layer_name];
						var index = null;
						for(i = 0; i < LayerNamesInArray.length ; i++){						
							if(LayerNamesInArray[i] == layer_name){
							index = i;
							break;
							} 
						}
						if(index != null){
							delete LayerNamesInArray[index];
						}						
					}
					
					delShape(layer_name);
					
					if(layer_stroke != "" && layer_stroke != null && layer_stroke != "undefined"){
					       delShape(layer_name +_stroke); 				
						}
						if(layer_restriction==1){
					        delShape(layer_name +_restriction); 							
							if(layer_stroke != "" && layer_stroke != null && layer_stroke != "undefined"){
								delShape(layer_name +_restriction_stroke); 							    
							}
						}
					
					
					poi.setPoi(layer_name,false,null);
					layers_modified = true;
				}
			//If selected layers type is line or point.
			else{								
				var index = null;
						for(var i = 0; i < LayerNamesInArray.length ; i++){
							if(LayerNamesInArray[i] == layer_name){
								index = i;
								break;
							} 
						}
						if(index != null){
							delete LayerNamesInArray[index];							
							
						}
						index = null;
						for(var i = 0; i < pointLayerNames.length ; i++){												
							if(pointLayerNames[i][0] == layer_name){
								index = i;
								break;
							} 
						}
						if(index != null){													
							pointLayerNames.splice(index,1);							
						}					
					poi.setPoi(layer_name,false,null);
					layers_modified = true;
				
			}
			
			
			j=j+6;
		}		
	  }
	  if(layers_modified){
	  	naviciAjaxApi.redrawDynamicLayer();
	  }
    }
}

function getpointLayerNames(){
   	return pointLayerNames;
   }
   
function getRouteLayerNames(){
   	return routeLayerNames;
   }



function toggleMapLayerPriority(layer_name){
		var isModified = false;
		var oldTopmostLayer = topmostLayer;
		topmostLayer = layer_name;
	
	
	//Change data of the old topmost layer(if there is one)
	if(oldTopmostLayer != null){
		//change picture (=classname)
		var temp = util.attach(oldTopmostLayer);
		temp.className='MapLayerPrioSelect';

		//--Take poi off and put it again (for getting right order).---				
		for(var i = 0; i < routeLayerNames.length ; i++){												
			if(routeLayerNames[i][0] == oldTopmostLayer){				
				var type = routeLayerNames[i][1];
					break;
						}
			}			
		poi.setPoi(oldTopmostLayer,false,null);
		setRouteLayer(oldTopmostLayer,'line','');
		isModified = true;
	}
	

	temp = util.attach(topmostLayer);
	temp.className='MapLayerPrioSelected';
	
	index = null;
	for(var i = 0; i < routeLayerNames.length ; i++){										
		if(routeLayerNames[i][0] == topmostLayer){
			index = i;
			var type = routeLayerNames[i][1];
			break;
					}
		}

	if(index != null){
		poi.setPoi(topmostLayer,false,null);
		setRouteLayer(topmostLayer,'line',1);
		isModified = true;
		}
		
	if(isModified){
		naviciAjaxApi.redrawDynamicLayer();
	}
}
