/* ------------------------------------------------- OBJETO LAYER --------------------------------------------------- */
//	Versión: 1.1
//	Navegadores soportados: Sólo IEW y DOM.
//	Paquete: Juego de Cartas (sólo IEW y DOM).
//	Dependencias: detecta.js (1.0+), funcsbase.js (1.0+), extstring.js (1.0+)
//	Comentarios:
//		Permite manipular tanto layers pre-creadas como creadas de forma dinámica en sus navegadores correspondientes.
//	Es una interfaz de alto nivel para el modelo de objetos del navegador soportado.
//	Histórico de cambios (tras versión 1.0):
//	- Versión 1.1:
//		Modificadas funciones 'muestra()' y 'oculta()' para que también afecten a la propiedad "display". Así, ahora la
//	ocultación elimina la visualización. Esto evita que la imagen oculta provoque que las barras de desplazamiento del
//	navegador reflejen las posiciones y tamaños de los elementos ocultados.
/* ------------------------------------------------------------------------------------------------------------------ */
if(typeof(gsDebug)=="undefined")gsDebug=null
/* - Constructor del objeto gsLayer. Si no existe su contrapartida 'div' en el documento, se creará sobre la marcha. Si ya
 existe, se tomarán los datos del propio objeto.
Parámetros:
	id -- Identificador del layer.
	x -- [opcional] Coordenada x de la esquina superior izquierda.
	y -- [opcional] Coordenada y de la esquina superior izquierda.
	an -- [opcional] Ancho máximo.
	al -- [opcional] Alto máximo.
	v -- [opcional] Visibilidad inicial.
	z -- [opcional] Profundidad (zIndex).
Devuelve:
	Objeto gsLayer.
- */
function gsLayer(id,x,y,an,al,v,z){
	this.id=id // Identificador
	var d=gsDameObjeto('div',id) // Buscarla si existe
	if(!d){ // No existe
		var l=gsCreaLayer(id,x,y,an,al,v,z,'') // Crear su HTML
		if(gsNav.iew)document.body.insertAdjacentHTML('beforeEnd',l) // Agregarlo en IEW
		else{ // Agregarlo según DOM
			var r=document.createRange()
			r.setStartAfter(document.body)
			var f=r.createContextualFragment(l)
			document.body.appendChild(f)
		}
		d=gsDameObjeto('div',id) // Volver a pedir el objeto recién creado
	}
	this.x=x?x:(d?(parseInt(gsNav.ie4?d.style.pixelLeft:d.style.left)):0) // Posición x
	this.y=y?y:(d?(parseInt(gsNav.ie4?d.style.pixelTop:d.style.top)):0) // Posición y
	this.an=an||(d?(d.style&&d.style.width?parseInt(d.style.width):d.offsetWidth):0) // Ancho
	this.al=al||(d?(d.style&&d.style.height?parseInt(d.style.height):d.offsetHeight):0) // Alto
	this.v=typeof(v)!="undefined"?v:(d?(!d.style.visibility||d.style.visibility!='hidden'?true:false):false) // Visibilidad
	this.z=z||(d?(d.style&&d.style.zIndex?d.style.zIndex:0):0) // Profundidad
	this.rec=d?(d.style.clip||''):'' // Recorte
	this.l=d||null // El objeto en sí
	this.s=d.style||null // El estilo del objeto
	this.colfon=d?(d.style.backgroundColor||''):'' // Color de fondo
	this.imafon=d?(d.style.backgroundImage||''):'' // Imagen de fondo
	this.cont=this.l.innerHTML||'' // Contenido
	this.mueve(this.x,this.y) // Ajustar posición por si se han pasado valores en x,y distintos de la pos. actual
	this.ajusta(this.an,this.al) // Ajustar ancho y alto
	this.v?this.muestra():this.oculta() // Ajustar visibilidad
	this.fijaPosZ(this.z) // Ajustar profundidad
}
/* - Mueve este objeto a la posición dada de la página. Si algún parámetro no es numérico o cadena (convertible a numérico
 por el propio JavaScript, aunque no se comprueba), o no se especifica, se mantiene invariable la coordenada correspondiente
 al mismo.
Parámetros:
	x -- [opcional] Coordenada x de la esquina superior izquierda.
	y -- [opcional] Coordenada y de la esquina superior izquierda.
Devuelve:
	Nada. Mueve el layer a la posición dada.
- */
gsLayer.prototype.mueve=function(x,y){
	this.x=typeof(x)=="undefined"||gsTipoDe(x)>1?this.x:x // Tomar valor correcto
	this.y=typeof(y)=="undefined"||gsTipoDe(y)>1?this.y:y // Tomar valor correcto
	if(gsNav.ie4){
		this.s.pixelLeft=this.x
		this.s.pixelTop=this.y
	}else{
		this.s.left=gsTipoDe(this.s.left)?this.x+"px":this.x
		this.s.top=gsTipoDe(this.s.top)?this.y+"px":this.y
	}
}
/* - Mueve este objeto relativamente a su posición en la página. Si algún parámetro no es significativo (distinto de 0 o
 valores nulos), o no se especifica, se tomará 0 en su lugar.
Parámetros:
	dx -- [opcional] Incremento en el eje x.
	dy -- [opcional] Incremento en el eje y.
Devuelve:
	Nada. Mueve el layer a la posición actual más el incremento dado.
- */
gsLayer.prototype.mueveRel=function(dx,dy){
	dx=dx||0
	dy=dy||0
	this.mueve(this.x+dx,this.y+dy)
}
/*- Muestra el layer.
Parámetros:
	Ninguno.
Devuelve:
	Nada.
- */
gsLayer.prototype.muestra=function(){
	this.s.display="inline"
	this.s.visibility="inherit"
	this.v=true
}
/*- Oculta el layer y lo elimina visualmente del documento.
Parámetros:
	Ninguno.
Devuelve:
	Nada.
- */
gsLayer.prototype.oculta=function(){
	this.s.display="none"
	this.s.visibility="hidden"
	this.v=false
}
/* - Ajusta el ancho y el alto de este objeto a los valores dados. Si alguno de los parámetros no es numérico, cadena
 convertible (no se comprueba) o no se especifica, se dejará invariable dicha dimensión.
Parámetros:
	an -- [opcional] Ancho deseado en píxels
	al -- [opcional] Alto deseado en píxels
Devuelve:
	Nada. Ajusta el layer al tamaño dado.
- */
gsLayer.prototype.ajusta=function(an,al){
	an=typeof(an)=="undefined"||gsTipoDe(an)>1?this.an:an // Tomar valor correcto
	al=typeof(al)=="undefined"||gsTipoDe(al)>1?this.al:al // Tomar valor correcto
	this.s.width=gsTipoDe(this.s.width)?an+'px':an // Si no es numérico, ponerle 'px' al final
	this.s.height=gsTipoDe(this.s.height)?al+'px':al // Si no es numérico, ponerle 'px' al final
	this.an=an // Guardar ancho
	this.al=al // Guardar alto
}
/* - Ajusta el ancho y alto de este objeto al ancho y alto de su contenido actual.
Parámetros:
	Ninguno.
Devuelve:
	Nada. Ajusta el layer al tamaño de su contenido.
- */
gsLayer.prototype.autoAjusta=function(){
	var an,al
	if(gsNav.ie4){ // Internet Explorer 4
       	an=parseInt(this.l.scrollWidth) // Leer ancho
       	al=parseInt(this.l.scrollHeight) // Leer alto
	}else{ // Resto navegadores soportados
		var oan=this.s.width // Guardar ancho actual
		var oal=this.s.height // Guardar alto actual
		this.s.width="auto" // Obligar a redimensionar ancho
     	an=parseInt(this.l.offsetWidth) // Leer resultado
		this.s.height="auto" // Obligar a redimensionar alto
       	al=parseInt(this.l.offsetHeight) // Leer resultado
       	this.s.width=oan // Recuperar ancho actual
       	this.s.height=oal // Recuperar alto actual
	}
	this.ajusta(an,al) // Ajustar
}
/* - Cambia el recorte del contenido del objeto a las coordenadas dadas relativas a las dimensiones del objeto en sí.
Parámetros:
	x -- [opcional] Recorte por la izquierda. Por defecto, 0 (no recorta).
	y -- [opcional] Recorte por arriba. Por defecto, 0 (no recorta).
	an -- [opcional] Ancho del recorte. Por defecto, 0 (elimina el ancho).
	al -- [opcional] Alto del recorte. Por defecto, 0 (elimina el alto).
Devuelve:
	Nada. Recorta el layer a las dimensiones dadas.
- */
gsLayer.prototype.recorta=function(x,y,an,al){
	var rec='rect('+(y||0)+'px '+(an||0)+'px '+(al||0)+'px '+(x||0)+'px)' // Generar estilo de recorte
	this.rec=rec // Recordarlo
	this.s.clip=rec // Aplicarlo
}
/* - Fija la posición Z del objeto. El 0 está debajo de todos los demás objetos. El máximo es 2^31.
Parámetros:
	z -- [opcional] Posición z deseada. Por defecto, mantiene la actual.
Devuelve:
	Nada. El layer es ordenado a la profundidad dada.
- */
gsLayer.prototype.fijaPosZ=function(z){
	this.z=z||this.z // Por defecto, no cambiar el actual
	this.s.zIndex=this.z // Aplicar el cambio
}
/* - Lee la posición Z (profundidad) del objeto. El 0 está debajo de todos los demás objetos. El máximo es 2^31.
Parámetros:
	Ninguno.
Devuelve:
	La profundidad actual del objeto.
- */
gsLayer.prototype.leePosZ=function(){
	return this.z // Devolver profundidad actual
}
/* - Escribe el texto HTML en el objeto. Reemplaza cualquier texto anterior incondicionalmente. Si no se especifica, se
 vaciará el contenido.
Parámetros:
	t -- [opcional] Texto a escribir.
Devuelve:
	Nada. El layer presenta ahora la información recién escrita.
- */
gsLayer.prototype.escribe=function(t){
	this.cont=t||'' // Valor por defecto
	this.l.innerHTML=this.cont // Poner contenido
	if(!gsNav.iew){ // No es compatible con Internet Explorer
		while(this.l.hasChildNodes())this.l.removeChild(this.l.firstChild) // Eliminar contenido previo
		var r=this.l.ownerDocument.createRange() // Preparar rango
		r.selectNodeContents(this.l) // Seleccionar todo el contenido
		r.collapse(true) // Unir nodos redundantes
		var df=r.createContextualFragment(this.cont) // Preparar fragmento
		this.l.appendChild(df) // Añadirlo
	}
}
/* - Limpia el contenido del objeto.
Parámetros:
	Ninguno.
Devuelve:
	Nada. El layer está ahora limpio.
- */
gsLayer.prototype.limpia=function(){
	this.escribe() // Limpiar contenido
}
/* - Lee el contenido actual del objeto. Si no está registrado, lee el que aparezca en este momento.
Parámetros:
	Ninguno.
Devuelve:
	El contenido del layer.
- */
gsLayer.prototype.lee=function(){
	if(!this.cont)this.cont=this.l.innerHTML // Memorizar el contenido actual si no lo estaba
	return this.cont // Devolverlo
}
/* - Cambia la imagen de fondo del objeto. Por defecto, la elimina.
Parámetros:
	ima -- [ocional] Nombre (URL) de la imagen a poner. Por defecto, elimina la imagen.
Devuelve:
	Nada. El layer cambia de imagen de fondo.
- */
gsLayer.prototype.fijaImagenFondo=function(ima){
	this.imafon=ima||'' // Valor por defecto
	this.s.backgroundImage=this.imafon // Ajustar imagen
}
/* - Cambia el color de fondo del objeto. Por defecto, lo hace transparente.
Parámetros:
	col -- [opcional] Color a fijar. Puede ser un nombre o una cadena hexa válida.
Devuelve:
	Nada. El layer cambia de color de fondo.
- */
gsLayer.prototype.fijaColorFondo=function(col){
	this.colfon=col||'transparent' // Valor por defecto
	this.s.backgroundColor=this.colfon // Ajustar color de fondo
}
/* - Lee el color de fondo del objeto. Si no estaba memorizado, lo registra ahora.
Parámetros:
	Ninguno.
Devuelve:
	El color de fondo del layer.
- */
gsLayer.prototype.leeColorFondo=function(){
	if(!this.colfon)this.colfon=this.s.backgroundColor // Leerlo ahora si no estaba memorizado
	return this.colfon // Devolver su valor
}
/* - Lee la imagen de fondo del objeto. Si no estaba memorizada, la registra ahora.
Parámetros:
	Ninguno.
Devuelve:
	La imagen de fondo del layer.
- */
gsLayer.prototype.leeImagenFondo=function(){
	if(!this.imafon)this.imafon=this.s.backgroundImage // Leerla ahora si no estaba memorizada
	return this.imafon// Devolver su valor
}