/* ------------------------------------- FUNCIONES BÁSICAS DE USO COMÚN --------------------------------------------- */
//	Versión: 1.0
//	Navegadores soportados: Todos (salvo algunas funciones puntuales).
//	Paquete: Juego de Cartas (sólo IEW o DOM).
//	Dependencias: detecta.js (1.0+).
//	Comentarios:
//		Son un conjunto de funciones de uso universal para facilitar ciertas operaciones en otras librerías.
//	Histórico de cambios (tras versión 1.0):
/* ------------------------------------------------------------------------------------------------------------------ */

/* - Devuelve el tipo de su argumento como un entero.
Parámetros:
	v -- Valor a examinar.
Devuelve:
	Tipo del argumento según la siguiente tabla:
		0 -- Numérico
		1 -- Cadena
		2 -- Función
		3 -- Objeto
		4 -- Lógico (boolean)
		5 -- Matriz
		6 -- "undefined"
- */
function gsTipoDe(v){
	return typeof(v)=="string"?1:typeof(v)=="object"?(typeof(v.length)!="undefined"?5:3):typeof(v)=="function"?2:typeof(v)=="boolean"?4:typeof(v)=="undefined"?6:0
}
/* - Devuelve una cadena hexadecimal de 6 dígitos a partir del entero dado.
Parámetros:
	v -- Valor a convertir (debe ser numérico).
Devuelve:
	Valor en cadena hexadecimal o '' si el valor no es numérico.
- */
function gsHexa6(v){
	return gsTipoDe(v)==0?(v&0xFFFFFF).toString(16):''
}
/* - Devuelve una cadena hexadecimal de 2 dígitos a partir del entero dado.
Parámetros:
	v -- Valor a convertir (debe ser numérico).
Devuelve:
	Valor en cadena hexadecimal o '' si el valor no es numérico.
- */
function gsHexa2(v){
	return gsTipoDe(v)==0?(v&0xFF).toString(16):''
}
/* - Genera una cadena de color HTML a partir de sus componentes RGB.
Parámetros:
	r -- Componente roja.
	g -- Componente verde.
	b -- Componente azul.
Devuelve:
	Valor en cadena hexadecimal. Si alguno de los argumentos no es numérico, se sustituirá por '00'.
- */
function gsRGB(r,g,b)
{
	return '#'+gsHexa2(gsTipoDe(r)==0?r:0)+gsHexa2(gsTipoDe(g)==0?g:0)+gsHexa2(gsTipoDe(b)==0?b:0)
}
/*- Genera variables a partir de los parámetros recibidos por la página web en que se incluye este código. Las nuevas
 variables se denominarán como los parámetros recibidos y serán hijas del objeto "document" actual, con tipo "string".
Parámetros:
	Ninguno.
Devuelve:
	Nada, pero genera variables como hijas del objeto "document".
- */
function gsGenPars(){
	if(location.search){
		var a=location.search.substring(1)
		a=a.split("&")
		for(i=0;i<a.length;i++){
			b=a[i].split("=")
			b[0]=unescape(b[0]).replace(/\s/gi,"_")
			b[1]=unescape(b[1])
			eval("document."+b[0]+"='"+b[1]+"'")
		}
	}
}
/*- Lee un parámetro de los recibidos por la página web en que se incluye este código.
Parámetros:
	n -- Nombre del parámetro esperado.
	v -- [opcional] Valor por defecto si no se encuentra el parámetro.
Devuelve:
	El valor del parámetro dado si se encuentra, v si no se encuentra, o null si no se especifica v.
- */
function gsLeePar(n,v){
	if(location.search){
		var l=location.search.substring(1) // Eliminar '?'
		var p=l.split("&") // Separar parámetros
		for(var i=0;i<p.length;i++){
			var pp=p[i].split("=")
			if(unescape(pp[0])==n)return unescape(pp[1])
		}
	}
	return v?v:null
}
/*- Obtiene un objeto por clase y nombre rápidamente en IEW y NS6+. Si hay más de uno, devuelve sólo el primero.
Parámetros:
	t -- Etiqueta del objeto.
	n -- Nombre del objeto.
Devuelve:
	El objeto buscado o null si no se encuentra.
- */
function gsDameObjeto(t,n){
	var l=gsNav.ie4?document.all.tags(t)[n]:document.getElementsByTagName(t)[n]
	return l
}
/*- Genera un número aleatorio entero entre 0 y v-1.
Parámetros:
	v -- Valor máximo más uno.
Devuelve:
	El número aleatorio entero.
- */
function gsRnd(v){
	return Math.floor(Math.random()*v)
}
/*- Genera el HTML necesario para instanciar un layer dados sus elementos principales.
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:
	El código HTML necesario.
- */
function gsCreaLayer(id,x,y,an,al,v,z,c){
	return '<div id="'+id+'" style="position:absolute;'+(x?'left:'+x+'px;':'')+(y?'top:'+y+'px;':'')+'width:'+
	(an?an+'px':'auto')+';height:'+(al?al+'px':'auto')+(v?';visibility:'+v:'')+(z?';z-index:'+z:'')+'">'+(c?c:'')+'</div>'
}
/*- Genera el HTML necesario para instanciar un iframe (IEW y NS6+) dados sus elementos principales.
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:
	El código HTML necesario.
- */
function gsCreaIframe(id,x,y,an,al,v,fb,mw,mh,ml,mt,sc){
	var t='<iframe id="'+id+'" name="'+id+'" left="'+(x||0)+'" top="'+(y||0)+'"'+(an?' width="'+an+'"':'')+
		(al?' height="'+al+'"':'')+' frameborder="'+(fb?fb:'no')+'"'+(mw?' marginwidth="'+mw+'"':'')+(mh?' marginheight="'+mh+'"':'')+
		(mt?' topmargin="'+mt+'"':'')+(ml?' leftmargin="'+ml+'"':'')+' scrolling="'+(sc?sc:'no')+'" style="position:absolute;width:'+
		(an?an+(gsTipoDe(an)==1?'':'px'):'auto')+';height:'+(al?al+(gsTipoDe(al)==1?'':'px'):'auto')+';left:'+(x||0)+'px;top:'+(y||0)+'px'+';visibility:'+
		(v==true?'inherit':v==false?'hidden':'inherit')+'"></iframe>'
	return t
}
/* - Traduce una cadena y la deja lista para usarla como parámetro de un script o página web.
Parámetros:
	val -- Cadena a traducir.
Devuelve:
	Cadena traducida.
-*/
function gsTraduce(val){
	var i,v='',j=0,r=/\x20/g
	i=val.indexOf("\r")
	while(i>-1){
		v+=val.substring(j,i)
		val=val.substring(i+1)
		i=val.indexOf("\r")
	}
	v+=val
	//v=v.replace(r,'+')
	return escape(v)
}

