
/*
 * Descricao: Exibe um elemento
 * Parametros:
 *  - elem: elemento
 */
function showElement(elem)
{
    $(elem).slideDown("slow");
}

/*
 * Descricao: Esconde um elemento
 * Parametros:
 *  - elem: elemento
 */
function hideElement(elem, callback)
{
	var callback = (callback != undefined) ? callback : function(){}
    $(elem).slideUp("slow", callback);
}

/*
 * Descricao: Verifica se um numero n de checkboxs ja esta selecionado. Caso
 *            positivo, desativa as demais
 * Parametros:
 *  - elem_id: id do elemento que contem as checkboxs
 *  - n      : numero maximo de checkboxs selecionadas
 */
function disableCheckbox(elem_id, n)
{
    if($('#' + elem_id + ' :checked').length >= n){
        $('#' + elem_id + ' :checkbox').attr('disabled', 'disabled');
        $('#' + elem_id + ' :checked').removeAttr('disabled');
    }
    else { $('#' + elem_id + ' :checkbox').removeAttr('disabled'); }
}

// http://kevin.vanzonneveld.net + http://obvcode.blogspot.com/2008/05/strtr-for-javascript.html
// +   original by: Brett Zamir
// *     example 1: $trans = {"hello" : "hi", "hi" : "hello"};
// *     example 1: strtr("hi all, I said hello", $trans)
// *     returns 1: 'hello all, I said hi'
// *     example 2: strtr('äaabaåccasdeöoo', 'äåö','aao');
// *     returns 2: 'aaabaaccasdeooo'
function strtr(str, from, to) {

    var fr = '', i = 0, lgth = 0;

    if (typeof from === 'object') {
        for (fr in from) {
            str = str.replace(fr, from[fr]);
        }

        return str;
    }

    lgth = to.length;
    if (from.length < to.length) {
        lgth = from.length;
    }

    for (i = 0; i < lgth; i++) {
        str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
    }
    
    return str;
}

/*
 * Descricao: Altera uma imagem
 * Parametros:
 *  - img:    elemento imagem
 *  - src:    caminho para a imagem
 *  - width:  largura da imagem
 *  - height: altura da imagem
 */
function changeImage(img, src, width, height, alt)
{
    $(img).fadeOut("slow", function(){
        $(img).attr("src", src);
        $(img).css("width", width);
        $(img).css("height", height);
        $(img).fadeIn("slow");
        (alt) ? $(img).attr("alt", alt) : '';
    });
}

/*
 * Descricao: Altera um texto
 * Parametros:
 *  - elem: elemento cujo texto sera mudado
 *  - text: texto
 */
function changeText(elem, text)
{
    $(elem).fadeOut("slow", function(){
        $(elem).html(text);
        $(elem).fadeIn("slow");
    });
}

/*
 * Descricao: Exibe um elemento se ele estiver escondido, ou esconde um elemento se ele estiver sendo exibido
 * Parametros:
 *  - elem: elemento
 */
function toggleElement(elem)
{
    ($(elem).css('display') == 'none') ? showElement(elem) : hideElement(elem);
}

/*
 * Descricao: Troca o texto
 * Parametros:
 *  - elem : elemento
 *  - txt_1: texto 1
 *  - txt_2: texto 2
 */
function toggleText(elem, txt_1, txt_2)
{
    ($(elem).text() == txt_1) ? changeText($(elem), txt_2) : changeText($(elem), txt_1);
}


/*
 * Descricao: Atualiza os caracteres restantes de um elemento
 * Parametros:
 *  - elem : elemento
 *  - txt  : texto onde e exibido os caracteres restantes
 *  - mn   : numero maximo de caracteres do elemento
 */
function updateCharsRemaining(elem, txt, mn)
{
    // numero de caracteres usados
    var numChars = elem.value.length;
    
    // caracteres restantes
    var remaining = mn - numChars;
    
    // caso o numero maximo de caracteres tenha sido excedido, retira os extras
    if(remaining < 0){
        elem.value = elem.value.substr(0, mn);
        remaining = 0;
    }
        
    // atualiza o texto com o numero de caracteres restantes
    $(txt).text(remaining);
}

/*
 * Descricao: Retorna a data no formato: dd/mm/aaaa hh:mm:ss
 */
function datetime()
{
    var d = new Date();
    return( rgz_num(d.getDate(), 2) + '/' + rgz_num((d.getMonth() + 1), 2) + '/' + d.getFullYear() + ' ' + rgz_num(d.getHours(), 2) + ':' + rgz_num(d.getMinutes(), 2) + ':' + rgz_num(d.getSeconds(), 2) );
}

/*
 * Regulariza o numero de digitos do valor
 */
function rgz_num(num, n_dig)
{
    var aux = num.toString();
    while(aux.length < n_dig)
        aux = '0' + aux;

    return(aux);
}

