﻿function pxbyCampo(pTIPO, pVALOR, pNULO, pFORMATO){
    var oRet;
    $.ajax({
        url: 'pxbyCampos.aspx', 
        data:({
            TIPO:pTIPO,
            VALOR:pVALOR,
            NULO:pNULO,
            FORMATO:pFORMATO
        }),
        cache: false,
        async: false,
        type:'POST',
        success: function(html){oRet=html;},
        error: function(){oRet=''}
    });  
    return oRet;
}

function pxbySeleccion(pControl){
    
    var txt = '';
           
    if (document.selection){
        txt = document.selection.createRange().text;        
    }
    else{
        txt=pControl.value.substring(pControl.selectionStart,pControl.selectionEnd);
    }        
    
    return txt;
    
}

function caretPos(txt){
    var i=txt.value.length+1;
    if (txt.createTextRange){
        theCaret = document.selection.createRange().duplicate();
        while ( theCaret.parentElement() == txt && theCaret.move("character",1)==1 ) --i;
    }
    return i==txt.value.length+1?-1:i;
}

function CambiarTecla(e, nueva){
    e.keyCode = nueva.charCodeAt(0);
    return true;    
}

function pxbyDate(pControl){
    var self=$(pControl);
    self.val(pxbyCampo('DATE', self.attr('valor'), self.attr('pxbyDateNulo'), self.attr('pxbyDate')));
    self.keypress(pxbyDate_KeyPress);
    self.blur(pxbyDate_Blur);
    self.focus(pxbyDate_Focus);
}

function pxbyDate_KeyPress(event){
    var keynum;
    var keychar;
    var numcheck;
    keynum = event.keyCode ? event.keyCode : event.which;
    keychar = String.fromCharCode(keynum);
    numcheck = /\d/;
    if(numcheck.test(keychar)){return true;}//Si es un NUMERO
    if(keychar == '-'){return CambiarTecla(event, '/');}//Si es un MENOS lo cambia por BARRA
    if(keychar == '/'){return true;}//Si es una BARRA
    if(keynum == 35 || keynum == 36){return true;}//INICIO y FIN
    if(keynum == 37 || keynum == 39){return true;}//FLECHAS
    if(keynum == 8 || keynum == 46){return true;}//SUPR Y BCKSPC
    if(keynum == 9){return true;}//TAB
    if(keynum == 13){return true;}//ENTER
    event.stopPropagation();
    return false;
}

function pxbyDate_Focus(){
    var self = $(this);
    self.val(pxbyCampo('DATE', self.attr('valor'), self.attr('pxbyDateNulo'), 'dd/MM/yyyy'));
    this.select();
}

function pxbyDate_Blur(){    
    var self = $(this);    
    self.attr('valor', pxbyCampo('DATE', self.val(), '', 'yyyy/MM/dd'));
    self.val(pxbyCampo('DATE', self.attr('valor'), self.attr('pxbyDateNulo'), self.attr('pxbyDate')));    
}

//MANEJADORES DE EVENTOS DE LOS CONTROLES
function pxbyDouble(pControl){
    var self=$(pControl);
//    self.val(pxbyCampo('DOUBLE', self.attr('valor'), self.attr('pxbyDoubleNulo'), self.attr('pxbyDouble')));
    self.keypress(pxbyDouble_KeyPress);
    self.blur(pxbyDouble_Blur);
}

