History.implement(new Options());History.implement({options:{separator:";"},routes:[],register:function(a){if(this.routes.push(a)==1){this.addEvent("changed",this.match)}},unregister:function(a){this.routes.remove(a)},match:function(c,b,a){if(!a){this.routes.each(Function.methodize("match",this.state))}},generate:function(){return this.routes.map(Function.methodize("generate")).clean().join(this.options.separator)},update:function(){return this.setState(this.generate())}});History.Route=new Class({Implements:[Events,Options],options:{skipDefaults:true,defaults:[],pattern:null,flags:"",generate:function(a){return a[0]},onMatch:$empty},initialize:function(a){this.setOptions(a);this.pattern=this.options.pattern||"(.*)";if($type(this.pattern)=="string"){this.pattern=new RegExp(this.pattern,this.options.flags)}this.values=this.defaults=this.options.defaults.slice();History.register(this);return this},setValues:function(a){if(this.values.toString()==a.toString()){return this}this.values=a;History.update();return this},setValue:function(a,b){if(this.values[a]==b){return this}this.values[a]=b;History.update();return this},build:function(a){var b=this.values.slice();this.values=a;var c=History.generate();this.values=b;return c},destroy:function(){History.unregister(this)},generate:function(){if(this.options.skipDefaultMatch&&(String(this.values)==String(this.defaults))){return null}return this.options.generate.call(this,this.values)},match:function(d){var c=d.match(this.pattern);var e=this.defaults;if(c){c.splice(0,1);for(var b=0,a=c.length;b<a;b++){c[b]=$pick(c[b],e[b]||null)}if(String(c)!=String(e)){this.values=c}}else{this.values=this.defaults.slice()}this.fireEvent("onMatch",[this.values,this.defaults])}});Function.methodize=function(b){var a=Array.slice(arguments,1);return function(c){return c[b].apply(c,a)}};
