var _MAP_WRAPPER = new Map_Wrapper();
var _LIST_OF_EXTRA_GRAPHICS = new Array(new Extra_Graphics());
var _OP_USER= new Idle();
var _WIN=null;
var _IMAGES_TO_LOAD=0;
var _jg= null;


function startup()
{
   
	try{
		loading_message(true);
		var params="type=layers&action=load";
		document.getElementById("map_frame").src=_UI_MAP+"?"+params+"&random="+Math.random();

		if(document.addEventListener)
		{
			document.getElementById( _MAP_ID ).addEventListener("mousedown",evt_event_zoomin,false);
			document.getElementById( _MAP_ID ).addEventListener("mousemove",mappa_mouse_over,false);
		}
		else
		{
			document.getElementById( _MAP_ID ).onmousedown=evt_event_zoomin;
			document.getElementById( _MAP_ID ).onmousemove=mappa_mouse_over;
		}
		
		_EVENT_LISTENER=evt_event_zoomin;

	}catch(e)
	{
		alert("Eventsmanager.startup(): "+e)
	}
}

function change_selected_tool(active){
    if( document.getElementById("pan")){
        document.getElementById("pan").className="";
    }
    if(document.getElementById("zoomin")){
        document.getElementById("zoomin").className="";
    }
    if(document.getElementById("zoomout")){
        document.getElementById("zoomout").className="";
    }
    if( document.getElementById("fullextent")){
        document.getElementById("fullextent").className="";
    }
    if(document.getElementById("query")){
        document.getElementById("query").className="";
    }
    if( document.getElementById("planimetry")){
        document.getElementById("planimetry").className="";
    }
    if(document.getElementById("measure")){
        document.getElementById("measure").className="";
    }
    if(document.getElementById("set_scale")){
        document.getElementById("set_scale").className="";
    }
    if(document.getElementById("rotate")){
        document.getElementById("rotate").className="";
    }

    if(document.getElementById("plot")){
      document.getElementById("plot").className="";
    }

    if(active){
      active.className = "tool_selected";
    }

}
function evt_event_zoom_to_scale(event)
{
	process_mouse_down(event,new Zoom_To_Scale());
}
function evt_but_popup_rotate_map(event)
{
	try{
		if( !event )
			event = window.event;
		var popup = new Popup_Menu_Rotate(this);
		popup.show(event.clientX,event.clientY);
		
	}catch(e)
	{
		alert("Eventsmanager.evt_but_popup_rotate_map(): "+e);
	    return false;
	}
}
function evt_event_move(event)
{
    process_mouse_down(event,new Move());
}
function evt_event_zoomin(event)
{
    process_mouse_down(event,new Zoomin());	
}
function evt_event_query_parcel(event)
{
	process_mouse_down(event,new Query_Parcel());
}
function evt_event_zoomout(event)
{
    process_mouse_down(event,new Zoomout());
}
function evt_event_recenter(event)
{
    process_mouse_down(event,new Recenter());    
}
function evt_event_measure(event)
{
	process_mouse_down(event,new Evt_Draw_Circle());
}
function evt_event_planimetry(event)
{
	process_mouse_down(event,new Planimetry());
}
function mappa_mouse_over(event)
{
	try{
		if(!event)
			event=window.event;
		clear_node(document.getElementById("coords"));
		var px_coords=_MAP_WRAPPER.convert_to_relative_pixel_coords(event.clientX,event.clientY);	
		var coords = _MAP_WRAPPER.convert_to_geo( px_coords[0],px_coords [1]);
		document.getElementById("coords").appendChild(document.createTextNode(coords));
 		stop_propagating_event(event);
	
	}catch(e)
	{
	    alert("Eventsmanager.mappa_mouse_over(): "+e);
	    return false;
	}
	
}

function mappa_mouse_move(event)
{
	try{
		if(!event)
			event=window.event;
		_OP_USER.mouse_move(event);
		
	}catch(e)
	{
	    alert("Eventsmanager.mappa_mouse_move(): "+e);
	    return false;
	}
}
function mappa_mouse_up(event)
{
	try{
       
		if(!event)
			event=window.event;

      
			
		if( _OP_USER )
		{
			//Remove the registerd events and a display coordinate event
			if(document.removeEventListener)
			{
				document.getElementById( _MAP_ID ).removeEventListener("mousemove",mappa_mouse_move,false);
				document.getElementById( _MAP_ID ).addEventListener("mousemove",mappa_mouse_over,false);
				
			}else
			{
				document.getElementById( _MAP_ID ).onmousemove=mappa_mouse_over;		
				document.getElementById( _MAP_ID ).onmouseup=null;
				if(document.attachEvent)
				{
					document.getElementById( _MAP_ID ).releaseCapture();
				}
			}
			
			_OP_USER.mouse_up(event);

		}
		
	}catch(e)
	{
	    alert("Eventsmanager.mappa_mouse_up(): "+e);
	    return false;
	}
}
function layer_change(target)
{
	var params="type=layers&action=update&livelli=";
	for(var i=0;i<document.forms[0].elements.length;i++)
	{
		if(document.forms[0].elements[i].checked)
		{
			if(i==0)
				params+=document.forms[0].elements[i].value;
			else
				params+=","+document.forms[0].elements[i].value;
		}
		
	}
	clear_node(document.forms[0]);
	document.getElementById("map_frame").src=_UI_MAP+"?"+params+"&random="+Math.random();
}

