var map_overIcon = false;

var vspc = 0;
var hspc = 0;

var map_zoomMode = "";
var mapContainer = null;

var map_mouseX = 0;
var map_mouseY = 0;
	
var map_xdown = 0;
var map_ydown = 0;
	
var map_xup = 0;
var map_yup = 0;

var zleft = 0;
var ztop = 0;

var zright = 0;
var zbottom = 0;
	
var map_zooming = false;

var x1 = 0;
var y1 = 0;

var x2 = 0;
var y2 = 0;

var drag = false;
var dragX = 0;
var dragY = 0;

var xycounter = 0;
var over = null;
var ns4 = (document.layers)? true:false
var ie4 = (document.all)? true:false

function setZoomMode(zoomMode) 
	{

	var mapStyle = null;

	// getElementById restituisce l'elemento (oggetto) il cui ID e' stato specificato
	if (document.getElementById)
		mapStyle = document.getElementById('zoomat').style;

	else if (document.all)
		mapStyle = document.all.zoomat.style;

	else if (document.layers)
		mapStyle = document.layers['zoomat'].style;

	if (zoomMode == 'in' || zoomMode == 'out')
		mapStyle.cursor = "hand";
			
	else if(zoomMode == 'area')
		mapStyle.cursor = "crosshair";

	else if(zoomMode == 'drag')
		mapStyle.cursor = "move";
			
	else
		mapStyle.cursor = "hand";

	// Assegno alla variabile globale il tipo di zoom correntemente scelto
	map_zoomMode = zoomMode;

	document.map_form.map_zoom.value = zoomMode;
}

function createZoomBox() 
	{

	// Verifico se il browser supporta il DHTML
	var DHTML = (document.getElementById);
	if (!DHTML) 
		return;

	onResize();
	setZoomBoxSettings();

	var zBgColor ="#000000";

	// Creo i tag DIV su cui tracciare il rettangolo (uno per ogni lato del rettangolo)
	createLayer("zoomBoxTop",hspc,vspc,map_width,map_height,false,zBgColor);
	createLayer("zoomBoxLeft",hspc,vspc,map_width,map_height,false,zBgColor);
	createLayer("zoomBoxRight",hspc,vspc,map_width,map_height,false,zBgColor);
	createLayer("zoomBoxBottom",hspc,vspc,map_width,map_height,false,zBgColor);

	//window.status = 'hspc=' + hspc + ' - vspc=' + vspc;
}

function setZoomBoxSettings() 
	{

    mapContainer = document.getElementById('map');
    if (!mapContainer)
        return;

    addEventListenerEx(mapContainer, 'mousedown', MouseDown, true);
    addEventListenerEx(mapContainer, 'mousemove', MouseMove, true);
    addEventListenerEx(mapContainer, 'mouseup', MouseUp, false);
    addEventListenerEx(mapContainer, 'mouseout', MouseOut, false);

    addEventListenerEx(mapContainer, 'draggesture', Cancel, false);
    addEventListenerEx(mapContainer, 'dragstart', Cancel, false);

}

function addEventListenerEx(EventSource,EventType,EventHandler,captures) 
	{
    captures = (captures) ? captures : false;
	    
    if ( document.addEventListener ) {
        EventSource.addEventListener(EventType,EventHandler,captures);
	        
    } else if (document.attachEvent) {
        EventType = 'on' + EventType;
        EventSource.attachEvent(EventType,EventHandler);
	        
    } else {
        EventType = 'on' + EventType;
        EventSource[EventType] = EventHandler;
    }
}

function MouseDown(evt) 
	{
	onResize();
	getImageXY(evt);

	map_xdown = document.map_form.map_xdown.value = map_mouseX;
	map_ydown = document.map_form.map_ydown.value = map_mouseY;

	switch(map_zoomMode) 
		{
		case 'in':
			document.map_form.map_action.value = 'zoom';
			document.map_form.submit();
			return true;

			break;

		case 'out':
			document.map_form.map_action.value = 'zoom';
			document.map_form.submit();
			return true;

			break;

		case 'info':
			document.map_form.map_action.value = 'zoom';
			document.map_form.submit();
			return true;

			break;

		case 'sposta':
			document.map_form.map_action.value = 'zoom';
			document.map_form.submit();
			return true;

			break;

		case 'area':
			if (!map_zooming )
				{

				startZoomBox(evt);
				return false;
				} 
				else 
					{
					MouseMove(evt);
					}

				return true;

			break;

		case 'drag':
			DragStart(evt);

			break;

		case 'multiplexy':
			xycounter++; 
			
			if (xycounter>=50) 
				{
				alert('si possono selezionare al massimo 50 zone per volta');
				return false;
			}

			var myOverDiv = document.getElementById('overDiv'+xycounter);
			
			if ( (ns4) || (ie4) ) 				{
				if (ns4) over = document.myOverDiv
				if (ie4) over = myOverDiv.style
			}
			
			var oOption = document.createElement("OPTION"); 
			oOption.text="x: "+map_xdown+' - y:'+map_ydown; 
			oOption.value=map_xdown+"|"+map_ydown; 
			oOption.selected=true;
			document.map_form.mapxy.add(oOption);
			
			var txt = "<img src=icone/ico_show.gif alt=selezione>"
			layerWrite(txt, xycounter);
			layerMoveTo(over,map_xdown+hspc-8,map_ydown+vspc-8);			
			break;
			
		default: // same as case else
			break;
		}

	return true;
}

