/* ===-----------=== Komanche 2.0 ===-----------===

           Copyright:     © 2004, CBA Consult ltda.
            Coded by:  Luiz Antonio B. Silva [Labs]
                      Todos os direitos reservados.

                http:         www.cbaconsult.com.br
                mail:   comercial@cbaconsult.com.br

   Biblioteca de (des)serialização de objetos no
   estilo "serialize()" do PHP.

-------------=== Vs. 1.0 - Fev/2004 | By Labs --=== */



// -----------------=== reportException()
/* Exibe mensagens de erro.
                                                     by Labs - 04/ 2004 */
function reportException(exception, msg){
    msg = (msg ? msg + "\n\n" : "");
    alert(msg + "Error: " + exception.name + "\n" + exception.message);
}


// -----------------=== serialize()
/* Serializa objetos.
                                                     by Labs - 04/2004 */
function serialize (v) {
    if (!isNaN (v) && v.__proto__ == Number.prototype) {
        v = Number (v);
    }

    switch (typeof(v)){
        //case Date :
       // case 'string'  : var enc_v = encode(v, 'base64');
       //                  return "s:" + enc_v.length + ":\"" + enc_v + "\";";
        case 'string'  : return "s:" + v.length + ":\"" + encode(v, 'escape') + "\";";
        case 'boolean' : return "b:" + (v == true ? "1" : "0") + ";";
        case 'number'  : return (v % 1 == 0 ? "i:" : "d:") + v + ";";
        /*case Array   : var itens = "";
                       for (var item in v){
                            itens += serialize(item);
                            itens += serialize(v[item]);
                       }
                       return "a:" + v.length + ":{" + itens + "}";*/
        case 'object'  : var itens = ""; var c = 0;
                       for (var item in v){
                            itens += serialize(item);
                            itens += serialize(v[item]);
                            c++;
                       }
                       return "a:" + c + ":{" + itens + "}";
                       //return "O:8:\"stdClass\":" + c + ":{" + itens + "}";

        default: return;
    }
}


// -----------------=== showObject()
/* Recebe um string que pode ser transformado em objeto
   via eval, e o retorna.
                                                     by Labs - 04/2004 */

function showObject(obj, space) {
/*alert('oi'+result);
alert(showObject(result));
alert('ola'+result.erros);*/
alert(obj);
for (var k in obj){
    alert(""+k+": " + unescape(obj[k]));

    if (obj[k].constructor == Object){
        for (var y in obj[k]){
            alert("  - "+y+": " + obj[k][y]);
        }
    }
}

  /*  var result;
    alert(result);
    for (var key in obj){
         result += space + " key: " + key + " - Value: " + obj[key];

         if (obj[key].constructor == Object){
             result += showObject(obj, space + "  ");
         }
    }
    alert(result);
    return result;*/
}


// -----------------=== toObject()
/* Recebe um string que pode ser transformado em objeto
   via eval, e o retorna.
                                                     by Labs - 04/2004 */
function toObject(str) {
    try {
        eval("var obj = " + str + ";");
        decodeObject(obj, 'escape');
        //showObject(obj);
        return obj;

    }catch(e){
        reportException(e, 'Falha no recebimento do objeto.');
        return false;
    }
}


// -----------------=== unserialize()
/* Deserializa objetos.
                                                     by Labs - 04/2004 */
