var currentModalWindow;

/**
 * Abre una ventana popup que permite filtrar elementos de la tabla
 * de la clase entity (mapeado por hibernate). Se muestran las columnas
 * especificadas en cols. Y al cerrar el popup se llama a la función
 * especificada por callback, pasandole por parámetro la fila seleccionada
 * en la tabla del popup.
 *
 * Parte de la implementación del PickUp.
 */
function openPickUpWindow(callback, cols, colsCount, entity, searchMethod)
{
    var showUrl = "popup_pickUp.html?method=show&onItemSelected=" + callback
              + "&colsCount=" + colsCount
              + "&entity=" + entity
              + "&searchMethod=" + searchMethod
              + cols;

    //Ventana emergente de window_js (prototype-window)
    //TODO: que el classname sea un parámetro de configuración global
    currentModalWindow = new Window({id:"pickup_window" ,className: "alphacube", title: "Seleccione un item", width:800,
                          height:500, zIndex : 100,recenterAuto: true, destroyOnClose: true ,
                          url: showUrl, showEffectOptions: {duration:1.5}});

    currentModalWindow.setCloseCallback(pickUpWindowCallBack);
    currentModalWindow.showCenter(true);
}

/**
 * Abre una ventana popup que permite seleccionar un conjunto de datos segun una consulta
 * implementada en el manager. Se muestran las columnas
 * especificadas en cols. Y al cerrar el popup se llama a la función
 * especificada por callback, pasandole por parámetro la fila seleccionada
 * en la tabla del popup.
 *
 * Parte de la implementación del PickUp.
 */
function openPickUpItemWindow(callback, cols, colsCount, entity, listMethod, params)
{
    var showUrl = "popup_pickUp.html?method=showItemList&onItemSelected=" + callback
              + "&colsCount=" + colsCount
              + "&listMethod=" + listMethod
              + "&params=" + params
              + cols;

    //Ventana emergente de window_js (prototype-window)
    //TODO: que el classname sea un parámetro de configuración global
    currentModalWindow = new Window({id:"pickup_window" ,className: "alphacube", title: "Seleccione un item", width:800,
                          height:500, zIndex : 100,recenterAuto: true, destroyOnClose: true ,
                          url: showUrl, showEffectOptions: {duration:1.5}});

    currentModalWindow.setCloseCallback(pickUpWindowCallBack);
    currentModalWindow.showCenter(true);
}

/**
 * Función invocada por el pickup window cuando se selecciona uno de sus elementos.
 * Esta función invoca a la función de callback especificada por el usuario en el
 * PickUpTag pasandole como parámetro el objeto seleccionado en la ventana en formato
 * JSON.
 */
function pickUpWindowCallBack(window)
{

    var win = Windows.getWindow(currentModalWindow.getId());
    var ww = win.content.contentWindow.window;
    var object = ww.eval("getSelectedItem()");

    if(object) {
      var callback = ww.eval("getCallback()");
       eval(callback + "(object)");
    }

    return true;
}


/**
 * Abre una ventana popup que permite realizar un ABM generico
 * sobre el POJO (entity) pasado como parametro. Al cerrar el popup se llama a la función
 * especificada por callback, la cual se encarga de actualizar los datos ingresados.
 *
 */
function openGenericCudWindow(callback, entity, cols, colsCount) {
	
	var showUrl	= "popup_genericCudForm.html?method=showGenericCudForm"
				+ "&colsCount=" + colsCount
				+ "&entity=" + entity
				+ cols
				+ "&callback=" + callback;
	
	currentModalWindow = new Window({id:"pickup_window" ,className: "alphacube", title: "Carga de datos", width:640,
                          height:480, zIndex : 100,recenterAuto: true, destroyOnClose: true ,
                          url: showUrl, showEffectOptions: {duration:1.5}});

    currentModalWindow.setCloseCallback(genericCudCloseCallBack);
    currentModalWindow.showCenter(true);
}

function genericCudCloseCallBack(window) {
	var win = Windows.getWindow(currentModalWindow.getId());
	var ww = win.content.contentWindow.window;
	
	var callback = ww.eval("getCallback()");
	eval(callback + "()");
	
	return true;
}


/**
 * Algunas funciones de librerías javascript tienen parámetros obligatorios de
 * tipo función, para los casos en donde no nos importe lo que haga dicha función
 * podemos usar esta.
 */
