
// ###   getPos - Info-Data Flavio Spezi (ver. 2.0 - 03/11/2005)   ###
// Restituisce la coordinata X o Y dell'oggetto HtmlElement.
// Parametri:	HtmlElement :		l'oggetto di cui conoscere le coordinate.
//				TopOrLeft :			la coordinata richiesta; se si passa TOP restituirà la coordinata Y, altrimenti X.
// ATTENZIONE: la procedura non funziona correttamente se l'oggetto passato si trova all'interno di una tabella, la quale
//		ha impostato l'attributo BORDER ad un valore maggiore di zero, non ha una configurazione STYLE che configura lo
//		spessore del bordo e la cella che contiene l'oggetto non ha una configurazione STYLE che configura lo spessore
//		del bordo. Per risolvere questo eventuale problema, impostare l'attributo POSITION dell'oggetto richiesto al
//		valore RELATIVE oppure ABSOLUTE.
function getPos(HtmlElement, TopOrLeft) {
	var fReturn = 0;
	var obj = HtmlElement;
	var topOrLeftValue = ((TopOrLeft.substring(0, 1).toLowerCase()=='t') ? 'Top' : 'Left');
	var styleVal;
	//var str1 = obj.tagName;		//riattivare per fare i test
	while (obj) {
		styleVal = obj['offset' + topOrLeftValue];
		if (styleVal) {
			styleVal = toNumber(styleVal.toString(), null);
			if (styleVal > 0) {
				fReturn += styleVal;
				//str1 += ' offset=' + styleVal;		//riattivare per fare i test
			}
		}
		//str1 += '\n';			//riattivare per fare i test
		
		obj = obj.offsetParent;
		if (obj) {
			//str1 += obj.tagName;		//riattivare per fare i test
			styleVal = obj.currentStyle['border' + topOrLeftValue + 'Width'];
			if (styleVal) {
				styleVal = toNumber(styleVal.toString(), null);
				if (styleVal > 0) {
					fReturn += styleVal;
					//str1 += ' border=' + styleVal;		//riattivare per fare i test
				}
			}

			styleVal = obj.currentStyle['scroll' + topOrLeftValue];
			if (styleVal) {
				styleVal = toNumber(styleVal.toString(), null);
				if (styleVal > 0) {
					fReturn += styleVal;
					//str1 += ' scroll(1)=' + styleVal;		//riattivare per fare i test
				}
			}
		}
		
	}
	//alert(str1);		//riattivare per fare i test
	return fReturn;
}

// ###   findProperty - Info-Data Flavio Spezi (ver. 0.2 - 09/11/2005)
// Restituisce l'oggetto proproetà cercato per nome. Se la proprietà non viene trovata, viene restituito
// il valore NULL. La ricerca avviene per attributo e per proprietà.
// NON SO SE FUNZIONA BENE...
function findProperty(obj, propertyName) {
	var ok, fReturn;
	ok = false;
	if (obj) {
		if (!ok) {
			try {
				//fReturn = obj.attributes.getNamedItem(propertyName);
				ok = true;
			} catch (e) {
				ok = false;
			}
			if (ok && !fReturn && fReturn!='') ok = false;
		}
		if (!ok) {
			try {
				fReturn = obj[propertyName];
				ok = true;
			} catch (e) {
				ok = false;
			}
			if (ok && !fReturn && fReturn!='') ok = false;
		}
		if (!ok) {
			try {
				fReturn = obj.currentStyle[propertyName];
				ok = true;
			} catch (e) {
				ok = false;
			}
			if (ok && !fReturn && fReturn!='') ok = false;
		}
		if (!ok) {
			try {
				fReturn = obj.style[propertyName];
				ok = true;
			} catch (e) {
				ok = false;
			}
			if (ok && !fReturn && fReturn!='') ok = false;
		}
	}
	if (!ok) fReturn = null;
	//alert(obj.tagName + ': ' + propertyName + '=' + fReturn + '; ok=' + ok);
	return fReturn;
}

