
/*================================================================================
FUNCION:	Constructor del objeto oVentana
ARGS:		Obj:	objeto Html ligado
			clase:	estilo CSS usado para el objeto ventana
DEVUELVE:	-----
DESCRIP.:
El objeto oVentana es un objeto ligado a un bloque DIV de la página HTML usado para el
texto que se va a desplazar dentro de una ventana contenedora representada por el objeto 
oPersiana.
Sus propiedades y métodos son:
Propiedades:
	elemDiv		Objeto HTML ligado (un bloque DIV)
	estilo		estilo CSS
Métodos	
	escribir	Rellenar el elemento HTML
	mover		Mover el elemento
	situar		Colocar la capa en una posición
	leerX		Lee la posición horizontal			
	leerY		Lee la posición vertical
	Alto		Pone la altura del objeto
	Ancho		Pone la anchura del objeto
================================================================================*/
function oVentana(obj, clase)
{
this.elemDiv = obj;
this.estilo = clase;
this.escribir = oVentana_escribir;
this.mostrar = oVentana_mostrar;
this.mover = oVentana_mover;
this.situar = oVentana_situar;
this.leerX = oVentana_X;
this.leerY = oVentana_Y;
this.Alto = oVentana_Alto;
this.Ancho = oVentana_Ancho;
}	

function oVentana_mostrar(sino)
{
var estado = (sino)?"visible":"hidden";
if (miNavegador.standard || miNavegador.modVer == "IE4")
	this.elemDiv.style.visibility = estado;
else	
	this.elemDiv.visibility = estado;

}
function oVentana_escribir(cadena, ancho, ns)
{
var capa = this.elemDiv;
switch (miNavegador.modVer){
case "IE4":
case "IE5":
case "IE6":
case "IE7":
case "NS5":
	capa.innerHTML = cadena;
	break;
case "NS4":
	var hija = this.elemDiv.id;
	var capa = this.elemDiv.document;
	var objest = document.classes[this.estilo].all;
	if (ancho)
		{
		capa.open();
		capa.write(cadena);
		capa.close();		
		}
	else	
		{
		capa.open();		
		capa.write('<div class="'+this.estilo+'">'+cadena+'</div>')
		capa.close();
		}
	this.elemDiv.document.close()
	}
}

function oVentana_mover(incx, incy)
{
var capa = this.elemDiv
if	(capa.style)
	{
	capa.style.left = parseInt(capa.style.left) + incx;
	capa.style.top = parseInt(capa.style.top) + incy;
	}
else
	{
	capa.left += incx;
	capa.top += incy;
	}	
}

function oVentana_situar(x,y)
{
var capa = this.elemDiv

if (capa.style)
	{
	capa.style.left = x+'px';
	capa.style.top = y+'px';
	}
else
	{
	capa.left = x;
	capa.top = y;
	}
}

function oVentana_X()
{
	if (this.elemDiv.style){
		return parseInt(this.elemDiv.style.left);
	}
	else	{
		
		return this.elemDiv.left;
	}
}

function oVentana_Y()
{
if (this.elemDiv.style)
	return parseInt(this.elemDiv.style.top)
else
	return this.elemDiv.top;	
}

function oVentana_Alto(arg)
{
if (this.elemDiv.style)
	if (!arg)
		arg = this.elemDiv.offsetHeight;
	else	
		this.elemDiv.style.height = arg + "px";
else
	if (!arg)
		arg = this.elemDiv.clip.height;
	else	
		this.elemDiv.clip.height = arg;
return arg;
}