function unserialize(str) {
    var type, len, a, b, key, val;
    type = str.charAt(0);
    switch (type) {

        // String: s:7:"package";s:3696:"
        case 's' : _str = str.substr(2, 10);
                   len = _str.substr(0, _str.indexOf(':'));
                   a   = (str.substr((len.length)+4, len)).toString();
                   break;

        // Integer: i:2;
        case 'i' : len = str.substr(2, str.indexOf(';')-1);
                   a   = parseInt(len);
                   break;

        // Float: d:2;
        case 'd' : len = str.substr(2, str.indexOf(';')-1);
                   a   = parseInt(len);
                   break;

        // Boolean:
        case 'b' : len = str.substr(2, str.indexOf(';')-1); alert(len);
                   a   = ((len == "true") || (len == "1") || (len == 1) ? true : false);
                   break;

        // Array: a:3:{s:2:"um";s:3:"uns";i:0;a:2:{i:0;s:4:"tres";i:1;i:2;}i:1;s:4:"dois";}
        //     => array("um" => "uns", array("tres", 2), "dois");
        case 'a' : a = {};  //  <<== Retorna um objeto, na verdade.
                   var l = str.substr(2, 1);
                   str = str.substr(5, str.length);
                   for (var x=0;x<l;x++){
                       res = unserialize(str);
                       key = res[0];
                       val = unserialize(res[1]);
                       a[key] = val[0];
                       str = val[1];
                   }
                   str = str.substr(1, str.length);
                   break;

    }

    if (type != "a"){
        if (type != "s" && len) len = (len.length);
        str = str.substr(str.indexOf(";", len)+1);
    }

    return [a, str];
}



// ----------------=== Funçoes de encoding ===---------------- //
// As funções abaixo são utilizadas para formatação dos dados
// enviados e recebidos.


// -----------------=== encode()
/* Faz o encode de uma string.
                                                     by Labs - 02/2004 */
function encode(str, tipo){
    switch (tipo){
        case 'html'   : return encodeHTML(str);   break;
        case 'escape' : return escape(str);       break;
        case 'base64' : return base64Encode(str); break;
    }
}


// -----------------=== decode()
/* Faz o encode de uma string.
                                                     by Labs - 02/2004 */
function decode(str, tipo){
    switch (tipo){
        case 'html'   : return decodeHTML(str);   break;
        case 'escape' : return unescape(str);     break;
        case 'base64' : return base64Decode(str); break;
    }
}


// -----------------=== encodeObject()
/* Faz o encode recursivo de um objeto.
                                                     by Labs - 02/2004 */
function encodeObject(obj, tipo){
    for (var param in obj){
         var t = typeof(obj[param]);
         if (t == 'string'){
             obj[param] = encode(obj[param], tipo);

         } else if (t == 'object'){
             obj[param] = encodeObject(obj[param], tipo);
         }
    }
    return obj;
}


// -----------------=== decodeObject()
/* Faz o decode recursivo de um objeto.
                                                     by Labs - 02/2004 */
function decodeObject(obj, tipo){
    for (var param in obj){
         var t = typeof(obj[param]);
         if (t == 'string'){
             obj[param] = decode(obj[param], tipo);

         } else if (t == 'object'){
             obj[param] = decodeObject(obj[param], tipo);
         }
    }
    return obj;
}


// -----------------=== Funções Base64
/* Copyright (C) 1999 Masanao Izumo <mo@goice.co.jp>
 * Version: 1.0
 * LastModified: Dec 25 1999
 * This library is free.  You can redistribute it and/or modify it.
 * Interfaces:
 * b64 = base64encode(data);
 * data = base64decode(b64);
 */

var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
    -1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

