/**************************/
/** FUNCIONES UTILIDADES **/
/**************************/
ab39aUtils = {
	array : {},
	combo : {},
	feedback : {},
	form : {},
	navegacion : {},
	tabla : {
		sortType : {},
		formatter : {}
	},
	util : {},
	properties : {}
};

//PROPERTIES
ab39aUtils.properties.popup_previsualizar_encuesta_height=900;
ab39aUtils.properties.popup_previsualizar_encuesta_width=1000;
ab39aUtils.properties.popup_enviar_email_height=550;
ab39aUtils.properties.popup_enviar_email_encuesta_width=900;

ab39aUtils.properties.popup_captcha_height=350;
ab39aUtils.properties.popup_captcha_width=550;

ab39aUtils.properties.popup_cursos_asignar_height=550;
ab39aUtils.properties.popup_cursos_asignar_width=900;

ab39aUtils.properties.popup_turnoseval_asignar_height=550;
ab39aUtils.properties.popup_turnoseval_asignar_width=900;

ab39aUtils.properties.popup_nuevaemp_asignar_height=700;
ab39aUtils.properties.popup_nuevaemp_asignar_width=900;

ab39aUtils.properties.popup_empulteval_asingar_height=550;
ab39aUtils.properties.popup_empulteval_asingar_width=900;

ab39aUtils.properties.popup_evaluadores_cursos_height=800;
ab39aUtils.properties.popup_evaluadores_cursos_width=900;


ab39aUtils.properties.popup_evalturnos_height=350;
ab39aUtils.properties.popup_evalturnos_width=900;

ab39aUtils.properties.popup_evaluadoreseval_height=600;
ab39aUtils.properties.popup_evaluadoreseval_width=1000;


////////////////////////
// FUNCIONES FEEDBACK //
////////////////////////
//Funcion que formatea un mapa de errores (value -> mensaje) para ser mostrado como feedback
ab39aUtils.feedback.formatearErroresHtmlFeedback = function (erroresMap, form) {
	var errorText = $("<ul>").addClass("rup-maint_feedbackUL").prepend($.rup.i18nParse($.rup.i18n.app,"feedback.validateError"));

	$.each(erroresMap, function(key, value){
		var errorKey = getFieldName(form, key);
		var fieldError = getFieldErrorLabel(errorKey);
		var fieldErrorMsg = getFieldErrorMsg(value);

		fieldError.append(fieldErrorMsg);
		errorText.append(fieldError);
	});

	return errorText;
};
//Funcion que pinta el texto en el feedback por defecto (OK)
ab39aUtils.feedback.pintarFeedbackOk = function (textoOk, feedback) {
	var feedbackOk = feedback && feedback.length? feedback : $("#feedback_general");
	var mensajeOk = textoOk && textoOk != "" ? textoOk : $.rup.i18n.app.ab39a_feedbacks.okGenerico;
	// Mostrar feedback
	feedbackOk.rup_feedback("set", mensajeOk, "ok");
};

//Funcion que pinta el texto en el feedback por defecto (OK) y hace desaperecer
ab39aUtils.feedback.pintarFeedbackOkDelay = function (textoOk, feedback) {
	var feedbackOk = feedback && feedback.length? feedback : $("#feedback_general");
	var mensajeOk = textoOk && textoOk != "" ? textoOk : $.rup.i18n.app.ab39a_feedbacks.okGenerico;
	// Mostrar feedback
	feedbackOk.rup_feedback("set", mensajeOk, "ok");
	// Ocultarlo
	setTimeout(function(){ feedbackOk.rup_feedback("close"); }, 2000);
	//feedbackOk.rup_feedback("delay",  1000);
	//
};

//Funcion que pinta el texto en el feedback por defecto (ERROR)
ab39aUtils.feedback.pintarFeedbackError = function (textoError, feedback) {
	var feedbackError = feedback && feedback.length? feedback : $("#feedback_general");
	var mensajeError = textoError && textoError != "" ? textoError : $.rup.i18n.app.ab39a_feedbacks.errorGenerico;
	// Mostrar feedback
	feedbackError.rup_feedback("set", mensajeError, "error");
};
//Funcion que pinta el texto en el feedback por defecto (ALERT)
ab39aUtils.feedback.pintarFeedbackAviso = function (textoAviso, feedback) {
	var feedbackAviso = feedback && feedback.length? feedback : $("#feedback_general");
	var mensajeAviso = textoAviso;
	// Mostrar feedback
	feedbackAviso.rup_feedback("set", mensajeAviso, "alert");
};

