/*------------------------------------------------------------------------------------------------------------------------------ 
 											Funcións de uso xeral
-------------------------------------------------------------------------------------------------------------------------------*/



// Comproba si e un nº tde telefono válido. Devolve false si no é váldo
//----------------------------------------------------------------------
function validaTelefono(str){
	
	var meuStr = $.trim(str);	//  jQuery.trim(str);	
	
	var patron = new RegExp("[0-9 +]{9,}","gi");
	
	return patron.test(meuStr);	
}



// Comproba que unha dir. de email sexa correcta. Devolve false en caso de error
//-------------------------------------------------------------------------------
function validaEmail(str){
	
	var meuStr = $.trim(str);	
	
	// Mellor así para poder empaquetar o js
	var patron = new RegExp("^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,4})+$", "gi");
	
	if(patron.test(meuStr))return true; // email OK
	
	else return false;
	
	//if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/.test(str)) return true; // email OK
	//else return false;
}

/*	
	Valida unha url. Pode vir con protocolo ou sin el 
	
	https://www.paypal.com/cgi-bin/webscr
	
*/
function validaUrl(url) {
	
	var meuStr = $.trim(str);	
	// Sacado de http://stackoverflow.com/questions/1303872/url-validation-using-javascript
	
	/*
	Estas representcaions dan prtoblemas ao e,paquetar o js OLLO
	var pat1 = /^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([0-9A-Za-z:]+\.)/ ;
	var pat2 = /^(ftp|http|https):\/\//	
	*/
	var pat1 =  new RegExp("^(http:\\/\\/www.|https:\/\/www.|ftp:\\/\\/www.|www.){1}([0-9A-Za-z:]+\\.)", "gi");
	var pat2 =  new RegExp("^(ftp|http|https):\\/\\/", "gi");
	
	// Comprobamos
	var valida 	= pat1.test(url); // si e valido ou non
	var F			= pat2.test(url); // si ten protocolo incluido e non hai que engadirllo á url formateada	
	// Devolver resultado da validación e url formateada. neste ultimo caso, si non ten http/https/ftp engadimos http://
	return ({res:valida, msg: valida ? (F ? url : "http://" + url) : 'Debes introducir una url valida (dominio.extension)' })	   
}


/*	Valida NIF, NIE e CIF. Devolve true si correcto
	--------------------------------------------------------------------*/
function validaNIFCIF(str) {
		
		var meuStr = $.trim(str);	//str = str.toUpperCase();	
		console.log(meuStr);
		var patronNIF = new RegExp("^([0-9]{8})([A-Z]{1})$","gi");
		var patronNIE = new RegExp("^((m|x|y|z){1})([0-9]{7}[a-z]{1})$","gi");
		var patronCIF = new RegExp("^((A|B|C|D|E|F|G|H|J|K|L|M|N|P|Q|R|S|U|V|W){1})([0-9]{8})$","gi");
		/*
		patronNIF = /^([0-9]{8})([A-Z]{1})$/i 
		patronNIE = /^((m|x|y|z){1})([0-9]{7}[a-z]{1})$/i
		patronCIF = /^((A|B|C|D|E|F|G|H|J|K|L|M|N|P|Q|R|S|U|V|W){1})([0-9]{8})$/i
		*/
		if(patronNIF.test(meuStr) || patronNIE.test(meuStr) || patronCIF.test(meuStr))return true
		else return false;		
	}


/*
	Función para validsar dous campos password e verificar que son iguales.
	Resibe un obxecto con: campo1, campo2, minimo maximo (lonxitudes dos password==> optativas)
	campo 1 --> password
	campo 2 -->  repite password	
	Devolve un array con hasta 3 parametros: resultado (true|false), campo do error (campo1|campo2) e mensaxe de error si o hai
	Como usar:
		res =  validaPassword( {campo1:'passwd1', campo2:'passwd2'});
		ou se non se quere validar res = new Array(true, true, true);
*/
function validaPassword(parametros){

    var arrResposta = {}; // Devolvemos un obxecto
	
    if(typeof parametros.campo1 != 'undefined' && typeof parametros.campo2 != 'undefined'){

        var pass1 		= $.trim($(parametros.campo1).val());
        var pass2 		= $.trim($(parametros.campo2).val());
        var lonxMin		= typeof parametros.minimo == 'undefined'  ? 5 : parseInt(parametros.minimo, 10); // Lonx por defecto 8 caracteres
        var lonxMax	= typeof parametros.maximo == 'undefined'  ? 12 : parseInt(parametros.maximo, 10); // Maximo 15 caracteres por defecto
        var valeVacio  = typeof parametros.valeVacio != 'undefined'  ? parametros.valeVacio : false; // si se define este param, a pass pode ir vacía
       
	  
        // Si vale vacio e os dous vacios -->true
        if(valeVacio && vacio(pass1) && vacio(pass2))
             arrResposta.res = true;

        // Contraseña obligatoria ou ben non vacía algunha das duas
        else if( vacio(pass1) || (!vacio(pass1) && (pass1.length < lonxMin || pass1.length > lonxMax) )){
            arrResposta ={res:false, foco: parametros.campo1, msg: 'La contraseña debe tener entre ' + lonxMin + ' y ' + lonxMax +' caracteres.'};


        }else if ( vacio(pass2) ||  ( !vacio(pass2) && pass2 != pass1 )){
            arrResposta ={res:false, foco:parametros.campo2, msg:'Los password no coinciden..'};


        }else{
            arrResposta.res = true;

        }
    }else{
        arrResposta ={res:false, foco:null, msg:'Parámetros insuficientes en validaPassword()'};

    }
    return arrResposta; // Non valido
		
	
}


