/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.encoding.compression.lzw"]){
dojo._hasResource["dojox.encoding.compression.lzw"]=true;
dojo.provide("dojox.encoding.compression.lzw");
dojo.require("dojox.encoding.bits");
(function(){
var _1=function(x){
var w=1;
for(var v=2;x>=v;v<<=1,++w){
}
return w;
};
dojox.encoding.compression.lzw.Encoder=function(n){
this.size=n;
this.init();
};
dojo.extend(dojox.encoding.compression.lzw.Encoder,{init:function(){
this.dict={};
for(var i=0;i<this.size;++i){
this.dict[String.fromCharCode(i)]=i;
}
this.width=_1(this.code=this.size);
this.p="";
},encode:function(_2,_3){
var c=String.fromCharCode(_2),p=this.p+c,r=0;
if(p in this.dict){
this.p=p;
return r;
}
_3.putBits(this.dict[this.p],this.width);
if((this.code&(this.code+1))==0){
_3.putBits(this.code++,r=this.width++);
}
this.dict[p]=this.code++;
this.p=c;
return r+this.width;
},flush:function(_4){
if(this.p.length==0){
return 0;
}
_4.putBits(this.dict[this.p],this.width);
this.p="";
return this.width;
}});
dojox.encoding.compression.lzw.Decoder=function(n){
this.size=n;
this.init();
};
dojo.extend(dojox.encoding.compression.lzw.Decoder,{init:function(){
this.codes=new Array(this.size);
for(var i=0;i<this.size;++i){
this.codes[i]=String.fromCharCode(i);
}
this.width=_1(this.size);
this.p=-1;
},decode:function(_5){
var c=_5.getBits(this.width),v;
if(c<this.codes.length){
v=this.codes[c];
if(this.p>=0){
this.codes.push(this.codes[this.p]+v.substr(0,1));
}
}else{
if((c&(c+1))==0){
this.codes.push("");
++this.width;
return "";
}
var x=this.codes[this.p];
v=x+x.substr(0,1);
this.codes.push(v);
}
this.p=c;
return v;
}});
})();
}
