]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/events.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1085 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / UI / WebServerResources / events.js
1 // written by Dean Edwards, 2005\r
2 // with input from Tino Zijdel, Matthias Miller, Diego Perini\r
3 // http://dean.edwards.name/weblog/2005/10/add-event/\r
4 function addEvent(element, type, handler) {\r
5         // Modification by Tanny O'Haley, http://tanny.ica.com to add the\r
6         // DOMContentLoaded for all browsers.\r
7         if (type == "DOMContentLoaded" || type == "domload") {\r
8                 addDOMLoadEvent(handler);\r
9                 return;\r
10         }\r
11         \r
12         if (element.addEventListener) {\r
13                 element.addEventListener(type, handler, false);\r
14         } else {\r
15                 // assign each event handler a unique ID\r
16                 if (!handler.$$guid) handler.$$guid = addEvent.guid++;\r
17                 // create a hash table of event types for the element\r
18                 if (!element.events) element.events = {};\r
19                 // create a hash table of event handlers for each element/event pair\r
20                 var handlers = element.events[type];\r
21                 if (!handlers) {\r
22                         handlers = element.events[type] = {};\r
23                         // store the existing event handler (if there is one)\r
24                         if (element["on" + type]) {\r
25                                 handlers[0] = element["on" + type];\r
26                         }\r
27                 }\r
28                 // store the event handler in the hash table\r
29                 handlers[handler.$$guid] = handler;\r
30                 // assign a global event handler to do all the work\r
31                 element["on" + type] = handleEvent;\r
32         }\r
33 };\r
34 // a counter used to create unique IDs\r
35 addEvent.guid = 1;\r
36 \r
37 function removeEvent(element, type, handler) {\r
38         if (element.removeEventListener) {\r
39                 element.removeEventListener(type, handler, false);\r
40         } else {\r
41                 // delete the event handler from the hash table\r
42                 if (element.events && element.events[type]) {\r
43                         delete element.events[type][handler.$$guid];\r
44                 }\r
45         }\r
46 };\r
47 \r
48 function handleEvent(event) {\r
49         var returnValue = true;\r
50         // grab the event object (IE uses a global event object)\r
51         event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);\r
52         // get a reference to the hash table of event handlers\r
53         var handlers = this.events[event.type];\r
54         // execute each event handler\r
55         for (var i in handlers) {\r
56                 this.$$handleEvent = handlers[i];\r
57                 if (this.$$handleEvent(event) === false) {\r
58                         returnValue = false;\r
59                 }\r
60         }\r
61         return returnValue;\r
62 };\r
63 \r
64 function fixEvent(event) {\r
65         // add W3C standard event methods\r
66         event.preventDefault = fixEvent.preventDefault;\r
67         event.stopPropagation = fixEvent.stopPropagation;\r
68         return event;\r
69 };\r
70 fixEvent.preventDefault = function() {\r
71         this.returnValue = false;\r
72 };\r
73 fixEvent.stopPropagation = function() {\r
74         this.cancelBubble = true;\r
75 };\r
76 \r
77 // End Dean Edwards addEvent.\r
78 \r
79 // Tino Zijdel - crisp@xs4all.nl This little snippet fixes the problem that the onload attribute on \r
80 // the body-element will overwrite previous attached events on the window object for the onload event.\r
81 if (!window.addEventListener) {\r
82         document.onreadystatechange = function(){\r
83                 if (window.onload && window.onload != handleEvent) {\r
84                         addEvent(window, 'load', window.onload);\r
85                         window.onload = handleEvent;\r
86                 }\r
87         }\r
88 }\r
89 \r
90 // Here are my functions for adding the DOMContentLoaded event to browsers other\r
91 // than Mozilla.\r
92 \r
93 // Array of DOMContentLoaded event handlers.\r
94 window.onDOMLoadEvents = new Array();\r
95 window.DOMContentLoadedInitDone = false;\r
96 \r
97 // Function that adds DOMContentLoaded listeners to the array.\r
98 function addDOMLoadEvent(listener) {\r
99         window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;\r
100 }\r
101 \r
102 // Function to process the DOMContentLoaded events array.\r
103 function DOMContentLoadedInit() {\r
104         // quit if this function has already been called\r
105         if (window.DOMContentLoadedInitDone) return;\r
106 \r
107         // flag this function so we don't do the same thing twice\r
108         window.DOMContentLoadedInitDone = true;\r
109 \r
110         // iterates through array of registered functions \r
111         for (var i=0; i<window.onDOMLoadEvents.length; i++) {\r
112                 var func = window.onDOMLoadEvents[i];\r
113                 func();\r
114         }\r
115 }\r
116 \r
117 function DOMContentLoadedScheduler() {\r
118         // quit if the init function has already been called\r
119         if (window.DOMContentLoadedInitDone) return true;\r
120         \r
121         // First, check for Safari or KHTML.\r
122         // Second, check for IE.\r
123         //if DOM methods are supported, and the body element exists\r
124         //(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1] \r
125         //in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)\r
126         if(/KHTML|WebKit/i.test(navigator.userAgent)) {\r
127                 if(/loaded|complete/.test(document.readyState)) {\r
128                         DOMContentLoadedInit();\r
129                 } else {\r
130                         // Not ready yet, wait a little more.\r
131                         setTimeout("DOMContentLoadedScheduler()", 250);\r
132                 }\r
133         } else if(document.getElementById("__ie_onload")) {\r
134                 return true;\r
135         } else if(typeof document.getElementsByTagName != 'undefined' && (document.getElementsByTagName('body')[0] != null || document.body != null)) {\r
136                 DOMContentLoadedInit();\r
137         } else {\r
138                 // Not ready yet, wait a little more.\r
139                 setTimeout("DOMContentLoadedScheduler()", 250);\r
140         }\r
141         \r
142         return true;\r
143 }\r
144 \r
145 // Schedule to run the init function.\r
146 setTimeout("DOMContentLoadedScheduler()", 250);\r
147 \r
148 // Just in case window.onload happens first, add it there too.\r
149 addEvent(window, "load", DOMContentLoadedInit);\r
150 \r
151 // If addEventListener supports the DOMContentLoaded event.\r
152 if(document.addEventListener)\r
153         document.addEventListener("DOMContentLoaded", DOMContentLoadedInit, false);\r
154 \r
155 /* for Internet Explorer */\r
156 /*@cc_on @*/\r
157 /*@if (@_win32)\r
158         document.write("<script id=__ie_onload defer src=\"//:\"><\/script>");\r
159         var script = document.getElementById("__ie_onload");\r
160         script.onreadystatechange = function() {\r
161                 if (this.readyState == "complete") {\r
162                         DOMContentLoadedInit(); // call the onload handler\r
163                 }\r
164         };\r
165 /*@end @*/\r