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