function pxbyDouble_KeyPress(event){

    var keynum;
    var keychar;
    var numcheck;
    var e = event;
    var txt = event.target;    
    var ent = $(txt).attr('pxbyDouble').split('-')[0];
    var dec = $(txt).attr('pxbyDouble').split('-')[1];
    
    //Establece el separador decimal existente, por defecto COMA
    var sep = ',';
    if(txt.value.indexOf('.')>-1) sep='.';
    
    keynum = event.keyCode ? event.keyCode : event.which;
    keychar = String.fromCharCode(keynum);
    numcheck = /\d/;
        
    if(numcheck.test(keychar)){//Si es un NUMERO        
        if(txt.value.indexOf(sep)==-1){//Si no hay comas 
            if(txt.value.length < ent || ent <= 0){return true;}//Si no se ha sobrepasado la cantidad de enteros permitida
        }
        else{            
            if(caretPos(txt) > -1 && caretPos(txt) <= (txt.value.indexOf(sep) + (dec - 1))){//Si es de la parte ENTERA
                if(txt.value.indexOf(sep) < ent || ent <= 0){return true;}//Si no se ha sobrepasado la cantidad de enteros permitida
            }                
            else{
                if(txt.value.length - txt.value.indexOf(sep) <= dec || dec <= 0){return true;}//Si no se ha sobrepasado la cantidad de decimales permitida
            }
        }       
    }
        
    if(keychar == ',' || keychar == '.'){//Si es una COMA         
        if(txt.value.indexOf(sep)==-1){//Si no habia COMA anteriormente
            if(caretPos(txt) == -1 || caretPos(txt)>(txt.value.length - dec) || dec <= 0){return true;}//Si no se sobrepasa la cantidad de decimales permitida
        }
        else{//Si habia COMA anteriormente            
            txtstr=pxbySeleccion(txt);
            if(txtstr.indexOf(sep)>-1){return true;}//Pero esta dentro de la selección que se reemplazará
        }        
    }                           
       
    if(keynum == 35 || keynum == 36){if(e.which==0) return true;}//INICIO y FIN    
    if(keynum == 37 || keynum == 39){if(e.which==0) return true;}//FLECHAS
    if(keynum == 8 || (keynum == 46 && keychar != '.')){if(e.which==0 || e.which==8) return true;}//SUPR Y BCKSPC
    if(keynum == 9){if(e.which==0) return true;}//TAB
    if(keynum == 13){if(e.which==0) return true;}//ENTER
    
    return false; 
    
}

function pxbyDouble_Blur(event){

    var txt = event.target;
    txt.value = txt.value.replace('.',',');
    
}

//FUNCIONES AUXILIARES Y DE CONVERSION
function XDouble(pValor, pNulo){
    
    pValor = '' + pValor;
    pValor = pValor.replace(',','.');
    pValor = parseFloat(pValor);
    
    if(isNaN(pValor))
        pValor = pNulo;
    
    return pValor;
    
}

//MANEJADORES DE EVENTOS DE LOS CONTROLES
function pxbyLong_KeyPress(event){
    
    var keynum;
    var keychar;
    var numcheck;    
    keynum = event.keyCode ? event.keyCode : event.which;
    keychar = String.fromCharCode(keynum);
    numcheck = /\d/;
    
    if(keynum == 35 || keynum == 36){if(e.which==0) return true;}//INICIO y FIN    
    if(keynum == 37 || keynum == 39){if(e.which==0) return true;}//FLECHAS
    if(keynum == 8 || (keynum == 46 && keychar != '.')){if(e.which==0 || e.which==8) return true;}//SUPR Y BCKSPC
    if(keynum == 9){if(e.which==0) return true;}//TAB
    if(keynum == 13){if(e.which==0) return true;}//ENTER
    return numcheck.test(keychar);
    
}

//FUNCIONES AUXILIARES Y DE CONVERSION
function XLong(pValor, pNulo){

    pValor = '' + pValor;        
    pValor = parseInt(pValor);
    
    if(isNaN(pValor))
        pValor = pNulo;
    
    return pValor;
    
}


function pxbyString(pControl){
    var self=$(pControl);
    self.val(pxbyCampo('STRING', self.attr('valor'), self.attr('pxbyStringNulo'), ''));
    self.keypress(pxbyString_KeyPress);
    self.blur(pxbyString_Blur);
    self.focus(pxbyString_Focus);
}

function pxbyString_KeyPress(event){

    var keynum;
    var e = event;
    var txt = event.target;    
    var lon = $(txt).attr('pxbyString');
    var txtstr;
    
    if(XLong(lon, 0)==0)
        return true;

    keynum = event.keyCode ? event.keyCode : event.which;
    
    if(keynum == 0){return true;}
    if(e.which == 0){return true;}    
    if(keynum == 8 || (keynum == 46 && keychar != '.')){if(e.which==0 || e.which==8) return true;}//SUPR Y BCKSPC
           
    txtstr=pxbySeleccion(txt);                   
    if(txtstr != '') return true;
                    
    if(txt.value.length + 1 <= lon) return true;                                
    
    return false; 
    
}

function pxbyString_Focus(){
    var self = $(this);
    self.val(pxbyCampo('STRING', self.attr('valor'), self.attr('pxbyStringNulo'), ''));
    this.select();
}

function pxbyString_Blur(){    
    
    var self = $(this);
    
    if(self.val()==self.attr('pxbyStringNulo'))
        self.attr('valor', '');
    else
        self.attr('valor', pxbyCampo('STRING', self.val(), '', ''));
        
    self.val(pxbyCampo('STRING', self.attr('valor'), self.attr('pxbyStringNulo'), ''));    
}

function XString(pValor, pNulo){
    return pxbyCampo('STRING', pValor, pNulo, '');
}
