Array.prototype.set=function(key,value){this[key]=value;}
Array.prototype.get=function(key){if(this.getKeys().contains(key))return this[key];return null;}
Array.prototype.count=function(){var s=0;for(var i in this)if(!this.isFunction(i))s++;return s;}
Array.prototype.countValues=function(){var output=new Array();for(var i in this){if(output.indexOfKey(this.get(i))==-1)output.set(this.get(i),1);else output.set(this.get(i),output.get(this.get(i))+1);}
return output;}
Array.prototype.fillKeys=function(keys,value){for(var i in keys)this.set(keys.get(i),value);}
Array.prototype.getKeys=function(){var keys='';for(var i in this)keys+=','+i;return keys.substr(1).split(',');}
Array.prototype.indexOfKey=function(key){if(this.isFunction(key))return-1;var index=0;for(var i in this){if(i==key)return index;index++;}
return-1;}
Array.prototype.isFunction=function(i){if(!(typeof i=='function'||typeof this.get(i)=='function'||(typeof i=='string'&&i.substr(0,8)=='function')))return false;else return true}
Array.prototype.keyOnIndex=function(index){var i=0;for(var k in this){if(i==index)return k;i++;}
return null;}
Array.prototype.makeUnique=function(){var output=new Array();for(var i in this){if(!output.contains(this.get(i))&&!this.isFunction(i))output.push(this.get(i));else if(!this.isFunction(i))this.remove(i);}}
Array.prototype.product=function(){var output=1;for(var i in this)if(this.get(i)*1==this.get(i))output*=this.get(i);return output;}
Array.prototype.rand=function(){var i=Math.round(Math.random()*(this.count()-1));return this.get(this.keyOnIndex(i));}
Array.prototype.remove=function(key){if(this.isFunction(key))return;if(1*key!=key)delete this[key];else{var i=this.indexOfKey(key);this.splice(i,1);}}
Array.prototype.shuffle=function(preserve_keys){if(!preserve_keys)preserve_keys=false;if(preserve_keys){var shuffled=new Array();while(shuffled.count()<this.count()){var i=Math.round(Math.random()*(this.count()-1));var key=this.keyOnIndex(i);if(shuffled.indexOfKey(key)==-1)shuffled.set(key,this.get(key));}
while(this.count()>0)this.remove(this.keyOnIndex(0));for(var i in shuffled)if(!this.isFunction(i))this.set(i,shuffled.get(i));}else{for(var i=0;i<this.count()*3;i++){var key1=this.keyOnIndex(Math.round(Math.random()*(this.count()-1)));var key2=this.keyOnIndex(Math.round(Math.random()*(this.count()-1)));this.swap(key1,key2);}}}
Array.prototype.sum=function(){var output=0;for(var i in this)if(this.get(i)*1==this.get(i))output+=this.get(i);return output;}
Array.prototype.swap=function(key1,key2){if(this.indexOfKey(key1)==-1||this.indexOfKey(key2)==-1)return;var t=this.get(key1);this.set(key1,this.get(key2));this.set(key2,t);}
Array.prototype.contains=function(obj){return(this.indexOf(obj)==-1)?false:true;}
if(!Array.indexOf){Array.prototype.indexOf=function(obj){for(var i=0;i<this.length;i++){if(this[i]==obj)return i;}
return-1;}}
Array.prototype.dump=function(){var output=new Array();var number=0;output.push('<tr><th>#</th><th>Key</th><th>Value</th></tr>');for(var i in this){if(!this.isFunction(i)){output.push('<tr><td>'+number+'</td><td>'+i+'</td><td>'+this.get(i)+'</td></tr>');number++;}}
return'<table>'+String.fromCharCode(10)+output.join(String.fromCharCode(10))+String.fromCharCode(10)+'</table>';}
