function descarrega_fitxer(id_fitxer, div_info){
	carregaURL('fitxers/descarrega_document_Ajax.php?id_fitxer='+id_fitxer, div_info);
}

function desconnecta() {
		document.location.href = 'includes/desconnectar.php';
	}

function veu_rellotge(div,idioma){
	var ahora = new Date()

   var dies = "";
	if(idioma=='es'){dies = new Array("domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado");}
	if(idioma=='ca'){dies = new Array("diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte");}

   var mesos = "";
	if(idioma=='es'){mesos = new Array("enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre");}
	if(idioma=='ca'){mesos = new Array("gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre");}
	var dia, numdia, mes, any, hora, minut, segon;

	dia   	= dies[ahora.getDay()];
	numdia 	= ahora.getDate();
	mes	  	= mesos[ahora.getMonth()];
	any		= ahora.getFullYear();
	hora  	= ahora.getHours(); 		hora = hora.toString();
	minut 	= ahora.getMinutes();		minut = minut.toString();
	segon 	= ahora.getSeconds();		segon = segon.toString();

	if(hora.length  == 1){hora  = '0' + hora;}
	if(minut.length == 1){minut = '0' + minut;}
	if(segon.length == 1){segon = '0' + segon;}

	var str_info = '<span class="data_rellotge">' + dia + ' ' + numdia + ' ' + mes + ' ' + any + '</span> <span class="separa_rellotge">|</span> <span class="hora_rellotge">' + hora + ':' + minut + ':' + segon + '</span>';
	$(div).update(str_info);
}

/**
* funcion que comprueba si el nombre de un fichero (cadena de texto) es de una extensión
* determinada, si lo es devuelve true, sino false.
* @param fileName : nombre del fichero a comprobar.
* @param fileTypes : array con las extensiones a comprobar. ej. array('jpg','jpeg','png','gif');
* @return bool TRUE si el nombre del fichero es de alguna de las extensiones pasadas, FALSE en otro caso.
*/
function TestFileType( fileName, fileTypes ) {
	if (!fileName) return false;
	dots = fileName.split(".")
	fileType = dots[dots.length-1];
	fileType = fileType.toLowerCase();
	if(!(fileTypes.join(".").indexOf(fileType) != -1)){
		return false;
	}
	return true;
}


/**
* funcion que comprueba si una cadena de texto está vacía. Se considera una cadena
* vacía la que únicamente contiene cualquier combinación de los siguientes
* caracteres ' ', '\t', '\n', '\r', '\f', '\v' ;
* @param texto : cadena a comprobar.
* @return bool TRUE si la cadena es considerada vacís, FALSE en otro caso.
*/
function textoVacio(texto){
	if ((texto == null) || (texto.length == 0))	return true;
	if (texto.search(/\S+/) != -1) return false;
	return true;
}

function textBuit(text){
	if ((text == null) || (text.length == 0))	return true;
	if (text.search(/\S+/) != -1) return false;
	return true;
}

/**
* funcion para eliminar los siguientes caracteres ' ', '\t', '\n', '\r', '\f', '\v' del
* principio y final de una cadena.
* @param str cadena a recortar.
* @return string retorna la cadena recortada
*/
function recorta(str){
	return str.replace(/^(\s*)((\s*\S+)*)(\s*)$/,"$2");
}

/**
* Comprueba si una cadena es un numero entero positivo (incluye el cero).
* @param str cadena a comprobar
* @return bool retorna TRUE si la cadena es entero positivo, FALSE en otro caso.
*/
function esEnteroPositivo(str){
	var re = /^([0-9]+)$/;
	if(re.test(str)){
		return true;
	}
	return false;
}


function buscar(f) {
	if (textBuit(f.a_buscar.value)) {
		return;
	}
	f.action="buscador.php";
	f.submit();
}

function isEmailAddress(valor)
{
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(valor)){
		return (true)
	} else {
		return (false);
	}
}

/** FUNCIONS AJAX **/

function carregaURL(url,id_div,asinc){ // Funció Ajax per tractar dades
	if(asinc == null){asinc = true;}
	new Ajax.Request(url, {
		  method: 'post',
		  asynchronous: asinc,
		  parameters:{},
		  onCreate: function(){
				$(id_div).innerHTML = "<center><img src='../img/loading.gif' /></center>";
		  },
		  onComplete: function(res) {
				$(id_div).innerHTML = res.responseText;
				setTimeout(function() {res.responseText.evalScripts()}, 1);
		}
	});
}