function MouseMove(evt) 
	{

	if (map_zoomMode=="drag")
		{
		Drag(evt);			
		return false;
	}

	if (map_zoomMode=='area' && map_zooming) 
			{

			getImageXY(evt);

			if (map_mouseX < 0)
				map_mouseX = 0;
					
			if (map_mouseX > map_width)
				map_mouseX = map_width;
					
			if (map_mouseY < 0)
				map_mouseY = 0;
					
			if (map_mouseY > map_height)
				map_mouseY = map_height;

			x2 = map_mouseX;
			y2 = map_mouseY;

			map_xup = document.map_form.map_xup.value = x2;
			map_yup = document.map_form.map_yup.value = y2;

			// Associa le coordinate del mouse al rettangolo da disegnare
			setClip();
			return false;
	}

			
	return true;
}

function MouseOut(evt) 
	{
	if (map_zoomMode=='area')
		{
			
		if (map_zooming) 
			{

			getImageXY(evt);

			if (map_mouseX < 0)
			 	map_mouseX = 0;
				 	
			if (map_mouseX > map_width)
				map_mouseX = map_width;
					
			if (map_mouseY < 0)
				map_mouseY = 0;
					
			if (map_mouseY > map_height)
				map_mouseY = map_height;

			stopZoomBox(evt);
				
			document.map_form.map_action.value = 'zoom';
			document.map_form.submit();
		}
			
		return true;
	}

	if (map_zoomMode=='drag')
		{
		DragAutoEnd(evt);
		return true;
	}
		
	return true;
}

function MouseUp(evt) 
	{

	switch(map_zoomMode) 
		{

		case 'area':
			if (map_zooming) 
				{
				if (map_mouseX < 0)
				 	map_mouseX = 0;
					 	
				if (map_mouseX > map_width)
					map_mouseX = map_width;
						
				if (map_mouseY < 0)
					map_mouseY = 0;
						
				if (map_mouseY > map_height)
					map_mouseY = map_height;

				stopZoomBox(evt);
					
				document.map_form.map_action.value = 'zoom';
				document.map_form.submit();
			}

			break;

		case 'drag':
			DragEnd(evt);

			break;

		case 'multiplexy':
			break;
			
		default: // same as case else
			break;
		}
		
	return true;
}

function getImageXY(evt) 
	{
	if(!evt) var evt = window.event;

	if(evt.pageX || evt.pageY) 
		{
		map_mouseX = evt.pageX;
		map_mouseY = evt.pageY;
		}
		else 
			{
			map_mouseX = evt.clientX + document.body.scrollLeft - 2;
			map_mouseY = evt.clientY + document.body.scrollTop - 2;
			}

	map_mouseX = map_mouseX - hspc;
	map_mouseY = map_mouseY - vspc;

	//window.status = 'X=' + (evt.clientX-hspc) + ' - Y=' + (evt.clientY-vspc) + ' - hspc=' + hspc + ' - vspc=' + vspc + '- map_zoomMode=' + map_zoomMode + ' - map_zooming=' + map_zooming;

}

function onResize() 
	{
	var oMap = document.getElementById('zoomat');

	vspc = oMap.offsetTop; //custom values
	hspc = oMap.offsetLeft;

	var parent = oMap.offsetParent;


	while(parent.tagName != "BODY") {
		vspc += parent.offsetTop;
		hspc += parent.offsetLeft;
		parent = parent.offsetParent;
	}

	//window.status = 'Left hspc:' + hspc + 'Top vspc' + vspc;

}