//Pinta un mensaje de feedback justo despues del indicado por parametro
var count_id_feedback_aux = 0;
ab39aUtils.feedback.pintarFeedbackSupletorio = function (textoAviso, feedback){
	var feedbackRaiz = feedback && feedback.length? feedback : $("#feedback_general");
	var id_feedback_aux = "feedback_aux_"+count_id_feedback_aux;
	feedbackRaiz.after("<div id='"+id_feedback_aux+"'></div>");
	$("#"+id_feedback_aux).rup_feedback({
    	type: "alert",
    	block:false,
    	closeLink: true
    });
	ab39aUtils.feedback.pintarFeedbackAviso(textoAviso, $("#"+id_feedback_aux));
	count_id_feedback_aux++;
};

//Cerrar feedbacks por defecto
ab39aUtils.feedback.cerrarFeedbacks = function (feedback) {
	$("#feedback_general").rup_feedback("close");
	//Cerrar el feedback especfico si se informa
	if (feedback && feedback.length){
		feedback.rup_feedback("close");
	}
};
//Cerrar todos los feedback de la pagina
ab39aUtils.feedback.cerrarTodosFeedbacks = function () {
	$("div.rup-feedback").each(function(){
		$(this).rup_feedback("close");
	});
};

//////////////////////
// FUNCIONES ARRAYS //
//////////////////////
//Funcion para borrar de un Array un valor por id (devuelve el nuevo array)
ab39aUtils.array.deleteFromArrayById = function (arrayDatos, idValue, idName) {
	//Grep con true devuelve los que NO coinciden
	return $.grep( arrayDatos, function(value){
		return value[idName].toString() == idValue.toString();
	}, true);
};
//Funcion para borrar de un Array un valor por array de PKs (devuelve el nuevo array)
ab39aUtils.array.deleteFromArrayByArrayPKs = function (arrayDatos, arrayValues, arrayNames) {
	//Solo borrar si los datos son coherentes
	if (arrayValues.length > 0 && arrayValues.length == arrayNames.length) {
		//Grep con true devuelve los que NO coinciden
		return $.grep( arrayDatos, function(value){
			var borrar = true;
			for (var ind = 0; ind < arrayValues.length; ind++) {
				borrar = borrar && value[arrayNames[ind]].toString() == arrayValues[ind].toString();
				if(!borrar) { break; }
			}
			return borrar;
		}, true);
	} else {
		return arrayDatos;
	}
};
//Devuelve el objeto del array por id (devuelve el primer objeto)
ab39aUtils.array.getObjectFromArrayById = function (arrayDatos, idValue, idName) {
	//Grep con false devuelve los que coinciden
	return $.grep( arrayDatos, function(value, index) {
		return value[idName].toString() == idValue.toString();
	}, false)[0];
};

ab39aUtils.array.getObjectFromArrayById = function (arrayDatos, idValue, idName, unnestObject) {
	//Grep con false devuelve los que coinciden
	return $.grep(arrayDatos, function(value, index) {
		if(unnestObject == true){
			value= $.rup_utils.unnestjson(value);
		}
		return value[idName] && value[idName].toString() == idValue.toString();
	}, false)[0];
};

//Filtra un array por el valor indicado
ab39aUtils.array.filterArrayByValue = function (arrayDatos, valor, name) {
	//Grep con false devuelve los que coinciden
	return $.grep(arrayDatos, function(value, index) {
		value = $.rup_utils.unnestjson(value);
		return value[name] && value[name].toString() == valor.toString();
	}, false);
};

//Devuelve true si existe en el array algun objeto que coincida con el valor
ab39aUtils.array.isObjectInArrayByValue = function (arrayDatos, valor, name) {
	return ab39aUtils.array.filterArrayByValue(arrayDatos, valor, name).length > 0;
};

//Devuelve el array preparado como un arrayCombo(value, label)
ab39aUtils.array.prepararArrayCombo = function (arrayDatos, arrayCombo, valueName, labelName, idioma){
	$.each(arrayDatos, function(index, item){
		arrayCombo.push({"value": item[valueName], "label": item[labelName + idioma]});
	});
};
//////////////////////
// FUNCIONES TABLAS //
//////////////////////
//Recarga la tabla con el array de datos proporcionado
ab39aUtils.tabla.reloadGridData = function (grid, arrayData) {
	if (grid) {
		grid.rup_grid('clearGridData');
		grid.rup_grid('setGridParam', {data : arrayData});
		grid.rup_grid('reloadGrid');
	}
};
//Recarga la tabla con el array de datos proporcionado
ab39aUtils.tabla.reloadGridDataWithFunction = function (grid, arrayData, funcionDeRetorno, param) {
	if (grid) {
		grid.rup_grid('clearGridData');
		grid.rup_grid('setGridParam', {data : arrayData});
		grid.rup_grid('reloadGrid', funcionDeRetorno, param);
	}
};
//Devuelve el objeto row de la fila seleccionada
ab39aUtils.tabla.getSelectedRow = function (grid) {
	if (grid) {
		var idFila = grid.rup_grid('getGridParam', 'selrow');
		return grid.rup_grid('getRowData', idFila);
	}
};
//Devuelve true si la tabla esta vacia, false en caso contrario
ab39aUtils.tabla.isEmptyGrid = function (grid) {
    return grid.rup_grid('getDataIDs').length == 0;
};