function dummy() {
    return true;
}


//Funciones para implementacion de tag subSelect
/**
 * Obtiene desde el servidor la lista de opciones para el select
 * en funcion al valor actual del select de ID parentId.
 * La actualizacion se hace via el objeto connection de YUI.
 */
function updateSubSelect(parentId, 		//Id del select del cual depende
                         id, 			//Id del select a actualizar
                         name, 			//Nombre del select a actualizar
                         value,			//(Opcional) Valor actual del select
                         listName,		//Nombre de la lista de opciones
                         param,			//Valor actual del select padre
                         emptyMsg,		//Mensaje mostrado si el select no tiene opciones
                         property,		//Nombre de la propiedad en la que se setea el valor seleccionado en el select
                         otherParams,	//Parámetros extras pasados en la url. Formato val1#val2#val3
                         nullable,		//Indica si debe tener una fila vacia. true/false
                         nullMessage,   
                         nullValue,
                         myStyleClass,
                         myDirectStyle
                         )
{
    var subSelectCallback = {
        success: updateSubSelectSuccess,
        failure: updateSubSelectFailure,
        argument: {}
    };

    //Realizar la peticion al servidor
    var url = 'ajax_updateSubSelect.html?method=search&list=' + listName + '&param=' + param +
              '&emptyMsg=' + emptyMsg + '&otherParams=' + otherParams + '&nullable=' + nullable +
              '&nullMessage=' + nullMessage + '&nullValue=' + nullValue + '&value=' + value;               

    subSelectCallback.argument = {selectId:id, 
    							  selectName:name, 
    							  selectValue:value, 
    							  destProperty:property,
    							  styleClass:myStyleClass,
    							  directStyle: myDirectStyle
    							  };
    var request = YAHOO.util.Connect.asyncRequest('GET', url, subSelectCallback);
}

function updateSubSelectSuccess(resp)
{
    var id = resp.argument.selectId;
    var name = resp.argument.selectName;
    var value = resp.argument.selectValue;
    var property = resp.argument.destProperty;
    var styleClass = resp.argument.styleClass;
    var style = resp.argument.directStyle
    var tmp;

    tmp = "<select id='" + id + "' ";

    if (name != "") {
        tmp = tmp + " name='" + name + "' ";
    }

    if (value != "") {
        tmp = tmp + " value='" + value + "' ";
    }
    
    if (styleClass != "") {
        tmp = tmp + " class='" + styleClass + "' ";
    }
    
    if (style != "") {
    	tmp = tmp + " style='" + style + "' "
    }

    tmp = tmp + ">";

    //Recuperar todos los eventos asociados al select antes de reescribirlo
    var listeners = YAHOO.util.Event.getListeners(YAHOO.util.Event.getEl(id));

    //Los selects generados por el tag estan en un div cuyo id es "div<id del select>"
    $("div" + id).innerHTML = tmp + resp.responseText + "</select>";

    //Reasociar los eventos al select
    for (tmp = 0; listeners != null && tmp < listeners.length; tmp++) {
        YAHOO.util.Event.addListener(id,listeners[tmp].type,listeners[tmp].fn);

        if (listeners[tmp].type == "change") {
            listeners[tmp].fn.call();
        }
    }
}

//TODO: mejorar manejo de error
function updateSubSelectFailure(resp)
{
    //alert('error ' + resp.responseText + ' code = ' + resp.statusText);
    //alert("Error al traer los datos del servidor");
}

//Funciones para implementacion de tag updatableTable
/**
 * Obtiene desde el servidor la tabla mostrar.
 * La actualizacion se hace via el objeto connection de YUI.
 */
function updateTable( id, 			//Id del select a actualizar
					  listName,		//Nombre de la lista a mostrar
					  cols, 		//nombre de las columnas
   					  cantCols, 	//cantidad de columnas
   					  params,		//parametros para la generacion de la tabla
   					  style, 		//estilo de la tabla
   					  method		//metodo del servlet que genera la tabla
					)
{
	var updatableTableCallback = {
	    success: updateTableSuccess,
		failure: updateTableFailure,
		argument: {}
	};

	//Realizar la peticion al servidor
	var url = 'ajax_updateTable.html?method='+ method + '&list=' + listName + '&params=' + params +
			  '&cantCols=' + cantCols + '&' + cols + '&style=' + style;

	updatableTableCallback.argument = {id:id};
	var request = YAHOO.util.Connect.asyncRequest('GET', url, updatableTableCallback);
}