function oVentana_Ancho(arg)
{
if (this.elemDiv.style)
	if (!arg)
		arg = this.elemDiv.offsetWidth;
	else	
		this.elemDiv.style.width = arg + "px";
else
	if (!arg)
		arg = this.elemDiv.clip.width;
	else	
		this.elemDiv.clip.right = arg;
return arg;		
}
//FIN DEL OBJETO oVentana
/*=====================================================================================
OBJETO oControl
Objeto destinado a establecer un control sobre el desplazamiento del texto, con él podremos hacer que el texto cambie el sentido del desplazamiento o se detenga. El control se construye dinámicamente mediante una tabla de una columna y tres filas, cada una de las tres celdas verticales resultantes contienen uno de los botones de acción. El bloque se sitúa en el momento de la edición de la página en uno de los laterales de la persiana.
PROPIEDADES
cuerpo		es un objeto oVentana
persiana	oPersiana al que se le aplica este control
btsubir		Dirección URL de la imagen para el botón de texto hacia arriba
btbajar		Dirección URL de la imagen para el botón de texto hacia abajo
btparar		Dirección URL de la imagen para el botón de parar despelzamiento
=====================================================================================*/
function oControl(objpers, idCapa, img1, img2, img3, estilo)
{
var capa = objHtml(idCapa), cont, rutclck;
if (!capa)
	alert("Error al crear la capa de control")
else{
	//this.cuerpo = new oVentana(capa, estilo)
	//this.persiana = eval(objpers);
	//this.btsubir = img1;
	//this.btparar = img2;
	//this.btbajar = img3;
	//this.cuerpo.Alto(this.persiana.marco.Alto());
	//cont= '<table width="100%" border="0" cellspacing="0" cellpadding="0" height="'+(this.persiana.marco.Alto())+'"><tr><td height="33%" valign="top"><a href="#" onClick="return '+ objpers+'.cambMovto(-1)"><img src="'+this.btsubir+'" border="0"></a></td></tr><tr><td height="33%" valign="middle"><a href="#"onClick="return '+ objpers+'.cambMovto(0)"><img src="'+this.btparar+'" border="0"></a></td></tr><tr><td height="33%" valign="bottom"><a href="#" onClick="return '+objpers+'.cambMovto(1)"><img src="'+this.btbajar+'" border="0"></a></td></tr></table>'
	//this.cuerpo.escribir(cont);
	//this.cuerpo.mostrar(true);
	}
}