function base64Encode(str) {
    var out, i, len;
    var c1, c2, c3;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if(i == len){
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt((c1 & 0x3) << 4);
            out += "==";
            break;
        }

        c2 = str.charCodeAt(i++);
        if(i == len){
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
            out += base64EncodeChars.charAt((c2 & 0xF) << 2);
            out += "=";
            break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
}

function base64Decode(str) {
    var c1, c2, c3, c4;
    var i, len, out;

    len = str.length;
    i = 0;
    out = "";
    while(i < len) {
        /* c1 */
        do {
            c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
        } while(i < len && c1 == -1);
        if (c1 == -1)
            break;

        /* c2 */
        do {
            c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
        } while(i < len && c2 == -1);
        if(c2 == -1)
            break;

        out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

        /* c3 */
        do {
            c3 = str.charCodeAt(i++) & 0xff;
            if(c3 == 61)
          return out;
            c3 = base64DecodeChars[c3];

        } while(i < len && c3 == -1);
        if(c3 == -1)
            break;

        out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

        /* c4 */
        do {
            c4 = str.charCodeAt(i++) & 0xff;
            if(c4 == 61)
          return out;
            c4 = base64DecodeChars[c4];
        } while(i < len && c4 == -1);
        if(c4 == -1)
            break;

        out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
}



// -----------------=== encodeHTML()
/* Codifica strings html para serem enviadas para o servidor.
                                                     by Labs - 02/2004 */
var enc_str = '¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"<>&';
var enc_arr = new Array(); // Unicode
enc_arr['¡'] = '&#161;'; enc_arr['¢'] = '&#162;'; enc_arr['£'] = '&#163;'; enc_arr['¤'] = '&#164;';
enc_arr['¥'] = '&#165;'; enc_arr['¦'] = '&#166;'; enc_arr['§'] = '&#167;'; enc_arr['¨'] = '&#168;'; enc_arr['©'] = '&#169;';
enc_arr['ª'] = '&#170;'; enc_arr['«'] = '&#171;'; enc_arr['¬'] = '&#172;'; enc_arr['­'] = '&#173;'; enc_arr['®'] = '&#174;';
enc_arr['¯'] = '&#175;'; enc_arr['°'] = '&#176;'; enc_arr['±'] = '&#177;'; enc_arr['²'] = '&#178;'; enc_arr['³'] = '&#179;';
enc_arr['´'] = '&#180;'; enc_arr['µ'] = '&#181;'; enc_arr['¶'] = '&#182;'; enc_arr['·'] = '&#183;'; enc_arr['¸'] = '&#184;';
enc_arr['¹'] = '&#185;'; enc_arr['º'] = '&#186;'; enc_arr['»'] = '&#187;'; enc_arr['¼'] = '&#188;'; enc_arr['½'] = '&#189;';
enc_arr['¾'] = '&#190;'; enc_arr['¿'] = '&#191;'; enc_arr['À'] = '&#192;'; enc_arr['Á'] = '&#193;'; enc_arr['Â'] = '&#194;';
enc_arr['Ã'] = '&#195;'; enc_arr['Ä'] = '&#196;'; enc_arr['Å'] = '&#197;'; enc_arr['Æ'] = '&#198;'; enc_arr['Ç'] = '&#199;';
enc_arr['È'] = '&#200;'; enc_arr['É'] = '&#201;'; enc_arr['Ê'] = '&#202;'; enc_arr['Ë'] = '&#203;'; enc_arr['Ì'] = '&#204;';
enc_arr['Í'] = '&#205;'; enc_arr['Î'] = '&#206;'; enc_arr['Ï'] = '&#207;'; enc_arr['Ð'] = '&#208;'; enc_arr['Ñ'] = '&#209;';
enc_arr['Ò'] = '&#210;'; enc_arr['Ó'] = '&#211;'; enc_arr['Ô'] = '&#212;'; enc_arr['Õ'] = '&#213;'; enc_arr['Ö'] = '&#214;';
enc_arr['×'] = '&#215;'; enc_arr['Ø'] = '&#216;'; enc_arr['Ù'] = '&#217;'; enc_arr['Ú'] = '&#218;'; enc_arr['Û'] = '&#219;';
enc_arr['Ü'] = '&#220;'; enc_arr['Ý'] = '&#221;'; enc_arr['Þ'] = '&#222;'; enc_arr['ß'] = '&#223;'; enc_arr['à'] = '&#224;';
enc_arr['á'] = '&#225;'; enc_arr['â'] = '&#226;'; enc_arr['ã'] = '&#227;'; enc_arr['ä'] = '&#228;'; enc_arr['å'] = '&#229;';
enc_arr['æ'] = '&#230;'; enc_arr['ç'] = '&#231;'; enc_arr['è'] = '&#232;'; enc_arr['é'] = '&#233;'; enc_arr['ê'] = '&#234;';
enc_arr['ë'] = '&#235;'; enc_arr['ì'] = '&#236;'; enc_arr['í'] = '&#237;'; enc_arr['î'] = '&#238;'; enc_arr['ï'] = '&#239;';
enc_arr['ð'] = '&#240;'; enc_arr['ñ'] = '&#241;'; enc_arr['ò'] = '&#242;'; enc_arr['ó'] = '&#243;'; enc_arr['ô'] = '&#244;';
enc_arr['õ'] = '&#245;'; enc_arr['ö'] = '&#246;'; enc_arr['÷'] = '&#247;'; enc_arr['ø'] = '&#248;'; enc_arr['ù'] = '&#249;';
enc_arr['ú'] = '&#250;'; enc_arr['û'] = '&#251;'; enc_arr['ü'] = '&#252;'; enc_arr['ý'] = '&#253;'; enc_arr['þ'] = '&#254;';
enc_arr['ÿ'] = '&#255;'; enc_arr['"'] = '&#34;';  enc_arr['<'] = '&#60;';  enc_arr['>'] = '&#62;';  enc_arr['&'] = '&#38;';

var enc_arr = new Array(); // Normal
enc_arr['¡'] = '&iexcl;' ; enc_arr['¢'] = '&cent;'  ; enc_arr['£'] = '&pound;' ; enc_arr['¤'] = '&curren;';
enc_arr['¥'] = '&yen;'   ; enc_arr['¦'] = '&brvbar;'; enc_arr['§'] = '&sect;'  ; enc_arr['¨'] = '&uml;'   ; enc_arr['©'] = '&copy;';
enc_arr['ª'] = '&ordf;'  ; enc_arr['«'] = '&laquo;' ; enc_arr['¬'] = '&not;'   ; enc_arr['­'] = '&shy;'   ; enc_arr['®'] = '&reg;';
enc_arr['¯'] = '&macr;'  ; enc_arr['°'] = '&deg;'   ; enc_arr['±'] = '&plusmn;'; enc_arr['²'] = '&sup2;'  ; enc_arr['³'] = '&sup3;';
enc_arr['´'] = '&acute;' ; enc_arr['µ'] = '&micro;' ; enc_arr['¶'] = '&para;'  ; enc_arr['·'] = '&middot;'; enc_arr['¸'] = '&cedil;';
enc_arr['¹'] = '&sup1;'  ; enc_arr['º'] = '&ordm;'  ; enc_arr['»'] = '&raquo;' ; enc_arr['¼'] = '&frac14;'; enc_arr['½'] = '&frac12;';
enc_arr['¾'] = '&frac34;'; enc_arr['¿'] = '&iquest;'; enc_arr['À'] = '&Agrave;'; enc_arr['Á'] = '&Aacute;'; enc_arr['Â'] = '&Acirc;';
enc_arr['Ã'] = '&Atilde;'; enc_arr['Ä'] = '&Auml;'  ; enc_arr['Å'] = '&Aring;' ; enc_arr['Æ'] = '&AElig;' ; enc_arr['Ç'] = '&Ccedil;';
enc_arr['È'] = '&Egrave;'; enc_arr['É'] = '&Eacute;'; enc_arr['Ê'] = '&Ecirc;' ; enc_arr['Ë'] = '&Euml;'  ; enc_arr['Ì'] = '&Igrave;';
enc_arr['Í'] = '&Iacute;'; enc_arr['Î'] = '&Icirc;' ; enc_arr['Ï'] = '&Iuml;'  ; enc_arr['Ð'] = '&ETH;'   ; enc_arr['Ñ'] = '&Ntilde;';
enc_arr['Ò'] = '&Ograve;'; enc_arr['Ó'] = '&Oacute;'; enc_arr['Ô'] = '&Ocirc;' ; enc_arr['Õ'] = '&Otilde;'; enc_arr['Ö'] = '&Ouml;';
enc_arr['×'] = '&times;' ; enc_arr['Ø'] = '&Oslash;'; enc_arr['Ù'] = '&Ugrave;'; enc_arr['Ú'] = '&Uacute;'; enc_arr['Û'] = '&Ucirc;';
enc_arr['Ü'] = '&Uuml;'  ; enc_arr['Ý'] = '&Yacute;'; enc_arr['Þ'] = '&THORN;' ; enc_arr['ß'] = '&szlig;' ; enc_arr['à'] = '&agrave;';
enc_arr['á'] = '&aacute;'; enc_arr['â'] = '&acirc;' ; enc_arr['ã'] = '&atilde;'; enc_arr['ä'] = '&auml;'  ; enc_arr['å'] = '&aring;';
enc_arr['æ'] = '&aelig;' ; enc_arr['ç'] = '&ccedil;'; enc_arr['è'] = '&egrave;'; enc_arr['é'] = '&eacute;'; enc_arr['ê'] = '&ecirc;';
enc_arr['ë'] = '&euml;'  ; enc_arr['ì'] = '&igrave;'; enc_arr['í'] = '&iacute;'; enc_arr['î'] = '&icirc;' ; enc_arr['ï'] = '&iuml;';
enc_arr['ð'] = '&eth;'   ; enc_arr['ñ'] = '&ntilde;'; enc_arr['ò'] = '&ograve;'; enc_arr['ó'] = '&oacute;'; enc_arr['ô'] = '&ocirc;';
enc_arr['õ'] = '&otilde;'; enc_arr['ö'] = '&ouml;'  ; enc_arr['÷'] = '&divide;'; enc_arr['ø'] = '&oslash;'; enc_arr['ù'] = '&ugrave;';
enc_arr['ú'] = '&uacute;'; enc_arr['û'] = '&ucirc;' ; enc_arr['ü'] = '&uuml;'  ; enc_arr['ý'] = '&yacute;'; enc_arr['þ'] = '&thorn;';
enc_arr['ÿ'] = '&yuml;'  ; enc_arr['"'] = '&quot;'  ; enc_arr['<'] = '&lt;'    ; enc_arr['>'] = '&gt;'    ; enc_arr['&'] = '&amp;';

function encodeHTML(str) {
    var pattern = /([¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"<>&])/gim;
    return(str.replace(pattern, function($0) {return(enc_arr[$0]);}));
}


// -----------------=== decodeHTML()
/* Decodifica strings html para serem enviadas para o servidor.
                                                     by Labs - 02/2004 */
var dec_arr = new Array(); // Unicode
dec_arr['&#161;'] = '¡'; dec_arr['&#162;'] = '¢'; dec_arr['&#163;'] = '£'; dec_arr['&#164;'] = '¤';
dec_arr['&#165;'] = '¥'; dec_arr['&#166;'] = '¦'; dec_arr['&#167;'] = '§'; dec_arr['&#168;'] = '¨'; dec_arr['&#169;'] = '©';
dec_arr['&#170;'] = 'ª'; dec_arr['&#171;'] = '«'; dec_arr['&#172;'] = '¬'; dec_arr['&#173;'] = '­'; dec_arr['&#174;'] = '®';
dec_arr['&#175;'] = '¯'; dec_arr['&#176;'] = '°'; dec_arr['&#177;'] = '±'; dec_arr['&#178;'] = '²'; dec_arr['&#179;'] = '³';
dec_arr['&#180;'] = '´'; dec_arr['&#181;'] = 'µ'; dec_arr['&#182;'] = '¶'; dec_arr['&#183;'] = '·'; dec_arr['&#184;'] = '¸';
dec_arr['&#185;'] = '¹'; dec_arr['&#186;'] = 'º'; dec_arr['&#187;'] = '»'; dec_arr['&#188;'] = '¼'; dec_arr['&#189;'] = '½';
dec_arr['&#190;'] = '¾'; dec_arr['&#191;'] = '¿'; dec_arr['&#192;'] = 'À'; dec_arr['&#193;'] = 'Á'; dec_arr['&#194;'] = 'Â';
dec_arr['&#195;'] = 'Ã'; dec_arr['&#196;'] = 'Ä'; dec_arr['&#197;'] = 'Å'; dec_arr['&#198;'] = 'Æ'; dec_arr['&#199;'] = 'Ç';
dec_arr['&#200;'] = 'È'; dec_arr['&#201;'] = 'É'; dec_arr['&#202;'] = 'Ê'; dec_arr['&#203;'] = 'Ë'; dec_arr['&#204;'] = 'Ì';
dec_arr['&#205;'] = 'Í'; dec_arr['&#206;'] = 'Î'; dec_arr['&#207;'] = 'Ï'; dec_arr['&#208;'] = 'Ð'; dec_arr['&#209;'] = 'Ñ';
dec_arr['&#210;'] = 'Ò'; dec_arr['&#211;'] = 'Ó'; dec_arr['&#212;'] = 'Ô'; dec_arr['&#213;'] = 'Õ'; dec_arr['&#214;'] = 'Ö';
dec_arr['&#215;'] = '×'; dec_arr['&#216;'] = 'Ø'; dec_arr['&#217;'] = 'Ù'; dec_arr['&#218;'] = 'Ú'; dec_arr['&#219;'] = 'Û';
dec_arr['&#220;'] = 'Ü'; dec_arr['&#221;'] = 'Ý'; dec_arr['&#222;'] = 'Þ'; dec_arr['&#223;'] = 'ß'; dec_arr['&#224;'] = 'à';
dec_arr['&#225;'] = 'á'; dec_arr['&#226;'] = 'â'; dec_arr['&#227;'] = 'ã'; dec_arr['&#228;'] = 'ä'; dec_arr['&#229;'] = 'å';
dec_arr['&#230;'] = 'æ'; dec_arr['&#231;'] = 'ç'; dec_arr['&#232;'] = 'è'; dec_arr['&#233;'] = 'é'; dec_arr['&#234;'] = 'ê';
dec_arr['&#235;'] = 'ë'; dec_arr['&#236;'] = 'ì'; dec_arr['&#237;'] = 'í'; dec_arr['&#238;'] = 'î'; dec_arr['&#239;'] = 'ï';
dec_arr['&#240;'] = 'ð'; dec_arr['&#241;'] = 'ñ'; dec_arr['&#242;'] = 'ò'; dec_arr['&#243;'] = 'ó'; dec_arr['&#244;'] = 'ô';
dec_arr['&#245;'] = 'õ'; dec_arr['&#246;'] = 'ö'; dec_arr['&#247;'] = '÷'; dec_arr['&#248;'] = 'ø'; dec_arr['&#249;'] = 'ù';
dec_arr['&#250;'] = 'ú'; dec_arr['&#251;'] = 'û'; dec_arr['&#252;'] = 'ü'; dec_arr['&#253;'] = 'ý'; dec_arr['&#254;'] = 'þ';
dec_arr['&#255;'] = 'ÿ'; dec_arr['&#34;']  = '"'; dec_arr['&#60;']  = '<'; dec_arr['&#62;']  = '>'; dec_arr['&#38;']  = '&';

var dec_arr = new Array(); // Normal
dec_arr['&iexcl;']  = '¡'; dec_arr['&cent;']   = '¢'; dec_arr['&pound;']  = '£'; dec_arr['&curren;'] = '¤';
dec_arr['&yen;']    = '¥'; dec_arr['&brvbar;'] = '¦'; dec_arr['&sect;']   = '§'; dec_arr['&uml;']    = '¨'; dec_arr['&copy;']   = '©';
dec_arr['&ordf;']   = 'ª'; dec_arr['&laquo;']  = '«'; dec_arr['&not;']    = '¬'; dec_arr['&shy;']    = '­'; dec_arr['&reg;']    = '®';
dec_arr['&macr;']   = '¯'; dec_arr['&deg;']    = '°'; dec_arr['&plusmn;'] = '±'; dec_arr['&sup2;']   = '²'; dec_arr['&sup3;']   = '³';
dec_arr['&acute;']  = '´'; dec_arr['&micro;']  = 'µ'; dec_arr['&para;']   = '¶'; dec_arr['&middot;'] = '·'; dec_arr['&cedil;']  = '¸';
dec_arr['&sup1;']   = '¹'; dec_arr['&ordm;']   = 'º'; dec_arr['&raquo;']  = '»'; dec_arr['&frac14;'] = '¼'; dec_arr['&frac12;'] = '½';
dec_arr['&frac34;'] = '¾'; dec_arr['&iquest;'] = '¿'; dec_arr['&Agrave;'] = 'À'; dec_arr['&Aacute;'] = 'Á'; dec_arr['&Acirc;']  = 'Â';
dec_arr['&Atilde;'] = 'Ã'; dec_arr['&Auml;']   = 'Ä'; dec_arr['&Aring;']  = 'Å'; dec_arr['&AElig;']  = 'Æ'; dec_arr['&Ccedil;'] = 'Ç';
dec_arr['&Egrave;'] = 'È'; dec_arr['&Eacute;'] = 'É'; dec_arr['&Ecirc;']  = 'Ê'; dec_arr['&Euml;']   = 'Ë'; dec_arr['&Igrave;'] = 'Ì';
dec_arr['&Iacute;'] = 'Í'; dec_arr['&Icirc;']  = 'Î'; dec_arr['&Iuml;']   = 'Ï'; dec_arr['&ETH;']    = 'Ð'; dec_arr['&Ntilde;'] = 'Ñ';
dec_arr['&Ograve;'] = 'Ò'; dec_arr['&Oacute;'] = 'Ó'; dec_arr['&Ocirc;']  = 'Ô'; dec_arr['&Otilde;'] = 'Õ'; dec_arr['&Ouml;']   = 'Ö';
dec_arr['&times;']  = '×'; dec_arr['&Oslash;'] = 'Ø'; dec_arr['&Ugrave;'] = 'Ù'; dec_arr['&Uacute;'] = 'Ú'; dec_arr['&Ucirc;']  = 'Û';
dec_arr['&Uuml;']   = 'Ü'; dec_arr['&Yacute;'] = 'Ý'; dec_arr['&THORN;']  = 'Þ'; dec_arr['&szlig;']  = 'ß'; dec_arr['&agrave;'] = 'à';
dec_arr['&aacute;'] = 'á'; dec_arr['&acirc;']  = 'â'; dec_arr['&atilde;'] = 'ã'; dec_arr['&auml;']   = 'ä'; dec_arr['&aring;']  = 'å';
dec_arr['&aelig;']  = 'æ'; dec_arr['&ccedil;'] = 'ç'; dec_arr['&egrave;'] = 'è'; dec_arr['&eacute;'] = 'é'; dec_arr['&ecirc;']  = 'ê';
dec_arr['&euml;']   = 'ë'; dec_arr['&igrave;'] = 'ì'; dec_arr['&iacute;'] = 'í'; dec_arr['&icirc;']  = 'î'; dec_arr['&iuml;']   = 'ï';
dec_arr['&eth;']    = 'ð'; dec_arr['&ntilde;'] = 'ñ'; dec_arr['&ograve;'] = 'ò'; dec_arr['&oacute;'] = 'ó'; dec_arr['&ocirc;']  = 'ô';
dec_arr['&otilde;'] = 'õ'; dec_arr['&ouml;']   = 'ö'; dec_arr['&divide;'] = '÷'; dec_arr['&oslash;'] = 'ø'; dec_arr['&ugrave;'] = 'ù';
dec_arr['&uacute;'] = 'ú'; dec_arr['&ucirc;']  = 'û'; dec_arr['&uuml;']   = 'ü'; dec_arr['&yacute;'] = 'ý'; dec_arr['&thorn;']  = 'þ';
dec_arr['&yuml;' ]  = 'ÿ'; dec_arr['&quot;']   = '"'; dec_arr['&lt;']     = '<'; dec_arr['&gt;']     = '>'; dec_arr['&amp;']    = '&';

function decodeHTML(str) {
    //var pattern = /&#(\d{2,3});/gim; // Unicode
    var pattern = /(&\w*?;)/gim;

    return(str.replace(pattern, function($0) {return(dec_arr[$0]);}));
}