// ###   toNumber - Info-Data Flavio Spezi (ver. 2.0 - 03/11/2005)   ###
// Restituisce il numero dalla forma string alla forma numerica
// Parametri:	NumericString :		il numero da restituire.
//				ReturnIfInvalid :	se il numero indicato è errato, verrà restituito questo valore.
//				AnyError :			se TRUE, la procedura restituirà ReturnIfInvalid per qualsiasie errore;
//									se FALSE (default) restituisce la parte numerica valida.
function toNumber(NumericString, ReturnIfInvalid, AnyError) {
	// Costanti di programmazione
	var numeriValidi = '0123456789';
	var sepDecimaliValidi = ".,";
	// Variabili di programmazione
	var strNumero, strCifra;
	var intero = '', decimale = '';
	var trovatoDecimale = false, err = 0;
	var i, fReturn;

	if (!NumericString || NumericString == '') {
		fReturn = ReturnIfInvalid;
	} else if (typeof(NumericString) == 'number') {
		fReturn = new Number(NumericString);
	} else {
		strNumero = '';
		try {
			strNumero = NumericString.toString();
		} catch(e) {
		}
		for (i = 0; i < strNumero.length; i++) {
			strCifra = strNumero.substr(i, 1);
			if (numeriValidi.indexOf(strCifra) >= 0) {
				if (!trovatoDecimale) {
					intero += strCifra;
				} else {
					decimale += strCifra;
				}
			 } else {
				if ((!trovatoDecimale) && (sepDecimaliValidi.indexOf(strCifra) >= 0)) {
					trovatoDecimale = true;
				} else {
					err = 1;	//troppi separatori o carattere non riconosciuto
					break;
				}
			}
		}
		if (err == 0 || !AnyError) {
			if (intero == '') intero = '0';
			if (decimale == '') decimale = '0';
			fReturn = new Number(intero + '.' + decimale);
		} else {
			fReturn = ReturnIfInvalid;
		}
	}
	return fReturn;
}


function StringToUrl(Testo) {
	var fReturn = Testo;
	fReturn = fReturn.replace(/\x25/g, '%25');				//"%"
	fReturn = fReturn.replace(/\x26/g, '%26');				//"&"
	fReturn = fReturn.replace(/\+/g, '%2B');				//"+"
	fReturn = fReturn.replace(/\x23/g, '%23');				//"#"
	fReturn = fReturn.replace(/\x0D/g, '%0D');				//vbCr
	fReturn = fReturn.replace(/\x0A/g, '%0A');				//vbLf
	fReturn = fReturn.replace(/\[Dialog_SepParam\]/g, '&');	//ripristino "&"
	return fReturn;
}
function LTrim(Stringa) {
	var str1 = Stringa;
	while(str1.charAt(0) == ' ') str1 = str1.substr(1);
	return str1;
}
function RTrim(Stringa) {
	var str1 = Stringa;
	while(str1.charAt(str1.length-1) == ' ') str1 = str1.substr(0, str1.length-1);
	return str1;
}
function Trim(Stringa) {
	var str1 = Stringa;
	while(str1.charAt(0) == ' ') str1 = str1.substr(1);
	while(str1.charAt(str1.length-1) == ' ') str1 = str1.substr(0, str1.length-1);
	return str1;
}