//FUNCIONES DE ORDENACION (sorttype)
//Funcion que formatea una fecha para ordenarla como texto
ab39aUtils.tabla.sortType.date = function (cellval) {
	var sortDate = "";
	if(cellval && cellval != ""){
		sortDate = $.datepicker.formatDate("yymmdd", ab39aUtils.util.parseStringToDate(cellval));
	}
	return sortDate;
};

//FUNCIONES DE FORMATTER (formatter)
//Funcion que formatea un importe a Euro
ab39aUtils.tabla.formatter.euro = function (cellval) {
	var resultado = "0";
	if(cellval != undefined && cellval != ''){
		resultado = cellval;
	}
	return ab39aUtils.util.formatearBigDecimal(resultado) + " €";
};

//////////////////////
// FUNCIONES COMBOS //
//////////////////////
//Recarga el combo con el array de datos(value,label) proporcionado, y las mismas propiedades
ab39aUtils.combo.reloadComboData = function (combo, arrayData) {
	if (combo) {
		var propiedadesCombo = combo.data("settings");
		combo.selectmenu("destroy");
		combo.rup_combo($.extend(propiedadesCombo, {source:arrayData, loadFromSelect:false}));
	}
};

//Elimina los elementos del combo y añade los elementos de los arrays (identificadores y descriptivos) al combo
ab39aUtils.combo.cargarComboArray = function ($combo, arrayData, includeBlank){
	if ($combo){
		$combo.find('option').remove().end();

		if (arrayData && arrayData.length > 0){
			if (includeBlank){
				$combo.append('<option value="">...</option>');
			}

			$.each(arrayData, function (ind, elem) {
				$combo.append('<option value=' + elem.value + '>' + elem.label + '</option>');
			});
		}
	}
};

//Recarga el combo con la url seleccionada, si se indica se resetea el valor
ab39aUtils.combo.reloadUrl = function ($combo, url, reset) {
	if ($combo.length > 0) {
		if(reset){
			$combo.rup_combo("setRupValue", "");
		}
		$combo.data("settings").source = url;
		$combo.rup_combo("reload");
	}
};

//Recarga el combo con la url seleccionada, si se indica se resetea el valor
ab39aUtils.combo.reloadUrlGroup = function ($combo, url, reset) {
	if ($combo.length > 0) {
		if(reset){
			$combo.rup_combo("setRupValue", "");
		}
		$combo.data("settings").sourceGroup = url;
		$combo.rup_combo("reload");
	}
};

//Añade el elemento seleccionado del combo y añade su código del String auxiliar con los códigos para enviar al Controlador
ab39aUtils.combo.anyadirElementoCombo = function ($combo, arrayData, elem){
	if ($combo){
		if ($combo.find("option[value='" + elem.value + "']").length == 0){
			$combo.append('<option value=' + elem.value + '>' + elem.label + '</option>');

			var optionValues = [];

			$combo.find("option").each(function() {
			    optionValues.push($(this).val());
			});

			arrayData.val ( optionValues );
		}
	}
};

//Elimina el elemento seleccionado del combo y elimina su código del String auxiliar con los códigos para enviar al Controlador
ab39aUtils.combo.eliminarElementoCombo = function ($combo, arrayData){
	if ($combo){
		var codigoSeleccionado = $combo.find("option:selected").val();

		arrayData.attr("value", arrayData.val().replace(codigoSeleccionado + SEPARADOR_CENTROS, ''));
		$combo.find("option:selected").remove();
	}

};

// Elimina todos los elementos de un combo
ab39aUtils.combo.eliminarElementosCombo = function ($combo){
	if ($combo){
		$combo.find('option').remove().end();
	}
};

//ab39aUtils en el div especificado los valores seleccionados del combo indicado (multiselect)
ab39aUtils.combo.cargarSeleccionadosDiv = function ($combo, $div){
	if ($combo.length > 0)
	{
		var target = $div;
		$combo.multiselect().bind("multiselectclick multiselectcheckall multiselectuncheckall", function( event, ui ){
	        // El método getChecked devuelve un array de elementos DOM, se mapea para obtener un nuevo mapa
	        var checkedValues = $.map($(this).multiselect("getChecked"), function( input ){
	        	// Se deuvelve el texto del combo en lugar de su valor
	            return input.title;
	        });

	        // Se actualiza el mensaje del div
	        target.val(
	            checkedValues.length
	                ? checkedValues.join(',')
	                : ''
	        );
	    })
	    .triggerHandler("multiselectclick");
	}
};

////////////////////
// FUNCIONES UTIL //
////////////////////
/*
 * Funcion para enfocar un componente.
 * @param componente a enfocar
 * @param retardo con el que se quiere enfocarlo
 */