/*	Función que recibe un arquivo e a extensión que debe ter (a empregar dentro dunha expresion regular OLLO)
	Si coincide devolve true, caso contrario devolve false
	Si non resibe a extensión, valida un jpg
	Os parametros resibense via obxecto {arquivo:noemDeArquivo, extension:extensio}
	Non sei como meter o punto na expres. regular para que chusque así que sacolle a extension e comprobo esta
	-------------------------------------------------------------------------------------------------------------------*/
function validaArquivo(parametros){
	// Por defecto valida jpg. Pode recibir string co ID do campo a validar ou ben referencia jQuery ao input
	// Logo primeiro que se resibe arquivo, que ten contido e depois validar
	
	var	campo,							
			str;
	
	if(typeof parametros.arquivo == 'undefined' ) return false;
	
	if(typeof parametros.arquivo != 'object' )campo = $("#" + parametros.arquivo); else campo = parametros.arquivo;
	
	var cadena = $.trim(campo.val()); // quita espacios ao nome do arquivo
	
	if (vacio(cadena)) return false; 
	
	var arr = cadena.split("."); 
	
	if(arr.length == 1)return false; // Asegurome de que ten .extension
	
	var extensionMiArchivo = (cadena.substring(cadena.lastIndexOf("."))).toLowerCase();
	
	var extension = $.trim(parametros.extension); // quita espacios		
		
	if(typeof parametros.extension != 'undefined' && parametros.extension != '' && parametros.extension != 'jpg'){	
		
		str = $.trim(parametros.extension) + "{1}$";		
		
	}else{	
		
		str = "\\.jp[e]{0,1}g$";
	}	
	
	var patron = new RegExp(str,"gi"); 
	
	var res =  patron.test(extensionMiArchivo);

	return res;
	

	
	
}


// Función para restrinxir só a caracteres alfanumericos un campo (input, textarea)
//-----------------------------------------------------------------------------
function caracteresValidos(str, min,max) {
	
	var meuStr = $.trim(str); //str.replace(/^\s*|\s*$/g,""); // Faille un trim á cadena
	
	var tmp = "^[a-zA-Z0-9_]{" + min + "," + max + "}$";
	
	var patron = new RegExp(tmp);
	
	return patron.test(meuStr);	
}





// equivalente a str_pad de php (Hai outra version que se atopa en  http://www.fobit.com/index.php?article=JavaScript:%20str_pad)
/*------------------------------------------------------------------
   función que formatea unha cadena até unha lonxitude dada cun caracter de relleno
   polo "LADO" indicado
   Resibe {str, lonx [, relleno] [, lado]}
  
  (lado: 0 left 1 right)
---------------------------------------------------------------------*/
function str_pad (obxecto) {

	var cadena 	= String(obxecto.str); cadena = $.trim(cadena);
	
	var lonx	= obxecto.lonx;
	
	var relleno = !isUndefined(obxecto.r) ? String(obxecto.r) : '0';
	
	var lado 	= isUndefined(obxecto.lado) ?  0 : 1; 

    while (cadena.length < lonx) cadena = lado ?  (cadena + relleno) : (relleno + cadena);		
    
	return cadena;
	
}



/* Busca caracteres que no sean espacio en blanco nunha cadea
--------------------------------------------------------------*/
function vacio(str) {
	
	str = $.trim(str);
	
	return !str;  //http://stackoverflow.com/questions/1812245/what-is-the-best-way-to-test-for-an-empty-string-with-jquery-out-of-the-box
}