//####   GetHtmlControlValue   -   SetHtmlControlValue   ####
//####   Info-Data - Flavio Spezi - ver. 1.0	(17/11/2005)
//Leggono e scrivono il valore degli oggetti INPUT, TEXTAREA e SELECT. Parametri:
//		ControlObject:	è il riferimento all'oggetto oppure l'ID dell'oggetto. Se si tratta di INPUT type=radio,
//						il parametro può essere il riferimento ad uno degli oggetti INPUT type=radio del gruppo oppure il nome del
//						gruppo seguito dal nome del frame (es. FrmPrinc.OptSesso_M, 'OptSesso_F', 'FrmPrinc.OptSesso').
function GetHtmlControlValue(ControlObject, Checkbox_TrueFalse) {
	var obj, tipoCtrl, objForm;
	var tipoRadio_Nome, listaCtrl;
	var cont1;
	var fReturn = null;
	obj = ControlObject;
	if (typeof(obj) == 'string') {
		if (obj.indexOf('.') > -1) obj = obj.substr(obj.indexOf('.')+1);
		obj = findObj(obj);
		if (typeof(obj) != 'object' || !obj.tagName) obj = ControlObject;
	}
	switch (typeof(obj)) {
		case 'object':
			tipoCtrl = obj.tagName;
			if (tipoCtrl == 'INPUT') tipoCtrl += ' ' + obj.type.toLowerCase();
			break;
		case 'string':
			tipoCtrl = 'INPUT radio';
			break;
	}
	if (tipoCtrl != 'INPUT radio' && typeof(obj) != 'object') tipoCtrl = 'non valido';
	switch (tipoCtrl) {
		case 'INPUT checkbox':
			fReturn = ((obj.checked) ? obj.value : null);
			break;
		case 'INPUT hidden':
			fReturn = obj.value;
			break;
		case 'INPUT password':
			fReturn = obj.value;
			break;
		case 'INPUT radio':
			if (typeof(obj) == 'string') {
				objForm = findObj(obj.substr(0, obj.indexOf('.')));
				tipoRadio_Nome = obj.substr(obj.indexOf('.')+1).toLowerCase();
			} else {
				objForm = obj.form;
				tipoRadio_Nome = obj.name.toLowerCase();
			}
			listaCtrl = objForm.tags('INPUT');
			if (listaCtrl) {
				for (cont1 = 0; cont1 < listaCtrl.length; cont1++) {
					if (listaCtrl[cont1].type.toLowerCase() == 'radio'
							&& listaCtrl[cont1].name.toLowerCase() == tipoRadio_Nome
							&& listaCtrl[cont1].checked) {
						fReturn = listaCtrl[cont1].value;
						break;
					}
				}
			}
			break;
		case 'INPUT text':
			fReturn = obj.value;
			break;
		case 'SELECT':
			fReturn = obj.value;
			break;
		case 'TEXTAREA':
			fReturn = obj.value;
			break;
	}
	return fReturn;
}
//Stesso principio della procedura [GetHtmlControlValue]. Restituisce TRUE se l'operazione va a buon fine.
function SetHtmlControlValue(ControlObject, NewValue) {
	var obj, tipoCtrl, objForm;
	var tipoRadio_Nome, listaCtrl;
	var cont1;
	var fReturn = false;
	obj = ControlObject;
	if (typeof(obj) == 'string') {
		if (obj.indexOf('.') > -1) obj = obj.substr(obj.indexOf('.')+1);
		obj = findObj(obj);
		if (typeof(obj) != 'object' || !obj.tagName) obj = ControlObject;
	}
	switch (typeof(obj)) {
		case 'object':
			tipoCtrl = obj.tagName;
			if (tipoCtrl == 'INPUT') tipoCtrl += ' ' + obj.type.toLowerCase();
			break;
		case 'string':
			tipoCtrl = 'INPUT radio';
			break;
	}
	if (tipoCtrl != 'INPUT radio' && typeof(obj) != 'object') tipoCtrl = 'non valido';
	switch (tipoCtrl) {
		case 'INPUT checkbox':
			obj.checked = (NewValue != null);
			fReturn = true;
			break;
		case 'INPUT hidden':
			obj.value = NewValue;
			fReturn = true;
			break;
		case 'INPUT password':
			obj.value = NewValue;
			fReturn = true;
			break;
		case 'INPUT radio':
			switch (typeof(obj)) {
				case 'string':
					objForm = findObj(obj.substr(0, obj.indexOf('.')));
					tipoRadio_Nome = obj.substr(obj.indexOf('.')+1).toLowerCase();
					break;
				case 'object':
					objForm = obj.form;
					tipoRadio_Nome = obj.name.toLowerCase();
					break;
			}
			listaCtrl = objForm.tags('INPUT');
			if (listaCtrl) {
				for (cont1 = 0; cont1 < listaCtrl.length; cont1++) {
					if (listaCtrl[cont1].type.toLowerCase() == 'radio'
							&& listaCtrl[cont1].name.toLowerCase() == tipoRadio_Nome
							&& listaCtrl[cont1].value == NewValue) {
						listaCtrl[cont1].checked = true;
						fReturn = true;
						break;
					}
				}
			}
			break;
		case 'INPUT text':
			obj.value = NewValue;
			fReturn = true;
			break;
		case 'SELECT':
			obj.value = NewValue;
			fReturn = (obj.value == NewValue);
			break;
		case 'TEXTAREA':
			obj.value = NewValue;
			fReturn = true;
			break;
		default:
			alert('Funzioni.js\n  function SetHtmlControlValue()\n    TipoCtrl non gestito: ' + tipoCtrl + '\n    Parametro ControlObject: ' + ControlObject);
	}
	return fReturn;
}


// ####  Funzioni di STANDARDIZZAZIONE BROWSERS  ##########

