/** 
 * Retorna a posição do cursor dentro do campo.
 */
function C_getPosTextoDigitado(ctrl) {
  	if (F_isIExplorer()) {
        ctrl.focus();
        range = document.selection.createRange();
        return (ctrl.value.length - range.move("character", 50000)); 
    } else {
        return ctrl.selectionStart;
    }
}

/** 
 * Retorna o texto se o caracter "caracter" for digitado na posição atual do
 * cursor.
 */
function C_getTextoDigitado(ctrl, caracter) {
  	if (F_isIExplorer()) {
        ctrl.focus();
        range = document.selection.createRange();
        tamSel = String(range.text).length;
        posIni = (ctrl.value.length - range.move("character", 50000));
        posFim = posIni + tamSel;
    } else {
        posIni = ctrl.selectionStart;
        posFim = ctrl.selectionEnd;
    }
    textodigitado = ctrl.value.substr(0, posIni) + caracter + ctrl.value.substr(posFim);
    return textodigitado;
}

/*
 * Retorna TRUE se o campo estiver todo selecionado
 */
function C_isCampoTodoSelecionado(ctrl) {
    tamanhoTextoCampo = String(ctrl.value).length;
  	if (F_isIExplorer()) {
        range = document.selection.createRange();
        return (String(range.text).length == tamanhoTextoCampo);
    } else {
        return (ctrl.selectionEnd - ctrl.selectionStart == tamanhoTextoCampo);
    }
}

/*
 * Retorna o tamanho da seleção no campo
 */
function C_getSelLength(ctrl) {
  	if (F_isIExplorer()) {
        range = document.selection.createRange();
        return range.text.length;
    } else {
        return (ctrl.selectionEnd - ctrl.selectionStart);
    }
}

/**
 * Retorna o código da tecla digitada no OnKeyPress, OnKeyDown e OnKeyUp.
 */
function C_TeclaDigitada(event) {
    if (F_isIExplorer()) {
        return event.keyCode;
    } else {
        return event.charCode;
    }
}

/**
 * Retorna o código da tecla de controle digitada no OnKeyPress, OnKeyDown e OnKeyUp.
 */
function C_TeclaControleDigitada(event) {
    if (F_isIExplorer()) {
        if (event.type == "keypress") {
            return 0;
        } else {
            return event.keyCode;
        }
    } else {
        return event.keyCode; 
    }
}

/**
 * Cancela o evento OnKeyPress, OnKeyDown, OnKeyUp.
 */
function C_CancelaEvento(event) {
    if (F_isIExplorer()) {
        event.returnValue = false;
    } else {
        event.preventDefault();
    }
}

/**
 * Retorna TRUE se o evento OnKeyPress pode ser processado.
 */
function C_NaoPodeProcessarOnKeyPress(ctrl, event) {
    tecla = C_TeclaDigitada(event);
    return (ctrl.readOnly || tecla == 0 || event.ctrlKey || 
        event.ctrlLeft || C_TeclaControleDigitada(event) > 0);
}

/**
 * Retorna TRUE caso as teclas de controle devam ser inibidas
 */
function C_getDeveInibirTeclasControle(ctrl, event) {
    if ((F_isIExplorer() && event.type == "keydown") ||
                (!F_isIExplorer() && event.type == "keypress")) {
        //pega a tecla que foi digitada
        tecla = C_TeclaDigitada(event);
        teclaControle = C_TeclaControleDigitada(event);
        //Se o campo não está em branco ou todo selecionado...
        if (ctrl.value != "" && !C_isCampoTodoSelecionado(ctrl)) {
            //Não deixa digitar o CRTL+V, CTRL+X, SHIFT+INS
            if ( ((event.ctrlKey || event.ctrlLeft) && (tecla == 86 || tecla == 118 || tecla == 88 || tecla == 120)) ||
                 ((event.shiftKey || event.shiftLeft) && (teclaControle == 45 || teclaControle == 46)) ) {
                return true;            
            }
            //Controla a digitação do DEL e BKSP
            if (teclaControle == 8 || teclaControle == 46)  {
                pos = C_getPosTextoDigitado(ctrl);  
                lenVal = String(ctrl.value).length;
                if ((teclaControle == 8 && pos != lenVal) ||
                        (teclaControle == 46 && pos != lenVal-1)) {
                     return true;
                }
            }
        }
    }
    return false;
}

/** 
 * Retira os caracteres especiais de um CPF/CNPJ 
 */
function C_EliminaMascaraCPFCNPJ(nuIdent) {
    nuIdent = String(nuIdent).replace(/\\/g, "");
    nuIdent = String(nuIdent).replace(/\//g, "");
    nuIdent = String(nuIdent).replace(/,/g, "");
    nuIdent = String(nuIdent).replace(/\./g, "");
    nuIdent = String(nuIdent).replace(/-/g, "");
    nuIdent = String(nuIdent).replace(/\s/g, "");
    return nuIdent;
}

/**
 * Verifica se o formato do campo é valido
 */
function C_verificaValor(ctrl) {
    if (ctrl.getAttribute('formatType') != null) {
        formatType = new String(ctrl.getAttribute('formatType')).toUpperCase();
        if (formatType == "TEXT") {
            return CT_verificaValor(ctrl);
        } else if (formatType == "NUMBER") {
            return CN_verificaValor(ctrl);
        } else if (formatType == "DATE") {
            return CD_verificaValor(ctrl);
        } else if (formatType == "MASK") {
            return CM_verificaValor(ctrl);
        } else if (formatType == "CPF") {
            return CCPF_verificaValor(ctrl);
        } else if (formatType == "CNPJ") {
            return CCNPJ_verificaValor(ctrl);
        }
    }
    return true;
}