/* *
 * 
 * javascript.js
 * 
 * Resumen:     
 * 
 * Set de funciones Javascript predefinidas por el desarrollador
 * 
 * Autor:       
 *
 * 
 * José Ruiz
 *
 * Ultima Rev:  03 / 10 / 2007
 * 
 * */

// Variables
cuenta = 0;

// validar() ~ Es un validador general de todos los formularios.
//
// Se encarga de recorrer todos los elementos de un formulario y
// verificar que estos no contengan valores vacios o null, ademas de 
// revisar que no se realice ningun tipo de inyección de código.

function validar(fx){
    
    // Expresión regular para la validación de campos de correo
    email_str=/^[^@\s]+@[^@\.\s]+(\.[^@\.\s]+)+$/;

    // Revisión de todos los campos, verificando a quien aplicar las
    // validaciones
    for (i = 0; i < fx.elements.length; i++) {
		
        // Que tipo de elemento recibirá la validacion
        if ((fx.elements[i].type == 'text' ||
             fx.elements[i].type == 'password' ||
             fx.elements[i].type == 'textarea') &&
             (fx.elements[i].type != 'hidden')){
            
            // De acuerdo al nombre cuales elementos no serán validados
            //Si el nombre del campo finaliza en _omit el campo no es validado
            if((fx.elements[i].name.substr(fx.elements[i].name.length-5))!='_omit'){
				
                // Reglas a validar en los campos            
                if (fx.elements[i].value == '' || 
                    fx.elements[i].value == 'null' || 
                    fx.elements[i].value.indexOf("\"", 0) > -1 || 
                    fx.elements[i].value.indexOf("=", 0) > -1 || 
                    fx.elements[i].value.indexOf("\'", 0) > -1){
                        
                    alert('Por favor completa todos los campos del formulario\n'+
                          'Verifique que no contenga caracteres especiales');    

                    // Si los elementos no son de tipo 'hidden' colocará
                    // el foco en el elemento que no cumple la validación
                    if(fx.elements[i].type != 'hidden')
                        fx.elements[i].focus();

                    return false;
                    break;
                        
                }
            }
        }
        
        // Otras validaciones más especificas
        
        // Verificar el correo con una expresión regular
        if(fx.elements[i].name == 'email' && fx.elements[i].value!=""){
            if(!email_str.test(fx.elements[i].value)) {
                alert('El formato del campo email no es valido');
                return false;
                break;
            }
        }
        
        // Verificar campos fecha
        if(fx.elements[i].type == 'hidden'){
            idFecha=fx.elements[i].id;
            if(idFecha.substr(0,6)=='f_date' && fx.elements[i].value==""){
                alert("Por favor completa todos los campos del formulario"+
                      "\nVerifique las fechas");
                return false;
                break;
            }
        }    
        
        // Verificar que las listas de selección no estén en su valor
        // predeterminado
        if(fx.elements[i].value=='N9'){
            alert('Por favor completa todos los campos del formulario\n'+
                  'Verifique las listas dependientes');
            return false;
            break;
        }
        
        // Validaciones relacionadas con AJAX
        if(document.getElementById('cK')){
            alert ('Introduzca un valor Válido!');
            return false;
        }
        if(document.getElementById('cKk')){
            //alert ('Por favor espere, se esta verificando el dato');
            return false;
        }
    }
    
    // Evita que el usuario envíe 2 veces el formulario
    if (cuenta == 0){
        //cuenta++;
        return true;
    }else{
        alert('Por favor espera la respuesta de tu peticion!');
        return false;
    }
    
}

// formato_moneda() ~ permite definir que caracteres puede introducir 
// un usuario en un campo y agrega una mascara para un formato de moneda.
// Para utilizarlo solo se debe agregar la siguiente linea como atributo
// del campo:
//
// onKeyPress="return(formato moneda(this,',','.',event))"

