/*
' --------------------------------------------------------------------------------
'
' INTERCRAFT SOLUTIONS INFORMÁTICA LTDA
' 15 DE JULHO DE 2009 - BASE COMUM PARA SOLUÇÕES ICRAFT
' COMPONENTE DE NAVEGAÇÃO
'
' OBSERVAÇÕES:::
'   - xxobservaçãoxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'   - incluir este script inserindo no page_load o comando: incluiscript(page, "Icraft.js")
'
' ALTERAÇÕES:::
'   - dd/mmm/yyyy xtécnico xxmotivotodocomletrasminúsculasxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'   - 16/jun/2009 lucianol debugprint, busca de campo debug ao invés de colocar diretamente em body caso container não seja especificado
'   - 29/jul/2009 lucianol debugprint, caso campo debug exista e esteja com display none, o mesmo é configurado com display block
'   - 29/out/2009 lucianol fechaflash, rotina utilizada pelo icftflash para fechar bloco
'   - 12/jan/2010 weslleya entramasc,  adicionadas as máscaras para CPF e CNPJ
'   - 31/mar/2010 weslleya entramasc,  adicionadas as máscaras para maiúsculo, minúsculo e capitalizado
'   - 31/mar/2010 weslleya validamasc, adicionadas as máscaras para maiúsculo, minúsculo e capitalizado
'   - 04/mai/2010 weslleya habilitacaps, detecta se a tecla capslock está ativa ou inativa no pressionamento de uma tecla
'
' IDÉIAS/NECESSIDADES:::
'   - xtecnico xxcomentárioxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
'
' --------------------------------------------------------------------------------
'
'
'
*/
// facilitador que retorna componente mediante seu nome
// método de pesquisa
// 1-window, document ou body
// 2-getelementbyid
// 3-procura elem por nome se existir origem ($...)
// IMPORTANTE:: caso não especifique origem, somente getelementbyid será executado
//     e ao procurar com origem, não esqueça de mencionar name= no controle
function $_(elem, origem) {
    if (elem == "window")
        elem = window;
    else
        if (elem == "document")
        elem = document;
    else
        if (elem == "body")
        elem = document.getElementsByTagName("body").item(0);
    else
        if (typeof (elem) == "string") {
        var elemobj = undefined;
        elemobj = document.getElementById(elem);

        if ((elemobj == null) && (origem != undefined)) {
            origem = $_(origem);
            var Prox = new ProcuraElem();
            elemobj = Prox.MaisProxPorNome(elem, origem);
        }

        elem = elemobj;

    }

    if (elem == null) {
        elem = undefined;
    }
    return elem;
}

// busca array que contém tais características
// elem = filhos deste elemento
// id = máscara de busca por nome
// classe = máscara de busca por classe
// tagname = tipos de elementos procurados
function $$_(origem, id, classe) {
    var ret = new Array()
    elem = $_(origem);
    if (arguments.length == 1) {
        for (filho in elem) {
            ret.push(filho);
        }
    } else {
        var Procura = new ProcuraElem()
        ret = Procura.PorMascara(elem, id, classe);
    }

    return ret;
}

var UnicoIDGlobal = 0;

// Retorna identificação única do elemento (se possível)
function UnicoID(ctl) {
    if (ctl.uniqueNumber != undefined) {
        return ctl.uniqueNumber;
    }
    UnicoIDGlobal--;
    try {
        ctl.uniqueNumber = UnicoIDGlobal;
    }
    catch (e) {
        UnicoIDGlobal++;
        return "";
    }
    return ctl.UniqueNumber;
}

// funções como objeto de procura em recursiva de elemento
// a partir de uma origem, seguindo hierarquicamente para baixo e,
// não encontrando, subindo para descer novamente.

// aqui inicia esta objeto. memória serve para acumular a hierarquia já pesquisada
function ProcuraElem() {
    //{
    this.memoria = "";
}

// busca hierárquica superior
ProcuraElem.prototype.MaisProxPorID = function(nomeelem, origem) {
    for (var obj = origem;
            obj != null;
            obj = obj.parentNode) {
        var ret = this.NosFilhosPorID(nomeelem, obj);
        if (ret != null) return ret;
    }
    return null;
}

// busca hierárquica inferior
ProcuraElem.prototype.NosFilhosPorID = function(nomeelem, origem) {
    if (origem != null) {
        if (new String(this.memoria + ";").indexOf(";" + UnicoID(origem) + ";") == -1) {

            if (origem.id == nomeelem) return origem;


            for (i in origem.childNodes) {
                if (typeof (origem.childNodes[i]) == "object") {
                    var ret = this.NosFilhosPorID(nomeelem, origem.childNodes[i]);
                    if (ret != null) return ret;
                }
            }

            this.memoria += ";" + UnicoID(origem);
        }
    }
    return null;
}

// em cada nó, busca hierarquica inferior (nos filhos) antes de subir
ProcuraElem.prototype.MaisProxPorNome = function(nomeelem, origem) {
    nomeelem = nomeelem.toUpperCase();


    for (var obj = origem;
                obj != null;
                obj = obj.parentNode) {
        var ret = this.NosFilhosPorNome(nomeelem, obj);
        if (ret != null) return ret;
    }
    return null;
}

