//**************************************************

//*  	scroller.js

//*		Autore Francesco Familiari

//*		francesco@lilo.it

//*		versione 1.01.02 25/03/2002

//**************************************************





function scroller(name) {



	//numero di pixel che vengono mossi a ogni passo

	this.scrollStep = 1;



	//numero di pixel che vengono mossi a ogni passo

	this.slotGap = 12;



	//velocità di scorrimento

	this.scrollDelay = 20;



	//tempo di arresto del primo messaggio visualizzato

	this.scrollStopDelay = 500;

	

	//tempo di arresto iniziale

	this.scrollFirstStopDelay = 1000;



	//nome dell'oggetto

	this.name = name

	

	//nome del layer contenente gli slots

	this.mainName = "main"

	

	//nome del layer degli slots

	this.slotName = "slot"





	//**************************

	//attributi interni

	//**************************	

	//puntatore al timer

	this.scrollTime = null;

	

	//indica se è stato chiamoato o meno il metodo initScroller;

	this.isInit = false;



	//indica se devo effettuare lo scroll o meno;

	this.scrollOn = false;



	//numero di slot da muovere

	this.slotsCount = -1;





	//*****************************************

	//	FUNZIONE CHE INIZIALIZZA LO SCROLLER

	//*****************************************

	this.initScroller = function() {

	

		//controllo se ho già inizializzato lo scroller

		if(this.isInit) return;

		else this.isInit= true;

	

		var scrollerHeight  = 0;

		

		this.slotsCount = this.getSlotsCount();

	

		//inizializzo lo scroller

		for(var i = 0; i <  this.slotsCount; i++) {

				

			//calcolo l'altezza totale degli slot

			scrollerHeight  += this.getSlotHeight(i);

		

			//devo inizializzare la posizione verticale dello slot 

			//[NB: il primo (i=0) è posizionato a 0px]

			if(i > 0) {

				this.setSlotPosY(i, this.getSlotPosY(i-1) + this.getSlotHeight(i-1) + this.slotGap);

			}

						

			//rendo visibile lo slot

			this.showSlot(i);

		}

		

		//

		//scrollerHeight += this.slotGap * (this.slotsCount - 1);

		

		//controllo se devo effettuare lo scrolling o meno

		if((scrollerHeight + this.slotGap * (this.slotsCount - 1) ) > this.getScrollerHeight()) {

		

			//devo effettuare lo scrolling

			this.scrollOn = true;



			this.scrollTime = setTimeout(this.name+".startScroller()", this.scrollFirstStopDelay);

		}



	}





	//*********************************

	//	FUNZIONE CHE MUOVE GLI SLOT

	//*********************************

	this.startScroller = function() {



		if(!this.isInit) {

			this.initScroller();

			return;

		}



		if(!this.scrollOn) return;

		

		//slot uscito dal campo visibile

		var hideSlot = -1;

		

		//indica se devo fare una pausa

		//perchè uno slot è arrivato in cima

		var stop = false;

	

		//muovo gli slot

		for(var i = 0; i < this.slotsCount; i++) {

			

			//muovo lo slot di un numero di pixel pari a scrollStep

			this.moveSlotPosY(i, -this.scrollStep);

			

			//se lo slot è uscito dal campo visibile lo memorizzo per poi muoverlo in coda

			if(this.getSlotPosY(i) + this.getSlotHeight(i)  <= 0) {

				hideSlot = i; 

			}



			//se lo slot è arrivato in cima imposto stop a true

			if(this.getSlotPosY(i) + this.scrollStep > 0 

					&& this.getSlotPosY(i) <= 0) {

				stop = true;

			}

			

		}

		

		//se uno slot è uscito dal campo visibile lo devo accodare all'ultimo slot

		if(hideSlot >= 0) {

			

			//cerco l'ultimo slot

			var lastSlot = (hideSlot  == 0) ? (this.slotsCount - 1) : hideSlot - 1;

			

			//cerco la nuova posizione dello slot

			newHideSlotPosition = this.getSlotPosY(lastSlot) 

					+ this.getSlotHeight(lastSlot)

					+ this.slotGap;

			

			//controllo la nuova posizione

			if(newHideSlotPosition > this.getScrollerHeight()) {

			

				//se la nuova posizione è oltre il campo visibile

				//posso posizionare lo slot

				this.setSlotPosY(hideSlot, newHideSlotPosition);



			} else {

					

				//se la nuova posizione non oltre il campo visibile

				//posiziono lo slot oltre tale posizione

				//per evitare che appaia improvvisamente nel campo visibile

				this.setSlotPosY(hideSlot, this.getScrollerHeight());



			}

			

		}

		

			

		//richiamo la funzione dopo un certo numero di millisecondi

		if(stop) {



			//muovo il messaggio successivo dopo un breve pausa

			this.scrollTime = setTimeout(this.name+".startScroller()", this.scrollStopDelay);

		

		} else {

		

			//muovo i messaggi

			this.scrollTime = setTimeout(this.name+".startScroller()", this.scrollDelay);

		

		}

		

	}





	//*************************************************

	//	FUNZIONE CHE FERMA IL MOVIMENTO DEGLI GLI SLOT

	//*************************************************

	this.stopScroller = function() {



		if(!this.scrollOn) return;



		clearTimeout(this.scrollTime);

	}



	

	//*************************************************

	//	FUNZIONI INTERNE

	//*************************************************

	

	//funzione che restituisce il numero di slot

	this.getSlotsCount = function() {

		return document.all[this.slotName].length	 ? document.all[this.slotName].length	 : 1;

	}

	

	

	//funzione che restituisce la posizione verticale di uno slot

	this.getSlotPosY = function(id) {

		return this.slotsCount > 1 ? document.all[this.slotName][id].offsetTop

										: document.all[this.slotName].offsetTop;

	}

	

	//funzione che imposta la posizione verticale di uno slot

	this.setSlotPosY = function(id, posY) {

		if(this.slotsCount > 1)	document.all[this.slotName][id].style.pixelTop = posY;

		else document.all[this.slotName].style.pixelTop = posY;

	}

	

	//funzione che incrementa la posizione verticale di uno slot

	this.moveSlotPosY = function(id, posY) {

		if(this.slotsCount > 1) document.all[this.slotName][id].style.pixelTop += posY;

		else document.all[this.slotName].style.pixelTop += posY;

	}



	//funzione che restituisce l'altezza di uno slot

	this.getSlotHeight = function(id) {

		return this.slotsCount > 1 ? document.all[this.slotName][id].offsetHeight 

										: document.all[this.slotName].offsetHeight



	}



	//funzione che rende visibile uno slot

	this.showSlot = function(id) {

		if(this.slotsCount > 1) document.all[this.slotName][id].style.visibility = "visible";

		else document.all[this.slotName].style.visibility = "visible";



	}

	

	//funzione che restituisce l'altezza dello scroller

	this.getScrollerHeight = function() {

		return document.all[this.mainName].offsetHeight

	}





}