/*
 * Adicionar site aos favoritos
 * Browsers: IE, FF e Opera
 * Fonte: http://www.codigofonte.com.br/codigo/js-dhtml/browser/adicionar-aos-favoritos-no-ie,-mozilla-firefox-e-opera
 */
function bookmark(url, title)
{
    if (window.sidebar) window.sidebar.addPanel(title, url,"");
    else if(window.opera && window.print){
        var mbm = document.createElement('a');
        mbm.setAttribute('rel','sidebar');
        mbm.setAttribute('href',url);
        mbm.setAttribute('title',title);
        mbm.click();
    }
    else if(document.all){window.external.AddFavorite(url, title);}
}

/*
 * Funcoes de Cookie ----------------------------------------------------------
 */
function setCookie(name, value, expires, path, domain, secure) {
        var curCookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires.toUTCString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
        document.cookie = curCookie;
}

function getCookie(name) {
       var dc = document.cookie;
       var prefix = name + "=";
       var begin = dc.indexOf("; " + prefix);
       if (begin == -1) {
       begin = dc.indexOf(prefix);
       if (begin != 0) return null;
       } else
       begin += 2;
       var end = document.cookie.indexOf(";", begin);
       if (end == -1)
       end = dc.length;
       return unescape(dc.substring(begin + prefix.length, end));
}

function deleteCookie(name, path, domain) {
       if (getCookie(name)) {
              document.cookie = name + "=" +
              ((path) ? "; path=" + path : "") +
              ((domain) ? "; domain=" + domain : "") +
              "; expires=Thu, 01-Jan-70 00:00:01 GMT";
              history.go(0);
       }
}
/* ------------------------------------------------------------------------- */

/**
*
*  MD5 (Message-Digest Algorithm)
*  http://www.webtoolkit.info/
*
**/