// se este node não foi pesquisado, este é verificado da seguinte forma:
//      -mesmo nome
//      -acabado por "$" seguido de nome (formação para asp.net)
ProcuraElem.prototype.NosFilhosPorNome = function(nomeelem, origem) {
    if (origem != null) {

        if (new String(this.memoria + ";").indexOf(";" + UnicoID(origem) + ";") == -1) {
            var nn = NZ(origem.name, "");

            if (nn != "") {
                nn = nn.toUpperCase();
                if (nn == nomeelem) return origem;
                var ultpal = nn.slice(-nomeelem.length - 1);
                if ((ultpal == ("$" + nomeelem))) return origem;
            }

            for (i in origem.childNodes) {

                if (typeof (origem.childNodes[i]) == "object") {

                    var ret = this.NosFilhosPorNome(nomeelem, origem.childNodes[i]);
                    if (ret != null) return ret;
                }
            }

            this.memoria += ";" + UnicoID(origem);
        }
    }
    return null;
}

// recupera a lista de componentes com uma determinada condição
//      -idmasc para máscara de id ex.: "_pnl.*"
//      -classemasc para máscara de classes ex.: "^sobre$" (somente classe sobre)
ProcuraElem.prototype.PorMascara = function(origem, idmasc, classemasc) {
    elems = new Array();
    if (origem != null) {

        if ((new String(this.memoria + ";").indexOf(";" + UnicoID(origem) + ";") == -1) || (UnicoID(origem) == undefined)) {

            idmasc = NZ(idmasc, "");
            classemasc = NZ(classemasc, "");
            sel = true;

            if (idmasc != "")
                if (origem.id == undefined)
                sel = false;
            else
                sel = sel && new RegExp(idmasc).test(origem.id);

            if (classemasc != "")
                if (origem.className == undefined)
                sel = false;
            else
                sel = sel && new RegExp(classemasc).test(origem.className);

            if (sel)
                elems.push(origem);

            for (var z = 0; z < origem.childNodes.length; z++) {
                if (typeof (origem.childNodes[z]) == "object")
                    elems = elems.concat(this.PorMascara(origem.childNodes[z], idmasc, classemasc));

            }
            this.memoria += ";" + UnicoID(origem);
        }
    }
    return elems;
}

// retorna texto contendo html dos tópicos pesquisados    
ProcuraElem.prototype.ListaMaisProx = function(nomeelem, origem) {
    var result = "";
    for (var obj = origem; obj != null; obj = obj.parentNode) {
        result += this.ListaFilhos(nomeelem, obj);
    }
    return result;
}

ProcuraElem.prototype.ListaFilhos = function(nomeelem, origem) {
    var result = "";
    if (origem != null) {
        if (new String(this.memoria + ";").indexOf(";" + UnicoID(origem) + ";") == -1) {
            result += "<li>" + origem.id + "(" + origem.tagName + ")</li>";
            itens = "";
            for (var z = 0; z < origem.childNodes.length; z++) {
                if (typeof (origem.childNodes[z]) == "object")
                    result += this.ListaFilhos(nomeelem, origem.childNodes[z]);
            }
            if (itens != "")
                result += "<ul>" + itens + "</ul>";

            this.memoria += ";" + UnicoID(origem);
        } else {
            result += "<li>evitou pois j&aacute; pesquisou:" + origem.id + "(" + origem.tagName + ")</li>";
        }
    }
    return result;
}

//}

// exclui controle da página
function RemoveElemento(nomecontrole) {
    nomecontrole = $_(nomecontrole);
    nomecontrole.parentNode.removeChild(nomecontrole);
    document.body.visible = true;
}

// esconde elemento da página
function EscondeElemento(nomecontrole, origem) {
    nomecontrole = $_(nomecontrole, origem);
    nomecontrole.style.visibility = "hidden";
    document.body.visible = true;
}

// mostra elemento da página
function MostraElemento(nomecontrole, origem) {
    nomecontrole = $_(nomecontrole, origem);
    nomecontrole.style.visibility = "visible";
}

// convert valores inexistentes ou indefinidos em algum default
function NZ(valor, def) {
    try {
        if (valor != undefined)
            return valor;
    } catch (ex) { }
    return def;
}

// não só converte inexistentes e indefinidos como também considerados nulos de tipos
function NZV(valor, def) {
    try {
        valor = NZ(valor, def);
        if ((valor == "") || (valor == 0)) {
            return def;
        }
        return valor;
    }
    catch (ex) { }
    return def;
}

// rotina para carrega evento para um determinado objeto
function CarregaEvento(obj, evento, funcao) {
    var ctl = $_(obj);
    if (ctl.attachEvent != undefined) {
        ctl.attachEvent(evento, funcao);
    } else {
        switch (evento.toLowerCase()) {
            case "scriptcommand":
                ctl.scriptcommand = funcao;
                break;
            case "playstatechange":
                ctl.playstatechange = funcao;
                break;
            case "markerhit":
                ctl.markerhit = funcao;
                break;
            default:
                AdicionaFuncao(ctl, evento, funcao);
        }
    }
}

