// Author: Anthony McKale
//
// Note: modifed to javascript from original as2 found below
// basically identical actual to as2
//
// http://www.razorberry.com/blog/archives/2004/08/22/lzw-compression-methods-in-as2/
//
// A class for LZW compression modified from code posted at the following URL's
// http://www.shoe-box.org/blog/index.php/2004/05/05/13-CompressionLzw
// http://www.lalex.com/blog/comments/200405/164-compression-lzw-actionscript-2.html
//
var lzw = {
    // Change this variable to output an xml safe string
    xmlsafe : false,
    compress : function(str){
        var dico = new Array();
        var skipnum = lzw.xmlsafe?5:0;
        for (var i = 0; i < 256; i++)
        {
            dico[String.fromCharCode(i)] = i;
        }
        if (lzw.xmlsafe)
        {
            dico["<"] = 256;
            dico[">"] = 257;
            dico["&"] = 258;
            dico["\""] = 259;
            dico["'"] = 260;
        }
        var res = "";
        var txt2encode = str;
        var splitStr = txt2encode.split("");
        var len = splitStr.length;
        var nbChar = 256+skipnum;
        var buffer = "";
        for (var i = 0; i <= len; i++)
        {
            var current = splitStr[i];
            if (dico[buffer + current] !== undefined)
            {
                buffer += current;
            }
            else
            {
                res += String.fromCharCode(dico[buffer]);
                dico[buffer + current] = nbChar;
                nbChar++;
                buffer = current;
            }
        }
        return res;
    },
    decompress : function (str)
    {
        var dico = new Array();
        var skipnum = lzw.xmlsafe?5:0;
        for (var i = 0; i < 256; i++)
        {
            var c = String.fromCharCode(i);
            dico[i] = c;
        }
        if (lzw.xmlsafe)
        {
            dico[256] = "<";
            dico[257] = ">";
            dico[258] = "&";
            dico[259] = "\"";
            dico[260] = "'";
        }
        var txt2encode = str;
        var splitStr = txt2encode.split("");
        var length = splitStr.length;
        var nbChar = 256+skipnum;
        var buffer = "";
        var chaine = "";
        var result = "";
        for (var i = 0; i < length; i++)
        {
            var code = txt2encode.charCodeAt(i);
            var current = dico[code];
            if (buffer == "")
            {
                buffer = current;
                result += current;
            }
            else
            {
                if (code <= 255+skipnum)
                {
                    result += current;
                    chaine = buffer + current;
                    dico[nbChar] = chaine;
                    nbChar++;
                    buffer = current;
                }
                else
                {
                    chaine = dico[code];
                    if (chaine == undefined) chaine = buffer + buffer.slice(0,1);
                    result += chaine;
                    dico[nbChar] = buffer + chaine.slice(0, 1);
                    nbChar++;
                    buffer = chaine;

                }
            }
        }
        return result;
    }
};