// Associa una funzione all'evento di un oggetto
function addEvent(obj, evType, fn){
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, false);
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent('on' + evType, fn);
		return r;
	} else {
		return false;
	}
}
function findObj(idObject, document_Optional) {
	var p, i, x;
	if(!document_Optional) document_Optional = document;
	if((p = idObject.indexOf("?")) > 0 && parent.frames.length) {
		document_Optional = parent.frames[idObject.substring(p + 1)].document;
		idObject = idObject.substring(0, p);
	}
	if(!(x = document_Optional[idObject]) && document_Optional.all) x = document_Optional.all[idObject];
	for (i=0; !x && i < document_Optional.forms.length; i++) x = document_Optional.forms[i][idObject];
	for (i=0; !x && document_Optional.layers && i < document_Optional.layers.length; i++) x = findObj(idObject, document_Optional.layers[i].document);
	return x;
}


// ####  [Traduci_Varchar_Read] ,  [Traduci_Varchar_Write] ,  [Traduci_Text_Read] ,  [Traduci_Text_Write]  ####
// ####  Info-Data Flavio Spezi (ver. 2.0 - 04/11/2005)  ###
// Procedure per la lettura e la scrittura in lingua.
// Parametri:
// 	MultilanguageSource   :	Può essere il [testo intero] in tutte le lingue oppure l'oggetto da cui prendere il valore:
// 							se il parametro è di tipo [Object], verrà prelevato il valore dell'attributo Value;
// 							se il parametro è una stringa essa verrà usata come [testo intero];
// 							per le funzioni Xxx_Write, nel caso in cui il parametro passato è un [Object], il risultato
// 							dell'elaborazione verrà salvato all'interno dell'oggetto; e in ogni caso verrà restituito come
// 							stringa dalla funzione.
// 	LanguageCode		  : il codice della lingua (es: IT, EN).
// 	LanguageIndex		  : l'indice di posizione della lingua (a partire da zero).
// 	LanguageSource		  : per le funzioni Xxx_Write, settare questo parametro col valore del testo nella lingua indicata;
// 							se il parametro è di tipo [Object], verrà prelevato il valore dell'attributo Value;
// 							se il parametro è una stringa essa verrà usata come [testo della lingua].
// 	CharsPerLanguage	  : caratteri messi a disposizione per ogni lingua. A differenza del programma analogo lato server,
//							qui non posso consentire l'uso del valore -1 (in automatico leggendo lungezza campo nel db) per
//							ovvi motivi.
function Traduci_Varchar_Read(MultilanguageSource, CharsPerLanguage, LanguageIndex) {
	var sorgenteIsObj = typeof(MultilanguageSource) == 'object';
	var sorgenteTesto = ((sorgenteIsObj) ? MultilanguageSource.value : MultilanguageSource);
	var fReturn = RTrim(sorgenteTesto.substr(CharsPerLanguage * LanguageIndex, CharsPerLanguage));
	return fReturn;
}
function Traduci_Varchar_Write(MultilanguageSource, CharsPerLanguage, LanguageIndex, LanguageSource) {
	var sorgenteIsObj = typeof(MultilanguageSource) == 'object';
	var sorgenteTesto = ((sorgenteIsObj) ? MultilanguageSource.value : MultilanguageSource);
	var sorgenteLanIsObj = typeof(LanguageSource) == 'object';
	var sorgenteLanTesto = ((sorgenteLanIsObj) ? LanguageSource.value : LanguageSource);
	
	while (sorgenteTesto.length < CharsPerLanguage * LanguageIndex) sorgenteTesto += ' ';
	while (sorgenteLanTesto.length < CharsPerLanguage) sorgenteLanTesto += ' ';
	sorgenteTesto = sorgenteTesto.substr(0, CharsPerLanguage * LanguageIndex) +
			sorgenteLanTesto + 
			sorgenteTesto.substr(CharsPerLanguage * (LanguageIndex + 1));
	if (sorgenteIsObj) MultilanguageSource.value = RTrim(sorgenteTesto);
	return sorgenteTesto;
}
function Traduci_Text_Read(MultilanguageSource, LanguageCode) {
	//#	Costanti utili che sono dichiarante in FUNZIONI.ASP : #
	//	Traduci_ChrLingua, Traduci_ChrFormatoTesto, Traduci_Lingue_DefaultIndex, Traduci_Lingue_DefaultCode, Traduci_FormatoTestoDefault
	var sorgenteIsObj = typeof(MultilanguageSource) == 'object';
	var sorgenteTesto = ((sorgenteIsObj) ? MultilanguageSource.value : MultilanguageSource);
	var posizIni, posizFine;
	var formatoTesto;
	var fReturn;
	//Leggo e rimuovo la definizione del FormatoTesto dalla stringa.
	formatoTesto = Traduci_GetFormatoTesto(sorgenteTesto);
	if (!formatoTesto) {
		formatoTesto = Traduci_FormatoTestoDefault;
	} else {
		sorgenteTesto = sorgenteTesto.substr(0, sorgenteTesto.length-2);
	}
	
	//Se NON trovo nemmeno un [Traduci_ChrLingua], significa che il testo non ha alcuna formattazione di lingua,
	//quindi imposterò tutto il testo alla lingua default [Traduci_Lingue_DefaultCode].                
	if (sorgenteTesto.substr(0, Traduci_ChrLingua.length) != Traduci_ChrLingua) sorgenteTesto = Traduci_ChrLingua + Traduci_Lingue_DefaultCode + sorgenteTesto;
	
    posizIni = sorgenteTesto.indexOf(Traduci_ChrLingua + LanguageCode);
    if (posizIni == -1) {
		fReturn = '';
	} else {
		posizIni += Traduci_ChrLingua.length + LanguageCode.length;
		posizFine = sorgenteTesto.indexOf(Traduci_ChrLingua, posizIni);
		if (posizFine == -1) posizFine = sorgenteTesto.length;
		fReturn = sorgenteTesto.substr(posizIni, posizFine - posizIni);
	}
	return fReturn;
}
function Traduci_Text_Write(MultilanguageSource, LanguageCode, LanguageSource) {
	//#	Costanti utili che sono dichiarante in FUNZIONI.ASP : #
	//	Traduci_ChrLingua, Traduci_ChrFormatoTesto, Traduci_Lingue_DefaultIndex, Traduci_Lingue_DefaultCode, Traduci_FormatoTestoDefault
	var sorgenteIsObj = typeof(MultilanguageSource) == 'object';
	var sorgenteTesto = ((sorgenteIsObj) ? MultilanguageSource.value : MultilanguageSource);
	var sorgenteLanIsObj = typeof(LanguageSource) == 'object';
	var sorgenteLanTesto = ((sorgenteLanIsObj) ? LanguageSource.value : LanguageSource);
	var posizIni, posizFine;
	var formatoTesto;
	var fReturn;
	//Leggo e rimuovo la definizione del FormatoTesto dalla stringa.
	formatoTesto = Traduci_GetFormatoTesto(sorgenteTesto);
	if (!formatoTesto) {
		formatoTesto = Traduci_FormatoTestoDefault;
	} else {
		sorgenteTesto = sorgenteTesto.substr(0, sorgenteTesto.length-2);
	}
	
	//Se NON trovo nemmeno un [Traduci_ChrLingua], significa che il testo non ha alcuna formattazione di lingua,
	//quindi imposterò tutto il testo alla lingua default [Traduci_Lingue_DefaultCode].                
	if (sorgenteTesto.substr(0, Traduci_ChrLingua.length) != Traduci_ChrLingua) sorgenteTesto = Traduci_ChrLingua + Traduci_Lingue_DefaultCode + sorgenteTesto;
	
	posizIni = sorgenteTesto.indexOf(Traduci_ChrLingua + LanguageCode);
	if (posizIni == -1) {
		fReturn = sorgenteTesto + Traduci_ChrLingua + LanguageCode + sorgenteLanTesto;
	} else {
		posizIni += Traduci_ChrLingua.length + LanguageCode.length;
		posizFine = sorgenteTesto.indexOf(Traduci_ChrLingua, posizIni);
		if (posizFine == -1) posizFine = sorgenteTesto.length;
		fReturn = sorgenteTesto.substr(0, posizIni) +
				sorgenteLanTesto +
				sorgenteTesto.substr(posizFine);
	}
	fReturn += Traduci_ChrFormatoTesto + formatoTesto;
	if (sorgenteIsObj) MultilanguageSource.value = fReturn;
	return fReturn;
}
function Traduci_GetFormatoTesto(textString) {
	//  Restituisce il FormatoTesto memorizzato nella stringa di testo passata come parametro.
	//  Se la stringa di testo non possiede un FormatoTesto definito, la funzione restituisce NULL.
	var fReturn = null;
    if (textString.substr(textString.length-2, 1) == Traduci_ChrFormatoTesto) {
		fReturn = textString.substr(textString.length-1, 1);
    }
    return fReturn;
}


