Add desktop summit page
[marble] / www / scripts / History.js
diff --git a/www/scripts/History.js b/www/scripts/History.js
new file mode 100644 (file)
index 0000000..28a76d9
--- /dev/null
@@ -0,0 +1,109 @@
+/**\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