/* ------------------------------------- MÓDULO SERVIDOR PARA COMUNICACIONES CON IFRAMES ---------------------------- */
//	Versión: 1.0
//	Navegadores soportados: IE5+, NS6+ y compatibles.
//	Paquete: Juego de Cartas (sólo IEW y DOM).
//	Dependencias: iframe.js (1.0+) y sus dependencias respectivas.
//	Comentarios:
//		Amplía el objeto gsIframe para crear un entorno cliente/servidor entre la página que contiene el objeto y las
//	páginas cargadas en los mismos. Proporciona un mecanismo estándar de comunicación que permite enviar y recibir
//	variables y objetos entre cliente y servidor, así como que el cliente ejecute funciones del servidor tanto al
//	cargarse como durante la vida útil de la página cliente.
//	Histórico de cambios (tras versión 1.0):
/* ------------------------------------------------------------------------------------------------------------------ */
if(typeof(gsDebug)=="undefined")gsDebug=null
if(typeof(gsIframe)!="undefined"){ // No crear las funciones si no existe el objeto
/* - Tabla de Iframes servidores registrados a través de esta interfaz. - */
var gsIframes=[]
/* - Tabla de clientes para cualquier servidor - */
//gsIframe.prototype.cli=[]
/* - Carga una página cliente en este Iframe. La página deberá estar correctamente formada e implementar la interfaz de
 cliente para poderse comunicar con este servidor. Los parámetros especifican la página a cargar y el código a ejecutar
 cuando se cargue la página (formato cadena).
Parámetros:
	pag -- Página a cargar. Debe ser una URL válida, pero no se comprueba.
	f -- [opcional] Nombre de la función del servidor a llamar cuando termine la carga. Recibirá de parámetro el ID del
		cliente.
Devuelve:
	Nada.
- */
gsIframe.prototype.cargaCliente=function(pag,f){
	f=f||'' // Valor por defecto
	if(gsTipoDe(f)!=1)f=f.toString() // Sólo cadenas
	if(pag){ // Si hay página a cargar
		var z=pag+(pag.indexOf('?')>-1?'&':'?')+'gsFunc='+gsTraduce(f)+'&gsId='+gsTraduce(this.id) // Añadir parámetros
		if(this.l.src==z)this.w.location.reload() // Si ya está el cliente cargado, recargarlo
		else this.l.src=z // Si no, sustituir por este
		if(!gsIframes[this.id])gsIframes[this.id]=this // Registrar servidor
	}
}
/* - Lee una variable remota y devuelve su valor.
Parámetros:
	id -- Identificador del cliente registrado con este servidor.
	v -- Nombre de la variable a leer.
	d -- [opcional] Valor por defecto en caso de no encontrarse.
Devuelve:
	Si el cliente no está registrado, devuelve null.
	Si el cliente está registrado y no se encuentra la variable, devuelve d (o null si se ha omitido este parámetro).
	Si el cliente está registrado y se encuentra la variable, devuelve su valor.
- */
gsIframe.prototype.leeVarRemota=function(id,v,d){
	var i=this.cli?this.cli.gsFind(id,'id'):-1 // Buscar cliente
	return i<0?null:this.cli[i].obj.leeVar(v,(d||null)) // Leer variable
}
/* - Ejecuta una función remota con parámetros y devuelve su resultado.
Parámetros:
	id -- Identificador del cliente registrado con este servidor.
	f -- Nombre de la función a ejecutar.
	arguments[1..n] -- Resto de argumentos de la función. Todos se envían como cadenas.
Devuelve:
	El resultado de la función, o null si el cliente
- */
gsIframe.prototype.ejecutaFuncRemota=function(id,f){
	var i=this.cli?this.cli.gsFind(id,'id'):-1 // Buscar cliente
	var a=arguments,t='' // Argumentos
	if(a.length>1)for(var i=1;i<a.length;i++)t+='"'+a[i].toString()+'",' // Cadena de parámetros
	if(t)t=t.gsDelR(1) // Borrar la última ','
	return i<0?null:this.cli.obj.ejecutaFunc(f,t) // Evaluar la función
}
/* - Lee una variable local y devuelve su valor. Esta función está pensada para ser llamada desde la interfaz de cliente,
aunque se puede llamar desde el servidor si se desea.
Parámetros:
	v -- Nombre de la variable a leer.
	d -- [opcional] Valor por defecto en caso de no encontrarse.
Devuelve:
	Si no se encuentra la variable localmente, devuelve d o null si se ha omitido este parámetro.
	En caso contrario, devuelve el valor pedido.
- */
gsIframe.prototype.leeVar=function(v,d){
	if(gsDebug)gsDebug.vuelcaObjeto(gsIframes)
	if(gsDebug)gsDebug.escribe("Recibiendo petición para leer variable "+v+" con valor x defecto "+d,true)
	d=typeof(d)=="undefined"?null:d // Valor por defecto
	return typeof(eval('window.'+v))=="undefined"?d:eval('window.'+v) // Evaluar variable
}
/* - Ejecuta una función local con parámetros y devuelve su resultado. Esta función está pensada para ser llamada desde
 la interfaz de cliente, aunque se puede llamar desde el servidor si se desea.
Parámetros:
	f -- Nombre de la función a ejecutar.
	arguments[1..n] -- Resto de argumentos de la función. Todos se envían como cadenas. También se puede recibir un único
		argumento adicional que contiene una tabla con los argumentos de la función.
Devuelve:
	El resultado de la función, o null si la función no existe localmente.
- */
gsIframe.prototype.ejecutaFunc=function(f){
	var a=arguments,t='',ff=f // Leer argumentos
	if(a.length>1){
		if(gsTipoDe(a[1])==5)a=a[1] // Viene un array de argumentos (llama el cliente)
		else a[0]=null//delete a[0] // Llama el servidor
		for(var i=0;i<a.length;i++)t+='"'+a[i].toString()+'",' // Cadena de parámetros
	}
	if(t)t=t.gsDelR(1) // Borrar la última ','
	return eval('window.'+ff)?eval('window.'+ff+'('+t+')'):null // Evaluar la función
}
/* - Registra a un cliente con este servidor.
Parámetros:
	id -- Identificador del cliente.
Devuelve:
	Nada.
- */
gsIframe.prototype.registraCliente=function(id){
	if(!this.cli)this.cli=[]
	this.cli[this.cli.length]={id:id,obj:eval("this.w.gsCliente")} // Registrar este cliente
}
/* - Lee el identificador de un cliente dado su índice en la tabla de clientes.
Parámetros:
	i -- Índice en la tabla.
Devuelve:
	'' si el valor de i no está en la tabla o el identificador pedido en caso contrario.
- */
gsIframe.prototype.leeIdCliente=function(i){
	return i<0||i>=this.cli.length?'':this.cli[i].id // Leer la id de un cliente dado su índice
}
/* - Lee el número de clientes registrados de este servidor.
Parámetros.
	Ninguno.
Devuelve:
	El número de clientes registrados.
- */
gsIframe.prototype.leeNumClientes=function(){
	return this.cli.length // Devolver el número de clientes de este objeto
}
/* - Tabla de clientes de este servidor. - */
//gsIframe.prototype.cli=[]
}