/**
 *
 * Almacena los paginadores existentes en esta parte de la aplicacion
 *
 **/
__gyui_paginadores = new Array();

/**
 *
 * Metodo encargado de realizar la solicitud de una paginacion
 * @param id Identificador del paginador con el que estamos trabajando
 * @param paramActualPosName nombre del parametro con al posicion actual
 * @param posPageShow Posicion inicial de la pagina a mostrar
 *
 **/
function getPage(id, paramActualPosName, posPageShow) {
	var paginador = __gyui_paginadores[id];
	paginador.send(paramActualPosName, posPageShow);
}

function getPageRequest(id, paramActualPosName, posPageShow, paramTotalRegistros, numTotalRegistros) {
	var paginador = __gyui_paginadores[id];
	paginador.send(paramActualPosName, posPageShow, paramTotalRegistros, numTotalRegistros);
}


/**
 *
 * Paginador base que envia peticiones de paginacion de forma sincrona
 * @param id Nombre que hemos dado al paginador que vamos a crear, debe
 *	      ser el mismo que hemos dado al parametro que contiene la paginacion
 * @param accion Accion que se debe invocar en nuestro action y que realiza la paginacion
 * @param params Parametros que deseamos enviar a demas de los utilizados por el paginador
 *
 **/
GALILEO.widget.Paginador = function(id, accion, params) {
	if ((accion) && (id)) {
		this._accion = accion;
		this._id = id;
		this._form = document.forms["form_" + this._id];
		this._params = params;
		__gyui_paginadores[id] = this;
	}
}; 

/**
 *
 * Atributos privados
 *
 **/
GALILEO.widget.Paginador.prototype._accion = null;
GALILEO.widget.Paginador.prototype._form = null;
GALILEO.widget.Paginador.prototype._id = null;
GALILEO.widget.Paginador.prototype._params = null;

/**
 * Metodo encargado de obtener el id que representa al paginador
 * @return id El id que representa al paginador
 **/
GALILEO.widget.Paginador.prototype.getId = function() {
	return this._id;
};

/**
 * Metodo encargado de preparar el formulario a enviar
 * @param paramActualPosName nombre del parametro con al posicion actual
 * @param posPageShow Posicion inicial de la pagina a mostrar
 */ 
GALILEO.widget.Paginador.prototype._prepareForm = function(paramActualPosName, posPageShow) {
	GALILEO.util.Form.getField(this._form.name, "accion").value = this._accion;
	GALILEO.util.Form.getField(this._form.name, paramActualPosName).value = posPageShow;
	
	// Comprobamos si existen parametros adicionales que enviar con el paginador
	if (this._params && this._params.length > 0) {
		for (var i = 0; i < this._params.length; i++) {
			var input = GALILEO.util.Dom.createElement('input', [{name: 'type', value: 'hidden'},
		  	 													 {name: 'name', value: this._params[i].name},
		  	 													 {name: 'value', value: this._params[i].el.value}]);
			this._form.appendChild(input);
		}
	}
};

/**
 *
 * Metodo encargado de realizar el envio de una solicitud
 * @param paramActualPosName nombre del parametro con al posicion actual
 * @param posPageShow Posicion inicial de la pagina a mostrar
 *
 **/
GALILEO.widget.Paginador.prototype.send = function(paramActualPosName, posPageShow) {
	this._prepareForm(paramActualPosName, posPageShow); 	
	this._form.submit();
};

/**
 *
 * Extension del paginador base que envia peticiones de paginacion de forma asincrona
 * @param id Nombre que hemos dado al paginador que vamos a crear, debe
 *	      ser el mismo que hemos dado al parametro que contiene la paginacion
 * @param url Url a la que realizaremos la peticion
 * @param accion Accion que se debe invocar en nuestro action y que realiza la paginacion
 * @param callback Retrollamada que debe ser invocada una vez finalizada la peticion
 *
 **/
GALILEO.widget.PaginadorAsync = function(id, url, accion, callback, params) {
	if ((accion) && (id) && (url)) {
		GALILEO.widget.PaginadorAsync.superclass.constructor.call(this, id, accion, params);
		this._callback = callback;
		this._url = url;
	}
};

/**
 *
 * Definicion de la herencia
 *
 **/
YAHOO.extend(GALILEO.widget.PaginadorAsync, GALILEO.widget.Paginador);

/**
 *
 * Atributos privados
 *
 **/
GALILEO.widget.PaginadorAsync.prototype._url = null;
GALILEO.widget.PaginadorAsync.prototype._callback = null;

/**
 *
 * Redefinicion del metodo de envio
 * @param paramActualPosName nombre del parametro con al posicion actual
 * @param posPageShow Posicion inicial de la pagina a mostrar
 *
 **/
GALILEO.widget.PaginadorAsync.prototype.send = function(paramActualPosName, posPageShow) {
	this._prepareForm(paramActualPosName, posPageShow);
	GALILEO.util.Connect.asyncRequestForm(this._form.name, this._accion, this._callback);
};

/**
 *
 * Metodo encargado de crear un paginador que utiliza la request para realizar la peticion asincrona
 * @param id Id del paginador
 * @param url Url a la cual enviar la accion
 * @param accion Accion a solicitar
 * @param callback Callback a ejecutar
 * @param params Parametros adicionales a pasar al paginador
 **/
GALILEO.widget.PaginadorRequestAsync = function(id, url, accion, callback, params) {
	if ((accion) && (id) && (url)) {
		GALILEO.widget.PaginadorRequestAsync.superclass.constructor.call(this, id, url, accion, callback, params);
	}
};

/*
 * Definicion de la herencia
 */
YAHOO.extend(GALILEO.widget.PaginadorRequestAsync, GALILEO.widget.PaginadorAsync);

/**
 * Redefinicion del metodo de envio para este nuevo paginador
 * @param paramActualPosName Nombre del parametro de posicion actual
 * @param posPageShow Posicion de la pagina a mostrar
 * @param paramTotalRegistros Parametro con el numero maximo de registros a mostrar
 * @param numTotalRegistros Numero total de registros existentes
 *
 **/
GALILEO.widget.PaginadorRequestAsync.prototype.send = function(paramActualPosName, posPageShow, paramTotalRegistros, numTotalRegistros) {
    var parametros = "";
	parametros += ("?accion=" + this._accion);
	parametros += ("&" + paramActualPosName + "=" + posPageShow);
	parametros += ("&" + paramTotalRegistros+ "=" + numTotalRegistros);
	
	if (this._params && this._params.length > 0) {
		for (var i = 0; i < this._params.length; i++) {
			parametros += ("&" + this._params[i].name + "=" + this._params[i].el.value);
		}
	}
	
	GALILEO.util.Connect.asyncRequest((this._url + parametros), this._callback);
};