// rotina inclu função em uma função já existente
function AdicionaFuncao(obj, evento, funcao) {
    obj[evento] = new Function(InteriorDeFuncao(obj[evento]) + ";" + InteriorDeFuncao(funcao));
}

// rotina retorna texto de interior da função sem sua especificação
function InteriorDeFuncao(funcao) {
    var x = new String(funcao);
    var posini = x.indexOf("{");
    var posfim = x.lastIndexOf("}");
    x = x.substring(posini + 1, posfim - 1);
    return x;
}

// contatena valores em inner
function DebugPrint(container, texto) {
    var obj;
    if (arguments.length == 1) {
        obj = $_('debug');

        if (obj == undefined) {
            obj = document.body;
        } else {
            if (obj.style.display == "none") {
                obj.style.display = "block";
            }
        }

        TxtToInner(container + "<br />", obj);
        return;
    }
    obj = $_(container);
    TxtToInner(texto + "<br />", obj);
}

// coloca texto dentro de inner de obj
function TxtToInner(texto, destino) {
    destino = $_(destino);
    destino.innerHTML += texto + "<br/>";
}

// coloca value dentro de inner de obj
function ValueToInner(origem, destino) {
    origem = $_(origem);
    destino = $_(destino);
    destino.innerHTML = origem.value;
}

// busca filhos do elemento em uma lista texto separando os itens por vírgula
function FilhosTxt(elem, html, taminner) {
    html = NZV(html, false);
    taminner = NZV(taminner, -1);
    var txt = "";
    elem = $_(elem);
    for (obj in elem) {
        if (html == true) {
            txt += "<b>" + obj + "</b>=";
            try {
                if (taminner >= 0 && (obj == "innerHTML" || obj == "textContent"))
                    txt += elem[obj].substr(0, taminner);
                else
                    txt += elem[obj];
            } catch (ex) {
                txt += "[erro]";
            }
            txt += "<br/>";
        } else {
            txt += obj + ":";
            try {
                if (taminner >= 0 && (obj == "innerHTML" || obj == "textContent"))
                    txt += elem[obj].substr(0, taminner);
                else
                    txt += elem[obj];
            } catch (ex) {
                txt += "[erro]";
            }
            txt += "; ";
        }
    }
    return txt;
}

// para resolver a diferença entre firefox e explorer no que diz respeito 'a evento
function EventResolv(e) {
    if (e != undefined) {
        return e;
    }
    return window.event;
}

// evita erro quando não existe a propriedade retornando valor default
function Prop(obj, prop, def) {
    try {
        return NZ(obj[prop], def);
    } catch (e) {
    }
    return def;
}

// rotina para arrastar elementos da tela.
// para utilizar, basta chamar diretamente no código Arrasta.Prepara(param) onde:
// params =
// 1-nome dos campos separados por ";"
// 2-lista de campos, resultado de $$_(...) por exemplo
function Arrasta() { };
//{

Arrasta.elementos = "";
Arrasta.controle = null;

Arrasta.Verifica = function(e) {
    EventResolv(e).returnValue = true;
}

Arrasta.Inicia = function(e) {
    e = EventResolv(e);
    if (e.button != 2) {
        var src = Prop(e, "srcElement", e.target);

        if (new String(Arrasta.elementos + ";").indexOf(";" + UnicoID(src) + ";") != -1) {

            Arrasta.controle = src;
            Arrasta.controle.origX = Arrasta.controle.offsetLeft;
            Arrasta.controle.origY = Arrasta.controle.offsetTop;
            Arrasta.controle.clickX = EventResolv(e).clientX;
            Arrasta.controle.clickY = EventResolv(e).clientY;

        }
    }
}

Arrasta.Movimenta = function(e) {
    e = EventResolv(e);

    if ((e.button != 2) && (Arrasta.controle != null)) {


        DX = e.clientX - Arrasta.controle.clickX;
        DY = e.clientY - Arrasta.controle.clickY;

        Arrasta.controle.style.left = (Arrasta.controle.origX + DX) + "px";
        Arrasta.controle.style.top = (Arrasta.controle.origY + DY) + "px";

        e.returnValue = false;
        e.cancelBubble = true;
    }
}

Arrasta.Solta = function(e) {
    if (Arrasta.controle != null)
        Arrasta.controle = null;
}

Arrasta.Prepara = function(elems) {
    Arrasta.elementos = "";
    if (typeof (elems) == "string") {
        elems = split(elems, ";");
        for (i in elems) {
            Arrasta.elementos += ";" + UnicoID($_(elems[i]));
        }
    } else {
        for (i in elems) {
            Arrasta.elementos += ";" + UnicoID(elems[i]);
        }
    }

    if (Arrasta.elementos != "") {
        document.ondragstart = Arrasta.Verifica;
        document.onmousedown = Arrasta.Inicia;
        document.onmousemove = Arrasta.Movimenta;
        document.onmouseup = Arrasta.Solta;
    }
}

//}