ab39aUtils.util.focusElement = function(elemento, delayms){
	var tmp_delay = delayms? parseInt(delayms):100;
	$(elemento).focus();
	window.setTimeout(function(){
		$(elemento).focus();
		ab39aUtils.util.scrollGoTo(elemento);
	},tmp_delay);
};

/*
 * Funcion de scroll al elemento.
 * @param elemento al que se quiere hacer scroll.
 */
ab39aUtils.util.scrollGoTo = function(element){
	$('html, body').animate({
		scrollTop: $(element).offset().top -300
	}, 500);
};

//Anyadir a la url el parametro noCache
ab39aUtils.util.setUrlNoCache = function(url) {
	var noCache = new Date().getTime();
	var and = '?';
	if(url.indexOf('?') >= 0){
		and = '&';
	}
	url+= and + '_=' +noCache;
	return url;
};


//Anyadir a la url el parametro noCache
ab39aUtils.util.setUrlNoCachePortalWar = function(url) {
	var noCache = new Date().getTime();
	var and = '?';
	if(url.indexOf('?') >= 0){
		and = '&';
	}
	url+= and + '_=' +noCache+'&'+portalWar;
	return url;
};


//Añadir titulo Maint
ab39aUtils.util.anyadirTituloMaint = function(rupMaint, titulo) {
	rupMaint[0].prop.detailDiv.rup_dialog("setOption", "title", titulo);
};

// Funcion que parsea un string (en formato dependiente del idioma) a un objeto Date
ab39aUtils.util.parseStringToDate = function(dateString) {
	return $.datepicker.parseDate($.rup.i18n.base.rup_date.dateFormat, dateString);
};
// Funcion que parsea un objeto Date a un String (en formato dependiente del idioma)
ab39aUtils.util.parseDateToString = function(date) {
	return $.datepicker.formatDate($.rup.i18n.base.rup_date.dateFormat, date);
};
// Funcion que suma a la fecha en string dada los dias dados
ab39aUtils.util.addDaysToStringDate = function(dateString, days) {
	var date = ab39aUtils.util.parseStringToDate(dateString);
	date.setDate(date.getDate()+days);
	return ab39aUtils.util.parseDateToString(date);
};
// Funcion que resta a la fecha en string dada los dias dados
ab39aUtils.util.removeDaysToStringDate = function(dateString, days) {
	var date = ab39aUtils.util.parseStringToDate(dateString);
	date.setDate(date.getDate()-days);
	return ab39aUtils.util.parseDateToString(date);
};

// Inserta en un mapa un valor, convirtiendolo a Array si no lo era (para mostrar los mensajes de error)
ab39aUtils.util.addArrayValueToErrorMap = function (map, value, name){
	var newArray = new Array();
	if(map[name]){
		newArray = newArray.concat(map[name]);
	}
	map[name] = newArray.concat(value);
};

/*
 * Pinta mensajes json parametrizables
 * @param source Texto del mensaje
 * @param params Valores que se quieren sustituir en el mensaje (puede ser array, string o varios parametros)
 */