/* Dinos si un ha variable é un numero
------------------------------------------- */
function is_num(N){	

	return (!isNaN(parseFloat(N,10)));		
}



/* Dinos si unha variable está definida
------------------------------------------- */
function isUndefined(x) {var u; return x === u;}




/*	Devolve valor binario de unha decimal
--------------------------------------------------------*/
function dec2Bin(n){
	
	enBinario = "";
	
	if (n <= 1) enBinario += n;	
	
	else{
		
		dec2Bin (Math.floor(n/2));	
		
		enBinario += n%2;	
		
	}
	
	return enBinario;
}


/*	Si un numero é binario devolve true
	(Só 1 e 0)
	-------------------------------------*/
function esBinario(str){
	
	//patronBin = /^(0|1){1,}$/i 	
	patronBin =  new RegExp("^(0|1){1,}$", "gi"); 	
	
	if(patronBin.test(str))return true;
	
	else return false;	
}


/*
	Función para ordenar numeros
	usase así:
	document.write(arr.sort(sortNumber));
	sendo arr un array de numeros	
*/
function sortNumber(a,b){
	return a - b;
}


/*
* Redondea un numero hasta os decimales que queres. toFixed solo
* casca pois tira parriba sempre
*   Corrección dos erros de redondeo
*   Sacado de http://www.merlyn.demon.co.uk/js-round.htm#Round
*/
//TestFunc que substitue a redondea
function TestFunc(X, N) { return StrS(X, 1, N); }

function redondea(X, N) { return StrC(X, 1, N); } 

//StrS
function StrS(X, M, N) { return StrC(X, M, N, 1) /* uses Sign */ }

//StrC
function StrC(X, M, N, B) {
    var St, J // to M digits point N digits
    St = String(Math.round((B ? Math.abs(X) : X)*Math.pow(10, N)));
    if (X===null || /\D/.test(St)) return ChrsTo(X, M+N+1+B, " ");
    St = ChrsTo(St, M+N, "0") ; J = St.length - N // 20090113
    return (B ? Sign(X) : "" ) + St.substring(0, J) + "." + St.substring(J) ;
    
}

//ChrsTo
function ChrsTo(S, L, C) { // ChrsTo is a new PrfxTo
  for (var i = String(S).length ; i < L ; i++) S = C + S
  return S
}

//Sign
function Sign(X) { return X>0 ? "+" : X<0 ? "-" : " " }
/*
*Fin correcions redondeo
*/




/*
 *  Función que cambia os valores dun select. Resibe:
	- nome do select 
	- array de obxectos, da forma {valores:nnnn, textosd:'dgdsgds'}
    - rexistroSel si hai que marcar algún como seleccionado

    OLLO: RESIBE OS VALORES A POÑER NO SELECT, polo que en caso de arrays multiples,
hai que pasarlle os valores axeitados
-------------------------------------------------------------------------------------------------------*/
	
function select_CambiaValores(parametros){
	
	//console.log(parametros);
	
	idSelect 		= $(parametros.idSelect);
	
	arrValores 	= parametros.arrValores;	
	
	valorSel	=  typeof parametros.valorSel != 'undefined' ? jQuery.trim(parametros.valorSel) : null; // Valor
	
	indiceSel	=  typeof parametros.indiceSel != 'undefined' ? parseInt(parametros.indiceSel, 10): 0; // indice
	
	
	
	//console.log(valorSel);
	
	var opsions = '';
	
	if(typeof arrValores != 'undefined' && arrValores !=null  && arrValores.length > 0){
		
		// Existen valores
		
		for (j = 0; j < arrValores.length; j++){
			
			opsions +=  '<option value="' +arrValores[j].campoValor + '"';
			if(valorSel != null && valorSel == arrValores[j].campoValor) opsions += ' selected="selected"'
			else 	if(indiceSel != null && indiceSel == j) opsions += ' selected="selected"'
			
			opsions += '">' +arrValores[j].campoTexto  + '</option>';
			
		}
		
	
		
	}else {
		// Non hai valores no array
		// Poñemos o campo default si se definiu ou poño un xenerico
		texto = typeof parametros.defaultText != 'undefined' ? parametros.defaultText : 'Seleccione...';
		
		valor = typeof parametros.defaultValor != 'undefined' ? parametros.defaultValor: 0;
		
		opsions =  '<option value="' +valor + '">' + texto + '</option>';
	}
	
	$(parametros.idSelect).html(opsions);
	
	
}



