// Sintassi supportata dai browser maggiormente utilizzati
// document.all (IE),
// document.layers (Netscape 4.x)
// document.getElementById (Netscape 6+, IE 5+ and all standards compliant browsers).
// Attenzione: IE 5.5+ supporta sia  document.all che document.getElementById
var LEFT_BUTTON = 1;
var vspc = 0;
var hspc = 0;

/*------------------------------------------------------------------------------
	Richiamata quando si fa clic per cambiare il modo di zoom.
	zoomMode può valere: 'in', 'out' e 'area'.

	Modifica la modalità dello zoom interattivo e imposta la relativa forma
	del cursore quando questo passa sopra all'immagine.
------------------------------------------------------------------------------*/
function setZoomMode(zoomMode) {
	// getElementById restituisce l'elemento (oggetto) il cui ID e' stato specificato
	if (document.getElementById)
		var mapStyle = document.getElementById("map_img").style;
	else if (document.all)
		var mapStyle = document.all.map_img.style;
	else if (document.layers)
		var mapStyle = document.layers['map_img'].style;

	if (zoomMode == 'in' || zoomMode == 'out')
		mapStyle.cursor = "hand";
	else if(zoomMode == 'area')
		mapStyle.cursor = "crosshair";
	else
		mapStyle.cursor = "hand";

	// Assegno alla variabile globale il tipo di zoom correntemente scelto
	map_zoomMode = zoomMode;
}

function createZoomBox() {
	// Verifico se il browser supporta il DHTML
	var DHTML = (document.getElementById);
	if (!DHTML) 
		return;

	setZoomBoxSettings();

	var zBgColor ="#00675B";

	// 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);
}

/*------------------------------------------------------------------------------
	Inizializza i gestori degli eventi.
------------------------------------------------------------------------------*/
function setZoomBoxSettings() {
	if (document.layers) {
		// document.captureEvents indica all'oggetto documento quali elementi catturare
		document.captureEvents(Event.MOUSEMOVE);
		document.captureEvents(Event.MOUSEDOWN);
		document.captureEvents(Event.MOUSEUP);
	}
	document.onmousemove = getMouse;
	document.onmousedown = mapTool;
	document.onmouseup = mouseUp;
}

/*------------------------------------------------------------------------------
	Gestisce il rilascio del pulsante del mouse.
------------------------------------------------------------------------------*/
function mouseUp(e) {
	// Come posso sapere se l'utente ha premuto i tasto sx o dx del mouse?
	// Risposta: l'evento click accade solo per il tasto sx del mouse. Percio',
	// il gestore dell'evento onClick non ha bisogno di verificare se si tratta
	// di tasto sx o dx.
	// D'altra parte , gli eventi mousedown e mouseup possono verificarsi per ogni
	// tasto del mouse. Per determinare se l'utente ha cliccato sul tasto sx o dx
	// si possono utilizzare le seguenti proprieta' degli eventi:
	//	event.which in Netscape Navigator
	//	event.button in Internet Explorer
	// Se il valore di queste proprietà vale 1, l'evento e' partito dal tasto sx.
	var button;	

	if (map_overIcon)
		return false;

	if (document.layers || navigator.appName == "Netscape")
		button = e.which;
	else
		button = event.button;

	if(button != LEFT_BUTTON)
		return;
	
	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(e);
		document.map_form.map_action.value = 'zoom';
		document.map_form.submit();
	}
	else {
		if(map_zoomMode != "area") {
			// Recupera le coordinate del mouse
			getImageXY(e);
			if (map_mouseX >= 0 && map_mouseX < map_width 
				&& map_mouseY >= 0 && map_mouseY < map_height) {
				zleft = map_mouseX;
				ztop = map_mouseY;
				document.map_form.map_action.value = 'zoom';
				document.map_form.submit();
			}
		}
	}
}

/*------------------------------------------------------------------------------
	Gestisce l'evento MOUSEDOWN.
------------------------------------------------------------------------------*/
function mapTool (e) {
	// Come posso sapere se l'utente ha premuto i tasto sx o dx del mouse?
	// Risposta: l'evento click accade solo per il tasto sx del mouse. Percio',
	// il gestore dell'evento onClick non ha bisogno di verificare se si tratta
	// di tasto sx o dx.
	// D'altra parte , gli eventi mousedown e mouseup possono verificarsi per ogni
	// tasto del mouse. Per determinare se l'utente ha cliccato sul tasto sx o dx
	// si possono utilizzare le seguenti proprieta' degli eventi:
	//	event.which in Netscape Navigator
	//	event.button in Internet Explorer
	// Se il valore di queste proprietà vale 1, l'evento e' partito dal tasto sx.
	var button;
	if (map_overIcon)
		return false;

	if (document.layers || navigator.appName == "Netscape")
		button = e.which;
	else
		button = event.button;

	if(button != LEFT_BUTTON)
		 return;

	onResize();

	// Recupera le coordinate del mouse
	getImageXY(e);
	map_xdown = document.map_form.map_xdown.value = map_mouseX;
	map_ydown = document.map_form.map_ydown.value = map_mouseY;

	// Verifico che le condizioni per disegnare il rettangolo siano soddisfatte
	if (!map_zooming && map_zoomMode == "area" 
		&& map_mouseX >=0  && map_mouseX<map_width
		&& map_mouseY >=0 && map_mouseY<map_height) {
		startZoomBox(e);
		return false;
	}
	else if (map_zooming) {
		getMouse(e);
		//stopZoomBox(e);
	}
	return true;
}