ab39aUtils.util.messageFormatter = function(source, params) {
	if (arguments.length > 2 && params.constructor != Array) {
		params = $.makeArray(arguments).slice(1);
	}
	if (params.constructor != Array) {
		params = [params];
	}
	$.each(params, function(i, n) {
		source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
	});
	return source;
};
ab39aUtils.util.isFechaValida = function (fechaStr) {
	return $.rup_validate.checkDate($.rup.i18n.base.rup_validate.format.date, fechaStr);
};
ab39aUtils.util.isNumCuentaValido = function(entidad, sucursal, dc, nCuenta){
	entidad = rellenaCeros(entidad,4);
	sucursal = rellenaCeros(sucursal,4);
	dc = rellenaCeros(dc,2);
	nCuenta = rellenaCeros(nCuenta,10);

	var concatenado = entidad+sucursal;
	var dc1 = calculaDCParcial(concatenado);
	var dc2 = calculaDCParcial(nCuenta);
	return dc==dc1+dc2;
};
ab39aUtils.util.GenerateIban = function(account) {
	//Limpiamos el numero de IBAN
    account = account.toUpperCase();  //Todo a Mayus
    account = ab39aUtils.util.trim(account); //Quitamos blancos de principio y final.
    account  = account.replace(/\s/g, "");  //Quitamos blancos del medio.
    var letra1,letra2,num1,num2;
    var isbanaux;
    var numeroSustitucion;
    //Generamos IBAN Temporal
    codigopais = 'ES';
    isbanaux = codigopais + '00' + account;
    // Cambiamos las letras por numeros.
    letra1 = isbanaux.substring(0, 1);
    letra2 = isbanaux.substring(1, 2);

    num1 = getnumIBAN(letra1);
    num2 = getnumIBAN(letra2);

    isbanaux = String(num1) + String(num2) + isbanaux.substring(2, isbanaux.length - 2);

    // Movemos los 6 primeros caracteres al final de la cadena.
    isbanaux = isbanaux.substring(6,isbanaux.length - 6) + isbanaux.substring(0,6);

    //Calculamos el resto
    resto = isbanaux % 97;
    digitocontrol = 98 - resto;

    if(digitocontrol < 10){digitocontrol = '0'+ String(digitocontrol);}
            Ibanfinal = codigopais + digitocontrol + account;

            if (fValidarIBAN(Ibanfinal))
             {
                Xrm.Page.getAttribute("asisa_codigoiban").setValue(Ibanfinal);
    }
    else
    {
    	alert('Error generando el codigo IBAN');
    }
};
ab39aUtils.util.fValidarIBAN = function(IBAN) {

	//Limpiamos el numero de IBAN
    IBAN = IBAN.toUpperCase();  //Todo a Mayus
    IBAN = ab39aUtils.util.trim(IBAN); //Quitamos blancos de principio y final.
    IBAN  = IBAN.replace(/\s/g, "");  //Quitamos blancos del medio.

    var letra1,letra2,num1,num2;
    var isbanaux;
    var numeroSustitucion;

    // Para obtener la letra del NIE solo hay que sustituir la X del principio por un 0 y la Y por un 1 dividir el número entre 23
    // Letra (X,Y,Z) seguida de número de 7 cifras y otra letra (digito de control). (NIE).

    if (IBAN.length != 24) {
        return false;
    }

    // Cogemos las primeras dos letras y las pasamos a numeros
    letra1 = IBAN.substring(0, 1);
    letra2 = IBAN.substring(1, 2);

	num1 = getnumIBAN(letra1);
	num2 = getnumIBAN(letra2);
    //Substituimos las letras por numeros.
    isbanaux = String(num1) + String(num2) + IBAN.substring(2, IBAN.length - 2);
    // Movemos los 6 primeros caracteres al final de la cadena.
    isbanaux = isbanaux.substring(6,IBAN.length - 6) + isbanaux.substring(0,6);

    //Calculamos el resto
    resto = isbanaux % 97;


    if (resto == 1)
    {
    	return true;
    }
    else
    {
        return false;
    }
};

ab39aUtils.util.trim = function(myString){
	return myString.replace(/^\s+/g,'').replace(/\s+$/g,'');
};

ab39aUtils.util.getnumIBAN = function(letra){
    ls_letras = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return ls_letras.search(letra) + 10;
};

ab39aUtils.util.formatearBigDecimal = function (value) {
	var resultado = '';
	if(value != undefined && value != ''){
		if(value.indexOf(',') == -1){
			value+= ",00";
		} else {
			if(value.split(',')[0].length == 0){
				value = "0" + value;
			}
			if(value.split(',')[1].length == 1) {
				value+= "0";
			}
		}
		resultado = value;
	}
	return resultado;
};

//Quitar fondo al toolbar
ab39aUtils.util.quitarFondoToolbar = function() {
	$(".rup-toolbar").css("border","0px");
	$(".rup-toolbar").css("margin-bottom","5px");
	$(".rup-toolbar").css("background","#FFFFFF");
	$(".rup-toolbar").css("padding","0");
};

//Anyadir a la url el parametro noCache
ab39aUtils.util.setUrlNoCache = function(url) {
	var noCache = new Date().getTime();
	var and = '?';
	if(url.indexOf('?') >= 0){
		and = '&';
	}
	url+= and + '_=' +noCache;
	return url;
};

//Bloquear pantalla mientras se esta realizando una operacion en segundo plano
//Permite asignarle propiedades
ab39aUtils.util.bloquearInterfaz = function(properties){
	var defaultProp = {
		baseZ: 999999,
		centerX: true,
		css:{
			paddingTop: "1em",
			paddingBottom: "1em",
			color: "#ffffff",
			borderColor: "#222",
			background: "#444",
			fontSize : "1.6em",
			cursor:		'default'
		},
		overlayCSS: {
			backgroundColor: 	'#222222',
			opacity:			0.3,
			cursor:		'default'
		},
		message : $.rup.i18n.base.rup_blockUI.cargando
	};
	$.blockUI($.extend(true, defaultProp, properties));
};

//Desbloquear pantalla
ab39aUtils.util.desBloquearInterfaz = function(){
	try{
		$.unblockUI();
	}catch(e){
		$('.blockUI').remove();
	}
};

ab39aUtils.util.formatearStringNulo = function(cadena){
	return cadena && cadena != null && cadena != "null" ? cadena : "";
};

// Funcion que deshabilita todos los campos de la capa indicada (div, form...)
ab39aUtils.util.disable = function($capa){
	//Deshabilita los campos normales
	$("input[type!='button'], textarea", $capa).prop('disabled', true);

	// Se deshabilitan los combos
	$.each($("select.rup_combo", $capa), function(index, elem){
		var $combo = $(elem);
		$combo.data("settings").disabled = true;
		$combo.rup_combo("disable");
	});

//	//	Deshabilitar los autocompletes
//	$("[ruptype='autocomplete']", $capa).each(function (index, element) {
//			$(element).val("");
//	});
};