function carregaFormURL(url,id_div,f){
	var params = Form.serialize(f);
	//alert(params);
	new Ajax.Request(url, {
		  method: 'post',
		  parameters: params,
		  asynchronous: true,
		  onCreate: function(){
				$(id_div).innerHTML = "<center><img src='../img/loading.gif' /></center>";
		  },
		  onComplete: function(res) {
				$(id_div).innerHTML = res.responseText;
				setTimeout(function() {res.responseText.evalScripts()}, 1);
		}
	});
}

function carregaFormURLSync(url,id_div,f){
	var params = Form.serialize(f);
	//alert(params);
	new Ajax.Request(url, {
		  method: 'post',
		  parameters: params,
		  asynchronous: false,
		  onCreate: function(){
				$(id_div).innerHTML = "<center><img src='../img/loading.gif' /></center>";
		  },
		  onComplete: function(res) {
				$(id_div).innerHTML = res.responseText;
				setTimeout(function() {res.responseText.evalScripts()}, 1);
		}
	});
}

function carrega(url,asinc){ // Funció Ajax per tractar dades
	if(asinc == null){asinc = true;}
	new Ajax.Request(url, {
		  method: 'post',
		  asynchronous: asinc,
		  parameters:{},
		  onComplete: function(res) {
				setTimeout(function() {res.responseText.evalScripts()}, 1);
		}
	});
}

function cargarURLParams(url,id_div,params) {
	new Ajax.Request( url, {
		asynchronous: true,
		encoding: 'iso-8859-1',
		method: 'post',
		parameters: params,
		onCreate: function(){
				$(id_div).innerHTML = "<center><img src='../img/loading.gif' /></center>";
		  },
		onComplete: function(res) {
		  $(id_div).innerHTML = res.responseText;
		  setTimeout(function() {res.responseText.evalScripts()}, 1);
		}
	} );
}

function cargarURLParamsSync(url,id_div,params) {
	new Ajax.Request( url, {
		asynchronous: false,
		encoding: 'iso-8859-1',
		method: 'post',
		parameters: params,
		onCreate: function(){
				$(id_div).innerHTML = "<center><img src='../img/loading.gif' /></center>";
		  },
		onComplete: function(res) {
		  $(id_div).innerHTML = res.responseText;
		  setTimeout(function() {res.responseText.evalScripts()}, 1);
		}
	} );
}

function esChrome() {
	var es_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
	return es_chrome;
}

// Dado un objeto HTML DOM, obtiene su posición X relativa a la pantalla en pixels.
function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (1) {
			curleft += obj.offsetLeft;
			if (!obj.offsetParent) break;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

// Dado un objeto HTML DOM, obtiene su posición Y relativa a la pantalla en pixels.
function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (1) {
			curtop += obj.offsetTop;

			if (!obj.offsetParent) break;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y) {
		curtop += obj.y;
	}
	return curtop;
}

/*
	* Esta función clasifica y valida todos* los códigos fiscales que se usan en España.
	* Analiza una variable de 9 carácteres alfanuméricos y devuelve un valor numérico para cada tipo de código
	* analizado donde todos los valores positivos (mayores que cero) indican que el código fiscal es correcto.
	*
	* Los valores devueltos son:
	*
	* 	 1 = NIF válido
	* 	-1 = NIF no válido
	* 	 2 = CIF válido
	* 	-2 = CIF no válido
	* 	 3 = NIE válido
	* 	-3 = NIE no válido
	* 	 0 = código no válido
	*
	* La función cumple con todas las especificaciones de las leyes españolas:
	*
	* Decreto 2423/1975, de 25 de septiembre.
	* Real Decreto 338/1990, de 9 de marzo.
	* Real Decreto 1624/1992, de 29 de diciembre que modifica el 338/1990.
	* Real Decreto 155/1996, de 2 de febrero.
	* Orden de 3 de julio de 1998, por la que se modifica el Anexo del Decreto 2423/1975.
	*
	* Que es, actualmente, todo lo aprobado respecto con los Códigos de Identificación Fiscal,
	* Número de Identificación Fiscal y Número de Identificación de Extranjeros.
	*
	* *Nota: dado que el algoritmo del dígito de control usado es secreto y jamás ha sido publicado
	* en fuentes oficiales del Estado se ha usado un algoritmo obtenido por ingeniería inversa que ha
	* logrado validar correctamente alrededor de un millón de CIFs, NIFs y NIEs en total.
	* Con lo que, presumiblemente, se puede asumir que concuerda con el algoritmo de validación secreto original.
	*/