/* -- Código de depuración/test -- */
if(typeof(gsDebug)=="undefined")gsDebug=null
if(gsDebug){
	var a=function(a){
		return a
	}
	var b='epepe',c=0xF00FFA,d={x:10},e=[10],f=true
	gsDebug.titulo('archivo "funcsbase.js"','cyan')
	gsDebug.escribe("a="+a+" - gsTipoDe(a)="+gsTipoDe(a))
	gsDebug.escribe("b="+b+" - gsTipoDe(b)="+gsTipoDe(b))
	gsDebug.escribe("c="+c+" - gsTipoDe(c)="+gsTipoDe(c))
	gsDebug.escribe("d="+d+" - gsTipoDe(d)="+gsTipoDe(d))
	gsDebug.escribe("e=["+e+"] - gsTipoDe(e)="+gsTipoDe(e))
	gsDebug.escribe("f="+f+" - gsTipoDe(f)="+gsTipoDe(f))
	gsDebug.escribe("gsHexa2(0xFF)="+gsHexa2(0xFF))
	gsDebug.escribe("gsHexa6(0xF0234A)="+gsHexa6(0xF0234A))
	gsDebug.escribe("gsRGB(0xaa,0xbb,0xcc)="+gsRGB(0xaa,0xbb,0xcc))
	gsDebug.escribe("gsLeePar('test','-- no hay --')="+gsLeePar('test','-- no hay --'))
	gsDebug.escribe("gsLeePar('test')="+gsLeePar('test'))
	gsDebug.escribe("gsDameObjeto('div','test')="+gsDameObjeto('div','test'))
	gsDebug.escribe("gsRnd(10)="+gsRnd(10))
	gsDebug.escribe("gsCreaLayer('test',5,5,100,100,true,0,'')="+gsCreaLayer('test',5,5,100,100,true,0,''))
	gsDebug.escribe("gsCreaIframe('test',5,5,100,100,true,'yes',10,5,5,5,'auto')="+gsCreaIframe('test',5,5,100,100,true,'yes',10,5,5,5,'auto'))
	gsDebug.escribe("gsTraduce('parámetros varios')="+gsTraduce('parámetros varios'))
	gsDebug.refresca()
}