function formato_moneda(fld, milSep, decSep, e) {
    // Variables
    var sep = 0;
    var key = '';
    var i = j = 0;
    var len = len2 = 0;
    var aux = aux2 = '';
    // Solo se permiten numeros
    var strCheck = '0123456789';
    
    // Obtiene el codigo de la letra precionada
    var whichCode = (window.Event) ? e.which : e.keyCode;
    
    // Comienza la comprobación
    if (whichCode == 13 || whichCode == 8 || whichCode == 46) 
        return true; // Permitir Tecla Enter y puntos 

    if (whichCode == 0) 
        return true; // Permitir Tabulador

    // Consigue el valor del codigo de tecla
    key = String.fromCharCode(whichCode);
    
    // Verifica el caracter con los seleccionados en strCheck
    if (strCheck.indexOf(key) == -1) 
        return false; 

    len = fld.value.length;
    
    // El siguiente bloque agrega la mascara para mostrar un formato moneda
    
    for(i = 0; i < len; i++)
        if ((fld.value.charAt(i) != '0') && (fld.value.charAt(i) != decSep)) 
            break;
            
    aux = '';
        
    for(; i < len; i++)
        if (strCheck.indexOf(fld.value.charAt(i))!=-1) 
            aux += fld.value.charAt(i);
            
    aux += key;
    
    len = aux.length;
    
    if (len == 0) 
        fld.value = '';
        
    if (len == 1) 
        fld.value = '0'+ decSep + '0' + aux;
        
    if (len == 2) 
        fld.value = '0'+ decSep + aux;
        
    if (len > 2) {
        aux2 = '';
        
    for (j = 0, i = len - 3; i >= 0; i--) {
        if (j == 3) {
            aux2 += milSep;
            j = 0;
        }
        aux2 += aux.charAt(i);
        j++;
    }
    
    fld.value = '';
    
    len2 = aux2.length;

    for (i = len2 - 1; i >= 0; i--)
    
        fld.value += aux2.charAt(i);
        fld.value += decSep + aux.substr(len - 2, len);
        
    }
    
    return false;
    
}

// formato_campo() ~ permite definir que caracteres puede introducir 
// un usuario en un campo. Para utilizarlo solo basta con agregar la 
// siguiente linea como atributo del campo a validar:
//
// onKeyPress="return(formato_campo(this,event,1))"

function formato_campo(fld,e,t) {

    // Variables
    var aux = aux2 = '';
    var i = j = 0;
    var strCheck = null;

    // solo numeros
    if (t==1)
        var strCheck = '0123456789';
        
    // solo letras
    if (t==2)
        var strCheck = 'AaBbCcDdEeFfGgHhIiJjKkLlÑñNnMmOoPpQqRrSsTtUuVvWwXxYyZzáÁéÉíÍóÓúÚ '; 
        
    // telefonos
    if (t==3)
        var strCheck = '0123456789-ext';
        
    // moneda & numerico con decimales
    if (t==4)
        var strCheck = '0123456789.'; 
    
    // Obtiene el codigo de la letra precionada
    var whichCode = (window.Event) ? e.which : e.keyCode;
    
    // Comienza la comprobación
    if (whichCode == 13 || whichCode == 8) 
        return true; // Permitir Tecla Enter

    if (t==4 && (whichCode == 44 || whichCode == 46)) 
        return true; // Permitir Comas y puntos 
        
    if (whichCode == 0) 
        return true; // Permitir Tabulador
        
    // Consigue el valor del codigo de tecla
    key = String.fromCharCode(whichCode);
    
    // Verifica el caracter con los seleccionados en strCheck
    if (strCheck.indexOf(key) == -1) 
        return false; 
    
    // Retorna el caracter al campo
    fld.value += aux2.charAt(i);
}

// ventanaPopUp() ~ generador de ventanas emergentes
// La sintaxis sería similar a la siguiente:
// <a href="javascript:ventanaPopUp('pagina.html',
//                                  'nombreVentana',
//                                  '600px','400px','yes');">Texto Enlace</a>

