/*
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);
	}