function updateTableSuccess(resp)
{
	var id = resp.argument.id;

	//Recuperar todos los eventos asociados al select antes de reescribirlo
	var listeners = YAHOO.util.Event.getListeners(YAHOO.util.Event.getEl(id));

	//Los selects generados por el tag estan en un div cuyo id es "div<id del select>"
	$("div" + id).innerHTML = resp.responseText;

	//Reasociar los eventos al select
	for (tmp = 0; listeners != null && tmp < listeners.length; tmp++) {
		YAHOO.util.Event.addListener(id,listeners[tmp].type,listeners[tmp].fn);

		if (listeners[tmp].type == "change") {
			listeners[tmp].fn.call();
		}
	}
}

//TODO: mejorar manejo de error
function updateTableFailure(resp)
{
	//alert('error ' + resp.responseText + ' code = ' + resp.statusText);
	alert("Error al traer los datos del servidor");
}


/**
 * Obtiene desde el servidor la descripción (toString()) asociada al valor actualizado del objeto origen.
 */
function showAssociatedDescription(origId, 		//Id del objeto origen
                         destId, 			//Id objeto destino
                         valPK,				//valor cargado en el objeto origen
                         clazz, 			//Nombre de la clase
                         emptyMsg,
                         method				//Metodo a invocar en el servlet
                         )
{
//Funciones para implementacion de tag associatedDescription
var showAssociatedDescriptionCallback = {
    success: showAssociatedDescriptionSuccess,
    failure: showAssociatedDescriptionFailure,
    argument: {}
};

	if (method == "")
		method = "search";

    //Realizar la peticion al servidor
    var url = 'ajax_updateAssociatedDescription.html?method=' + method + '&strPK=' + valPK + '&strClass=' + clazz +
              '&emptyMsg=' + emptyMsg ;
    showAssociatedDescriptionCallback.argument = {objId:destId };
    var request = YAHOO.util.Connect.asyncRequest('GET', url, showAssociatedDescriptionCallback);
}

function showAssociatedDescriptionSuccess(resp)
{
    //alert(resp.responseText);
    //alert(resp.argument.objId);
    var id = resp.argument.objId;
    $(id).value = resp.responseText;
    //$("span" + id).innerHTML = resp.responseText;
}

//TODO: mejorar manejo de error
function showAssociatedDescriptionFailure(resp)
{
    //alert('error ' + resp.responseText + ' code = ' + resp.statusText);
    //alert("Error al traer los datos del servidor");
}

function addRemoveItem(add, item) {
    if (add) {
        $('selectedItem').value += "," + item;
    } else {
        var regex = new RegExp("," + item,"g");
        $('selectedItem').value = $('selectedItem').value.replace(regex, "");
    }
}


/**
 * Pasar a mayusculas todos los campos de texto
 * que tengan asociado el estilo "text".
 * Al evento click del boton sumit se le asocia la funcion
 * que convierte el contenido de los campos.
 */

 function toUpperOnSubmit(obj) {
    /**
     * Convertir a mayuscula todos los campos de texto que tengan id=text,
     * y los textarea.
     * La lista de controles transformados debe coincidir con la lista especificada
     * en styles/form.css con text-transform:uppercase.
     */

    var texts = $$('.text');
    var areas = $$('textarea');

    texts.each(function(obj) {
        obj.value = obj.value.toUpperCase();
    });

    areas.each(function(obj) {
        obj.value = obj.value.toUpperCase();
    });
 }

 var last = {};
function addClickEventTableRows(tableId) {
    var previousClass = null;
    var table = $(tableId);
    var tbody = table.getElementsBySelector("tbody")[0];
    var rows;
    if (tbody == null) {
        rows = table.getElementsBySelector("tr");
    } else {
        rows = Element.getElementsBySelector(tbody, "tr");
    }
    // add event handlers so rows light up and are clickable
    for (i=0; i < rows.length; i++) {
        if (rows[i].getAttribute("class") != "empty") {
            Event.observe(rows[i], "click", function (evt) {
                if (last[tableId]) {
                    last[tableId].removeClassName("selected");
                }
                var tr = Event.element(evt).ancestors()[0];
                tr.addClassName("selected");
                last[tableId] = tr;
                $("id" + tableId).value = tr.childElements()[0].firstChild.nodeValue.strip();
            });
        }
    }
}