/*	Función que determiña que redio buttons está escollido neste momento
	ou devolve -1 si ninghún!!!
--------------------------------------------------------------------*/

function dameValorRadioButton(nomeGrupo){
	return $('input[name='+nomeGrupo+']:checked').val();
}


/*
	Se temos un select para escoller importes ou fechas existe a posibilidade de escoller un rango
	entre uns limites.
	Indice == 6 --> escoller rango (ex. fecha/importe inferior - fecha/importe superior), resto valor simple (ej fecha ou importe)
	tipo: 1 fechas, resto numeros


*/
function validaSelectCriterio(parametros){


    //console.log(parametros.valeCero);
	idSelect 		= $(parametros.idSelect);
	input0 		= typeof parametros.input0	!= 'undefined' ? $(parametros.input0) : null;
	input1		= typeof parametros.input1 	!= 'undefined' ? $(parametros.input1) : null;
	input2 		= typeof parametros.input2 	!= 'undefined' ? $(parametros.input2) : null;
	tipo			= typeof parametros.tipo   	!= 'undefined' ? 1 : 0; // 0 numerico (default),  1 fecha
    valeCero		= typeof parametros.valeCero   	!= 'undefined' ? 1 : 0; // 0 non pode ser == 0,  pode ser == a cero
	esRango 	= idSelect.attr('selectedIndex') == 6 ? 1 : 0; //alert("ese. esRango: " + esRango);
    //console.log(parametros);
	
	// ¿Input sinxelo ou rango?
	if(esRango){
            //alert("enRango");

            // Si os 2 vacios devolve null, o que quere decir que non se emprega ese criterio
            if(vacio(input1.val()) && vacio(input2.val()))
            return({res:null});

            if(vacio(input1.val()) || vacio(input2.val()))
            return({res:false, foco: input1,  msg:"Debes introducir los 2 valores"}); // os 2 obligatorios




            if(tipo == 1){
                    //alert("Rango de fechas");
                    // Rango de Fechas
                    if(!validaFecha({fecha:input1.val()}))return({res:false, foco:input1, msg:"La primera fecha no es valida"});
                    if(!validaFecha({fecha:input2.val()}))return({res:false, foco:input2, msg:"La segunda fecha no es valida"});
                    if(comparaFecha(input1.val(), input2.val()) != 2)return({res:false, foco:input2, msg:"La segunda fecha debe ser mayor"});

            }else{
                    //alert("numerico");
                    // Numerico
                    if(isNaN(input1.val())||(!valeCero && parseFloat(input1.val(), 10) <= 0))
                    return({res:false, foco:input1, msg:"El valor debe ser un numero mayor de 0"});

                    if(isNaN(input2.val())|| parseFloat(input2.val(), 10) <= 0)
                    return({res:false, foco:input2, msg:"El segundo valor debe ser un numero mayor de 0"});

                    if(parseFloat(input1.val(), 10) >= parseFloat(input2.val(), 10))
                    return({res:false, foco:input1, msg:"El primer valor debe ser menor que el segundo"});
            }
            return ({res:true});


	}else{
		
		// 1 so campo input
		if( vacio(input0.val())) return({res:null});

		if(tipo == 1){
			// Fecha simple
			//console.log("Simle");
			if(!validaFecha({fecha:input0.val()}))return({res:false, foco:input0, msg:"Introduce una fecha valida"});
		}else{
			// Importe/numero
			if( !vacio(input0.val()) && (isNaN(input0.val())|| (!valeCero && parseFloat(input1.val(), 10) <= 0)))
			return({res:false, foco:input0, msg:"El valor debe ser un numero mayor de 0"});
		}
		return ({res:true});
	}



}






// Redirección(void)
//----------------------------------------------
function redirecciona(url,tempo){
	if(tempo>0)	setTimeout("document.location.href='" + url + "';", tempo); else document.location.href=''+url+'';
}





// Devove array|obxecto coas variables de busqueda da url (só as que teñen valores)
function getUrlVars() {
	/*var map =  new Array(); // Mellor que obxecto pois asi podo usar o método join!
	var patron = new RegExp("^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$", "gi");
	var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, 
		function(m,key,value) {
			if(value  != undefined)map[key] = value;
		}
	);
	*/
	
	var map =  new Array(); // Mellor que obxecto pois asi podo usar o método join!
	
	var patron = new RegExp("[?&]+([^=&]+)=([^&]*)", "gi");
	
	var parts = window.location.href.replace(patron, 	
		function(m,key,value) {
			if(!isUndefined(value) )map[key] = value;
		}
	);
	
	return map;
}




