/*



ITImageSelect: ibreria gestione selezione di parti di immagini per funzioni di zoom e simili



Copyright © 2001 InfoTecna s.r.l.



Testato con IE 5.0, 5.5 e 6.0, Mozilla 1.0, Opera 6



Vedere l'allegato ITImageSelect.html per un esempio d'uso



Le funzioni di interfaccia sono le seguenti:



-- Inizializzazione

ITISAvailable() - Ritorna true se la funzionalità è disponibile

ITISSetZoomBoxId(ZBId) - Imposta l'Id della zoom box. Di default è ITISZoomBox.

ITISSetMapImageId(MIId) - Imposta l'Id dell'imagine mappa. Di default è ITISMapImage.



-- Recupero informazioni sulla zoom box

ITISIsZBZoom() - Ritorna true se l'utente ha creato una vera e propria zoom box, false se è un semplice click.

ITISGetZBOffsetX() - Ritorna l'offset X della zoom box rispetto alla mappa.

ITISGetZBOffsetY() - Ritorna l'offset Y della zoom box rispetto alla mappa.

ITISGetZBWidth() - Ritorna la larghezza della zoom box. Vale sempre 0 se ITISIsZBZoom() ritorna false.

ITISGetZBHeight() - Ritorna l'altezza della zoom box. Vale sempre 0 se ITISIsZBZoom() ritorna false.



-- Gestione eventi, ritornano true quando l'evento è gestito completamente

ITISStartBDraw(evt) - Da impostare come script di risposta sull'evento onmousedown dell'area di selezione, passando come parametro 'event'.

ITISDragBDraw(evt) - Da impostare come script di risposta sull'evento onmousemove dell'area di selezione, passando come parametro 'event'.

ITISStopBDraw(evt) - Da impostare come script di risposta sull'evento onmouseup dell'area di selezione, passando come parametro 'event'.

ITISZBDragBDraw(evt) - Da impostare come script di risposta sull'evento onmousemove della zoom box, passando come parametro 'event'.



*/



// Affinché il sistema di zoom funzioni è necessario il supporto per la GetElementById()

var ITISHasGEBID = document.getElementById != null;



// Id della zoom box con default

var ITISZoomBoxId = 'ITISZoomBox';



// Id della mappa con default

var ITISMapImageId = 'ITISMapImage';



// Verifica se la funzionalità è disponibile

function ITISAvailable()

	{

		return(ITISHasGEBID);

	}



// Imposta l'id  della ZoomBox

function ITISSetZoomBoxId(ZBId)

	{

		ITISZoomBoxId = ZBId;

	}



// Imposta l'id della mappa

function ITISSetMapImageId(MIId)

	{

		ITISMapImageId = MIId;

	}



// Recupera la posizione assoluta X del mouse dall'evento

function ITISGetMouseAbsPosX(evt)

	{		

		// Netscape, Mozilla

		if (typeof evt.pageX == 'number')

			return(evt.pageX);

			

		// Opera

		if(top.opera != null && evt.clientX != null)

			return(evt.clientX); 

			

		// Internet Explorer

		if (evt.clientX != null)

    	if(window.document.compatMode == null || window.document.compatMode == 'BackCompat')

    		return((evt.clientX + document.body.scrollLeft) - 3); // Internet explorer < 6, ignoto il motivo dell'offset di 3 pixel

    	else

    		return((evt.clientX + document.documentElement.scrollLeft) - 3); // Internet explorer 6+, ignoto il motivo dell'offset di 3 pixel					

				

		// Impossibile recuperare la coordinata

		return 0;

	}



// Recupera la posizione assoluta Y del mouse dall'evento