// Disegna il rettangolo sulla mappa
function startZoomBox(evt)
	{
	getImageXY(evt);

	if ((map_mouseX < map_width) && (map_mouseY < map_height)) 
		{
		if (!map_zooming) 
			{
			x1=map_mouseX;
			y1=map_mouseY;
				
			x2=x1+1;
			y2=y1+1;
				
			clipLayer("zoomBoxTop",(x1+hspc),(y1+vspc),(x2+hspc),(y2+vspc));
			clipLayer("zoomBoxLeft",(x1+hspc),(y1+vspc),(x2+hspc),(y2+vspc));
			clipLayer("zoomBoxRight",(x1+hspc),(y1+vspc),(x2+hspc),(y2+vspc));
			clipLayer("zoomBoxBottom",(x1+hspc),(y1+vspc),(x2+hspc),(y2+vspc));
				
			map_zooming=true;
				
			showLayer("zoomBoxTop");
			showLayer("zoomBoxLeft");
			showLayer("zoomBoxRight");
			showLayer("zoomBoxBottom");
			}
		}
		else 
			{
			if (map_zooming)
				stopZoomBox(evt);
	}
	
	return false;
}

function stopZoomBox(evt)
	{
	map_zooming = false;

	if ( zright < zleft + 4 && ztop < zbottom + 4 )
		{
		// Se il rettangolo e' troppo piccolo
		zright = zleft;
		zbottom = ztop;
		}
	return true;
}

// Associa le coordinate del mouse al rettangolo da disegnare durante l'evento MOUSEMOVE
function setClip() 
	{

	if (x1 > x2) 
		{
		zright = x1;
		zleft = x2;
		} 
		else 
			{
			zleft = x1;
			zright = x2;
			}
				
	if (y1 > y2) 
		{
		zbottom = y1;
		ztop = y2;
			
		}
		else 
			{
			ztop = y1;
			zbottom = y2;
			}
		
	if (x1 != x2 && y1 != y2) 
		{

		var ovBoxSize = 2;// Dimensione linea rettangolo
		// Visualizza le linee

		//window.status = 'zleft=' + zleft + 'ztop=' + ztop + 'zright=' + zright + 'zbottom=' + zleft + 'x1=' + x1;
			
		clipLayer("zoomBoxTop",zleft,ztop,zright,ztop+ovBoxSize);
		clipLayer("zoomBoxLeft",zleft,ztop,zleft+ovBoxSize,zbottom);
		clipLayer("zoomBoxRight",zright-ovBoxSize,ztop,zright,zbottom);
		clipLayer("zoomBoxBottom",zleft,zbottom-ovBoxSize,zright,zbottom);
	}
}
	
function DragStart(evt)
	{
	drag = true;
	dragX = map_mouseX;
	dragY = map_mouseY;
}

function Drag(evt)
	{
    if (!drag)
        return false;

    var map = mapContainer.firstChild;
    if (!map) 
        return false;

	getImageXY(evt);

    var dX = map_mouseX - dragX;
    var dY = map_mouseY - dragY;

    map.style.left = dX + 'px';
    map.style.top = dY + 'px';

	evt.cancelBubble = true;
	return false;
}
		
function DragAutoEnd(evt)
	{
	getImageXY(evt);
			
	if (drag) 
		{
		if (map_mouseX < 0)
		 	map_mouseX = 0;
				 	
		if (map_mouseX > map_width)
			map_mouseX = map_width;
					
		if (map_mouseY < 0)
			map_mouseY = 0;
					
		if (map_mouseY > map_height)
			map_mouseY = map_height;

		var dX = map_mouseX - dragX;
		var dY = map_mouseY - dragY;
				
		UpdateMap(dX, dY);
	}
}

function DragEnd(evt)
	{

	if (!drag)
	    return;

	drag = false;

	getImageXY(evt);
			
	var dX = map_mouseX - dragX;
	var dY = map_mouseY - dragY;

	if (dX == 0 && dY == 0)
	    return;

	UpdateMap(dX, dY);
}

function UpdateMap(deltaX, deltaY)
	{

	document.map_form.map_xdrag.value = deltaX;
	document.map_form.map_ydrag.value = deltaY;
		
	document.map_form.map_action.value = 'drag';
	document.map_form.submit();
	
}

function Cancel(evt)
	{
    evt.cancelBubble = true;
}

// Writes to a layer
function layerWrite(txt, cnt) {

		var myOverDiv = document.getElementById('overDiv'+cnt);
        if (ns4) {
                var lyr = document.myOverDiv.document;
                lyr.write(txt);
                lyr.close();
        }
        else 
			{
			if (ie4) 
				{
				myOverDiv.innerHTML = txt;
			}
		}
}

// Move a layer
function layerMoveTo(obj,xL,yL) {
        obj.left = xL;
        obj.top = yL;
}