/*------------------------------------------------------------------------------
	Salva la posizione del mouse nelle variabili globali x2 e y2.

	Viene configurata da createZoomBox() per essere richiamata automaticamente
	quando viene spostato il mouse.
------------------------------------------------------------------------------*/
// Funzione che si occupa di gestire l'evento MOUSEMOVE
function getMouse(e) {
	if (map_overIcon)
		return false;

	// Se si sta disegnando il rettangolo controllo che le coordinate del mouse
	// non escano dall'immagine mappa
	if (map_zooming) {
		// Recupera le coordinate del mouse
		getImageXY(e);
		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;
	} else
		return true;
}
/*------------------------------------------------------------------------------
	Recupera le coordinate di un evento del mouse relativamente all'immagine
	visualizzata.

	Salva le coordinate recuperate nelle variabili globali map_mouseX e
	map_mouseY.

	Tiene conto di un eventuale scroll del tag BODY.
------------------------------------------------------------------------------*/
function getImageXY(e) {
	//if (document.layers || navigator.appName == "Netscape") { //Ns
	if(!e) var e = window.event;
	if(e.pageX || e.pageY) {
		// pageX = restituisce la coordinata orizontale dell'oggetto evento,
		// rispetto alla pagina visibile in quel momento
		map_mouseX = e.pageX;
		// pageY = restituisce la coordinata verticale dell'oggetto evento,
		// rispetto alla pagina visibile in quel momento
		map_mouseY = e.pageY;
	}
	//else if (navigator.appName == "Microsoft Internet Explorer"){//IE
	else {
		// clientX = imposta o restituisce la coordinata orizontale del puntatore
		// del mouse relativa alla finestra, escluse le scrollbar.
		// Siccome la proprieta' clientX restituisce un valore relativo alla finestra,
		// si puo' aggiungere il valore della proprieta' scrollLeft per determinare
		// la distanza della coordinata orizontale dall'angolo del elemento body
		map_mouseX = event.clientX + document.body.scrollLeft - 2;
		// clientY = imposta o restituisce la coordinata veriticale del puntatore
		// del mouse relativa alla finestra, escluse le scrollbar.
		// Siccome la proprieta' clientY restituisce un valore relativo alla finestra,
		// si puo' aggiungere il valore della proprieta' scrollTop per determinare
		// la distanza della coordinata orizontale dall'angolo del elemento body
		map_mouseY = event.clientY + document.body.scrollTop - 2;
	}

	//window.status = 'X=' + map_mouseX + 'Y=' + map_mouseY + 'hspc:' + hspc + 'vspc' + vspc;

	// Sottraggo lo scostamento dall' angolo in alto a sinistra della pagina
	map_mouseX = map_mouseX-hspc;
	map_mouseY = map_mouseY-vspc;
}

// Disegna il rettangolo sulla mappa durante l'evento MOUSEDOWN
function startZoomBox(e) {
	// Recupera le coordinate del mouse
	getImageXY(e);
	// Controllo che il mouse sia all'interno della mappa
	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,y1,x2,y2);
			clipLayer("zoomBoxLeft",x1,y1,x2,y2);
			clipLayer("zoomBoxRight",x1,y1,x2,y2);
			clipLayer("zoomBoxBottom",x1,y1,x2,y2);
			map_zooming=true;
			showLayer("zoomBoxTop");
			showLayer("zoomBoxLeft");
			showLayer("zoomBoxRight");
			showLayer("zoomBoxBottom");
		}
	}
	else {
		if (map_zooming)
			stopZoomBox(e);
	}
	return false;
}

// Stop zoom box display... zoom in/out
function stopZoomBox(e) {
	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;
	}

	//window.status = 'left=' + zleft + 'top=' + ztop + 'right:' + zright + 'bottom' + zbottom;

	if ((x1 != x2) && (y1 != y2)) {
		var ovBoxSize = 2;// Dimensione linea rettangolo
		// Visualizza le linee
		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 hideZoomBox() {
	hideLayer("zoomBoxTop");
	hideLayer("zoomBoxLeft");
	hideLayer("zoomBoxRight");
	hideLayer("zoomBoxBottom");
}

// Determina il posizionamento della mappa rispetto al BODY e richiama la
// funzione che adegua il posizionamento dei DIV (layer) alla mappa
// Tale funzione viene richiamata dall'evento MOUSEDOWN
function onResize() {
	var oMap = document.getElementById("map_img");

	//if( document.all)
	//{
		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;
		}
	//}
	//else
	//{
	//	vspc = oMap.offsetTop;
	//	hspc = oMap.offsetLeft;
	//}

	//window.status = 'Left hspc:' + hspc + 'Top vspc' + vspc;

	//moveLayer( "zoomBoxTop", hspc, vspc);
	//moveLayer( "zoomBoxLeft", hspc, vspc);
	//moveLayer( "zoomBoxRight", hspc, vspc);
	//moveLayer( "zoomBoxBottom", hspc, vspc);
}