﻿function trace(s){ window.open("","trace").document.write(s) }
//-----------------------------------------------------------
function dialog(s)
{
    var b = true;
    s = s.trim();
    if(s.length>0)
    {
        if(s.indexOf("?")>-1) b = confirm("ATENÇÃO:\n\n" + s + "\n\n");
        else 
        {
            s = s.charAt(0)=="{" ? s.substring( s.indexOf("}")+1 ) : s;
            alert("ATENÇÃO:\n\n" + s + "\n\n");
        }
    }   
    return b;
}
//----------------------------------------------------------------------------
function getNav() 
{
    var nv = navigator.userAgent;
    var vs = navigator.appVersion;
    var q = "IE";
    if (nv.indexOf("Opera")>-1) q = "OPERA";
    if (nv.indexOf("Firefox")>-1) q = "FIREFOX";
    if (nv.indexOf("Netscape")>-1) q = "NETSCAPE";
    if (nv.indexOf("Mozilla")>-1 && nv.indexOf("Netscape")==-1 && nv.indexOf("MSIE")==-1 && nv.indexOf("Firefox")==-1) q = "MOZILLA";
     if (nv.indexOf("Chrome")>-1) q = "CHROME";

    var avs = null;
    if (q=="IE") {
        avs = vs.split(";");
        vs = parseFloat(avs[1].substring(5));
    } else if (q=="FIREFOX") {
        avs = nv.split("/");
        vs = parseFloat(avs[3]);
    } else
        vs = 0;

    var r = { n: q, v: vs };

    return r;
}
var NV = getNav();
var IE5 = NV.n=="IE"&NV.v<6?true:false;
var IE6 = NV.n=="IE"&NV.v==6?true:false;
var IE7 = NV.n=="IE"&NV.v==7?true:false;
var IE8 = NV.n=="IE"&NV.v==8?true:false;
var IE = NV.n=="IE"?true:false;
var FF = NV.n=="FIREFOX"?true:false;
var FF3 = NV.n=="FIREFOX"&NV.v==3?true:false;
var OP = NV.n=="OPERA"?true:false;
var MZ = NV.n=="MOZILLA"?true:false;
var NS = NV.n=="NETSCAPE"?true:false;
var CH = NV.n=="CHROME"?true:false;
var VS = NV.v;
//----------------------------------------------------------------------------
function createCookie(name, value, expires, path, domain, secure)
{
    var objDate = new Date();
    objDate.setMonth(objDate.getMonth()+expires);
    document.cookie = name + "=" + escape(value) + 
        ((expires) ? "; expires=" + objDate.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +  
        ((secure) ? "; secure=" + secure : "");  
}
//------------------------------------------
function getValueCookie(name) 
{    
    var valueCookie = function(offset)
    {
        var endstr = document.cookie.indexOf(";", offset);
        if (endstr == -1) endstr = document.cookie.length;
        return unescape(document.cookie.substring(offset, endstr));
    }
    
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen) 
    {
        var j = i + alen;
        if (document.cookie.substring(i,j) == arg) return valueCookie(j);
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return "";
}
//----------------------------------------------------------------------------
//Evitar que conteudo seja selecionado
function notSelection()
{
    if(document.selection) document.selection.empty(); 
    else
    {
        var selection = window.getSelection(); 
        selection.removeAllRanges();
    }
}
//---------------------------------------
function notSeletionDocument(evt,f) 
{ 
    if(evt)
    {
        var e = IE?event.srcElement:evt.target; 
        var t = e.tagName.toLowerCase();
        try 
        {
            if (f==true && t!="input" && t!="textarea") notSelection();
        } 
        catch(e) {};
    }
    else
        notSelection();    
}
//----------------------------------------------------------------------------
function setActionKeyPress(fcAnon,aKey,evt)
{
    var k = getKey(evt).Code;
    var e = getEvent(evt).element;
    for(var i=0;i<aKey.length;i++) {
        if(aKey[i]==k && (e.tagName!="TEXTAREA" && k==13) ) fcAnon(evt);
    }
    return true;
}
//----------------------------------------------------------------------------
//atribui ao keypress para cada elemento "aEl" uma action para cada keyCode "aKey"
function setKeyPress(aEl,aKey,fcAnon) 
{
    for(var i=0;i<aEl.length;i++) addEvent(aEl[i],"keypress",function(event){setActionKeyPress(fcAnon,aKey,event)});
}
//----------------------------------------------------------------------------
var TIMEKEYUP = null;
function setActionKeyTime(fnc,time) 
{
    time = time!=null ? time : 1100;
    clearTimeout(TIMEKEYUP);
    TIMEKEYUP = setTimeout(fnc,time);
}
//----------------------------------------------------------------------------
//nega caracteres (baseado nos seus codigos ASCII)
function noChars(evt, aIntKeys)
{
    return !aIntKeys.isExist(getKey(evt).Code);
}
//----------------------------------------------------------------------------
//verifica se existe lista de checkbox, se houver retorna valores em lista
function getValueListCheckbox(f,n) 
{
    var cp = f.elements[n];
    var y = cp.length;
    var s = "";
    if (typeof y != "undefined") 
    {
        var r = [];
        for (var i=0;i<y;i++) if (cp[i].checked) r.push(cp[i].value);
        s = r.join(",");
    } 
    else 
        s = cp.value;
    return s.trim();
}
//----------------------------------------------------------------------------
//retorna index e value do radio marcado na coleção
function getValueListRadio(e) {
    e = typeof e=="string" ? ID(e) : e;
    var r = null;
    for (var i=0;i<e.length;i++){
        if(e[i].checked)
        {   
            r = { index:i, value:e[i].value };
            break;
        }
    }
    return r;
}
//###################################################################################################################################
String.prototype.trim = function()
{
    var r = this;
    var er = /^\s|\s$/;
    while (er.test(r)) r = r.replace(/^\s|\s$/g,"");
    return r;
}
//---------------------------------------------------------------------
//troca caracteres especiais para comuns
String.prototype.unaccented = function()
{
    var s = this;
    var a = "ãâàáäêèéëîìíïõôòóöûúùüÃÂÀÁÄÊÈÉËÎÌÍÏÕÔÒÓÖÛÙÚÜçÇñÑ";
    var c = "aaaaeeeeiiiiooooouuuuAAAAAEEEEIIIIOOOOOUUUUcCnN";
    var i, x, n = "";
    for(i=0; i<s.length; i++)
    {
        x = a.indexOf(s.charAt(i));
        n += (x>-1 ? c[x] : s.charAt(i));
    }
    return n;
}
//---------------------------------------------------------------------
//retira caracteres de quebra e fim de linha
String.prototype.clearBreakLine = function(tagBR)
{
    var s = this;
    tagBR = typeof tagBR=="string" ? tagBR : "";
    s = s.replaceAll( String.fromCharCode(13), tagBR);
    s = s.replaceAll( "\n", tagBR);
    s = s.replaceAll( String.fromCharCode(10), "" );
    s = s.replaceAll( "\t", "" );
    return s;
}
//---------------------------------------------------------------------
//retorna valor do elemento string caso existe, caso contrario retorna valueDefault.
String.prototype.nvl = function(valueDefault)
{
    var s = (typeof valueDefault=="undefined" ? "" : valueDefault), e = ID(this);
    if(e)
    {
        s = e.innerHTML && !e.value ? e.innerHTML : e.value;  //alert(e.id + " = " + s);  
    }    
    return s;
}
//------------------------
//seta valor e um campo de formulario ou conteudo (string ou object) em um elemento container (div, span...)
String.prototype.setValue = function(value)
{   
    var e = ID(this);    
    if(!e) e = ID(this+"_0"); //caso nao existe, checar se existe um id com "_0", pois caso seja uma familia de campos "radio" ou "checkbox"
    value = typeof value=="undefined" || value==null ? "" : value;
    if(e)
    {
        if(e.innerHTML && !e.value)
        {
            if(typeof value == "string") e.innerHTML = value; else e.appendChild(value);
        }
        else
        { 
            UtilData.setValueField(e, value);
        }
    }    
    return true;
}
//------------------------
String.prototype.getValue = function(){ return this.nvl(""); }

//---------------------------------------------------------------------
// s = string a ser cadastrada na enumeration 
// b = 1 -> incluir nova se nao existir / b = 0 -> excluir valor de existir
String.prototype.setEnum = function(s,b)
{
    var e = this; //alert(s);
    s = "{" + s + "}";
    e = b==1 ? (e.toUpperCase().indexOf(s.toUpperCase())==-1?e+=s:e) : e.replace(s,"").trim();
    return e.trim();
}
//-------------------------------------------
String.prototype.replaceAll = function(str,newStr){
    var r = this;
    while (r.indexOf(str)>-1) r = r.replace(str,newStr);
    return r;
}
//-------------------------------------------
//adiciona string "chr" n vezes antes ou depois da string
var ADD_CONCAT = { FIRST:0, LAST:1 };
String.prototype.addConcat = function(chr, maxLength, firstOrLast) //firstOrLast --> 0 = first / 1 = last
{
    if( typeof firstOrLast!="object" ) firstOrLast = ADD_CONCAT.FIRST;
    var s = this;
    while (s.length<maxLength)
    {
        if(firstOrLast==0)
            s = chr.toString() + s;
        else
            s += chr.toString();
    }
    return s;
}
//-------------------------------------------
//Somente formatos: dd/MM/yyyy HH:mm:ss ou yyyy/MM/dd HH:mm:ss
String.prototype.toDate = function()
{ 
    var s = this;    
    var sp = s.indexOf("/") ? "/" : "-";
    
    var x, a, m,d;
    x = s.length>10 ? s.indexOf(" ") : s.length;

    //mes possui a mesma posicao no meio
    m = (parseInt(s.substring( s.indexOf(sp)+1, s.lastIndexOf(sp) ))-1).toString().addConcat("0", 2, 0);
    
    if(s.indexOf("/")>3) //formato: yyyy/MM/dd
    {        
        a = s.substring(0, s.indexOf(sp)).trim()       
        d = s.substring( s.lastIndexOf(sp)+1, x).trim().addConcat("0", 2, 0);
    }
    else
    {
        a = s.substring( s.lastIndexOf(sp)+1, x).trim();
        d = s.substring( 0, s.indexOf(sp) ).addConcat("0", 2, 0);
    }    
    
    var H=0,M=0,S=0;
    if(s.length>10) //data posssui HH:mm:ss
    { 
        H = s.substring( x, s.indexOf(":") ).trim().addConcat("0", 2, 0);
        M = s.substring( s.indexOf(":")+1, s.lastIndexOf(":") ).addConcat("0", 2, 0);
        S = s.substring( s.lastIndexOf(":")+1 ).addConcat("0", 2, 0);
    } 
    //alert(a + "\n" + m + "\n" + d + "\n" + H + "\n" + M + "\n" + S);
    
    return (s.length>10) ? new Date(a,m,d,H,M,S) : new Date(a,m,d);
}
//-------------------------------------------
String.prototype.parseDouble = function()
{
    var s = this;
    if(s.trim().length>0)
    {
        s = s.replace(/\./g,""); //retira pontos
        s = s.replace(",",".");
        s = parseFloat(s);
    } else
        s = 0;
    return s;
}
//-------------------------------------------
Date.prototype.format = function(mask)
{
    var dt = this;
    mask = mask.replace("dd", dt.getDate().toString().addConcat("0",2));
    mask = mask.replace("MM", (dt.getMonth()+1).toString().addConcat("0",2));
    mask = mask.replace("yyyy",dt.getFullYear().toString());
    mask = mask.replace("HH", dt.getHours().toString().addConcat("0",2));
    mask = mask.replace("mm", dt.getMinutes().toString().addConcat("0",2));
    mask = mask.replace("ss", dt.getSeconds().toString().addConcat("0",2));
    mask = mask.replaceAll("'","");
    return mask;
}
//-------------------------------------------
//Verifica se "o" ja esta no array
Array.prototype.isExist = function(o){
    var a = this;
    var b = false;
    if(a.length>0)
    { 
        for(var i=0;i<a.length;i++){ //alert(a[i] + " = " + o);
            if(typeof a[i]!="undefined")
            {
                if(a[i].toString().toLowerCase()==o.toString().toLowerCase()) {
                    b = true;
                    break;
                }
            }
        }
    }
    return b;
}
//-------------------------------------------
//substitui {0} ou {n..} pela string correspondente passada como parametro
String.prototype.toFormat = function()
{
    var s = this;
    for(var i=0; i<arguments.length; i++)  s = s.replaceAll("{" + i + "}", arguments[i]);
    return s;
}
//-------------------------------------------
//adiciona string "chr" n vezes antes ou depois da string
var ADD_CONCAT = { FIRST:0, LAST:1 };
String.prototype.addConcat = function(chr, maxLength, firstOrLast) //firstOrLast --> 0 = first / 1 = last
{
    if( typeof firstOrLast!="object" ) firstOrLast = ADD_CONCAT.FIRST;
    var s = this;
    while (s.length<maxLength)
    {
        if(firstOrLast==0)
            s = chr.toString() + s;
        else
            s += chr.toString();
    }
    return s;
}
//-------------------------------------------

//procura no array de objetos json um par "nome - valor"
Array.prototype.getValueListJson = function(name, value)
{
    var obj = null, objJson = this;    
    for(var i=0; i<objJson.length; i++)
    {        
        if(objJson[i].hasOwnProperty(name))
        {
            if(objJson[i][name].toString() == value.toString())
            {
                obj = objJson[i];
                break;
            }
        }
    }
    return obj; 
}

//-----------------------------------------------------------------------------------

//Verifica em arrayValues se existe um item cujo o trecho exite na string
String.prototype.isExist = function(arrayValues)
{
    var a = this;
    var b = false;
    for(var i=0; i<arrayValues.length; i++){
        if(a.indexOf(arrayValues[i].trim())>-1){
            b = true;
            break;
        }
    }
    return b;
}
//---------------------------------------------------------------------
function nvl(obj, valueDefault)
{
    valueDefault = typeof valueDefault=="undefined" || valueDefault==null ? "" : valueDefault;
    return obj==null ? valueDefault : obj;
}
//-------------------
function nvlBool(obj, valueBoolDefault)
{
    valueDefault = typeof valueDefault!="boolean" ? false : valueDefault;
    return typeof obj!="boolean" ? valueDefault : obj;
}
//---------------------------------------------------------------------
function addOptions(cp,valor,texto) 
{	
    var oOption = CE("Option");
    oOption.value = valor;
    oOption.text = texto;
    try { cp.add(oOption, null); } // NS/FF
    catch(e) { cp.add(oOption); } // IE
    return oOption;
}
//---------------------------
function selectedOption(e, value, toValue)
{
    toValue = typeof toValue=="undefined" ? true : toValue;
    var v = "";
    for(var i=0; i<e.options.length; i++)
    {
        v = toValue ? e.options[i].value : e.options[i].text;
        e.options[i].selected = (v==value);
    }    
}
//---------------------------------------------------------------------
function isDate(d) { //Verifica se data e valida
    //Separa valores
    var dd = d.substring(0,d.indexOf("/"));	
    var mm = d.substring(d.indexOf("/")+1,d.lastIndexOf("/"));
    var aa = d.substring(d.lastIndexOf("/")+1,10);

    //Inverter data para valor inglês, e criar date
    var dt = new Date(mm+"/"+dd+"/"+aa);
    var ddd = dt.getDate();
    var mmm = (dt.getMonth()+1);
    var aaa = dt.getFullYear();            

    return ( (dd==ddd & mm==mmm & aa==aaa) & parseInt(aa) > 1900 ) ? true : false;
}
//---------------------------------------------------------------------
function getEvent(evt)
{ 
    evt = IE?event:evt;
    var el = IE?event.srcElement:evt.target;

    var x = !FF?evt.offsetX:evt.layerX;
    var y = !FF?evt.offsetY:evt.layerY;

    return {event: evt, element: el, x:x, y:y};
}
//---------------------------------------------------------------------
//retorna codigo ou caracter capturado sobre o evento gerado pelo teclado
function getKey(evt)
{
    evt = getEvent(evt).event;
    var keyCode = evt.keyCode ? evt.keyCode : (evt.which ? evt.which : evt.charCode);
    return { Char:String.fromCharCode( keyCode ), Code: keyCode }
}
//---------------------------------------------------------------------
//coordenadas do clique do mouse
function getPosMouse(evt)
{
    evt = getEvent(evt).event;
    var t = document.documentElement.scrollTop+document.body.scrollTop;
    var l = document.documentElement.scrollLeft+document.body.scrollLeft;
    return {
        x: (!FF?evt.offsetX:evt.layerX)+l, y: (!FF?evt.offsetY:evt.layerY)+t, /* ---------> coordenadas em relação ao elemento */
        X: (evt.clientX)+l, Y: (evt.clientY)+t /* ---------> coordenadas em relação ao Body */
    }
}
//---------------------------------------------------------------------
function ID(id){  return document.getElementById(id) }
//---------------------------------------------------------------------
function CE(tg, id, css, objFather)
{
    var e = document.createElement(tg);
    if(typeof id!="undefined") e.id = id;
    if(typeof css!="undefined" && css!=null){
        if(css.indexOf("=")==-1) e.className = css;
        else with(e.style){ eval(css) }
    } 
    if(objFather!="undefined" && objFather!=null) objFather.appendChild(e);
    return e;
}
//---------------------------------------------------------------------
function Div(id,html,css,objFather) 
{
    var d = CE("div", id, css);
    if(html!="undefined"&&html!=null) 
    {
        if (typeof html=="object") d.appendChild(html); else d.innerHTML=html;
    }
    if(objFather!="undefined" && objFather!=null) objFather.appendChild(d);
    return d;
}
//---------------------------------------------------------------------
function A(id,html,css,fa,objFather)
{
    var a = CE("a", id, css);
    if(IE) a.href = "javascript:void(0)";    
    if(html!="undefined"&&html!=null) { if (typeof html=="object") a.appendChild(html); else a.innerHTML=html; }
    if(objFather!="undefined" && objFather!=null) objFather.appendChild(a);
    if(fa!="undefined") a.onclick = fa;
    return a;
}
//---------------------------------------------------------------------
function alpha(e, n)
{
    e = typeof e=="string" ? ID(e) : e;
    if(IE) e.style.filter = "alpha(opacity:" + n +")";
    else e.style.opacity = n/100;
}
//---------------------------------------------------------------------
var labelOldButton = "";
function StandByButton(e, label)
{
    e = typeof e=="string" ? ID(e) : e;
    var b = e.disabled;
    if(!b)
    {
        alpha(e, 60);
        labelOldButton = e.innerHTML;
        e.innerHTML = typeof label == "undefined"  || label.length == 0 ? "processando..." : label;
    }
    else
    {
        alpha(e, 100);
        e.innerHTML = labelOldButton
    }
    e.disabled = !b;
}
//---------------------------------------------------------------------
//Retorna próximo elemento superior que possui barra de rolagem. Recurso necessário para posicionamento absoluto correto.
function getElementScroll(e)
{
    var el = e.parentNode;
    while(el)
    {
        if(el.scrollHeight > el.offsetHeight) break;
        el = el.parentNode;
    }
    return el;
}
//---------------------------------------------------------------------
function getAbsolutePosInElementScroll(e)
{
    var p, x, y;
    p = getAbsolutePos(e);
    x = p.x;
    y = p.y;

    if(!IE)
    {
        e = getElementScroll(e);
        x -= (e ? e.scrollLeft : 0);
        y -= (e ? e.scrollTop : 0);
    }
    return { x:x, y:y, element:e }
}
//---------------------------------------------------------------------
//retorna posicao do elemento "eIn" dentro do elemento "eSuper"
function getAbsolutePosInElement(eIn,eSuper)
{
    eIn = typeof eIn=="object" ? eIn : ID(eIn);
    eSuper = typeof eSuper=="object" ? eSuper : ID(eSuper);                    

    var pIn = getAbsolutePos(eIn);
    var pSuper = getAbsolutePos(eSuper); //alert(pSuper.y + "\n\n" + pIn.y);

    return { x:(pIn.x-pSuper.x), y:(pIn.y-pSuper.y) };                    
}
//---------------------------------------------------------------------
//Retorna posicao absoluta do elemento "el"
function getAbsolutePos(el) 
{
    el = typeof el=="object" ? el : ID(el);
    var SL = el.scrollLeft;
    var ST = el.scrollTop;
    var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
    if (el.offsetParent) { //Passa por cada elemento parent ate chegar no ultimo, o que ser usado como parametro de posicao
        var tmp = this.getAbsolutePos(el.offsetParent);
        r.x += tmp.x;
        r.y += tmp.y;
    }
    return r;
}
//---------------------------------------------------------------------
//offsetParent real para IE e FF, pois "offsetParent" retorna valores diferentes nestes navegadores
function getOffSetParent(elem) 
{
    if (elem.parentNode) 
    {
        while (elem.parentNode != document.body) 
        {
            elem = elem.parentNode;
            while (elem.nodeType != 1) 
            {
                elem = elem.parentNode;
            }
            if (elem.style.position == "absolute" || elem.style.position == "relative") 
            {
                return elem;
            }
            elem = elem.parentNode;
        }
        return null;
    } 
    else if (elem.offsetParent && elem.offsetParent.tagName != "HTML") 
    {
        return elem.offsetParent;
    } 
    else 
    {
        return null;
    }
}

//---------------------------------------------------------------------
//Retorna elemento "el" acima de tag
function getElementFather(el,tag) 
{ 
    var f = null;
    el = el.parentNode;
    while (el) 
    {
        if (el.tagName==tag.toUpperCase()) 
        { 
            f = el;	
            break;
        }
        el = el.parentNode;				
    }
    return f;	
}
//---------------------------------------------------------------------
//gera um numero sempre diferente para uso de identificacao unica
function getUniqueKey()
{
    var dt = new Date();
    return dt.getTime().toString();
}
//---------------------------------------------------------------------
function getParams(args,param,valueDefault) 
{
    var s = valueDefault;
    if(args)
    {
        var a = args.split(";");
        var p, v;
        for(var i=0;i<a.length;i++) 
        {
            p = a[i].substring(0,a[i].indexOf(":")).trim(); 
            v = a[i].substring(a[i].indexOf(":")+1).trim(); //alert(p + "\n\n" + v);
            if (p.toLowerCase()==param.toLowerCase()) 
            {
                s = v=="true"||v=="false" ? eval(v) : v;
                break;
            }
        }
    }
    return s;
}
//---------------------------------------------------------------------
function getValuesJson(f)
{
    var e = null, qs = new Object();
    for(var i=0; i<f.elements.length; i++)
    {
        e = f.elements[i];
        if( getParams(e.getAttribute("conf"),"put","yes") == "yes" )
        {
            eval("qs." + e.id); alert(e.id);
            qs[e.id] = e.value;
        }
    }
    return qs;
}
//---------------------------------------------------------------------
//simula uma multithread
function newThread(funcAnon)
{
    setTimeout(funcAnon, 0);
}
//---------------------------------------------------------------------
function windowPopup(name, url, width, height, resize)
{
    resize = resize ? "yes" : "no";
    var l = (document.documentElement.offsetWidth - width)/2;
    var t = (document.documentElement.offsetHeight - height)/2;
    var popup = window.open( url, name, 'height='+height+'px,width='+width+'px,left='+l+'px,top='+t+'px,resizable='+resize+',toolbar=no,location=no,directories=no,menubar=no,titlebar=no,status=yes,scrollbars=yes' );
    popup.focus();
}
//---------------------------------------------------------------------

function isEmail(str_email) {	
	var er = /([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})/;
    return er.test(str_email);
}

//---------------------------------------------------------------------

var UtilMasks = {

    Number : function()
    {
        var e = this; 
        var v = e.value.replace(/\D/g,"").replace(/^0/g,""); //limpa e deixa somente numeros
        var mask = e.getAttribute("mask");
        var cd = 0;
        if(mask.indexOf(",")>-1) cd = mask.substring(mask.indexOf(",")+1).length;   
        
        //completa valor com zeros a esquerda
        if(v.length>0)
        {
            while( v.length <= cd ) v = "0" + v;     
                
            e.value = formatString(v, mask);
            if( parseInt(e.value.replace(/\D/g,""))==0 ) e.select();
        }
        return false;
    },
    
    Password : function(evt)
    {
        var b = true, d = "";     
        var e = getEvent(evt).element;  
        
        var maxlength = e.getAttribute("maxlen");
        
        var k = getKey(evt);
        var d = k.Char;

        if( !(!IE && (k.Code==8 || k.Code==9)) ) //Tratamentos para Mozilla
        {      
            if( IE ? true : (FF && k.Code>0 && k.Code!=8) )
            {
                b = (/[0-9a-zA-Z_-]/).test(d);      
            }
            if(b) b = e.value.length<maxlength;                            
        } 
        
        return b;
    },
    
    TextClean : function(evt)
    {
        var b = true;     
        var e = getEvent(evt).element;
        var maxlength = nvl(e.getAttribute("maxlen"),250);
        var regexp = nvl(e.getAttribute("regexp"));
        var k = getKey(evt);
        
        //document.title = k.Code + " = " + k.Char;
        
        var charCodes = [8,13,27,35,36,37,38,39,40,46]; //charcodes aceitos       
        var er = new RegExp("[0-9a-zA-Z ãâàáäêèéëîìíïõôòóöûúùüÃÂÀÁÄÊÈÉËÎÌÍÏÕÔÒÓÖÛÙÚÜçÇñÑ-" + regexp + "]");

        b = charCodes.isExist(k.Code) && k.Char!="." ? true : er.test(k.Char);      
        
        if(b) b = e.value.length<maxlength;  //maxlength do campo                          
        
        return b;    
    },
    
    //=====================================    
    Types : {
        CURRENCY:   "###.###.###,##",
        NUMBER:     "###.###.###",
        INTEGER:     "###############",
        DATE:       "##/##/##",
        DATEFULL:   "##/##/####",
        CEP:        "#####-###"
    }  
    //=====================================      
}


//------------------------------
function setMaskFieldNumber(e, mask, align)
{   
    e = typeof e=="string" ? ID(e) : e;
    e.style.textAlign = typeof align=="undefined" ? "right" : align;
    e.setAttribute("maxlen", mask.replace(/[^#]/g,"").length );
    e.setAttribute("mask", mask);  
    e.onkeypress = setMask; 
    e.onclick = function(){ this.select() };
    e.onkeyup = UtilMasks.Number;
}
//------------------------------

function setMask(evt)
{
    var b = true, d = "";     
    var e = getEvent(evt).element;  
    var v = e.value.replace(/\D/g,"");
    
    var maxlength = e.getAttribute("maxlen");
    
    var k = getKey(evt);
    var d = k.Char;

    if( !(!IE && (k.Code==8 || k.Code==9)) ) //Tratamentos para Mozilla
    {        
        if( IE ? true : (FF && k.Code>0 && k.Code!=8) ) 
            b = (/\d/).test(d);                
            
        if(b) b = v.length<maxlength;                            
    } 
       
    return b;
}


//------------------------------

function maskFieldNumber(f)
{
    if(typeof f=="string") f = ID(f);
    if(f.tagName == "FORM")
    {
        var e = null, at = "";
        for(var i=0; i<f.elements.length; i++)
        { 
            e = f.elements[i];
            at = getParams( e.getAttribute("conf"), "type", "");
            if(at.indexOf("number")>-1)
            {
                at = at.substring( at.indexOf("(")+1, at.lastIndexOf(")") );
                setMaskFieldNumber(e, (at.indexOf("#")>-1 ? at : eval(at)) );
            }
        }    
    }
}

//---------------------------------------------------------------------

function setMaskeredPassword(e, _maxlength)
{
    e = typeof e=="string" ? ID(e) : e;
    e.setAttribute("maxlen", _maxlength);
    addEvent(e,"keypress", UtilMasks.Password);
}

//---------------------------------------------------------------------

function formatString(s, mask)
{
    var i = 0, y = 0, x = 0, d = 0;
    var n = "";
           
    for(y = mask.length-1; y>=0; y--)
    {
        if(mask.charAt(y)=='#')
        {

            i = s.length-1-x;
            if(i>=0)
            {
                d = s.charAt(i);                    
                x++;
            } 
            else
                break;
        } 
        else
            d = mask.charAt(y);

        n = d.toString() + n;
    }
    
    //se primeiro ou ultimo caracter for: "." ou "/" ou "," , despresar
    if( (/^[\.|\/|,-]/).test(n) ) n = n.substring(1);
    if( (/[\.|\/|,-]$/).test(n) ) n = n.substring(0,n.length-1);

    return n.toString();
}

//-----------------------------------------------------------------------------------

function clearFields(f)
{
    f = typeof f=="string" ? ID(f) : f;
    var e, at, s, y;
    for(var i=0; i<f.elements.length; i++)
    {
        e = f.elements[i];
        if(e)
        {
            at = e.getAttribute("clear");
            if(at!="no")
            {
                s = e.getAttribute("defaultValue");
                s = s ? s : "";
                if(e.type=="select" || e.type=="select-one") e.options[0].selected = true;
                if(e.type!="radio") UtilData.setValueField(f, e, s);                  
            }
        }
    }
    return void(0);
}

//-----------------------------------------------------------------------------------
//cria efeito que com focu no input muda a cor e ao sair volta a cor original

var EventsStatesFieldsForms = {
    Focus : function(evt)
    {
        var e = getEvent(evt).element;
        var cl = e.className ? e.className : "";
        e.setAttribute("oldClassName", cl);
        e.className = cl + " field-focus";
    },

    Blur : function(evt)
    {
        var e = getEvent(evt).element;
        e.className = e.getAttribute("oldClassName");
    }
}
//------------------------------
function setStatesFieldsForms()
{
    var el, i, x, forms = document.body.getElementsByTagName("form");
    for(i=0; i<forms.length; i++)
    {
        for(x=0; x<forms[i].elements.length; x++)
        {            
            el = forms[i].elements[x];            
            if(el.type == "text" || el.type == "password" || el.type == "textarea")
            {           
                addEvent(el,"focus", EventsStatesFieldsForms.Focus);
                addEvent(el,"blur", EventsStatesFieldsForms.Blur);                
            }            
        }   
    }
}

//-----------------------------------------------------------------------------------

function toggleContainer(bt, e, display)
{
    e = typeof e=="string" ? ID(e) : e;
    display = typeof display=="undefined" ? "block" : display;
    var b = e.style.display == display;
    e.style.display = b ? "none" : display;
    if(bt)
    {
        var seta = bt.getElementsByTagName("span")[0];
        if(seta) seta.innerHTML = b ? "&#9658;" : "&#9660;";
    }
    
    notSeletionDocument(null);
}

//-----------------------------------------------------------------------------------

function toggleChecked(_this, ct)
{
    ct = typeof ct=="string" ? ID(ct) : ct;
    var el = ct.getElementsByTagName("input");
    for(var i=0; i<el.length; i++) el[i].checked = _this.checked;    
}

//-----------------------------------------------------------------------------------
//tb = id da tabela com os dados / rowHead = linha que sera os titulos / funcAnonEditLineRecord = func. Anon. para edicao da linha
function OrderByTable(tb, funcAnonEditLineRecord, rowHead)
{
    tb = typeof tb=="string" ? ID(tb) : tb;
    rowHead = typeof rowHead=="undefined" ? 0 : rowHead;
    if(tb)
    {
        if(tb.rows.length-rowHead-1 > 1)
        {
            var i = 0, x, y, data = [], cols = []; 
            for(x = rowHead+1; x < tb.rows.length; x++)
            {
                for(y = 0; y < tb.rows[x].cells.length; y++)
                {
                    cols[y] = tb.rows[x].cells[y].innerHTML.trim();  
                }
                data[data.length] = cols;
                cols = [];
            }
            
            //verificar tipos das colunas
            var titles = [], t, c;
            for(y = 0; y < tb.rows[rowHead].cells.length; y++)
            {
                c = tb.rows[rowHead].cells[y];
                c.setAttribute("index", y);
                c.setAttribute("order", "desc");
                t = c.getAttribute("type");
                t = t ? t : "string";
                titles[y] = { type: t, legend: (t!="no" ? c.innerHTML.trim() : ""), element:c };
                
                if(t!="no")
                {
                    c.style.cursor = "pointer";
                    c.title = "Clique para ordernar os dados por esta coluna";
                    c.onclick = function(evt){ orderBy(evt) };
                }   
            }       
            
            orderBy = function(evt)
            {                
                alpha(tb,50);
                statusSort(evt);
            
                var e = getEvent(evt).element;
                while(e.tagName!="TD") e = e.parentNode;
            
                e.setAttribute("order", e.getAttribute("order")=="asc"?"desc":"asc" );
                var o = e.getAttribute("order");
                var i = e.getAttribute("index"); 
                
                var st;        
                for(var y=0; y<titles.length; y++) 
                {
                    st = titles[y].element.getElementsByTagName("span")[0];
                    if(st) titles[y].element.removeChild(st);
                }
                
                st = document.createElement("span");
                with(st.style){ font="normal 10px arial"; color="#666"; marginLeft="5px"; };
                st.innerHTML = o=="asc" ? "&#9660;" : "&#9650;";
                e.appendChild(st);                      
                
                newThread( function(){ sort(o, i); alpha(tb,100); statusSort(); } );    
            }
            
            var sort = function(ascOrDesc, nCol) //0 - asc / 1 - desc
            {       
                var i, y, x, old;                    
                for(i = 1; i < data.length; i++)
                { 
                    for(y = 0; y < data.length-1; y++)
                    {
                        //compara dados respeitando ordem e tipo de dado
                        if( compare( data[y][nCol], data[y+1][nCol], titles[nCol].type, ascOrDesc ) )
                        {
                            for(x = 0; x < data[y].length; x++)
                            {
                                if(titles[x].type != "no")
                                {
                                    old = data[y][x];
                                    data[y][x] = data[y+1][x];
                                    data[y+1][x] = old;
                                }
                            }                            
                        }
                    }              
                }          
                
                i = 0;    
                for(x = rowHead+1; x < tb.rows.length; x++)
                { 
                    for(y = 0; y < tb.rows[x].cells.length; y++)
                    {
                        tb.rows[x].cells[y].innerHTML = data[i][y];                
                    }
                    i++;
                }       
            }
            
            var compare = function( first, second, type, orderby )
            {  
                var b = true;
                if(type=="number") 
                {
                    first = parseFloat(first.replace(/\./g,"").replace(/[,]/g,".")); 
                    second = parseFloat(second.replace(/\./g,"").replace(/[,]/g,"."));
                    b = orderby=="asc" ? (first > second) : (first < second);
                } 
                else if(type=="date")
                {
                    first = first.trim().length>0 ? Date.parse(first.toDate()) : 0; 
                    second = second.trim().length>0 ? Date.parse(second.toDate()) : 0;
                    b = orderby=="asc" ? (first > second) : (first < second);
                }
                else
                {
                    first = first.toLowerCase().replace(/\s/g,"").unaccented();
                    second = second.toLowerCase().replace(/\s/g,"").unaccented();
                    var z = 0, t = first.length > second.length ? second.length : first.length;
                    var f = '', s = '';
                    while(f == s && z < t)
                    { 
                        f = first.charAt(z);
                        s = second.charAt(z);
                        b = orderby=="asc" ? f > s : f < s;
                        z++;
                    }
                }            
                return b;         
            } 
            
            
            var statusSort = function(evt)
            {
                var st = ID("status_sort_orderbytable");
                if(st) st.parentNode.removeChild(st);
                else
                {
                    var p = getPosMouse(evt);
                    st = Div("status_sort_orderbytable","Aguarde, ordenando dados...","border='1px solid red';color='red';backgroundColor='yellow';font='bold 12px arial';width='180px';textAlign='center';padding='3px 0 3px 0';position='absolute';top='" + (p.Y-25) + "px';left='" + (p.X-90) + "px';",document.body);           
                }       
            } 
            
            addEvent(tb,"click",notSelection);
        }       
        
        //action edit lines
        addEvent(tb,"dblclick",
            function(evt)
            {
                var id = null, e = getEvent(evt).element, c = null;
                if(e.tagName=="TD")
                {
                    if(e.parentNode != tb.rows[rowHead])
                    {
                        c = e.parentNode.cells;
                        for(var i=0; i<tb.rows[rowHead].cells.length; i++)
                        {
                            if(tb.rows[rowHead].cells[i].getAttribute("fk"))
                            {
                                id = c[i].innerHTML;
                                break;
                            }
                        }
                        if(funcAnonEditLineRecord) funcAnonEditLineRecord(id, c);
                    }
                } 
                            
            }
        );
    }
}

//-----------------------------------------------------------------------------------
//exibe numero de caracteres digitados ate seu limite
function StateNumChars(evt, eLabel, e, max)
{    
    eLabel = typeof eLabel=="string" ? ID(eLabel) : eLabel;
    e = typeof e=="string" ? ID(e) : e;
    
    var kc = getKey(evt).Code;
    var b = true, n = max - e.value.length;
    if(n<=0 && !( kc==8 || kc==46 || (kc >= 37 && kc <= 40)) ) b = false;
    eLabel.innerHTML = n;
    return b;
}

//-----------------------------------------------------------------------------------

function isFieldsValid(f)
{
    var m = "", cfg, c, v, n;
    f = typeof f=="undefined" ? document.forms[0] : (typeof f=="string" ? ID(f) : f);
    for(var i=0;i<f.elements.length;i++)
    {
        c = f.elements[i];
        cfg = c.getAttribute("conf");
        if (cfg!=null)
        {
            v = c.value.trim();
            n = c.name.length == 0 ? c.id : c.name;
            if(getParams(cfg,"null","yes").toLowerCase()=="no")
            {
                if(getParams(cfg,"type","")=="email" && v.length>0 && !isEmail(v))
                {
                    m += "» O E-MAIL do campo \"" + getParams(cfg,"label",n) + "\" é inválido!\n";
                }
                else if(v.length==0)
                {
                    m += "» O campo \"" + getParams(cfg,"label",n) + "\" precisa ter um valor válido!\n";
                }
            }
        }
    }
    if(m.length>0) dialog(m);
    return m.length>0 ? false : true;
}

//==============================================================================================================================

//seta configuracoes: calendar, masks, stateInputs, etc...
function setConfigFieldsForms(f)
{
    f = typeof f=="undefined" ? document.forms[0] : f;
    var conf, p, n, e = f.elements;
    for(var i=0; i<e.length; i++)
    {
        conf = e[i].getAttribute("conf"); //alert(e[i] + " = " + conf);
        if(conf)
        {
            p = getParams(conf,"type","");
            if(p.indexOf("number")>-1) 
            {
                n = p.substring( p.indexOf("(")+1, p.lastIndexOf(")") );
                setMaskFieldNumber(e[i], (n.indexOf("#")>-1 ? n : eval(n)), n.indexOf(".INTEGER")>-1 ? "left" : "right" );
            }
            if(p.indexOf("calendar")>-1) 
            {
                Calendar(e[i], p.indexOf("calendar_datetime")>-1 );
            }
            
            p = getParams(conf,"nochars","");
            if(p.length>0) 
            {   
                e[i].setAttribute("nochars", p.substring(1,p.length-1));
                e[i].onkeypress = function(evt){ return noChars(evt, this.getAttribute("nochars").split(",")); }
            }

        }       
    }    
    return true;
}