// Funcion que limpia todos los campos de la capa indicada (div, form...), por defecto no limpia los hiddens
ab39aUtils.util.limpiar = function($capa, includeHidden){
	if(includeHidden == undefined) {
		includeHidden = false;
	}
	$('input,select,textarea', $capa).rup_form("clearFields", includeHidden);
};

//Funcion que abre el popup del captcha
ab39aUtils.util.abrirPopupCaptcha = function() {
	var url = ab39aUtils.util.setUrlNoCache($.rup.CTX_PATH + "captcha/formulario/");
	var titulo = $.rup.i18n.app.ab39a_titulo.captcha;
	var height = ab39aUtils.properties.popup_captcha_height;
	var width = ab39aUtils.properties.popup_captcha_width;
	var fnClose = function(){};
	ab39aUtils.util.openPopup($("#popupCaptchaDiv"), url, titulo, height, width, fnClose);
};


////////////////////
// FUNCIONES FORM //
////////////////////
//Funcion que devuelve si un  formulario con el validate de UDA es valido, si no es valido muestra el feedback
ab39aUtils.form.validate = function($form, $feedback) {

	var $feedback = $feedback && $feedback.length? $feedback : $form.validate().settings.feedback;

	// Cerrar feedback errores
	ab39aUtils.feedback.cerrarFeedbacks($feedback);

	if ($form.validate().checkForm()) {
		return true;
	} else {
		var erroresMap = $form.validate().errorMap;

//		form.validate().showErrors(erroresMap);

		// Ejemplo crear mapa de errores propio...
		// var erroresMap = new Object();
		// erroresMap.codUsuario = "Literal de error1";
		// erroresMap.nif = "Literal de error2";
		// erroresMap['Campo Propio'] = "Literal de error3";

		var mensajeError = ab39aUtils.feedback.formatearErroresHtmlFeedback(erroresMap, $form);
		//Mostrar feedback
		ab39aUtils.feedback.pintarFeedbackError(mensajeError, $feedback);
		return false;
	}
};

//Funcion que devuelve el ErrorMap de un  formulario con el validate de UDA, si es valido devuelve un mapa vacio
ab39aUtils.form.getValidateErrorMap = function(form) {
	//Es necesario hacer el check para que el errorMap se actualice
	form.validate().checkForm();
	return form.validate().errorMap;
};

//////////////////////
// FUNCIONES JQUERY //
//////////////////////
$.fn.cleanAutocomplete = function() {
	var self = this[0];
	self.value = "";
	$("#" + self.id + "_label").val("");
	$("#" + self.id + "_label").blur();
};

//////////////////////////
//FUNCIONES "PRIVADAS" //
//////////////////////////
//Funcion que busca el label de un campo del formulario desde el fieldName
function getFieldName(form, fieldName){
	if (form && form.length > 0) {
		var labelForName = $("[name='" + fieldName + "']", form).attr("id");
		//Se selecciona el primer label con ese for
		var labelElem = form.find("label[for='" + labelForName + "']:first");
		if (labelElem.length>0){
			return labelElem.text();
		} else {
			//Puede ser un combo
			var labelElem = form.find("label[for='" + labelForName + "-button" + "']:first");
			if (labelElem.length>0){
				return labelElem.text();
			}
		}
	}
	//Si no encuentra el label devuelve el propio fieldName
	return fieldName;
}
//Funcion que devuelve el errorLabel formateado para mostrar
function getFieldErrorLabel(errorLabel){
	return $("<li>").append("<b>" + errorLabel + "</b>");
}
//Funcion que devuelve el mensaje de error formateado para mostrar
function getFieldErrorMsg(errorMsg){
	if ($.isArray(errorMsg)){
		// En caso de que el mensaje de error sea un array de mensajes, se debera de recorrer y concatenar
		var baseUl = $("<ul>");
		for (var i=0; i<errorMsg.length; i++){
			baseUl.append($("<li>").append(errorMsg[i]));
		}
		return baseUl;
	}else{
		return $("<ul>").append($("<li>").append(errorMsg));
	}
};
function calculaDCParcial(cadena){
	var dcParcial = 0;
	var tablaPesos = [6,3,7,9,10,5,8,4,2,1];
	var suma = 0;
	var i;
	for(i=0;i<cadena.length;i++){
		suma = suma + cadena.charAt(cadena.length-1-i)*tablaPesos[i];
	}
	dcParcial = 11-suma % 11;
	if(dcParcial==11){dcParcial=0;}else if(dcParcial==10){dcParcial=1;}
	return dcParcial.toString();
}
function rellenaCeros(numero,longitud){
	var ceros = '';
	var i;
	numero = numero.toString();
	for(i=0;longitud-numero.length>i;i++){
		ceros += '0';
	}
	return ceros+numero;
}