/*=====================================================================================
OBJETO oPersiana.
Es una ventana delante de la cual se va desplazando en vertical un conjunto de textos.
Está formado por una ventana contenedora y dos ventanas hijas: una de ellas contiene el
texto que está visible y la otra contiene el texto que sustituirá al actual. Las ventanas
hijas son objetos tipo oVentana.
Propiedades
	marco 		Marco ventana principal, es un objeto oVentana
	identJS		Identificafor Javascript de la variable en que se instancia este objeto
	ctrl		Objeto ventana usado para los botones de control
	estilo		estilo CSS del marco
	textos		Lista de textos que recorreran el marco
	txtind 		Indice del texto actual en la lista
	cambiar 	Indicador booleano para señalar que cambia el sentido de movto.
	incTxt		Sentido de incremento del indice de textos a mostrar (+1, -1)
	primera		Indicador booleanao para señalar primer barrido de texto
	noPausa		Indicador booleano para señalar que no haga pausa
	parar		Indicador booleano para detener el desplazamiento del texto
	timer		Temporizador utilizado para este objeto.
	pausa 		Tiempo de pausa entre textos
	sent		Sentido del movimiento. 1= Ar-Ab, -1= Ab-Ar
	veloc 		Rapidez del movto
	movil		Marco hijo (objeto oVentana)
Métodos	
	actualizar 	Mover hijo
	preparaHija	Inicializa una ventana hija
	cambMovto	Modifica el sentido del movimiento del texto o lo detiene

FUNCION:	Constructor del objeto oPersiana
ARGS:		Marco:	ID del bloque HTML que forma la ventana contenedora
			veloc:	un número que indica la rapidez con la que se desplazará el texto
			textos: array con los textos que aparecerán en la ventana
			sent: 	Sentido del movimiento del texto. 1= Ar-Ab, -1= Ab-Ar
			pausa: 	número indicando el tiempo que el texto permanecerá en reposo
			estilo:	nombre del estilo CSS usado para la ventana contenedora. 
				
DEVUELVE:	---
DESCRIP:	Constructor del objeto persiana
}
=====================================================================================*/
function oPersiana(idMarco, veloc, textos, sent, pausa, estilo)
{
var capa, hija, ctrl, estNS;
var obj = objHtml(idMarco);
this.identJS = null;
this.ctrl = null;
this.marco = null;
this.estilo = estilo;
this.textos = textos.slice(0);
this.txtind = 0;
this.pausa = pausa;
this.sent = sent;
//Para controlar parada/movto
this.cambiar = false;
this.incTxt = 1;
this.primera = true;
this.noPausa = false;
this.parar = false;
this.timer = null;
//*****************
this.veloc = veloc;
this.movil = new Array(null, null);
this.movact = 0;
this.actualizar = oPersiana_actualizar;
this.preparaHija = oPersiana_preparaHija;
this.cambMovto = oPersiana_cambMovto;
//Crea la ventana del marco contenedor
this.marco =new oVentana(obj, this.estilo);
//Crea las capas hijas
if (miNavegador.modVer == "NS4"){
	this.marco.elemDiv.clip.height= parseInt(document.ids[this.marco.elemDiv.id].height);
	document.classes[this.estilo].all.position="absolute";
	document.classes[this.estilo].all.overflow="hidden";
	capa = '<div id="'+idMarco+'h1" class="'+this.estilo+'">&nbsp;</div>';
	capa +='<div id="'+idMarco+'h2" class="'+this.estilo+'">&nbsp;</div>';
	}
	
else if (miNavegador.modVer == "NS5"){	
	var oDiv=document.getElementById("tabla1")//.innerHTML=capa;
	var posX=oGFX.f_getPosX(oDiv);
	var posY=oGFX.f_getPosY(oDiv);
	capa = '<div id="'+idMarco+'h1" style="position: relative;  background-color: #FFFFFF;">&nbsp;</div>';
	capa +='<div id="'+idMarco+'h2" style="position: relative;  background-color: #FFFFFF;">&nbsp;</div>';
	//alert(capa)
	this.marco.elemDiv.style.overflow= "hidden"
	//document.getElementById("tabla1").style.visibility= "hidden";
	
	
	//this.marco.elemDiv.style.overflow = "hidden"
}
else{
	capa = '<div id="'+idMarco+'h1" style="position: absolute;">&nbsp;</div>';
	capa +='<div id="'+idMarco+'h2" style="position: absolute;">&nbsp;</div>';
	this.marco.elemDiv.style.overflow = "hidden"
}
this.marco.escribir(capa, this.marco.Ancho());
this.marco.mostrar(true);
//Crea las dos ventanas móviles usadas
estNS = this.estilo;
for(n=0; n<2; n++)
	{
		
	switch (miNavegador.modVer){
		case "IE4":
			hija = this.marco.elemDiv.children[n];
			hija.style.paddingLeft = "4px";
			hija.style.paddingTop = "4px";
			this.movil[n] = new oVentana( hija, this.estilo);			
			break;
		case "IE5":
		case "IE6":
		case "IE7":
		case "NS5":
			hija = this.marco.elemDiv.childNodes[n];
			hija.style.paddingLeft = "4px";
			hija.style.paddingTop = "4px";			
			this.movil[n] = new oVentana( hija, this.estilo);						
			break;
		case "NS4":
			hija = this.marco.elemDiv.document.layers[n];
			var objest = document.classes[this.estilo].all;
			estNS = this.estilo+'NS';
			with (document.classes[estNS].all){
				fontSize = objest.fontSize||null; 
				fontFamily = objest.fontFamily||null;
				fontWeight = objest.fontWeight||null;
				fontStyle = objest.fontStyle||null;
				textDecoration = objest.textDecoration||null;
				textAlign =  objest.textAlign||null;
				color = objest.color||null;
				paddingRight = objest.paddingRight||null;
				paddingLeft= objest.paddingLeft||null;
				paddingTop = objest.paddingTop||null;
				paddingBottom = objest.paddingBottom||null;
				width = objest.width;
				this.movil[n] = new oVentana( hija, estNS);
				}	
		}
	}
//Inicializa las ventanas hijas
this.preparaHija(0);
this.preparaHija(1, true);
}
/*=====================================================================================
FUNCION:	Método del objeto oPersiana: oPersiana_preparaHija(n)
ARGS:		número de la ventana hija
DEVUELVE:	---
DESCRIP:	Prepara una ventana hija colocándole el texto que se mostrará y situándola
			fuera de la ventana contenedora. La posición vertical deberá ser tal que 
			la ventana queda debajo de la que en un momento dado se está mostrando, o
			sea, la hija 1 deberá quedar debajo de la 0 y viceversa.
=====================================================================================*/
function oPersiana_preparaHija(n, sig)
{
this.movil[n].mostrar(false);
this.movil[n].escribir(this.textos[this.txtind]);
//La sitúa bajo la ventana anterior
if (sig)
	this.sent = -this.sent
if (this.sent >0)
	this.movil[n].situar(1, -Math.max(this.movil[n].Alto(),this.marco.Alto()));
else
	this.movil[n].situar(1, Math.max(this.movil[1-n].Alto(),this.marco.Alto()));
this.movil[n].mostrar(true);
if (sig)
	this.sent = -this.sent
}
/*=====================================================================================
FUNCION:	Método del objeto oPersiana: oPersiana_actualizar(arg)
ARGS:		cadena identificador de la persiana
DEVUELVE:	---
DESCRIP:	Actualiza el contenido de la ventana principal desplazando adecuadamente
			las ventanas hijas.
=====================================================================================*/
function oPersiana_actualizar(arg)
{

var objPers = this;
var tmp = objPers.veloc;
var act = objPers.movact;
var sig = 1-act;
var movil = objPers.movil[act];
var sigmov = objPers.movil[sig];
var marco = objPers.marco;
var fin=false, txt=objPers.textos.length, ind = 0;
if (objPers.identJS==null)
   {
   objPers.identJS= arg;
   }

if(!objPers.parar)
	{
	movil.mover(0, objPers.sent);
	if (sigmov) 
		sigmov.mover(0, objPers.sent)
	fin = movil.leerY() == 0;
	}
if (objPers.cambiar)
	{
	objPers.sent = -objPers.sent;
	objPers.movact = sig;
	this.incTxt = -this.incTxt;
	objPers.txtind+=objPers.incTxt;
	if (objPers.txtind<0)
		objPers.txtind = objPers.textos.length-1;
	if (objPers.primera)
		{
		objPers.movil[1].escribir(objPers.textos[objPers.txtind]);
		objPers.primera = false;
		}	
	objPers.cambiar = false;
	}
if (!fin)
	objPers.timer = setTimeout(arg+".actualizar('"+arg+"')", tmp);
else
	{
	objPers.primera = false;
	if (objPers.noPausa) {tmp = 0; objPers.noPausa=false}
	tmp = tmp*objPers.pausa;
	objPers.sigPausa = objPers.veloc;
	objPers.txtind +=objPers.incTxt;
	objPers.txtind = (txt + objPers.txtind) % txt;
	objPers.movact = 1-objPers.movact;
	objPers.preparaHija(objPers.movact);
	objPers.timer = setTimeout(arg+".actualizar('"+arg+"')", tmp);
	}
}

function oPersiana_cambMovto(snt)
{
//this.noPausa = (this.movil[1-this.movact].leerY() == 0);
if (snt !=0){
	this.parar = false;
	this.cambiar = this.sent != snt;
	this.noPausa = (this.movil[1-this.movact].leerY() == 0)&& this.cambiar;
	if (this.movil[1-this.movact].leerY() == 0)
		{
		clearTimeout(this.timer);
		this.actualizar(this.identJS);
		}
	}
else 
	this.parar=true;
return false;
}