function valida_nif_cif_nie(cf) {
	cf = cf.toUpperCase().trim();
	var num = new Array(9);
	for (var i = 0; i < 9; i++){
		num[i] = cf.substr(i,1);
	}

	//si no tiene un formato valido devuelve error
	var re = /((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)/;
	if(!re.test(cf)) return 0;

	//comprobacion de NIFs estandar
	re = /(^[0-9]{8}[A-Z]{1}$)/;
	if(re.test(cf)){

		var pat = 'TRWAGMYFPDXBNJZSQVHLCKE';
		if(num[8] == pat.substr(cf.substr(0,8) % 23, 1)) return 1;
		else return -1;
	}

	//algoritmo para comprobacion de codigos tipo CIF
	var suma = parseInt(num[2]) + parseInt(num[4]) + parseInt(num[6]);
	var tmp;

	for (i = 1; i < 8; i += 2){
		tmp = 2 * num[i];
		suma += parseInt(String(tmp).substr(0,1));
		if(parseInt(String(tmp).substr(1,1))){
			suma += parseInt(String(tmp).substr(1,1));
		}
	}
	var n = 10 - parseInt(String(suma).substr(String(suma).length - 1, 1))

	//comprobacion de NIFs especiales (se calculan como CIFs)
	re = /^[KLM]{1}/;
	if(re.test(cf)){
		if(num[8] == String.fromCharCode(parseInt(64 + n))) return 1;
		else return -1;
	}

	//comprobacion de CIFs
	re = /^[ABCDEFGHNPQS]{1}/;
	if(re.test(cf)){
		if(num[8] == String.fromCharCode(parseInt(64 + n)) || num[8] == String(n).substr(String(n).length -1, 1) ) return 2;
		else return -2;
	}

	//comprobacion de NIEs
	re = /^[TXYZ]{1}/;
	var re2 = /^[T]{1}[A-Z0-9]{8}$/;
	var re3 = /X/;
	var re4 = /Y/;
	var re5 = /Z/;
	var strTmp = 'TRWAGMYFPDXBNJZSQVHLCKE';
	if(re.test(cf)){
		tmp = cf.replace(re3,'0');
		tmp = tmp.replace(re4,'1');
		tmp = tmp.replace(re5,'2');
		tmp = tmp.substr(0,8)%23;
		tmp = strTmp.substr(tmp,1);
		if(num[8] == tmp || re2.test(cf) ) return 3;
		else return -3;
	}

	//si todavia no se ha verificado devuelve error
	return 0;
}

/*
* Esta funcion calcula el digito de control de un numero de cuenta
* parametros:
*		entidadOficina: string con la concatenacion de las partes entidad y oficina (8 primeros digitos)
*		numCta: string con la parte correspondiente al numero de cuenta (10 últimos dígitos)
* retorno: devuelve el digito de control calculado.
*/
function calcula_dc(entidadOficina,numCta){
	var APesos = new Array(1,2,4,8,5,10,9,7,3,6); // Array de "pesos"
	var DC1=0;
	var DC2=0;
	var x=8;
	var digito;
	while(x>0) {
		digito = entidadOficina.charAt(x-1);
		DC1=DC1+(APesos[x+2-1]*(digito));
		x = x - 1;
	}
	var Resto = DC1%11;
	DC1=11-Resto;
	if (DC1==10) DC1=1;
	if (DC1==11) DC1=0;              // Dígito control Entidad-Oficina
	x=10;
	while(x>0) {
		digito=numCta.charAt(x-1);
		DC2=DC2+(APesos[x-1]*(digito));
		x = x - 1;
	}
	Resto = DC2%11;
	DC2=11-Resto;
	if (DC2==10) DC2=1;
	if (DC2==11) DC2=0;         // Dígito Control C/C
	var DigControl=(DC1)+""+(DC2);   // los 2 números del D.C.
	return DigControl;
}



/*  Aquesta funció serveix per crear un CKEditor en una pàgina Ajax i que al
    modificar el contingut d'aquesta no doni error d'instància duplicada

    @param id_textarea    -> Identificador del textarea que es convertirà en CKEditor
    @param params         -> Paràmetres de configuració del plugin del CKEditor
*/
function crea_ckeditor(id_textarea, params){
    if(params == 'undefined'){params = '';}

    var trobat = false;
    var editor;

    //alert(params);

    for(var i in CKEDITOR.instances) {
        if(CKEDITOR.instances[i].name == id_textarea){trobat = true;}
    }

    //alert(trobat);

    if(trobat == false){
       CKEDITOR.replace(id_textarea, params);
    } else {
       editor = CKEDITOR.instances[id_textarea];
       CKEDITOR.remove(editor);
       CKEDITOR.replace(id_textarea, params);
    }
    trobat = false;
}


/**
* funcion para eliminar saltos de linea y espacios de una cadena.
* @param str cadena a tratar.
* @return string retorna la cadena tratada
*/
function eliminarSaltosLineaEspacios(str){
	return str.replace(/ /g,"").replace(/(\s)+/g,"");
}

function getElementByClass(classname){
	 var inc=0;
	 var elems=Array();
	 var alltags=document.all? document.all : document.getElementsByTagName("*");
	 for (var i=0; i<alltags.length; i++){
	   if (alltags[i].className==classname){
	     elems[inc++]=alltags[i];
	   }
	 }
	 return elems;
}

// Funció javascript per mostrar el missatge $msg al id $id passat,
// assignant una classe en funcio del string $tipo=[ok|err|hidden]
function escriuMsgLog(id,tipo,msg){
	if (typeof $(id) == "undefined") {
		return;
	}
	var classe;
	switch(tipo){
		case 'ok':
			classe = "msg_log msg_log_ok";
			break;
		case 'err':
			classe = "msg_log msg_log_err";
			break;
		case 'hidden':
			classe = "msg_log_hidden";
			break;
		default:
	   	classe = "msg_log_hidden";
	}
	$(id).update(msg);
	$(id).className = classe;
	if(classe != 'msg_log_hidden'){
		$(id).show();
		$(id).scrollTo(id);
		Effect.Pulsate(id,{pulses:6,duration:3});
		$(id).hide();
		$(id).show();
	}else{
		$(id).hide();
	}
}

/**
*	recibe un elemento Radio html.
*	Devuelve:
*		 false -> si no hay ningun radio seleccionado;
*		 true -> si el radio es de un solo elemento y está seleccionado.
*		 entero -> entero con la posicion del radio seleccionado dentro del array de radios.
*/
function radioSeleccionado(elementRadio){
	if(elementRadio.length==undefined){ // para que funcione cuando solo hay un registro en la lista.
		if(elementRadio.checked) return true;
		else return false;
	}
	else{
		// si hay mas de un registro en la lista.
		for(var i=0;i<elementRadio.length;i++){
			if (elementRadio[i].checked){
				return i;
			}
		}
		return false;
	}
}

function obtenerValueRadioSeleccionado(elementoRadio){
	var valor = false;
	if (elementoRadio.length==undefined){
		//nomes i ha un sol element
		if (elementoRadio.checked){
			valor=elementoRadio.value;
		}
	}
	else {
		for (var i=0;i<elementoRadio.length;i++){
	       if (elementoRadio[i].checked){
				valor=elementoRadio[i].value;
				break;
			}
	    }
	}
	return valor;
}

// Define el método trim en la clase string (nativa de javascript)
// Este método devuelve la cadena quitando los espacios en blanco del principio y final
String.prototype.trim = function() { return this.replace(/^[\s]+|[\s]+$/g, ""); };


/**
* función para escapar con '\' todas las comillas simples "'" que no estón ya
* escapadas en un texto. Si encuentra un numero par de '\' delante de "'" aóade
* una nueva '\'.

* @param texto : cadena a tratar.
* @return la cadena tratada.
*/

function escaparComillasSimples(texto){
	var txt=texto, str1, str2, n_barras=0;
	for(var i=0; i<txt.length ; i++){
		if(txt.charAt(i)== '\''){
			if ((n_barras%2)==0){
				//si tiene un numero par de barras o no tiene ninguna
				str1 = txt.substr(0,i);
				str2 = txt.substr(i);
				txt = str1 + '\\' + str2;
				i++;
			}
			n_barras=0;
		}
		else if(txt.charAt(i)== '\\') n_barras++;
		else n_barras=0;
	}
	return(txt);
}


/**
* función para escapar con '\' todas las comillas dobles '"' que no estón ya
* escapadas en un texto. Si encuentra un numero par de '\' delante de '"' aóade
* una nueva '\'.
* @param texto : cadena a tratar.
* @return la cadena tratada.
*/
function escaparComillasDobles(texto){
	var txt=texto, str1, str2, n_barras=0;
	for(var i=0; i<txt.length ; i++){
		if(txt.charAt(i)== '\"'){
			if ((n_barras%2)==0){
				//si tiene un numero par de barras o no tiene ninguna
				str1 = txt.substr(0,i);
				str2 = txt.substr(i);
				txt = str1 + '\\' + str2;
				i++;
			}
			n_barras=0;
		}
		else if(txt.charAt(i)== '\\') n_barras++;
		else n_barras=0;
	}
	return(txt);
}


// función para escapar con '\' todas las comillas simples (') y dobles (") que no estón ya
// escapadas en un texto. Si encuentra un numero par de '\' delante de (') o (") aóade
// una nueva '\'.
// @param texto : cadena a tratar.
// @return la cadena tratada.
function escaparComillas(texto){
	texto = escaparComillasSimples(texto);
	var txt=texto, str1, str2, n_barras=0;
	for(var i=0; i<txt.length ; i++){
		if(txt.charAt(i)== '\"'){
			if ((n_barras%2)==0){
				//si tiene un numero par de barras o no tiene ninguna
				str1 = txt.substr(0,i);
				str2 = txt.substr(i);
				txt = str1 + '\\' + str2;
				i++;
			}
			n_barras=0;
		}
		else if(txt.charAt(i)== '\\') n_barras++;
		else n_barras=0;
	}
	return(txt);
}



//// Funcions per la paginació /////

function paginacioVesAPlana(num_plana){
	$('num_plana').value = num_plana;
	$('f_pags').submit();
}

function paginacioCanviRegsPlana(num_regs_plana){
	$('num_plana').value = 1;
	$('regs_plana').value = num_regs_plana;
	$('f_pags').submit();
}
//// Fi funcions per la paginació /////


// Función que averigua si el navegador activo es Microsoft Internet Explorer 6
// Retorna true o false
window.esIE6 = function() {
	var res;
	var ua, s, i;
	var version = null;
	ua = navigator.userAgent;
	s = "MSIE";
	res = false;
	if ((i = ua.indexOf(s)) >= 0) {
		version = parseFloat(ua.substr(i + s.length));
		if (version == 6) res = true;
	}
	return res;
}


// Funciones para cargar y registrar archivos javascript (.js) externos dentro de código que se ha cargagado mediante Ajax
// Uso: cargaArchivoJS("rutaArchivo.js")
window.cargaArchivoJS = function(archivo){
	e=document;
	var a=e.createElement("script");
	a.type="text/javascript";
	a.charset="iso-8859-15";
	a.src=archivo;
	registraArchivoJS(a);
}
window.registraArchivoJS = function(archivo){
	e=document;
	var a=e.getElementsByTagName("head")[0];
	a|| (a=e.body.parentNode.appendChild(e.createElement(" head")));
	a.appendChild(archivo);
}
window._loadJs = function(archivo){
	var a=e.createElement("script");
	a.type="text/javascript";a.charset="iso-8859-15";
	a.src=archivo;
	registraArchivoJS(a);
}

function esFecha (strValue) {
    //check to see if its in a correct format
   var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/

    if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
    else {
    var strSeparator = strValue.substring(2,3)
    //create a lookup for months not equal to Feb.
    var arrayDate = strValue.split(strSeparator);

    var arrayLookup = { '01' : 31,'03' : 31,
      '04' : 30,'05' : 31,
      '06' : 30,'07' : 31,
      '08' : 31,'09' : 30,
      '10' : 31,'11' : 30,'12' : 31
    }

    var intDay = parseInt(arrayDate[0],10);
    var intMonth = parseInt(arrayDate[1],10);
    var intYear = parseInt(arrayDate[2],10);
    //check if month value and day value agree

    if (arrayLookup[arrayDate[1]] != null) {
      if (intDay <= arrayLookup[arrayDate[1]] && intDay != 0
        && intYear > 1975 && intYear < 2050)
        return true;     //found in lookup table, good date
    }

    if (intMonth == 2) {
      intYear = parseInt(arrayDate[2]);

      if (intDay > 0 && intDay < 29) {
        return true;
      }
      else if (intDay == 29) {
        if ((intYear % 4 == 0) && (intYear % 100 != 0) ||
            (intYear % 400 == 0)) {
          // year div by 4 and ((not div by 100) or div by 400) ->ok
          return true;
        }
      }
    }
    }

    return false; //any other values, bad date
}

function cerrarLightWindowActivo() {
	try { myLightWindow.deactivate(); } catch(ex) { }
}