//Formatter para columnas de tipo: "descarga"
ab39aUtils.tabla.formatter_download = function (href,nombre){
	var enlace = $("<a >").attr({
		"href":"#",
		"title":nombre,
		"onclick":"ab39aUtils.util.ajaxDownload(\"" + href + "\")"
	});
	var span = $("<span >").attr({
		"class": "collapse_icon ui-icon ui-icon-arrowthickstop-1-s",
		"style": "display:inline-block;float:none;vertical-align:top;"
	});
	span.appendTo(enlace);
	if(nombre){
		var span2 = $("<span >");
		span2.html(nombre);
		span2.appendTo(enlace);
	}

	return enlace[0].outerHTML;
};

//Formatter para columnas de tipo: "link"
ab39aUtils.tabla.formatter_link = function (href,nombre){
	var enlace = $("<a >").attr({
		"href":"#",
		"title":nombre,
		"onclick":"ab39aUtils.util.ajaxDownload(\"" + href + "\")"
	});
	var span = $("<span >").attr({
		"style": "display:inline-block;float:none;vertical-align:top;"
	});
	span.appendTo(enlace);
	if(nombre){
		var span2 = $("<span >");
		span2.html(nombre);
		span2.appendTo(enlace);
	}

	return enlace[0].outerHTML;
};

//Funcion que se encarga de descargar un fichero en modo "ajax". Gestiona errores ajax.
ab39aUtils.util.ajaxDownload = function (url, propsParam) {
	ab39aUtils.util.bloquearInterfaz({message : $.rup.i18n.app.ab39a_mensajes.descargar});
	//[JBHG] Fix para que el handler de excepciones devuelva un error de ajax.
	url += url.match("\\?") === null? "?" : "&";
	//url += ($.rup.browser.isIE)? "_emulate_iframe_http_status=true":"ajaxDownloadFile=true";
	url += "ajaxDownloadFile=true";
	var props_default = {
		cookieName: "SGE_fileDownload",
		data: {},
		successCallback: function (url) { ab39aUtils.util.desBloquearInterfaz(); },
		customFailCallback: function(response, url){
			ab39aUtils.util.desBloquearInterfaz();
			$.rup_messages("msgError", {
				message : $.rup.i18n.app.ficheroDescarga["mensajeErrorDefault"],
				title : $.rup.i18n.app.ficheroDescarga["titleError"]
			});
		}
	};
	var fail_overwrite = {
			//NO SE PUEDE SOBREESCRIBIR:
			failCallback: function (html, url) {
				var html_response = "";
				if($.parseHTML(html) && $.parseHTML(html).length > 0){
					//[JBHG] El texto del error viene encapsulado en un tag 'pre':
					html_response = $.parseHTML(html)[0].innerText;
					//En el caso de I.E. ademas, el texto esta introducido en un textarea:
					if($.rup.browser.isIE){	html_response = $(html_response).text(); }
				}
				this.customFailCallback(unescape(html_response), url);
			}
	};

	$.fileDownload(ab39aUtils.util.setUrlNoCache(url), $.extend(true,props_default,propsParam,fail_overwrite));
};

//Limpia un campo file
ab39aUtils.util.limpiarCampoFile = function ($fileInput) {
	if ($.browser.msie) {
		$fileInput.replaceWith($fileInput.clone());
	} else {
		$fileInput.val("");
	}
};

ab39aUtils.tabla.formatterSiNo = function (cellval){
	var resultado = "";
	if(cellval != undefined && cellval != '') {
		if("1" == cellval || 1 == cellval) {
			resultado = $.rup.i18n.app.general.si;
		} else if("0" == cellval || 0 == cellval) {
			resultado = $.rup.i18n.app.general.no;
		}
	}
	else if(typeof cellval == "number"){
		if(1 == cellval) {
			resultado = $.rup.i18n.app.general.si;
		} else if(0 == cellval) {
			resultado = $.rup.i18n.app.general.no;
		}
	}
	return resultado.toUpperCase();
};

ab39aUtils.tabla.formatterIdioma = function (cellval){
	var resultado = "";
	if(cellval != undefined && cellval != '') {
		if("1" == cellval) {
			resultado = $.rup.i18n.app.general.eu;
		} else if("0" == cellval) {
			resultado = $.rup.i18n.app.general.es;
		}
	}
	return resultado;
};
//validar fechas
ab39aUtils.util.validarFecha = function(id){
	var tmpDate = $("#"+id).val();

	try{
		$.datepicker.parseDate($.rup.i18n.base.rup_date.dateFormat, tmpDate);
	}catch(err){
		$("#"+id).val("");
		return false;
	};
	return true;
};


