var Hash=new Class({length:0,initialize:function(object){this.obj=object||{};this.setLength()},get:function(key){return(this.hasKey(key))?this.obj[key]:null},hasKey:function(key){return(key in this.obj)},set:function(key,value){if(!this.hasKey(key))this.length++;this.obj[key]=value;return this},setLength:function(){this.length=0;for(var p in this.obj)this.length++;return this},remove:function(key){if(this.hasKey(key)){delete this.obj[key];this.length--}return this},each:function(fn,bind){$each(this.obj,fn,bind)},extend:function(obj){$extend(this.obj,obj);return this.setLength()},merge:function(){this.obj=$merge.apply(null,[this.obj].extend(arguments));return this.setLength()},empty:function(){this.obj={};this.length=0;return this},keys:function(){var keys=[];for(var property in this.obj)keys.push(property);return keys},values:function(){var values=[];for(var property in this.obj)values.push(this.obj[property]);return values}});function $H(obj){return new Hash(obj)};Hash.Cookie=Hash.extend({initialize:function(name,options){this.name=name;this.options=$extend({'autoSave':true},options||{});this.load()},save:function(){if(this.length==0){Cookie.remove(this.name,this.options);return true}var str=Json.toString(this.obj);if(str.length>4096)return false;Cookie.set(this.name,str,this.options);return true},load:function(){this.obj=Json.evaluate(Cookie.get(this.name),true)||{};this.setLength()}});Hash.Cookie.Methods={};['extend','set','merge','empty','remove'].each(function(method){Hash.Cookie.Methods[method]=function(){Hash.prototype[method].apply(this,arguments);if(this.options.autoSave)this.save();return this}});Hash.Cookie.implement(Hash.Cookie.Methods);