// abre janela popup com altura e largura especificada
// será centralizada apresentando como título a descricao
function PopUp(url, largura, altura, descricao, atributos) {
    if (largura == undefined)
        largura = 550;
    if (altura == undefined)
        altura = 410;
    if (descricao == undefined)
        descricao = 'Informativo';
    var esquerda = ((screen.width) / 2) - (largura / 2);
    var topo = ((screen.height) / 2) - (altura / 2);
    if (atributos == undefined)
        atributos = "width=" + largura + ", height=" + altura + ", top=" + topo + ", left=" + esquerda + ", scrollbars=yes, status=no, toolbar=no, location=no, directories=no, menubar=no, resizable=yes, fullscreen=no";
    return window.open(url, descricao, atributos);
}


// Identificação padronizada do navegador
function Nav() { };
//{
Nav.IE = (navigator.appName == "Microsoft Internet Explorer");
Nav.IE5 = Nav.IE && (navigator.userAgent.indexOf('MSIE 5') != -1);
Nav.IE50 = Nav.IE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);
Nav.IE6 = Nav.IE && (navigator.userAgent.indexOf('MSIE 6') != -1);
Nav.IE7 = Nav.IE && (navigator.userAgent.indexOf('MSIE 7') != -1);
Nav.IE8 = Nav.IE && (navigator.userAgent.indexOf('MSIE 8') != -1);
Nav.Gecko = navigator.userAgent.indexOf('Gecko') != -1;
Nav.Safari = navigator.userAgent.indexOf('Safari') != -1;
Nav.Opera = navigator.userAgent.indexOf('Opera') != -1;
Nav.Mac = navigator.userAgent.indexOf('Mac') != -1;
Nav.NS7 = navigator.userAgent.indexOf('Netscape/7') != -1;
Nav.NS71 = navigator.userAgent.indexOf('Netscape/7.1') != -1;
Nav.NS8 = navigator.userAgent.indexOf('Netscape/8') != -1;
if (Nav.Opera) {
    Nav.IE = true;
    Nav.Gecko = false;
    Nav.Safari = false;
}
//}


// atribui url a location de frame
function AtribFrameLocation(Frame, URL) {
    if (frames[Frame].location) {
        frames[Frame].location.href = URL;
    } else {
        $_(Frame).src = URL;
    }
}

