jQuery.root = $(document);

/**
 * Oculta un mensaje de informacion.
 * Se utiliza para ocultar un mensaje del resultado de una peticion http via AJAX
 * @return null
 */
function _hideMsg() {
    $("#out").fadeOut("slow");
}

/**
 * Muestra un mensaje de informacion.
 * Se utiliza para mostrar un mensaje del resultado de una peticion http via AJAX
 * @param msg (String) Mensaje a mostrar
 * @param ok (Boolean) Indica si el mensaje es de ok
 * @return null
 */
var timer;

function _showMsg(message, type) {
    delay = 3000;

    if (timer != null)
            clearTimeout(timer);
    
    $('#out').removeClass("progress");
    $('#out').removeClass("message");
    $('#out').removeClass("error");
    $('#out').removeClass("warning");

	switch (type) {
		case 1:
			$('#out').addClass("progress");
			break;
		
		case 2:
			$('#out').addClass("message");
			break;
		
		case 3:
			$('#out').addClass("error");
			break;

        case 4:
			$('#out').addClass("warning");
			break;
	}
    
    $('#out').html(message);
	$("#out").show();

    if ((type != '1') && (delay > -1))
        timer = setTimeout('_hideMsg()', delay);

}

function showError(message) {	_showMsg(message, 3); }
function showMessage(message) { _showMsg(message, 2); }
function showProgress(message) { _showMsg(message, 1); }
function showWarning(message) {	_showMsg(message, 4); }


function autoCloseFacebox(reload) {
    delay = 3500;
    autoClose = setTimeout(function(){
        $.facebox.close();
        if (reload)
            window.location.reload();
    }, delay);

    return autoClose;
}

function _hideFaceboxMsg() {
    $("#output").hide();
}

function _showFaceboxMsg(message, type) {
    delay = 3000;

    if (timer != null)
        clearTimeout(timer);

    $('#output').removeClass("progress");
    $('#output').removeClass("error");

    switch (type) {
        case 1:
            $('#output').addClass("progress");
            break;

        case 2:
            $('#output').addClass("error");
            break;
    }

    $('#output').html(message);
    $("#output").show();

    //if ((type != '1') && (delay > -1))
    //    timer = setTimeout(function(){_hideFaceboxMsg()}, delay);
}

function showFaceboxError(message) { _showFaceboxMsg(message, 2); }
function showFaceboxProgress(message) { _showFaceboxMsg(message, 1); }


/**
 * Gestiona las respuestas recibidas de peticiones AJAX, siempre y cuando dicha respuesta cumpla con
 * la estructura establecida.
 * @param resp String con la respuesta en formato XML
 * @param afterSubmit function que se ejecuta después de la petición
 * @return null
 */
function _manageAjaxResponse(resp, afterSubmit) {
    //$('label').css('background-color', '');
    $('.inlineErr').remove();

    response = $('response', $(resp)).eq(0);
    
    if (response != null) {
        code = $('code', $(response)).text();
        msg = $('msg', $(response)).text();

        if (afterSubmit != null) {
            afterSubmit(code, msg, response);

        }
        else
            if (code > 0)
                showMessage(msg);
            else if (code == -9)
                showError(msg);


            $('error', $(response)).each(function() {
                //$('label[for=' +$(this).attr('field')+ ']').css('background-color', '#f66');
                //$('#errorsList').append("<li style=\"color:#f00\">" +$(this).text()+ "</li>");
                $('label[for=' +$(this).attr('field')+ ']')
                    .after("<div class=\"inlineErr\">" +$(this).text()+ "</div>");
            })

/*
            $('warning', $(response)).each(function() {
                $('label[@for=' +$(this).attr('field')+ ']').css('background-color', '#ff9');
                $('#errorsList').append("<li>" +$(this).text()+ "</li>");
            })
*/

    
    } else {
        alert("La respuesta del servidor no es compatible");
        
    }
    
    return code;
}

function manageAjaxResponse(resp) {
    return _manageAjaxResponse(resp, null);
}


/**
 * Carga las opciones de un campo select.
 * @param   source String, Nombre del archivo en formato XML, que contiene las opciones.
 * @param   target String, Id del campo select.
 * @param   params String, Parametros que se envian en la peticion.
 * @return  null
 */
