/* ------------------------------------------------ OBJETO IFRAME --------------------------------------------------- */
//	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+), extarray.js (1.0+)
//	Comentarios:
//		Permite manipular tanto iframes 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 gsIframe. Si no existe su contrapartida 'iframe' en el documento, se creará sobre la marcha. Si ya
 existe, se tomarán los datos del propio objeto.
Parámetros:
	id -- Identificador del iframe.
	x -- [opcional] Coordenada x de la esquina superior izquierda. Si se omite, vale 0.
	y -- [opcional] Coordenada y de la esquina superior izquierda. Si se omite, vale 0.
	an -- [opcional] Ancho máximo. Si se omite vale 'auto'.
	al -- [opcional] Alto máximo. Si se omite vale 'auto'.
	v -- [opcional] Visibilidad inicial. Si se omite es 'visible'.
	fb -- [opcional] Borde del iframe ('yes', 'no'). Si se omite vale 'no'.
	mw -- [opcional] Ancho del margen. Si se omite, usa el valor por defecto del navegador.
	mh -- [opcional] Alto del margen. Si se omite, usa el valor por defecto del navegador.
	ml -- [opcional] Margen izquierdo. Si se omite, usa el valor por defecto del navegador.
	mt -- [opcional] Margen superior. Si se omite, usa el valor por defecto del navegador.
	sc -- [opcional] Indicador de barras de desplazamiento ('yes', 'no', 'auto'). Si se omite vale 'no'.
Devuelve:
	Objeto gsIframe.
- */
function gsIframe(id,x,y,an,al,v,fb,mw,mh,ml,mt,sc){
	this.id=id // Identificador
	var d=gsDameObjeto('iframe',id),i // Buscarlo si existe
	if(!d){ // No existe
		var l=gsCreaIframe(id,x,y,an,al,v,fb,mw,mh,ml,mt,sc) // Crear su HTML
		if(gsDebug)gsDebug.escribe("Layer para "+this.id+": "+l)
		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('iframe',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.width?d.width:d.style.width!='auto'?d.style.width:d.offsetWidth):0) // Ancho
	this.al=al||(d?(d.height?d.height:d.style.height!='auto'?d.style.height:d.offsetHeight):0) // Alto
	this.v=v||(d?(!d.style.visibility||d.style.visibility!='hidden'?true:false):false) // Visibilidad
	this.z=d?(d.style&&d.style.zIndex?d.style.zIndex:0):0 // Profundidad
	this.fb=fb||(d?d.frameBorder:'no') // Borde del marco
	this.mw=mw||(d?d.marginWidth:0) // Ancho del margen
	this.mh=mh||(d?d.marginHeigth:0) // Alto del margen
	this.ml=ml // Margen izquierdo
	this.mt=mt // Margen superior
	this.sc=sc||(d?d.scrolling:0) // Desplazamiento (barras)
	this.src=(d?d.src:'') // Página visualizada (si la hay)
	this.rec=d?(d.style.clip||''):'' // Recorte
	this.l=d||null // El objeto en sí
	for(i=0;i<window.frames.length;i++)if(window.frames[i].name==this.id)break; // Buscar ventana
	this.w=i<window.frames.length?window.frames[i]:null // La ventana
	this.d=this.w?this.w.document:null // El documento
	this.s=d?(d.style||null):null // El estilo del objeto
	this.cont=this.d&&this.d.body?this.d.body.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 IFRAME a la posición dada.
- */
gsIframe.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
	this.s.left=gsTipoDe(this.s.left)?this.x+"px":this.x // Poner cadena o número según corresponda
	this.s.top=gsTipoDe(this.s.top)?this.y+"px":this.y // Poner cadena o número según corresponda
}
/* - 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 IFRAME a la posición actual más el incremento dado.
- */
gsIframe.prototype.mueveRel=function(dx,dy){
	dx=dx||0
	dy=dy||0
	this.mueve(this.x+dx,this.y+dy)
}
/*- Muestra el IFRAME.
Parámetros:
	Ninguno.
Devuelve:
	Nada.
- */
gsIframe.prototype.muestra=function(){
	this.l.style.display="inline"
	this.l.style.visibility="inherit"
	this.v=true
}
/*- Oculta el IFRAME.
Parámetros:
	Ninguno.
Devuelve:
	Nada.
- */
gsIframe.prototype.oculta=function(){
	this.l.style.display="none"
	this.l.style.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 IFRAME al tamaño dado.
- */
gsIframe.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)==1?an+'px':an // Si no es numérico, ponerle 'px' al final
	//this.s.height=gsTipoDe(this.s.height)==1?al+'px':al // Si no es numérico, ponerle 'px' al final
	this.s.width=an
	this.s.height=al
	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 IFRAME al tamaño de su contenido (si ello es posible).