// prepara variável para envio ao aspnet a partir do javascript
function UrlJSEncode(Txt) {
    Txt = escape(Txt);
    Txt = Txt.replace(/\_/g, "%5F");
    Txt = Txt.replace(/\//g, "%2F");
    Txt = Txt.replace(/\?/g, "%3F");
    Txt = Txt.replace(/=/g, "%3D");
    Txt = Txt.replace(/&/g, "%26");
    Txt = Txt.replace(/@/g, "%40");
    Txt = Txt.replace(/\%/g, "_");
    return Txt;
}

function UrlJSDecode(Txt) {
    Txt = Txt.replace(/\_/g, "%");
    return unescape(Txt);
}

// carrega em select ou dropdownlist itens separados por ponto e vírgula
function OpcaoCarrega(select, itens) {
    itens = itens.split(";");
    var opcao;
    for (var z = 0; z < itens.length; z += 2) {
        opcao = document.createElement("option");
        opcao.value = itens[z];
        opcao.innerText = itens[z + 1];
        select.appendChild(opcao);
    }
}

// função para gerar postback no aspnet
function doPostBack(eventTarget, eventArgument) {
    var form = document.forms['form1'];
    if (!form)
        form = document.forms(0);
    if (!form.onsubmit || (form.onsubmit() != false)) {
        form.__EVENTTARGET.value = eventTarget;
        form.__EVENTARGUMENT.value = eventArgument;
        form.submit();
    }
}

// para trocar todo conteúdo. ainda não fiz teste de performance para ver qual mais rápida: esta ou regex 
function ReplaceAll(texto, encontrar, substituir) {
    while (texto.indexOf(encontrar) != -1) {
        texto = texto.replace(encontrar, substituir);
    }
    return texto;
}


// função que retorna posição na tela x, considerando deslocamento
function ScrollLeft() {
    var x = (window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft);
    return x ? x : 0;
}

// função que retorna posição y na tela considerando deslocamento
function ScrollTop() {
    var y = (window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop);
    return y ? y : 0;
}


// para centralizar objeto
function Centraliza(ctl) {
    ctl = $_(ctl);
    var doc = document.body;
    ctl.style.left = (doc.clientWidth - ctl.clientWidth) / 2 + ScrollLeft() + "px";
    ctl.style.top = (screen.height - ctl.clientHeight) / 4 + ScrollTop();
}




////////////////////////////
// rotinas sendo revisadas


function AtivaSetas(limite, conteudo, cima, baixo) {

    var limitectl = $_(limite);
    var conteudoctl = $_(conteudo);
    var cimactl = $_(cima);
    var baixoctl = $_(baixo);

    if (conteudoctl.clientHeight > (limitectl.clientHeight - 40)) {
        baixoctl.style.visibility = "visible";
        cimactl.style.visibility = "visible";
    }

    var comm = "AtivaSetasTempo('" + limite + "','" + conteudo + "',-10)";
    CarregaEvento(baixoctl, "onmouseover", new Function("$_('" + baixo + "').AtivaSetasRolando = setInterval(\"" + comm + "\",100);"));

    comm = "AtivaSetasTempo('" + limite + "','" + conteudo + "',10)";
    CarregaEvento(cimactl, "onmouseover", new Function("$_('" + cima + "').AtivaSetasRolando = setInterval(\"" + comm + "\",100);"));

    CarregaEvento(baixoctl, "onmouseout", new Function("if (NZV($_('" + baixo + "').AtivaSetasRolando,'')!='') clearInterval($_('" + baixo + "').AtivaSetasRolando);"));

    CarregaEvento(cimactl, "onmouseout", new Function("if (NZV($_('" + cima + "').AtivaSetasRolando,'')!='') clearInterval($_('" + cima + "').AtivaSetasRolando);"));

    comm = "$_('" + conteudo + "').style.marginTop='0px'";
    CarregaEvento(cimactl, "onclick", new Function("setTimeout(\"" + comm + "\",0); if (NZV($_('" + baixo + "').AtivaSetasRolando,'')!='') clearInterval($_('" + baixo + "').AtivaSetasRolando); if (NZV($_('" + cima + "').AtivaSetasRolando,'')!='') clearInterval($_('" + cima + "').AtivaSetasRolando);"));

    comm = "$_('" + conteudo + "').style.marginTop=RetiraUnid($_('" + conteudo + "').style.marginTop)-$_('" + limite + "').clientHeight*.65+'px';AtivaSetasTempo('" + limite + "','" + conteudo + "',-1)";
    CarregaEvento(baixoctl, "onclick", new Function("setTimeout(\"" + comm + "\",0); if (NZV($_('" + baixo + "').AtivaSetasRolando,'')!='') clearInterval($_('" + baixo + "').AtivaSetasRolando); if (NZV($_('" + cima + "').AtivaSetasRolando,'')!='') clearInterval($_('" + baixo + "').AtivaSetasRolando);"));

}

function RetiraUnid(param) {
    return parseInt(NZV(param, "0"));
}

function AtivaSetasTempo(limite, conteudo, desl) {
    var limitectl = $_(limite);
    var conteudoctl = $_(conteudo);
    var marg = RetiraUnid(conteudoctl.style.marginTop) + desl;
    var limitsup = limitectl.clientHeight - conteudoctl.clientHeight - 40;
    if ((desl < 0) && (marg < limitsup)) {
        marg = limitsup;
    }
    if ((desl > 0) && (marg > 0)) {
        marg = 0;
    }
    conteudoctl.style.marginTop = marg + "px";
}

function EntraMasc(obj, masc, e) {
    var tecla = (window.event) ? event.keyCode : e.which;

	if (tecla == 0 || tecla == 8)
		return true;

    if (tecla == 59) {
        var data = new Date();
        dia = data.getDate();
        mes = data.getMonth() + 1;
        ano = data.getFullYear();
        hora = data.getHours();
        minuto = data.getMinutes();
        segundo = data.getSeconds();
        if (dia < 10) {
            dia = "0" + dia;
        }
        if (mes < 10) {
            mes = "0" + mes;
        }
        if (hora < 10) {
            hora = "0" + hora;
        }
        if (minuto < 10) {
            minuto = "0" + minuto;
        }
        if (segundo < 10) {
            segundo = "0" + segundo;
        }
        switch (masc) {
            case "[0-9]{1,2}($|/($|[0-9]{0,4}))":
                obj.value = mes + "/" + ano;
                return false;
            case "[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}))))":
                obj.value = dia + "/" + mes + "/" + ano;
                return false;
            case "[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}($| ($|[0-9]{1,2}($|:($|[0-9]{1,2}($|:($|[0-9]{1,2}))))))))))":
                obj.value = dia + "/" + mes + "/" + ano + " " + hora + ":" + minuto + ":" + segundo;
                return false;
            case "[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}($| ($|[0-9]{1,2}($|:($|[0-9]{1,2}))))))))":
                obj.value = dia + "/" + mes + "/" + ano + " " + hora + ":" + minuto;
                return false;
        }
    }
    var achou = null;
    if (masc.charAt(0) == ">") {
        achou = "upper";
        masc = masc.substring(1);
        carac = String.fromCharCode(tecla);
        if (carac != carac.toUpperCase()) {
            tecla = carac.toUpperCase().charCodeAt(0);
        }
    } else if (masc.charAt(0) == "<") {
        achou = "lower";
        masc = masc.substring(1);
        carac = String.fromCharCode(tecla);
        if (carac != carac.toLowerCase()) {
            tecla = carac.toLowerCase().charCodeAt(0);
        }
    } else if (masc.charAt(0) == "|") {
        achou = "capit";
        masc = masc.substring(1);
        carac = String.fromCharCode(tecla);
        if (carac != carac.capitalizar()) {
            tecla = carac.capitalizar();
        }
    }
    var pretend = obj.value + String.fromCharCode(tecla);

    switch (masc) {
        case "":
            masc = ".*";
            break;
        case "MM/yyyy":
            masc = "[0-9]{1,2}($|/($|[0-9]{0,4}))";
            break;
        case "dd/MM/yyyy":
            masc = "[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}))))";
            break;
        case "dd/MM/yyyy HH:mm:ss":
            masc = "[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}($| ($|[0-9]{1,2}($|:($|[0-9]{1,2}($|:($|[0-9]{1,2}))))))))))"
            break;
        case "dd/MM/yyyy HH:mm":
            masc = "[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}($| ($|[0-9]{1,2}($|:($|[0-9]{1,2}))))))))"
            break;
        case "real":
            masc = "[-+]{0,1}[0-9]*[\\.,]{0,1}[0-9]*";
            break;
        case "inteiro":
            masc = "[-+]{0,1}[0-9]*";
            break;
        case "inteiro+":
            masc = "[+]{0,1}[0-9]*";
            break;
        case "CPF":
            masc = "[0-9]{1,3}($|\\.($|[0-9]{1,3}($|\\.($|[0-9]{1,3}($|-($|[0-9]{1,2}))))))";
            break;
        case "CNPJ":
            masc = "[0-9]{1,2}($|\\.($|[0-9]{1,3}($|\\.($|[0-9]{1,3}($|\\/($|[0-9]{1,4}($|-($|[0-9]{1,2}))))))))";
            break;
    }


    var Re = new RegExp("^" + masc + "$");
    var ar = Re.exec(pretend);
    obj.onkeyup = function() {
        if (achou) {
            if (achou == "upper"){
                obj.value = obj.value.toUpperCase();
            }else if (achou == "lower")
                obj.value = obj.value.toLowerCase();
            else if (achou == "capit")
                obj.value = obj.value.capitalizar();
        }
        if ((tecla == 46) && (ar != null)) {
            switch (masc) {
                case "[-+]{0,1}[0-9]*[\\.,]{0,1}[0-9]*":
                    obj.value = obj.value.substring(0, obj.value.length - 1) + ',';
                case "real":
                    obj.value = obj.value.substring(0, obj.value.length - 1) + ',';
            }
            tecla = null;
        }
    }
    return (ar != null);
}

function ValidaMasc(obj, masc, e) {

    var pretend = obj.value;
    var valid = true;
    var Re;
    var ar;

    if (masc.charAt(0) == ">") {
        masc = masc.substring(1);
        obj.value = obj.value.toUpperCase();
    } else if (masc.charAt(0) == "<") {
        masc = masc.substring(1);
        obj.value = obj.value.toLowerCase();
    } else if (masc.charAt(0) == "|") {
        masc = masc.substring(1);
        obj.value = obj.value.capitalizar();
    }

    if (obj.value != "") {
        switch (masc) {
            case "":
                valid = true;
                break;

            case "MM/yyyy":
                Re = new RegExp("^[0-9]{1,2}/[0-9]{0,4}$");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
            case "dd/MM/yyyy":
                Re = new RegExp("[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}))))");
                ar = Re.exec(pretend);
                valid = (ar != null);
                if (valid)
                    valid = (isDate(obj.value, /^([0-9]{1,2})[\/]([0-9]{1,2})[\/]([0-9]{1,4})$/, { d: 1, m: 2, y: 3 }) == 0);
                break;
            case "dd/MM/yyyy HH:mm:ss":
                Re = new RegExp("[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}($| ($|[0-9]{1,2}($|:($|[0-9]{1,2}($|:($|[0-9]{1,2}))))))))))");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
            case "dd/MM/yyyy HH:mm":
                Re = new RegExp("[0-9]{1,2}($|/($|[0-9]{1,2}($|/($|[0-9]{0,4}($| ($|[0-9]{1,2}($|:($|[0-9]{1,2}))))))))");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
            case "real":
                Re = new RegExp("[-+]{0,1}[0-9]*[\\.,]{0,1}[0-9]*");
                ar = Re.exec(pretend);
                valid = (ar != null);
                obj.value = obj.value.replace(new RegExp("\\.", "gi"), ",");
                break;
            case "inteiro":
                Re = new RegExp("[-+]{0,1}[0-9]*");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
            case "inteiro+":
                Re = new RegExp("[+]{0,1}[0-9]*");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
            case "CPF":
                Re = new RegExp("[0-9]{3}.[0-9]{3}.[0-9]{3}-[0-9]{2}");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
            case "CNPJ":
                Re = new RegExp("[0-9]{2}.[0-9]{3}.[0-9]{3}/[0-9]{4}-[0-9]{2}");
                ar = Re.exec(pretend);
                valid = (ar != null);
                break;
        }

        if (!valid) {
            alert("Preenchimento '" + obj.value + "' invalido para este campo. Veja o formato de acordo com a mascara '" + masc + "'.");
            obj.value = "";
            obj.focus();
        }

    }
}

function isDate(y, m, d) {
    var h, i, s;
    if (typeof y == "string" && m instanceof RegExp && d) {
        if (!m.test(y)) return 1;
        s = RegExp["$" + d.s], i = RegExp["$" + d.i], h = RegExp["$" + d.h], y = RegExp["$" + d.y], m = RegExp["$" + d.m], d = RegExp["$" + d.d];
    }
    d = Math.abs(d) || 0, m = Math.abs(m) || 0, y = Math.abs(y) || 0, h = Math.abs(h) || 0, i = Math.abs(i) || 0, s = Math.abs(s) || 0;
    return arguments.length != 3 ? 1 : d < 1 || d > 31 ? 2 : m < 1 || m > 12 ? 3 : /4|6|9|11/.test(m) && d == 31 ? 4
        : m == 2 && (d > ((y = !(y % 4) && (y % 1e2) || !(y % 4e2)) ? 29 : 28)) ? 5 : h < 0 || h > 23 ? 6 : i < 0 || i > 59 ? 7 : s < 0 || s > 59 ? 8 : 0;
}



function CriaBotoesSubmit(controle, container, botoes, eventos, eventopadrao) {
    var container = $_(container);
    var ar = botoes.toString().split(";");
    var ev = eventos.toString().split("{|}");
    var result = "";
    for (z = 0; z < ar.length; z++) {

        var coma = "";
        var param = "";
        if (z < ev.length) {
            coma = ev[z];
        }
        coma = NZV(coma, eventopadrao);

        if (coma.toString().substr(0, 11).toLowerCase() == "javascript:") {
            param = "";
            coma += "return false;";
        } else {
            param = coma;
            coma = "__doPostBack('" + coma + "','');return false;"
        }

        var id = controle + "_" + container.id + "_btn" + z;
        result += "<input type=\'submit\' value=\'" + ar[z] + "\' id=\'" + id + "\' param=\'" + param + "\' onclick=\'" + ReplaceAll(coma, "'", "\"") + "\' />";
    }

    container.innerHTML = result;
}

function FechaFlash(ControlId) {
    $_(ControlId + "_btnClose").click();
}

function RedimensionaFlash(ControlId, Largura, Altura, FlashId) {
    if (FlashId == undefined) {
        FlashId = ControlId;
    }
    var flash = $_(FlashId);
    flash.setAttribute("width", Largura);
    flash.setAttribute("height", Altura);
    var lnk = $_(ControlId + "_lnkPopup");
    if (lnk != undefined)
        lnk.click();
}

String.prototype.capitalizar = function() {
    return this.replace(/\S+/g, function(a) {
        return a.charAt(0).toUpperCase() + a.slice(1).toLowerCase();
    });
};


function MultiSelector( list_target, max ){
	this.list_target = list_target;
	this.count = 0;
	if( max ){
		this.max = max;
	} else {
		this.max = -1;
	};
	this.addElement = function( element ){
		if( element.tagName == 'INPUT' && element.type == 'file' ){

            if (this.count == 0) {
                this.element0 = element;
            } else {                          
                element.name = this.element0.name + "$" + this.count;
            }
            this.count++;
            
			element.multi_selector = this;
			element.onchange = function(){
				var new_element = document.createElement( 'input' );
				new_element.type = 'file';
				this.parentNode.insertBefore( new_element, this );
				this.multi_selector.addElement( new_element );
				this.multi_selector.addListRow( this );
				this.style.position = 'absolute';
				this.style.left = '-1000px';
			};
			if( this.max != -1 && this.count > this.max ){
				element.disabled = true;
			};
			this.current_element = element;
		} 
	};
	this.addListRow = function( element ){
		var new_row = document.createElement( 'div' );
		new_row.setAttribute("class","upload_arquivos");
		var new_row_button = document.createElement( 'input' );
		new_row_button.setAttribute("class", "upload_botoes");
		new_row_button.type = 'button';
		new_row_button.value = 'Apagar';
		new_row.element = element;
		new_row_button.onclick= function(){
			this.parentNode.element.parentNode.removeChild( this.parentNode.element );
			this.parentNode.parentNode.removeChild( this.parentNode );
			this.parentNode.element.multi_selector.count--;
			this.parentNode.element.multi_selector.current_element.disabled = false;
			return false;
		};
		new_row.innerHTML = element.value;
		new_row.appendChild( new_row_button );
		this.list_target.appendChild( new_row );
	};
};

function CriaMultiUpload(NomeInputControl, NomeListaControl, MaxArquivosUpload) {
    var multi_selector = new MultiSelector( document.getElementById( NomeListaControl ), MaxArquivosUpload );
    multi_selector.addElement( document.getElementById( NomeInputControl ) );
    return multi_selector
}



function UploadVerificaExtensao(ctl, masc) 
{
    var Arq = $_(ctl);
    var NomeArq=Arq.value;        

    if (Trim(NomeArq) =='' )
    {
        alert("Selecione um arquivo para upload!");
        Arq.focus();
        return false;
    }

   var Extensoes = masc.split(";");

   while (NomeArq.indexOf("\\") != -1)
     NomeArq = NomeArq.slice(NomeArq.indexOf("\\") + 1);

   var ext = NomeArq.slice(NomeArq.indexOf(".")).toLowerCase();

   for (var i = 0; i < Extensoes.length; i++) 
   {
     if (Extensoes[i] == ext) 
     { 
       return true;
     }
   }  
   alert("Escolha uma das extensões permitidas: " 
       + (Extensoes.join(" ")) + "\nBusque um arquivo válido.");
       Arq.focus();
       return false;
}


function Caps(e) {
    var Evento = e ? e : window.Eventoent;  
     
    if (!Evento) {
        return;
    }
    var targ = Evento.target ? Evento.target : Evento.srcElement;
    var Tecla = -1;
 
    if (Evento.Tecla) {
    Tecla = Evento.Tecla;
    } else if (Evento.keyCode) {
    Tecla = Evento.keyCode;
    }
 
    var ShiftSel = false;
 
    if (Evento.shiftKey) {
    ShiftSel = Evento.shiftKey;
    } else if (Evento.modifiers) {
    ShiftSel = !!(Evento.modifiers & 4);
    }
    
    
    if (((Tecla >= 65 && Tecla <= 90) && !ShiftSel) || 
    ((Tecla >= 97 && Tecla <= 122) && ShiftSel)) {
 
        return true;
 
    } else {
 
        return false; 
    }
}


function HabilitaCaps(Controle) {
    var v=$_(Controle);
    var c=Caps(event);
    if (c != undefined) {
        v.style.display = c?'block':'none';
    }
}


function MudaImagem(id, imagemId, imagemFechado, imagemAberto) {
    var x = id? $_(id) : null;
    var y = imagemId? $_(imagemId) : null;

    if (x) {
        if (x.style.display == 'none') {
            x.style.display = 'block';
            if (y) {
                y.style.backgroundImage = "url(" + imagemAberto + ")";
                y.style.backgroundRepeat = 'no-repeat';
            }
        } else {
            x.style.display = 'none';
            if (y) {
                y.style.backgroundImage = "url(" + imagemFechado + ")";
                y.style.backgroundRepeat = 'no-repeat';
            }
        }
    }

    return false;
}

function AjaxIgnoraErro(sender, args)
{
   if (args.get_error() != undefined)   
        args.set_errorHandled(true);
        
}


function PagAnterior(Origem,Ctl,dx,dy, Circular) {
    Circular = Circular=='True'?true:false;
    Ctl = $_(Ctl);
    if (dy>0) {
        y = Ctl.scrollTop;
        y -= dy;
        if (y>=0) {
            Ctl.scrollTop = y;
        } else if (Circular) {
            Ctl.scrollTop = 0;
            while((Ctl.scrollTop+dy) < Ctl.scrollHeight)
                Ctl.scrollTop += dy;
        }
    }
    if (dx>0) {    
        x = Ctl.scrollLeft;
        x -= dx;
        if (x>=0) {
            Ctl.scrollLeft = x;
        } else if (Circular) {
            Ctl.scrollLeft = 0;
            while ((Ctl.scrollLeft+dx) < Ctl.scrollWidth)
                Ctl.scrollLeft += dx;            
        }
    }
}

function PagPosterior(Origem,Ctl,dx,dy,Circular) {
    Circular = Circular=='True'?true:false;
    Ctl = $_(Ctl);
    if (dy>0) {
        y = Ctl.scrollTop;
        y += dy;
        if (y<Ctl.scrollHeight) {
            Ctl.scrollTop = y;
        } else if (Circular) {
            Ctl.scrollTop = 0;
        }
    }

    if (dx>0) {    
        x = Ctl.scrollLeft;
        x += dx;
        if (x<Ctl.scrollWidth) {
            Ctl.scrollLeft = x;
        } else if (Circular) {
            Ctl.scrollLeft = 0;
        }
    }
}

function PagVertDef(Origem, Ctl, Pag, dy) {
    Ctl = $_(Ctl);
    if (Pag >0) {
        Antes = Ctl.style.visibility;
        Ctl.scrollTop = 0;
        Ctl.style.visibility = "hidden";
        while (Pag>1) {
            PagPosterior(Origem,Ctl,0,dy);
            Pag -= 1;
        }
        Ctl.style.visibility = Antes;
    }
    
}

function PagVertCompos(Origem, CtlClientID, dy) {
//    var Ctl = $_(CtlClientID);
////    Tot = parseInt(Ctl.clientHeight/dy);
///////    alert(Ctl.scrollTop);

//    Tot = 2;

//    Ret = "";
//    for (z=1;z<=Tot;z++) {  
//        Ret += (Ret==""?"&nbsp;&nbsp;":"&nbsp;") + "<a href=\"#null\" title=\"P&aacute;gina "+z+" de "+Tot+".\" onclick=\"PagVertDef(this,'" + CtlClientID + "',"+z+", "+dy+");\">"+z+"</a>";
//    }
//    return Ret;
}


function ToolTipDiv(Ctl, DivContainer, DivText, Texto,x,y) {
    if (Texto == '' || Texto == undefined || DivText == '' || DivText == undefined) {
        $_(DivContainer).style.visibility='hidden';
    } else {
        var dv = $_(DivContainer);
        dv.style.visibility = 'visible'; 
        
        $_(DivText).innerHTML = Texto;
        
        if (x == undefined) {
            x = (window.event.x+40);
        }
        
        if (y == undefined) {
            y = (window.event.y+30);
        }

        dv.style.position = 'absolute';
        dv.style.left = (x + Ctl.offsetLeft) + "px";
        dv.style.top = (y + Ctl.offsetTop) + "px";
    }
}