function loadOptiosSelect(source, target, params, defaultSelected) {
    
    $("#" + target).empty();
    $("#" + target).addOption("-1", "Cargando..");
    $("#" + target).attr('disabled', 'disabled');
    
    $.ajax({
        url: "./" + source,
        dataType: "xml",
            data: params,
            success: function(xml) {
                $("#" + target).empty();

                $("option", xml).each(function(){
                    $("#" + target).addOption($(this).attr("value"), $(this).text());
                });

                if (defaultSelected)
                    selectByValue(target, defaultSelected);
                else
                    selectByValue(target, "0");

                $("#" + target).attr('disabled', '');
            }
	});
}


/**
 * Selecciona la opcion del select que coincida con un valor siempre y cuando este exista.
 * @param select Puede ser el nombre
 * @param value (String) Valor de la opcion.
 * @return null
 */
function selectByValue(select, value)
{
    // Si se pasa el nombre del objeto, lo busco
    if (typeof select === "string")
        select = jQuery.root.find('select[name=' +select+ ']');


    // Si tengo el objeto, busco la opción y la selecciono
    if (typeof select === "object")
    {
        select.find('option[value=' +value+ ']').attr('selected', 'selected');
        return true;
    }
    else
        return false;
}

/**
 * Selecciona la opcion del Select que coincida con un valor siempre y cuando este exista.
 * @param select (String) Nombre del Select,
 * @param text (String) Valor de la opcion.
 * @return null
 */
function selectByText(select, text) {
    $('option[value=' +text+ ']', $('#' + select)).attr('selected', 'selected');
}

/**
 * Selecciona la opcion del Select que coincida con un valor siempre y cuando este exista.
 * @param name (String) Nombre del Select,
 * @param value (String) Valor de la opcion.
 * @param markLabel boolean, 
 * @return null
 */
function selectRadioByValue(name, value, markLabel) {
    radio = $('input:radio[name=' +name+ '][value=' +value+ ']');
    $(radio).attr("checked", "checked");

    if (markLabel) {
        $(radio).parent().css("color", "#900");
        $(radio).parent().css("font-weight", "bold");
    }
}

/**
 * Impide escribir caracteres no numéricos en un input
 * @param	evt Event. Evento de tecla pulsada
 * @return	true si se pulsó un número; false en caso contrario
 */
function onlyNumbers(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
    //if (charCode!=46 && charCode!=8 && charCode!=9 && (charCode<48 || charCode>57))
        return false;

    return true;
}

/**
 * Inicializa el calendario
 * @return	null
 */
function initCalendar() {
    $.dpText = {
    	TEXT_PREV_YEAR		:	'A&ntilde;o anterior',
    	TEXT_PREV_MONTH		:	'Mes anterior',
    	TEXT_NEXT_YEAR		:	'A&ntilde;o siguiente',
    	TEXT_NEXT_MONTH		:	'Mes siguiente',
    	TEXT_CLOSE			:	'Cerrar',
    	TEXT_CHOOSE_DATE	:	'Elegir fecha'
    }

    Date.monthNames = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'];
    Date.abbrMonthNames = ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'];
    Date.dayNames = ['Domingo', 'Lunes', 'Martes', 'XMiércoles', 'Jueves', 'Viernes', 'Sábado'];
    Date.abbrDayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    Date.firstDayOfWeek = 1;
    Date.format = 'dd/mm/yyyy';

    $('.date-pick').datePicker({
        startDate: '01/01/2000',
    	endDate: (new Date()).asString()
    });

}

function logout() {
    if (confirm("¿Está seguro de querer terminar su sesión?"))
        window.location="do/logout.jsp";
}

function ismaxlength(obj){
    var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : "";
    if (obj.getAttribute && obj.value.length>=mlength)
    obj.value=obj.value.substring(0,(mlength-1))
}

function createCookie(c_name,value,expiredays) {
    var exdate=new Date();
    exdate.setDate(exdate.getDate()+expiredays);
    document.cookie=c_name+ "=" +escape(value)+
    ((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