function modifyPageLinks(id) {
    var element = $(id).previousSiblings()[0];
    if (element) {
        var as = Element.getElementsBySelector(element, "a");
        for (var i = 0; i < as.length; i++) {
            as[i].setAttribute("href", "javascript:updateSlot('" + as[i].getAttribute("href") + "')");
        }
    }
}

/* Obtiene el semestre seleccionado dependiendo del radiobutton */
function getSelectedSemestre(ctrl) {
    for(i=0;i<ctrl.length;i++)
        if(ctrl[i].checked) return ctrl[i].value;
}

function updateSlot(anchor) {
    var obj = new Ajax.Updater("slot", anchor, {evalScripts: true});
}

/**
 * Retorna el valor seleccionado en un grupo de radio buttons.
 * null si no hay uno seleccionado.
 */
function getRadioCheckedValue(radio) {
	for(var i = 0; i < radio.length; i++) {
		if (radio[i].checked) {
			return radio[i].value;
		}		
	}
	
	return null;
}

/**
 * Functiones utiles para personas
 */
function updateDivs(bloque) {
	//Cargo los formularios via ajax
	var item = {};
	item.id = $("idPersona").value;

	ready = false;
	
	//Terciario
	if (bloque == 'acad_ter') {
    	item.method = "manejarEstudios";
    	item.bloque = "acad_ter";
    	$("divTerciario").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divTerciario", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
	}
    
    //Especializacion
    if (bloque == 'acad_esp') {
    	item.method = "manejarEstudios";
    	item.bloque = "acad_esp";
    	$("divEspecializacion").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divEspecializacion", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Maestria
    if (bloque == 'acad_mas') {
    	item.method = "manejarEstudios";
    	item.bloque = "acad_mas";
    	$("divMaestria").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divMaestria", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Doctorado
    if (bloque == 'acad_doc') {
    	item.method = "manejarEstudios";
    	item.bloque = "acad_doc";
    	$("divDoctorado").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divDoctorado", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Idiomas
    if (bloque == 'idioma') {
        item.method = "manejarIdioma";
    	item.bloque = "idioma";
    	$("divIdiomas").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divIdiomas", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Informatica
    if (bloque == 'informatico') {
        item.method = "manejarEstudioInformatico";
    	item.bloque = "informatico";
    	$("divInformatica").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divInformatica", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Otros
    if (bloque == 'otros') {
        item.method = "manejarEstudioOtros";
    	item.bloque = "otros";
    	$("divOtrosConoc").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divOtrosConoc", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Antecedentes no docentes
    if (bloque == 'ant_nodoc') {
        item.method = "manejarAntecedentesNoDocentes";
    	item.bloque = "ant_nodoc";
    	$("divNoDocente").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divNoDocente", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Antecedentes docentes
    if (bloque == 'ant_doc') {
        item.method = "manejarAntecedentesDocentes";
    	item.bloque = "ant_doc";
    	$("divDocente").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divDocente", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Eventos
    if (bloque == 'evento') {
        item.method = "manejarEventos";
    	item.bloque = "evento";
    	$("divEvento").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divEvento", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Organizaciones
    if (bloque == 'asociacion') {
        item.method = "manejarAsociaciones";
    	item.bloque = "asociacion";
    	$("divAsociacion").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divAsociacion", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Revista
    if (bloque == 'revista') {
        item.method = "manejarPublicacion";
    	item.bloque = "revista";
    	$("divRevista").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divRevista", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Libro
    if (bloque == 'libro') {
        item.method = "manejarPublicacion";
    	item.bloque = "libro";
    	$("divLibro").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divLibro", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }
    
    //Investigacion
    if (bloque == 'investigacion') {
        item.method = "manejarInvestigacion";
    	item.bloque = "investigacion";
    	$("divInvestigacion").update("<table class='tbl_recuadro' width='100%'><tr valign='middle'><td align='center' width='10%'><img src='images/cargando.gif' width='16px' height='16px'></td><td>Cargando Datos...</td></tr></table>");
    	new Ajax.Updater("divInvestigacion", "ajax_personas.html", {
                  method: "post",
                  parameters: $H(item),
                  evalScripts: true                
        });
    }

    ready = true;
}