(function(){if(this.Hash){return}var Hash=this.Hash=new Type("Hash",function(object){if(typeOf(object)=="hash"){object=Object.clone(object.getClean())}for(var key in object){this[key]=object[key]}return this});this.$H=function(object){return new Hash(object)};Hash.implement({forEach:function(fn,bind){Object.forEach(this,fn,bind)},getClean:function(){var clean={};for(var key in this){if(this.hasOwnProperty(key)){clean[key]=this[key]}}return clean},getLength:function(){var length=0;for(var key in this){if(this.hasOwnProperty(key)){length++}}return length}});Hash.alias("each","forEach");Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(value){return Object.keyOf(this,value)},hasValue:function(value){return Object.contains(this,value)},extend:function(properties){Hash.each(properties||{},function(value,key){Hash.set(this,key,value)},this);return this},combine:function(properties){Hash.each(properties||{},function(value,key){Hash.include(this,key,value)},this);return this},erase:function(key){if(this.hasOwnProperty(key)){delete this[key]}return this},get:function(key){return(this.hasOwnProperty(key))?this[key]:null},set:function(key,value){if(!this[key]||this.hasOwnProperty(key)){this[key]=value}return this},empty:function(){Hash.each(this,function(value,key){delete this[key]},this);return this},include:function(key,value){if(this[key]==undefined){this[key]=value}return this},map:function(fn,bind){return new Hash(Object.map(this,fn,bind))},filter:function(fn,bind){return new Hash(Object.filter(this,fn,bind))},every:function(fn,bind){return Object.every(this,fn,bind)},some:function(fn,bind){return Object.some(this,fn,bind)},getKeys:function(){return Object.keys(this)},getValues:function(){return Object.values(this)},toQueryString:function(base){return Object.toQueryString(this,base)}});Hash.alias({indexOf:"keyOf",contains:"hasValue"})})();