/* ---------------------------------------- EXTENSIONES DEL OBJETO ARRAY -------------------------------------------- */
//	Versión: 1.1
//	Navegadores soportados: Todos los que soportan el objeto Array y la capacidad de añadir extensiones a 'prototype'.
//	Paquete: Juego de Cartas (sólo IEW y DOM).
//	Dependencias: Ninguna.
//	Comentarios:
//		Son un conjunto de funciones que extienden el tipo básico Array de JavaScript.
//	Histórico de cambios (tras versión 1.0):
//	- Versión 1.1:
//		+Añadida función gsFindE, una modificación de gsFind que devuelve el elemento que cumple la condición dada.
//		+Añadida función gsFindMult, una ampliación de gsFind que devuelve una tabla de índices de los elementos que cumplen
//	la condición de búsqueda dada.
//		+Añadida función gsFindMultE, una ampliación de gsFind que devuelve una tabla con los elementos que cumplen la
//	condición de búsqueda dada.
/* ------------------------------------------------------------------------------------------------------------------ */

/* - Calcula el índice que contiene el valor máximo de la matriz sobre la que se ejecuta esta función. Dispone de dos
 parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	a[0] -- [opcional] Nombre de la propiedad a comparar para matrices de objetos.
	a[1] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente por JavaScript.
Devuelve:
	El índice en el que se halló el valor máximo de la matriz o -1 si no se encuentra o hay algún error.
- */
Array.prototype.gsMax=function(){
	var m,t=this,p='',f=null,j=-1,a=arguments
	if(a.length>0)p=a[0]
	if(a.length>1)f=a[1]
	if(t.length)m=eval((f?'f(':'')+'t[0]'+(p?'.'+p:'')+(f?')':''))
	for(var i=1;i<t.length;i++){
		var x=eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))
		if(x>m){
			m=x
			j=i
		}
	}
	return j
}
/* - Calcula el índice que contiene el valor mínimo de la matriz sobre la que se ejecuta esta función. Dispone de dos
 parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	a[0] -- [opcional] Nombre de la propiedad a comparar para matrices de objetos.
	a[1] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente por JavaScript.
Devuelve:
	El índice en el que se halló el valor mínimo de la matriz o -1 si no se encuentra o hay algún error.
- */
Array.prototype.gsMin=function(){
	var m,t=this,p='',f=null,j=-1,a=arguments
	if(a.length>0)p=a[0]
	if(a.length>1)f=a[1]
	if(t.length)m=eval((f?'f(':'')+'t[0]'+(p?'.'+p:'')+(f?')':''))
	for(var i=1;i<t.length;i++){
		var x=eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))
		if(x<m){
			m=x
			j=i
		}
	}
	return j
}
/* - Calcula la suma de los elementos de la matriz sobre la que se ejecuta esta función. Dispone de dos parámetros
 opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	a[0] -- [opcional] Nombre de la propiedad a sumar para matrices de objetos.
	a[1] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor sumable directamente por JavaScript.
Devuelve:
	La suma de los valores de la matrix, o "NaN" o "Inf" en caso de error.
- */
Array.prototype.gsSum=function(){
	var s=0,t=this,p='',f=null,a=arguments
	if(a.length>0)p=a[0]
	if(a.length>1)f=a[1]
	for(var i=0;i<t.length;i++)s+=parseFloat(eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':'')))
	return s
}
/* - Calcula el número de elementos de la matriz sobre la que se ejecuta esta función cuyo valor es el de su argumento
 principal. Dispone de dos parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	v -- Valor a contar.
	a[1] -- [opcional] Nombre de la propiedad a contar para matrices de objetos.
	a[2] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente con el buscado.
Devuelve:
	El número de elementos que cumplen las condiciones, ó 0 si no se haya ninguno que las satisfaca o si hay error.
- */
Array.prototype.gsCount=function(v){
	var c=0,t=this,p='',f=null,a=arguments
	if(a.length>1)p=a[1]
	if(a.length>2)f=a[2]
	for(var i=0;i<t.length;i++)if(eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))==v)c++
	return c
}
/* - Busca el primer elemento de la matriz sobre la que se ejecuta esta función cuyo valor es el de su argumento principal.
 Dispone de dos parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	v -- Valor a buscar.
	a[1] -- [opcional] Nombre de la propiedad a buscar para matrices de objetos.
	a[2] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente con el buscado.
Devuelve:
	El índice del elemento buscado ó -1 en caso de error o no encontrado.
- */
Array.prototype.gsFind=function(v){
	var t=this,p='',f=null,a=arguments
	if(a.length>1)p=a[1]
	if(a.length>2)f=a[2]
	for(var i=0;i<t.length;i++)if(eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))==v)return i
	return -1
}
/* - Busca el primer elemento de la matriz sobre la que se ejecuta esta función cuyo valor es el de su argumento principal.
 Dispone de dos parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	v -- Valor a buscar.
	a[1] -- [opcional] Nombre de la propiedad a buscar para matrices de objetos.
	a[2] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente con el buscado.
Devuelve:
	El elemento buscado ó null en caso de error o no encontrado.
- */
Array.prototype.gsFindE=function(v){
	var t=this,p='',f=null,a=arguments
	if(a.length>1)p=a[1]
	if(a.length>2)f=a[2]
	for(var i=0;i<t.length;i++)if(eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))==v)return t[i]
	return null
}
/* - Busca los índices de todos elementos de la matriz sobre la que se ejecuta esta función cuyo valor es el de su argumento
 principal. Dispone de dos parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	v -- Valor a buscar.
	a[1] -- [opcional] Nombre de la propiedad a buscar para matrices de objetos.
	a[2] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente con el buscado.
Devuelve:
	Una matriz con los índices de todos los elementos que cumplen la condición de búsqueda o null.
- */
Array.prototype.gsFindMult=function(v){
	var t=this,p='',f=null,a=arguments,r=[]
	if(a.length>1)p=a[1]
	if(a.length>2)f=a[2]
	for(var i=0;i<t.length;i++)if(eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))==v)r[r.length]=i
	return r.length?r:null
}
/* - Busca todos los elementos de la matriz sobre la que se ejecuta esta función cuyo valor es el de su argumento principal.
 Dispone de dos parámetros opcionales para aumentar su funcionalidad y potencia.
Parámetros:
	v -- Valor a buscar.
	a[1] -- [opcional] Nombre de la propiedad a buscar para matrices de objetos.
	a[2] -- [opcional] Nombre de la función a utilizar para convertir el elemento de la matriz o una propiedad del mismo
		en un valor comparable directamente con el buscado.
Devuelve:
	Una matriz con todos los elementos que cumplen la condición de búsqueda o la matriz vacía.
- */
Array.prototype.gsFindMultE=function(v){
	var t=this,p='',f=null,a=arguments,r=[]
	if(a.length>1)p=a[1]
	if(a.length>2)f=a[2]
	for(var i=0;i<t.length;i++)if(eval((f?'f(':'')+'t['+i+']'+(p?'.'+p:'')+(f?')':''))==v)r[r.length]=t[i]
	return r.length?r:null
}
if(typeof(gsDebug)=="undefined")gsDebug=null
if(gsDebug){
	var a=[10,20.3,15.5,3,0,-1,0,0,1,0]
	gsDebug.titulo('archivo "extarray.js"','#40AAFF')
	gsDebug.escribe('a=['+a+']')
	gsDebug.escribe('(debe valer 1) a.gsMax()='+a.gsMax())
	gsDebug.escribe('(debe valer 5) a.gsMin()='+a.gsMin())
	gsDebug.escribe('(debe valer 48.8) a.gsSum()='+a.gsSum())
	gsDebug.escribe('(debe valer 1) a.gsCount(3)='+a.gsCount(3))
	gsDebug.escribe('(debe valer 4) a.gsFind(0)='+a.gsFind(0))
	gsDebug.escribe('(debe valer 20.3) a.gsFindE(20.3)='+a.gsFindE(20.3))
	gsDebug.escribe('(debe valer 4,6,7,9) a.gsFindMult(0)='+a.gsFindMult(0))
	gsDebug.escribe('(debe valer 0,0,0,0) a.gsFindMultE(0)='+a.gsFindMultE(0))
	gsDebug.refresca()
}