function ventanaPopUp (pagina,nom_ventana,ancho,alto,scroll_b){
    var opciones=("toolbar=no, "+
                  "location=no, "+
                  "directories=no, "+
                  "status=no, "+
                  "menubar=no, "+
                  "scrollbars="+scroll_b+","+
                  "resizable=no,"+
                  "width="+ancho+","+
                  "height="+alto+"");
    var w=window.open(pagina,nom_ventana,opciones);
}


// pregunta() ~ es utilizada en los links para eliminar para solicitar
// confirmación al usuario

function pregunta(){
    
    if ( confirm('Estas seguro de eliminar el registro?') )
        return true;
    else
        return false;
        
}


// $_() ~ permite acceder de forma más sencilla a un elemento utilizando
// el document object model
//
// Ej: $_('nombre').value

function $_(id){
    
    return document.getElementById(id);
    
}
// Da formato a los montos con separador de miles y decimales.
//onKeyPress="return(formato_monto(this,maxInt,maxDec,event))" 
function formato_monto(fld,maxInt,maxDec,e) {
	var milSep='.';
	var decSep=',';
	var bandera=0;
	var num_dec=0;
	var comas=0;
	var comas2=0;
	var campo='';
	var aux_entero=0;
	var parte_entera='';
	var i = j = 0;
	var len = len2 = 0;
	var strCheck = '0123456789'+decSep;
	var aux = aux2 = '';
	var whichCode = (window.Event) ? e.which : e.keyCode;
	var key = String.fromCharCode(whichCode); 
	
	if (whichCode == 13) return true; 						// Enter
	if (whichCode == 8) return true; 							// Enter
	//if (whichCode == 46) return true;						// Enter 
	if (whichCode == 0) return true; 					// Consigue el valor del codigo de tecla...
    if (strCheck.indexOf(key) == -1){ 
	return false; 	// no es una tecla valida	
	}	
	
	for(i=0;i<fld.value.length;i++){
		if(fld.value.charAt(i)==milSep)
			comas2=comas2+1;
		}
		
	if(comas2>0){		
	campo_split=fld.value.split(milSep);
		for(i=0;i<=comas2;i++){
			campo+=campo_split[i];
		}
	}else
		campo=fld.value;
			
			
	if(decSep.indexOf(key)!= -1){
		if(campo.indexOf(key)!= -1){
			return false;
			}
	}		
	
		
	if((campo+key).indexOf(decSep)!= -1)
		bandera=1;
	
	cadena=campo.split(decSep);
	
	if(bandera!=1)
		cadena[0]+=key;
		
		if(cadena[0].length > maxInt)
			return false;
	
	//calcular numero de comas
	for(i=(cadena[0].length)/3;i>1;i--)
		comas=comas+1;

	if(cadena[0].length%3==0)
		aux_entero=3;
	else
		aux_entero=(cadena[0].length%3);
				
	if(bandera!=1){
		for(i=0;i<(aux_entero);i++){
			parte_entera+=cadena[0].charAt(i);
		}
		if(cadena[0].length>3)
			parte_entera+=milSep;
			
		for(i=aux_entero,j=1;i<(cadena[0].length);i++,j++){
			parte_entera+=cadena[0].charAt(i);
			if(j%3==0&& cadena[0].length-1!=i){
				parte_entera+=milSep;
				}
			}
		
		campo_final=parte_entera;
		}
	else{
	for(i=0;i<(aux_entero);i++){
			parte_entera+=cadena[0].charAt(i);
		}
		if(cadena[0].length>3)
			parte_entera+=milSep;
			
		for(i=aux_entero,j=1;i<(cadena[0].length);i++,j++){
			parte_entera+=cadena[0].charAt(i);
			if(j%3==0&& cadena[0].length-1!=i){
				parte_entera+=milSep;
				}
			}
		if(cadena[1]!=undefined)
			len2=cadena[1].length;
		else len2=0;
		
		for(i=0;i<len2;i++){
				num_dec++;
			}
			
		if(num_dec>=maxDec)
			return false;
			
		if(cadena[1]!=undefined)
			campo_final=(parte_entera+decSep+cadena[1]+key);
		else
			campo_final=(parte_entera+decSep);
	}
	
	fld.value=campo_final;		
	return false;
}