//var MD5 = function (string) {
function md5(string)
{
    function RotateLeft(lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    }

    function AddUnsigned(lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
     }

     function F(x,y,z) { return (x & y) | ((~x) & z); }
     function G(x,y,z) { return (x & z) | (y & (~z)); }
     function H(x,y,z) { return (x ^ y ^ z); }
    function I(x,y,z) { return (y ^ (x | (~z))); }

    function FF(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function GG(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function HH(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function II(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount-(lByteCount % 4))/4;
        lBytePosition = (lByteCount % 4)*8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
        return lWordArray;
    };

    function WordToHex(lValue) {
        var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
        }
        return WordToHexValue;
    };

    function Utf8Encode(string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    };

    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;

    string = Utf8Encode(string);

    x = ConvertToWordArray(string);

    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

    for (k=0;k<x.length;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
        a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
        d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
        c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
        b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
        a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
        d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
        c=II(c,d,a,b,x[k+6], S43,0xA3014314);
        b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
        a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
        d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
        c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
        b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
        a=AddUnsigned(a,AA);
        b=AddUnsigned(b,BB);
        c=AddUnsigned(c,CC);
        d=AddUnsigned(d,DD);
    }

    var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

    return temp.toLowerCase();
}

/*****************************************************************************
 * autor: Pedro Henrique de M. Rodrigues
 * data: 21/06/2007
 * nome: numtomoney
 * parametros:
 *   num  : Valor a ser transformado
 *   moeda: Exibe a moeda?
 * retorno: valor em formato de dinheiro
 * descricao: recebe um valor numerico e retorna o valor em formato financeiro
 */
function numToMoney( num, moeda )
{
    return (((moeda != undefined) && (moeda)) ? "R&#36;" : "" ) + number_format(num, 2, ',', '.');
}

/*****************************************************************************
 * Fonte: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format
 */
function number_format( number, decimals, dec_point, thousands_sep ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // %        note 1: For 1000.55 result with precision 1 in FF/Opera is 1,000.5, but in IE is 1,000.6
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'

    var n = number, prec = decimals;
    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep;
    var dec = (typeof dec_point == "undefined") ? '.' : dec_point;

    var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;

    var abs = Math.abs(n).toFixed(prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
              _[0].slice(i).replace(/(\d{3})/g, sep+'$1');

        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }

    return s;
}

/**
 * by Micox - elmicox.blogspot.com - www.ievolutionweb.com
 * htmlEntities
 *
 * See: http://br.php.net/htmlentities
 */
function htmlEntities(texto)
{
    var i,carac,letra,novo='';
    for(i=0;i<texto.length;i++){
        carac = texto.charCodeAt(i);
        if( (carac > 47 && carac < 58) || (carac > 62 && carac < 127) || (carac == 10) || (carac == 13) ){
            //se for numero ou letra normal ou \n ou \r
            novo += texto.charAt(i);
        }else{
            novo += "&#" + texto.charCodeAt(i) + ";";
        }
    }
    return novo;
}


/* Validar email
 *
 * Retirada de: http://www.mhavila.com.br/topicos/web/valform.html
 * Criador: Márcio d'Ávila
*/
function isEmail(val){
    var er = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
    return er.test(val);
}


/* Validar data
 *
 * val: data no formato dd/mm/aaaa
 * Adaptada de checkdate: http://kevin.vanzonneveld.net/code/php_equivalents/php.js
 */
function isDate(val)
{
    var date = val.split('/');
    var myDate = new Date();
    myDate.setFullYear( date[2], (date[1] - 1), date[0] );
    return ((myDate.getMonth()+1) == date[1] && date[0]<32);
}


/* Validar CEP
 *
 * Criador da ER: Klaus Paiva
 */
function isCep(val)
{
    var er = /^([0-9]{2})\.?([0-9]{3})-?([0-9]{3})$/;
    return er.test(val);
}


/* Validar numero
 *
 * Retirada de: http://www.mhavila.com.br/topicos/web/valform.html
 * Criador: Márcio d'Ávila
*/
function isNumeric(val)
{
    var er = /^\d+$/;
    return er.test(val);
}


/* Validar telefone */
function isTel(val)
{
    var er = /^(\d{2,3}|\(\d{2,3}\))?[ ]?\d{3,4}[-]?\d{3,4}$/;
    return er.test(val);
}

/*
 * Retira os espacos no inicio e fim de uma string
 */
function trim(str)
{
    return str.replace(/^\s+|\s+$/g,"");
}

/*****************************************************************************
 * autor: Pedro Henrique de M. Rodrigues
 * data: 16/02/2009
 * nome: convert_to_url_format
 * parametros: string
 * retorno: a string tratada
 * descricao: trata uma string retirando alguns caracteres
 */
function convert_to_url_format( str )
{
    // retira os espacos antes e depois da string
    str = trim(str);

    // converte a string para minuscula
    str = str.toLowerCase();

    // substitui os caracteres mais conhecidos
    var from = "áäãâàéëêè&íïìóöõôòúüûùçšýž";
    var to   = "aaaaaeeeeeiiiooooouuuucsyz";
    str = strtr(str, from, to);

    // percorre a string e substitui os caracteres 'estranhos'
    for(var i = 0, c; i < str.length; i++){

        c = str.charCodeAt(i);

        if( ((c < 48) ||   // deixa os numeros
             (c > 57))  && // deixa os numeros

            ((c < 97) ||   // deixa os caracteres alfabeticos
             (c > 122)) && // deixa os caracteres alfabeticos

            (c != 95) )    // deixa o _

            // substitui o caracter 'estranho' por _
        { str = str.replace(str.charAt(i), '_'); }

    } // fim-for

    return( str );
}

/*
 * Descricao: cria nome (sem extensao) para a foto baseado em seu comentario
 * Parametros:
 *  - comment: comentario da foto
 *  - num_max: numero maximo de caracteres
 */
function name_from_comment(comment, num_max)
{
    num_max = (num_max) ? num_max : 100;
    comment = convert_to_url_format(comment);
    comment = comment.substr(0, num_max - 5)
    return comment + '_' + parseInt(Math.random() * 100000);
}

/*
 * Verifica a forca de uma senha
 * 0 - Senha invalida
 * 1 - Senha Fraca
 * 2 - Senha Media
 * 3 - Senha Forte
 */
function checkPassword(password)
{
    var pw = password.replace(/^\s+|\s+$/g,"");
    if(pw.length >= 6){
        var patterns = [ /^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$/, // Senha Forte
                         /^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$/, // Senha Media
                         /(?=.{6,}).*/ ]; // Senha Fraca
        for(var i in patterns)
            if(patterns[i].test(pw))
                return(3 - i);
    }
    return 0; // Senha invalida
}

/*
 * Verifica se um valor e um inteiro
 * Fonte: http://kevin.vanzonneveld.net/code/php_equivalents/php.js
 */
function is_int( mixed_var )
{
    var y = parseInt(mixed_var * 1);

    if (isNaN(y)) {
        return false;
    }
    return mixed_var == y && mixed_var.toString() == y.toString();
}

/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
* Returns  : The textual representation of the array.
* This function was inspired by the print_r function of PHP.
* This will accept some data as the argument and return a
* text that will be a more readable version of the
* array/hash/object that is given.
*/
function dump(arr, level)
{
    var dumped_text = "";
    if(!level) level = 0;

    // The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";

    if(typeof(arr) == 'object') { //Array/Hashes/Objects
        for(var item in arr) {
            var value = arr[item];

            if(typeof(value) == 'object') { //If it is an array,
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += dump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else { //Stings/Chars/Numbers etc.
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}

