ab39aUtils = {
	util: {},
	form:{},
	feedback: {},
	combo : {},
	tabla : {
		sortType : {},
		formatter : {}
	}
};

/**
 * Funcion que convierte de JSON a lista de parametros (form encoding).
 * 
 * Elimina los caracteres '[' y ']' para evitar problemas con las listas
 * 
 * @param model
 * @returns Model en formato form encoding
 */
ab39aUtils.util.jsonToFormEncoding = function(jsonObject) {

	var valueformEncoding = $.param(jsonObject);
	valueformEncoding = valueformEncoding.split("[]").join("");
	return valueformEncoding.split("%5B%5D").join("");
}



/**
 *  Funcion que se encarga de descargar un fichero en modo "ajax". Gestiona errores ajax. 
 *  
 */
ab39aUtils.util.ajaxDownload = function (url, propsParam) {
	
	//[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&";
	// Aplicacion integrada en Portal
	url += PORTALWAR;
	var props_default = {
		cookieName: "AADICC_fileDownload",
		data: {},
		customFailCallback: function(response, url){
			ab39aUtils.feedback.pintarFeedbackError(response, $("#Exportar_feedback"));
			ab39aUtils.feedback.pintarFeedbackError(response, $("#Catalogo_feedback"));
//			$.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));
};

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

//Para Añadir en las llamadas ajax
ab39aUtils.util.setUrlNoCachePortalWar = function(url) {
    var noCache = new Date().getTime();
    var and = '?';
    if(url.indexOf('?') >= 0){
          and = '&';
    }
    url+= and + '_=' +noCache+'&'+portalWar;
    return url;
};


/*** 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 : $("#feedback_general");
	
	if (form.validate().checkForm()) {
		return true;
	} else {
		var erroresMap = form.validate().errorMap;
		var mensajeError = ab39aUtils.feedback.formatearErroresHtmlFeedback(erroresMap, form);

		//Mostrar feedback
		ab39aUtils.feedback.pintarFeedbackError(mensajeError, feedback);
		return false;
	}
};


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;
};

//////////////////////
////FUNCIONES FORM //
//////////////////////
//Funcion que deshabilita todos los campos de un formulario
ab39aUtils.form.disable = function($form) {

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

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

};

//Funcion que habilita todos los campos de un formulario
ab39aUtils.form.enable = function($form) {

//Deshabilita los campos normales
$("input[type!='button'], textarea", $form).prop('disabled', false);

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

};

ab39aUtils.combo.habilitarCombo = function ($combo) {
	$combo.rup_combo("enable");
};

ab39aUtils.combo.deshabilitarCombo = function ($combo) {
	$combo.val('').change();
	$combo.rup_combo("disable");
};

////////////////////////
////FUNCIONES COMBOS //
////////////////////////
//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");
	}
};
////////////////////////
//FUNCIONES FEEDBACK //
////////////////////////

//Funcion que pinta el texto en el feedback por defecto (OK)
ab39aUtils.feedback.pintarFeedbackOk = function (textoOk, feedback) {
	var feedbackOk = feedback && feedback.length? feedback : $("div.rup-feedback:first");
	var mensajeOk = textoOk && textoOk != "" ? textoOk : $.rup.i18n.app.ab12a_feedbacks.okGenerico;
	// Mostrar feedback
	feedbackOk.rup_feedback("set", mensajeOk, "ok");
};
//Funcion que pinta el texto en el feedback por defecto (ERROR)
ab39aUtils.feedback.pintarFeedbackError = function (textoError, feedback) {
	var feedbackError = feedback && feedback.length? feedback : $("div.rup-feedback:first");
	var mensajeError = textoError && textoError != "" ? textoError : $.rup.i18n.app.ab12a_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 : $("div.rup-feedback:first");
	var mensajeAviso = textoAviso;
	// Mostrar feedback
	feedbackAviso.rup_feedback("set", mensajeAviso, "alert");
};

//Cerrar feedbacks por defecto
ab39aUtils.feedback.cerrarFeedbacks = function (feedback) {
	//Cerrar el feedback especfico si se informa
	if (feedback){
		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 "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));
	}
};


//////////////////////////
// FUNCIONES DE TABLAS //
/////////////////////////
//Devuelve el objeto row de la fila seleccionad
ab39aUtils.tabla.getSelectedRow = function ($grid) {
	if ($grid) {
		var idFila = $grid.rup_table('getGridParam', 'selrow');
		return $grid.rup_table('getRowData', idFila);
	}
};

//////////////////////////
//  FUNCIONES DE UTIL  //
/////////////////////////
//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();
	}
};


