--- /dev/null
+/**\r
+ * History\r
+ *\r
+ * @version 1.0\r
+ *\r
+ * @license MIT License\r
+ * @author Harald Kirschner <mail [at] digitarald.de>\r
+ * @copyright 2008 Author\r
+ */\r
+\r
+var History = $extend(history, {\r
+\r
+ implement: function(obj) {\r
+ return $extend(this, obj);\r
+ }\r
+\r
+});\r
+\r
+History.implement(new Events($empty));\r
+\r
+History.implement({\r
+\r
+ state: null,\r
+\r
+ start: function() {\r
+ if (this.started) return this;\r
+ this.state = this.getHash();\r
+ if (Browser.Engine.trident) {\r
+ var iframe = new Element('iframe', {\r
+ 'src': "javascript:'<html></html>'",\r
+ 'styles': {\r
+ 'position': 'absolute',\r
+ 'top': '-1000px'\r
+ }\r
+ }).inject(document.body).contentWindow;\r
+ var writeState = function(state) {\r
+ iframe.document.write('<html><body onload="top.History.$listener(\'', encodeURIComponent(state) ,'\');">Moo!</body></html>');\r
+ iframe.document.close();\r
+ };\r
+ $extend(this, {\r
+ '$listener': function(state) {\r
+ state = decodeURIComponent(state);\r
+ if (this.state != state) this.setHash(state).changeState(state);\r
+ }.bind(this),\r
+ 'setState': function(state, force) {\r
+ if (this.state != state || force) {\r
+ if (!force) this.setHash(state).changeState(state, true);\r
+ writeState(state);\r
+ }\r
+ return this;\r
+ },\r
+ 'trace': function() {\r
+ var state = this.getHash();\r
+ if (state != this.state) writeState(state);\r
+ }\r
+ });\r
+ var check = (function() {\r
+ if (iframe.document && iframe.document.body) {\r
+ check = $clear(check);\r
+ if (!iframe.document.body.innerHTML) this.setState(this.state);\r
+ }\r
+ }).periodical(50, this);\r
+ } else {\r
+ if (Browser.Engine.presto915) {\r
+ new Element('img', {\r
+ 'src': "javascript:location.href='javascript:History.trace();';",\r
+ 'styles': {\r
+ 'position': 'absolute',\r
+ 'top': '-1000px'\r
+ }\r
+ }).inject(document.body);\r
+ }\r
+ }\r
+ this.trace.periodical(150, this);\r
+ this.started = true;\r
+ return this;\r
+ },\r
+\r
+ changeState: function(state, manual) {\r
+ var stateOld = this.state;\r
+ this.state = state;\r
+ this.fireEvent('changed', [state, stateOld, manual]);\r
+ },\r
+\r
+ trace: function() {\r
+ var state = this.getHash();\r
+ if (state != this.state) this.changeState(state);\r
+ },\r
+\r
+ getHash: function() {\r
+ var href = location.href, pos = href.indexOf('#') + 1;\r
+ return (pos) ? href.substr(pos) : '';\r
+ },\r
+\r
+ setHash: function(state) {\r
+ location.hash = '#' + state;\r
+ return this;\r
+ },\r
+\r
+ setState: function(state) {\r
+ if (this.state !== state) this.setHash(state).changeState(state, true);\r
+ return this;\r
+ },\r
+\r
+ getState: function() {\r
+ return this.state;\r
+ }\r
+\r
+});\r