function ITISGetMouseAbsPosY(evt)

	{

		// Netscape, Mozilla

		if (typeof evt.pageY == 'number')

			return(evt.pageY);

			

		// Opera

		if(top.opera != null && evt.clientY != null)

			return(evt.clientY); 

			

		// Internet Explorer

		if (evt.clientY != null)

    	if(window.document.compatMode == null || window.document.compatMode == 'BackCompat')

    		return((evt.clientY + document.body.scrollTop) - 3); // Internet explorer < 6, ignoto il motivo dell'offset di 3 pixel

    	else

    		return((evt.clientY + document.documentElement.scrollTop) - 3); // Internet explorer 6+, ignoto il motivo dell'offset di 3 pixel					

				

		// Impossibile recuperare la coordinata

		return 0;

	}



// Funzioni matematiche ausiliarie

function ITISAbs(X)

	{

		if (X < 0)

			return -X;

		else

			return X;

	}



function ITISMin(X,Y)

	{

		if (X < Y)

			return X;

		else

			return Y;

	}



function ITISMax(X,Y)

	{

		if (X < Y)

			return Y;

		else

			return X;

	}



// Imposta la visibilità della ZoomBox

function ITISSetZBoxVisible(visible)

	{

		// Recupera la ZoomBox

		var ZBox = document.getElementById(ITISZoomBoxId);



		// Imposta la visibilità

		if (visible)

			ZBox.style.visibility = 'visible';

		else

			ZBox.style.visibility = 'hidden';

	}



// Verifica la visibilità della zoom box

function ITISGetZBoxVisible()

	{

		// Recupera la ZoomBox

		var ZBox = document.getElementById(ITISZoomBoxId);



		// Ritorna la visibilità

		return(ZBox.style.visibility == 'visible');

	}



// Imposta la posizione della zoom box

function ITISSetZBoxPosition(left,top,width,height)

	{

		// Recupera la ZoomBox

		var ZBox = document.getElementById(ITISZoomBoxId);



		// Imposta la posizione

		ZBox.style.left = left;

		ZBox.style.top = top;

		ZBox.style.width = width;

		ZBox.style.height = height;

	}



// Recupera la posizione assoluta di un elemento

function ITISGetElmAbsOffset(ElmId)

	{

		var lx = 0;

		var ly = 0;



		var elm = document.getElementById(ElmId);



		if (elm.pageX != null) // Netscape, Mozilla

			return({offsetX:elm.pageX,offsetY:elm.pageX});



		if (elm.x != null) // Opera

			return({offsetX:elm.x,offsetY:elm.y});



		while (elm != null) // Internet explorer

			{

				lx += elm.offsetLeft;

				ly += elm.offsetTop;

				elm = elm.offsetParent;

			}



		return({offsetX:lx,offsetY:ly});

	}



// Recupera il bottone premuto da un'evento

// Ritorna 'none', 'left', 'right', 'middle'

function ITISGetMouseButton(evt)

	{

		// Mozilla, Netscape, Opera

		if (evt.which != null)

			switch (evt.which)

				{

					case 1:

						return('left');

					case 2:

						return('middle');

					case 3:

						return('right');

				}



		// Internet Explorer

		if (evt.button != null)

			switch (evt.button)

				{

					case 0:

						return('none');

					case 1:

						return('left');

					case 2:

						return('right');

					case 4:

						return('middle');

				}



		// Default, Opera

		return('left');

	}



// Punto partenza disegno ZoomBox

var ITISZBX;

var ITISZBY;



// Tracciatura posizione effettiva zoom box

var ITISEZBX = 0;

var ITISEZBY = 0;

var ITISEZBW = 0;

var ITISEZBH = 0;



// Salvataggio offset ZoomBox

var ITISOZBX = 0;

var ITISOZBY = 0;



// Tipo zoom box

var ITISZBZoom;



// Flagg avvio drag

var ITISBDrag = false;



// Recupero tipo zoom box

function ITISIsZBZoom()

	{

			return(ITISZBZoom);

	}



// Recupero posizione e dimensione zoom box

function ITISGetZBOffsetX()

	{

		return(ITISOZBX);

	}



function ITISGetZBOffsetY()

	{

		return(ITISOZBY);

	}



function ITISGetZBWidth()

	{

		return(ITISEZBW);

	}



function ITISGetZBHeight()

	{

		return(ITISEZBH);

	}