//#################################
//####  Funzioni di HTML PLUS  ####
//#################################
//Procedure per aggiungere funzionalità ad oggetti Html

function HtmlPlus_VerticalFill(HtmlObject) {
	var posY = getPos(HtmlObject, 'top');
	var Body = window.document.body;
	var offsetY = 0;
	HtmlObject.height = Body.clientHeight - posY - offsetY;
	if (Body.scrollHeight > Body.clientHeight) {	//Se c'è la scrollBar allora...
		HtmlObject.height -= Body.scrollHeight - Body.clientHeight;
	}
	offsetY = Body.clientHeight - posY - HtmlObject.height;
	HtmlObject.setExpression('height', 'window.document.body.clientHeight - getPos(document.getElementById("' + HtmlObject.id + '"), "top") - ' + offsetY);
}


function HtmlPlus_AutoScroll_AddPlusToObject(HtmlObject, ObjectHeight, PixelPerSec, NoAutoStart) {
	var fps = 25;
	var defaultPixelPerSec = 20;
	
	HtmlObject.AutoScroll_PixelPerSec = ((PixelPerSec) ? PixelPerSec : defaultPixelPerSec);
	HtmlObject.AutoScroll_Fps = fps;
	HtmlObject.AutoScroll_Enabled = 'toInitialize';
	HtmlObject.AutoScroll_IsPlay = false;
	HtmlObject.AutoScroll_IdPlayer = null;
	switch (typeof(ObjectHeight)) {
		case 'object':
			HtmlObject.style.setExpression('height', function() {ObjectHeight.currentStyle('clientHeight');});
			break;
		case 'string':
			if (ObjectHeight.length > 10) {
				HtmlObject.style.setExpression('height', ObjectHeight);
				break;
			}
		default:
			HtmlObject.style.setAttribute('height', toNumber(ObjectHeight, 0));
			break;
	}
	if (!NoAutoStart) addEvent(window, 'load', function() {HtmlPlus_AutoScroll_Start(HtmlObject);});
}
function HtmlPlus_AutoScroll_Start(HtmlObject) {
	var obj;
	obj = ((HtmlObject && HtmlObject.id) ? HtmlObject : event.srcElement);
	if (obj.AutoScroll_Enabled == 'toInitialize') {
		//Inizializzo l'oggetto
		if (obj.scrollHeight > obj.clientHeight) {
			obj.style.setAttribute('paddingTop', obj.clientHeight + 'px');
			obj.style.setAttribute('paddingBottom', obj.clientHeight + 'px');
			addEvent(obj, 'mouseover', function(){HtmlPlus_AutoScroll_Stop(obj);});
			addEvent(obj, 'mouseout', function(){HtmlPlus_AutoScroll_Start(obj);});
			obj.AutoScroll_Enabled = true;
		}
		obj.AutoScroll_IdPlayer = '';
	}
	if (!obj.AutoScroll_IsPlay && obj.AutoScroll_Enabled) {
		obj.AutoScroll_IdPlayer = window.setInterval('HtmlPlus_AutoScroll_RunStep(' + obj.id + ');', Math.ceil(1000 / obj.AutoScroll_Fps));
		obj.AutoScroll_IsPlay = true;
	}
}
function HtmlPlus_AutoScroll_Stop(HtmlObject) {
	var obj;
	obj = ((HtmlObject && HtmlObject.id) ? HtmlObject : event.srcElement);
	if (obj.AutoScroll_IsPlay) {
		obj.AutoScroll_IsPlay = false;
		window.clearInterval(obj.AutoScroll_IdPlayer);
		obj.AutoScroll_IdPlayer = '';
	}
}
function HtmlPlus_AutoScroll_RunStep(HtmlObject) {
	var obj, i;
	obj = HtmlObject;
	if (obj.AutoScroll_IsPlay) {
		if (obj.scrollHeight <= obj.clientHeight) {
			HtmlPlus_AutoScroll_Stop(obj);
		} else {
			i = obj.scrollTop + Math.ceil(obj.AutoScroll_PixelPerSec / obj.AutoScroll_Fps);
			if ((i > obj.scrollHeight - obj.clientHeight) || (i < 0)) {
				if (obj.AutoScroll_PixelPerSec > 0) {
					i = 0;
				} else {
					i = obj.scrollHeight;
				}
			}
			obj.scrollTop = i;
		}
	}
}

//###################################
//####  Funzioni di MACRO MEDIA  ####
//###################################

function MM_displayStatusMsg(msgStr)  { //v3.0
	status=msgStr; document.MM_returnValue = true;
}

function MM_findObj(n, d) { //v3.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document); return x;
}
function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
 var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
   var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
   if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}


function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);