- */
gsIframe.prototype.autoAjusta=function(){
	var an,al
	if(this.d&&this.d.body){ // Si hay contenido
		if(gsNav.ie4){ // Internet Explorer 4
	       	an=parseInt(this.d.body.scrollWidth) // Leer ancho
	       	al=parseInt(this.d.body.scrollHeight) // Leer alto
		}else{ // Resto navegadores soportados
			var oan=this.d.body.style.width // Guardar ancho actual
			var oal=this.d.body.style.height // Guardar alto actual
			this.d.body.width="auto" // Obligar a redimensionar ancho
	     	an=parseInt(this.d.body.offsetWidth) // Leer resultado
			this.d.body.height="auto" // Obligar a redimensionar alto
	       	al=parseInt(this.d.body.offsetHeight) // Leer resultado)
	       	this.d.body.style.width=oan // Recuperar ancho actual
	       	this.d.body.style.height=oal // Recuperar alto actual
		}
	}else{ // Si no lo hay
		an=al=0 // Poner a 0
	}
	if(gsDebug)gsDebug.escribe("Autoajustando área "+this.id+" a "+an+","+al)
	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 IFRAME a las dimensiones dadas.
- */
gsIframe.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 (profundidad) 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 IFRAMEs es ordenado a la profundidad dada.
- */
gsIframe.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.
- */
gsIframe.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 del objeto "document.body". Crea un documento si no existe ninguno.
Parámetros:
	t -- [opcional] Texto a escribir.
Devuelve:
	Nada. El IFRAME presenta ahora la información recién escrita.
- */
gsIframe.prototype.escribe=function(t){
	this.cont=t||'' // Valor por defecto
	if(this.l.src||(!this.d&&this.w))this.d=this.w?this.w.document:null // Releer documento si es menester
	this.d.body.innerHTML=this.cont // Poner contenido
	if(!gsNav.iew){ // Si no es IEW o compatible
		if(!this.d){ // Crear un documento si no existe
			this.w.document.open("text/html") // Abrir documento
			this.w.document.write("<html><head></head><body></body></html>") // Documento en blanco
			this.w.document.close() // Cerrar documento
			this.d=this.w.document // Obtener el documento de nuevo
		}
		while(this.d.body.hasChildNodes())this.d.body.removeChild(this.d.body.firstChild) // Eliminar contenido previo
		var r=this.d.body.ownerDocument.createRange() // Crear rango
		r.selectNodeContents(this.d.body) // Seleccionar todo el contenido
		r.collapse(true) // Unir nodos redundantes
		var df=r.createContextualFragment(this.cont) // Preparar fragmento
		this.d.body.appendChild(df) // Añadirlo
	}
}
/* - Limpia el contenido del objeto.
Parámetros:
	Ninguno.
Devuelve:
	Nada. El IFRAME está ahora limpio.
- */
gsIframe.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 IFRAME.
- */
gsIframe.prototype.lee=function(){
	if(!this.cont)this.cont=this.d.body.innerHTML // Memorizar el contenido actual si no lo estaba
	return this.cont // Devolverlo
}