// Termina il disegno della zoom box

function ITISStopBDraw(evt)

	{

		// Controlla se era in esecuzione

		if (ITISBDrag)

			{

				// Controlla che sia il bottone corretto

				if (ITISGetMouseButton(evt) != 'left')

					// Funzionalità non disponibile

					return(false);



				// Imposta il flag drag zoom box

				ITISBDrag = false;



				// Nasconde la zoom box

				if (ITISHasGEBID)

					ITISSetZBoxVisible(false);



				// Controlla il tipo di click

				if (ITISEZBW > 0 || ITISEZBH > 0)

					ITISZBZoom = true;

				else

					ITISZBZoom = false;



				// Recupera l'offset dell'immagine

				var ImgOffset = ITISGetElmAbsOffset(ITISMapImageId);



				// Calcola l'offset esatto della zoom box

				ITISOZBX = ITISEZBX - ImgOffset.offsetX;

				ITISOZBY = ITISEZBY - ImgOffset.offsetY;



				// Operazione completata

				return(true);

			}

		else

			// Funzionalità non disponibile

			return(false);

	}



// Avvia il disegno della zoom box

function ITISStartBDraw(evt)

	{

		// Verifica se lo script è attivabile

		if (ITISHasGEBID)

			{

				// Controlla che sia il bottone corretto

				if (ITISGetMouseButton(evt) != 'left')

					return(false);



				// Controlla non sia già in esecuzione

				if (ITISBDrag)

					{

						ITISStopBDraw(evt);

						return(false);

					}



				// Imposta il punto sorgente della ZoomBox

				ITISZBX = ITISGetMouseAbsPosX(evt);

				ITISZBY = ITISGetMouseAbsPosY(evt);



				// Imposta la tracciatura

				ITISEZBX = ITISZBX;

				ITISEZBY = ITISZBY;

				ITISEZBW = 0;

				ITISEZBH = 0;



				// Imposta la zoom box

				if (ITISHasGEBID)

					ITISSetZBoxPosition(ITISZBX,ITISZBY,0,0);



				// Imposta il flag avvio drag

				ITISBDrag = true;



				// Operazione completata

				return(true);

			}

		else

			// Funzionalità non disponibile

			return(false);

	}



// Sviluppa il disegno del box zoom

function ITISDragBDraw(evt)

	{

		// Controlla il flag drag in corso

		if (ITISBDrag)

			{

				// Posizione mouse

				var MX = ITISGetMouseAbsPosX(evt);

				var MY = ITISGetMouseAbsPosY(evt);



				// Imposta la dimensione prevista della zoombox

				ITISEZBW = ITISMax(0,ITISAbs(ITISZBX - MX));

				ITISEZBH = ITISMax(0,ITISAbs(ITISZBY - MY));



				// Aggiorna la tracciatura

				// L'offset di 2 pixel si presenta bene su IE e comunque non crea problemi

				// sugli altri browser

				ITISEZBX = ITISMin(ITISZBX,MX + 2);

				ITISEZBY = ITISMin(ITISZBY,MY + 2);



				// Reimposta la la zoom box

				if (ITISEZBW > 0 || ITISEZBH > 0)

					{

						ITISSetZBoxPosition(ITISEZBX,ITISEZBY,ITISEZBW,ITISEZBH);

						ITISSetZBoxVisible(true);

					}

				else

					// Nasconde la zoom box se ha dimensione nulla

					ITISSetZBoxVisible(false);



				// Operazione completata

				return(true);

			}

		else

			// Funzionalità non disponibile

			return(false);

	}



// Drag interno alla zoom box stessa

function ITISZBDragBDraw(evt)

	{

		// Verifica se lo script è attivabile

		if (ITISHasGEBID)

			{

				// Nasconde momentaneamente la zoom box di modo che non

				// interferisca con il movimento

				ITISSetZBoxVisible(false);



				// Operazione completata

				return(true);

			}

		else

			// Funzionalità non disponibile

			return(false);

	}