function reload_map(params)
{
	try{
        loading_message(true);
		document.getElementById("layers_container").style.visibility="hidden";
        document.getElementById("map_frame").src=_UI_MAP+"?"+params+"&random="+Math.random();
	}
    catch(e)
	{
		alert("Eventsmanager.reload_map(): "+e);
		return false;
	}
}

function proccess_map_response(img_url,scale_url,ref_url,scale,minx,maxx,miny,maxy,w,h)
{
	try{
		_MAP_WRAPPER.update_map(img_url,scale_url,ref_url,scale,minx,maxx,miny,maxy,w,h);
	}
	catch(e)
	{
		alert("Eventsmanager.proccess_map_response(): "+e);
		return false;
	}
}

function remove_popup()
{
	var popup = document.getElementById("popup");
	if(popup)
	{
		var parent = document.getElementById("window");
		clear_node(popup);
		parent.removeChild(popup);
		//Sets noop
		document.getElementById("tool_no_op").checked=true;
		remove_all_events();
		_OP_USER = new Idle();
	}
}

function register_mouse_down_handler(handler)
{
	try{
		if(document.removeEventListener)
			document.getElementById( _MAP_ID ).removeEventListener("mousedown",_EVENT_LISTENER,false);
		else
		{
			document.getElementById( _MAP_ID ).onmousedown=null;
			if(document.attachEvent)
				document.getElementById( _MAP_ID ).releaseCapture();
		}
		
		remove_popup();
		
		_EVENT_LISTENER=handler;
		
		if(document.addEventListener)
		{
			document.getElementById( _MAP_ID ).addEventListener("mousedown",handler,false);	
		}
		else
		{
			document.getElementById( _MAP_ID ).onmousedown=handler;
            //14.04.2009 removed for preventing toolbas icons fire events to the map
//			if(document.attachEvent)
//				document.getElementById( _MAP_ID ).setCapture();
		}
		

	}catch(e)
	{
		alert("Eventsmanager.register_mouse_down_handler(): "+e);
		return false;
	}
}

function register_mouse_move_handler(event)
{
	try{
		if(document.addEventListener)
		{
			document.getElementById( _MAP_ID ).addEventListener("mousemove",mappa_mouse_move,false);
			document.getElementById( _MAP_ID ).addEventListener("mouseup",mappa_mouse_up,false);
		}else 
		{
			document.getElementById( _MAP_ID ).onmousemove=mappa_mouse_move;
			document.getElementById( _MAP_ID ).onmouseup=mappa_mouse_up;
			if(document.attachEvent)
			{
				document.getElementById( _MAP_ID ).setCapture();
			}
		}
	
	}catch(e)
	{
		alert("Eventsmanager.register_mouse_move_handler(): "+e);
		return false;
	}
}

function register_mous_up_handler(event)
{
	try{
		if(document.addEventListener)
		{
			document.getElementById( _MAP_ID ).addEventListener("mouseup",mappa_mouse_up,false);
		}else 
		{
			document.getElementById( _MAP_ID ).onmouseup=mappa_mouse_up;
			if(document.attachEvent)
			{
				document.getElementById( _MAP_ID ).setCapture();
			}
		}
		
	}catch(e)
	{
		alert("Eventsmanager.register_mouse_up_handler(): "+e);
		return false;
	}
}

function register_key_enter_event_listenter(handler)
{
	try{
		//Frist remove
		if(document.removeEventListener)
			document.removeEventListener("keyup",_KEY_EVENT_LISTENER,false);
		else
		{
			document.onkeyup=null;
			
			if(document.attachEvent)
				document.releaseCapture();
		}
		
		if(handler == null)
			return;
	
		if ( document.addEventListener )
            document.addEventListener("keyup", handler, false);
      else if ( document.attachEvent )
            document.attachEvent("onkeyup", handler);
      else
            document.onkeyup = handler
            
//      if (document.layers) document.captureEvents(Event.KEYUP);
      
      _KEY_EVENT_LISTENER=handler;
		 

	}catch(e)
	{
		alert("Eventsmanager.register_key_enter_event_listenter(): "+e);
		return false;
	}
}

