var History=$extend(history,{implement:function(a){return $extend(this,a)}});History.implement(new Events($empty));History.implement({state:null,start:function(){if(this.started){return this}this.state=this.getHash();if(Browser.Engine.trident){var c=new Element("iframe",{src:"javascript:'<html></html>'",styles:{position:"absolute",top:"-1000px"}}).inject(document.body).contentWindow;var b=function(d){c.document.write("<html><body onload=\"top.History.$listener('",encodeURIComponent(d),"');\">Moo!</body></html>");c.document.close()};$extend(this,{"$listener":function(d){d=decodeURIComponent(d);if(this.state!=d){this.setHash(d).changeState(d)}}.bind(this),setState:function(e,d){if(this.state!=e||d){if(!d){this.setHash(e).changeState(e,true)}b(e)}return this},trace:function(){var d=this.getHash();if(d!=this.state){b(d)}}});var a=(function(){if(c.document&&c.document.body){a=$clear(a);if(!c.document.body.innerHTML){this.setState(this.state)}}}).periodical(50,this)}else{if(Browser.Engine.presto915){new Element("img",{src:"javascript:location.href='javascript:History.trace();';",styles:{position:"absolute",top:"-1000px"}}).inject(document.body)}}this.trace.periodical(150,this);this.started=true;return this},changeState:function(c,a){var b=this.state;this.state=c;this.fireEvent("changed",[c,b,a])},trace:function(){var a=this.getHash();if(a!=this.state){this.changeState(a)}},getHash:function(){var a=location.href,b=a.indexOf("#")+1;return(b)?a.substr(b):""},setHash:function(a){location.hash="#"+a;return this},setState:function(a){if(this.state!==a){this.setHash(a).changeState(a,true)}return this},getState:function(){return this.state}});