ab39aUtils.util.openPopup = function($div, url, titulo, height, width, fnClose){
	ab39aUtils.util.bloquearInterfaz();
    $div.rup_dialog("destroy");
   
    $div.rup_dialog({
        type: $.rup.dialog.AJAX,
        title : titulo,
        url: url,
//        showLoading: true,
        autoOpen : false,
        closeOnEscape : true,
        modal : true,
        resizable : true,
        height:height,
        width:width,
        close: function(){
        	if (fnClose){
        		fnClose;
        	}
        	$div.rup_dialog("destroy");
        }
//        minWidth : 800,
//        minHeight : 550,
    });   

    $div.rup_dialog('open');
};

//Elimina los caracteres no numéricos de un texto
ab39aUtils.util.eliminarNoNumericos = function(text){
	i = 0;
	while(i < text.length){
		if($.isNumeric(text.charAt(i))){
			i++;
		}else{
			text = text.replace(text.charAt(i), '');
		}
	}
	return text;
};

//Funcion que deshabilita todos los campos de la capa indicada (div, form...)
ab39aUtils.util.disable = function($capa){
    //Deshabilita los campos normales
    $("input[type!='button'], textarea", $capa).prop('disabled', true);

    // Se deshabilitan los combos
    $.each($("select.rup_combo", $capa), function(index, elem){
        var $combo = $(elem);
        $combo.data("settings").disabled = true;
        $combo.rup_combo("disable");
    });
};



//Funcion que deshabilita todos los campos de la capa indicada (div, form...)
ab39aUtils.util.readonly = function($capa){
    // Se deshabilitan las fechas
    $.each($(".campoFecha", $capa), function(index, elem){
        var $fecha = $(elem);
        $fecha.datepicker( "destroy" );
        $fecha.removeClass('campoFecha');
        $fecha.addClass('campoTexto');
        $fecha.prop('readonly', true);

        ;
    });

    //Deshabilita los campos normales
    $("input[type!='button'], textarea", $capa).prop('readonly', true);

    // Se deshabilitan los combos
    $.each($("select.rup_combo", $capa), function(index, elem){
        var $combo = $(elem);
        $combo.data("settings").disabled = true;
        $combo.rup_combo("disable");
    });

    //Deshabilitar radiobutton,checkbox
    $("input[type='radio'], input[type='checkbox'], button, input[type='button']", $capa).prop('disabled', true);

}; 

//Funcion que limpia los combos

ab39aUtils.util.clearCombos = function(){
	$.each($("select.rup_combo"), function(index, elem){
	    var $combo = $(elem);
	    $combo.rup_combo("clear");
	}); 
};


ab39aUtils.util.initConfirmarDialog2Funciones = function(tab,titulo,texto,fnAceptar,fnCancelar){	
	$('<div></div>').appendTo(tab)
	.html('<div style="font-size:13px">' + texto + '</div>')
	.dialog({
	    modal: true, title: titulo, zIndex: 10000, autoOpen: true,
	    width: 'auto', resizable: false,
	    buttons: {	    	
	        comun_operaciones_cancelar: function () {
	        	fnCancelar();
	            $(this).dialog("close");
	        },
	        comun_operaciones_aceptar: function () {
	        	fnAceptar();
	            $(this).dialog("close");
	        }
	    },
	    close: function (event, ui) {
	        $(this).remove();
	    }
	});
}

function waitDialog(mensaje){
	
	var mensajeMostrar = "Cargando datos. Por favor, espere...";
	if (mensaje != ""){
		mensajeMostrar = mensaje;
	}
	
	$.blockUI({ message: "<div class='ab39a_modalWait'><img src='" + $.rup.APP_STATICS + "/images/busy.gif' /> "+mensajeMostrar+" </div>" });
	$(".blockUI.blockOverlay").css("z-index",9000);
	$(".blockUI.blockOverlay").css("opacity",0.5);
	$(".blockUI.blockMsg.blockPage").css("z-index",9001);
	$(".blockUI.blockMsg.blockPage").css("opacity",1);	
}

function closeWaitDialog(){
	$.unblockUI();
}

// maxlength para las textareas
$("textarea[maxlength]").live('keyup paste blur', function() {
	
    // Store the maxlength and value of the field.
    var maxlength = $(this).attr('maxlength');
    
    var val = $(this).val();

    // Trim the field if it has content over the maxlength.
    if (val.length > maxlength) {
        $(this).val(val.slice(0, maxlength-1));
    }
});


ab39aUtils.util.openPopup = function($div, url, titulo, height, width, fnClose){
	ab33aUtils.util.bloquearInterfaz();
	$div.rup_dialog("destroy");
	
	$div.rup_dialog({
		type: $.rup.dialog.AJAX, 
		title : titulo,
		url: url,
//		showLoading: true,
		autoOpen : false,
		closeOnEscape : true,
		modal : true,
		resizable : true,
		height:height,
		width:width,
		close: function() {
			if (fnClose){
				fnClose;
			}
			$div.rup_dialog("destroy");
		}
//		minWidth : 800,
//		minHeight : 550,
	});	

	$div.rup_dialog('open');
};