function remove_all_events()
{
	try{
		if(document.removeEventListener)
		{
			document.getElementById( _MAP_ID ).removeEventListener("mousedown",_EVENT_LISTENER,false);
			document.getElementById( _MAP_ID ).removeEventListener("mousemove",mappa_mouse_move,false);
            document.getElementById( _MAP_ID ).removeEventListener("mousemove",mappa_mouse_over,false);
			document.getElementById( _MAP_ID ).removeEventListener("mouseup",mappa_mouse_up,false);
		}
		else
		{
			document.getElementById( _MAP_ID ).onmousedown=null;
			document.getElementById( _MAP_ID ).onmousemove=null;
			document.getElementById( _MAP_ID ).onmouseup=null;

			if(document.attachEvent)
			{
				document.getElementById( _MAP_ID ).releaseCapture();
			}
		}
	}catch(e)
	{
		alert("Eventsmanager.remove_all_events(): "+e);
		return false;
	}
}

function evt_add_layer(name,active,list_objects,list_urls)
{
	try{
		var form= document.forms[0];
		var div = document.createElement("div");
		
		div.onclick=function(){_MAP_WRAPPER.evt_select_layer(this);}
		
		if(_MAP_WRAPPER.is_layer_selected(name))
			div.className="layer_selected";
		else
			div.className="layer";

		var chck = document.createElement("input");
        chck.type='checkbox';
        chck.name='livello';
        chck.onclick=Function('layer_change(this);');
        chck.value=name;
        div.id=name;
        
        div.appendChild(chck)
        div.appendChild(document.createTextNode(name))
        form.appendChild(div);
		
		if(active == "true")
		{
			chck.checked=true;
			for(var i=0;i<list_objects.length;i++)
			{
				var obj_name=list_objects[i];
				var url_image=list_urls[i];
                var img = document.createElement('img');
                img.src=url_image;
                img.onload=layer_image_loaded;
                form.appendChild(img);
                form.appendChild( document.createTextNode(obj_name) );
                form.appendChild(document.createElement("br"));
			}
		}
		
	}catch(e)
	{
		alert("Events_Manager.evt_add_layer(): "+e);
		return false;
	}
}

function layer_image_loaded()
{
	_IMAGES_TO_LOAD--;
	if(_IMAGES_TO_LOAD == 0)
		reload_map("type=map&action=load");
}

function stop_propagating_event(event)
{
	try{
		if(event.stopPropagation)
			event.stopPropagation();
		else
			event.cancelBubble=true;
		
		//Prevent default
		if(event.preventDefault)
			event.preventDefault();
		else
			event.returnValue=false;
		}
	catch(e)
	{
		alert("Eventsmanager.stop_propagating_event() "+e);
		return false;
	}
}

function process_mouse_down(event,obj)
{
	try{
        
		if(!event)
			event=window.event;
		register_mouse_move_handler(event);	
		
		_OP_USER = obj;
		_OP_USER.mouse_down(event);
	}
	catch(e)
	{
		alert("Parkings_Events_Manager.evt_but_select_parking(): "+e);
		return false;
	}
	
}

function draw_extra_graphics(new_graphics)
{
	if(new_graphics)
		_jg = new jsGraphics(_MAP_ID);
	else
		_jg = _jg == null ? new jsGraphics(_MAP_ID):_jg;
	_jg.setPrintable(false);
	for(var i=0; i < _LIST_OF_EXTRA_GRAPHICS.length; i++)
		_LIST_OF_EXTRA_GRAPHICS[i].draw();
		
	_jg.paint();
}

function reset_extra_graphics()
{	
	clear_points();
	clear_linepath();
	clear_polygon();
	clear_polar_figure();
    clear_lines();
	_ID_GEOMETRY = -1;
	
	for(var i=0; i < _LIST_OF_EXTRA_GRAPHICS.length; i++)
		_LIST_OF_EXTRA_GRAPHICS[i].clear();
		
	_jg = _jg == null ? new jsGraphics(_MAP_ID):_jg;
	_jg.clear();
	_jg = null;
	_LIST_OF_EXTRA_GRAPHICS.splice(0,_LIST_OF_EXTRA_GRAPHICS.length);
	_LIST_OF_EXTRA_GRAPHICS.push(new Extra_Graphics());
	
}
function clear_extra_graphics()
{
	_jg = _jg == null ? new jsGraphics(_MAP_ID):_jg;
	_jg.clear();
}

function remove_from_extra_graphics(object)
{
	for(var i=0; i < _LIST_OF_EXTRA_GRAPHICS.length; i++)
	{
		if(_LIST_OF_EXTRA_GRAPHICS[i] === object)
		{
			_LIST_OF_EXTRA_GRAPHICS.splice(i,1);
			break;
		}
	}
	clear_extra_graphics();
}

function evt_create_plot(event)
{
	process_mouse_down(event,new Evt_Create_Plot());
}
function show_popup_menu(event,obj)
{
	try{
		if( !event )
			event = window.event;
		obj.show(event.clientX,event.clientY);
                change_selected_tool(null);
	}catch(e)
	{
	    alert("Eventsmanager.show_popup_menu(): "+e);
	    return false;
	}
}

function change_language(lang){
    window.location.href=window.location.href.replace(/(\?.*)/,"")+"?lang="+lang+"&rand="+Math.random();
}

