· 7 years ago · Apr 17, 2018, 10:20 AM
1if (!window.Event) var Event = { };
2
3Object.extend(Event, {
4 KEY_BACKSPACE: 8,
5 KEY_TAB: 9,
6 KEY_RETURN: 13,
7 KEY_ESC: 27,
8 KEY_LEFT: 37,
9 KEY_UP: 38,
10 KEY_RIGHT: 39,
11 KEY_DOWN: 40,
12 KEY_DELETE: 46,
13 KEY_HOME: 36,
14 KEY_END: 35,
15 KEY_PAGEUP: 33,
16 KEY_PAGEDOWN: 34,
17 KEY_INSERT: 45,
18
19 cache: { },
20
21 relatedTarget: function(event) {
22 var element;
23 switch(event.type) {
24 case 'mouseover': element = event.fromElement; break;
25 case 'mouseout': element = event.toElement; break;
26 default: return null;
27 }
28 return Element.extend(element);
29 }
30});
31
32Event.Methods = (function() {
33 var isButton;
34
35 if (Prototype.Browser.IE) {
36 var buttonMap = { 0: 1, 1: 4, 2: 2 };
37 isButton = function(event, code) {
38 return event.button == buttonMap[code];
39 };
40
41 } else if (Prototype.Browser.WebKit) {
42 isButton = function(event, code) {
43 switch (code) {
44 case 0: return event.which == 1 && !event.metaKey;
45 case 1: return event.which == 1 && event.metaKey;
46 default: return false;
47 }
48 };
49
50 } else {
51 isButton = function(event, code) {
52 return event.which ? (event.which === code + 1) : (event.button === code);
53 };
54 }
55
56 return {
57 isLeftClick: function(event) { return isButton(event, 0) },
58 isMiddleClick: function(event) { return isButton(event, 1) },
59 isRightClick: function(event) { return isButton(event, 2) },
60
61 element: function(event) {
62 var node = Event.extend(event).target;
63 return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
64 },
65
66 findElement: function(event, expression) {
67 var element = Event.element(event);
68 if (!expression) return element;
69 var elements = [element].concat(element.ancestors());
70 return Selector.findElement(elements, expression, 0);
71 },
72
73 pointer: function(event) {
74 return {
75 x: event.pageX || (event.clientX +
76 (document.documentElement.scrollLeft || document.body.scrollLeft)),
77 y: event.pageY || (event.clientY +
78 (document.documentElement.scrollTop || document.body.scrollTop))
79 };
80 },
81
82 pointerX: function(event) { return Event.pointer(event).x },
83 pointerY: function(event) { return Event.pointer(event).y },
84
85 stop: function(event) {
86 Event.extend(event);
87 event.preventDefault();
88 event.stopPropagation();
89 event.stopped = true;
90 }
91 };
92})();
93
94Event.extend = (function() {
95 var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
96 m[name] = Event.Methods[name].methodize();
97 return m;
98 });
99
100 if (Prototype.Browser.IE) {
101 Object.extend(methods, {
102 stopPropagation: function() { this.cancelBubble = true },
103 preventDefault: function() { this.returnValue = false },
104 inspect: function() { return "[object Event]" }
105 });
106
107 return function(event) {
108 if (!event) return false;
109 if (event._extendedByPrototype) return event;
110
111 event._extendedByPrototype = Prototype.emptyFunction;
112 var pointer = Event.pointer(event);
113 Object.extend(event, {
114 target: event.srcElement,
115 relatedTarget: Event.relatedTarget(event),
116 pageX: pointer.x,
117 pageY: pointer.y
118 });
119 return Object.extend(event, methods);
120 };
121
122 } else {
123 Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
124 Object.extend(Event.prototype, methods);
125 return Prototype.K;
126 }
127})();
128
129Object.extend(Event, (function() {
130 var cache = Event.cache;
131
132 function getEventID(element) {
133 if (element._prototypeEventID) return element._prototypeEventID[0];
134 arguments.callee.id = arguments.callee.id || 1;
135 return element._prototypeEventID = [++arguments.callee.id];
136 }
137
138 function getDOMEventName(eventName) {
139 if (eventName && eventName.include(':')) return "dataavailable";
140 return eventName;
141 }
142
143 function getCacheForID(id) {
144 return cache[id] = cache[id] || { };
145 }
146
147 function getWrappersForEventName(id, eventName) {
148 var c = getCacheForID(id);
149 return c[eventName] = c[eventName] || [];
150 }
151
152 function createWrapper(element, eventName, handler) {
153 var id = getEventID(element);
154 var c = getWrappersForEventName(id, eventName);
155 if (c.pluck("handler").include(handler)) return false;
156
157 var wrapper = function(event) {
158 if (!Event || !Event.extend ||
159 (event.eventName && event.eventName != eventName))
160 return false;
161
162 Event.extend(event);
163 handler.call(element, event);
164 };
165
166 wrapper.handler = handler;
167 c.push(wrapper);
168 return wrapper;
169 }
170
171 function findWrapper(id, eventName, handler) {
172 var c = getWrappersForEventName(id, eventName);
173 return c.find(function(wrapper) { return wrapper.handler == handler });
174 }
175
176 function destroyWrapper(id, eventName, handler) {
177 var c = getCacheForID(id);
178 if (!c[eventName]) return false;
179 c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
180 }
181
182 function destroyCache() {
183 for (var id in cache)
184 for (var eventName in cache[id])
185 cache[id][eventName] = null;
186 }
187
188 if (window.attachEvent) {
189 window.attachEvent("onunload", destroyCache);
190 }
191
192 return {
193 observe: function(element, eventName, handler) {
194 element = $(element);
195 var name = getDOMEventName(eventName);
196
197 var wrapper = createWrapper(element, eventName, handler);
198 if (!wrapper) return element;
199
200 if (element.addEventListener) {
201 element.addEventListener(name, wrapper, false);
202 } else {
203 element.attachEvent("on" + name, wrapper);
204 }
205
206 return element;
207 },
208
209 stopObserving: function(element, eventName, handler) {
210 element = $(element);
211 var id = getEventID(element), name = getDOMEventName(eventName);
212
213 if (!handler && eventName) {
214 getWrappersForEventName(id, eventName).each(function(wrapper) {
215 element.stopObserving(eventName, wrapper.handler);
216 });
217 return element;
218
219 } else if (!eventName) {
220 Object.keys(getCacheForID(id)).each(function(eventName) {
221 element.stopObserving(eventName);
222 });
223 return element;
224 }
225
226 var wrapper = findWrapper(id, eventName, handler);
227 if (!wrapper) return element;
228
229 if (element.removeEventListener) {
230 element.removeEventListener(name, wrapper, false);
231 } else {
232 element.detachEvent("on" + name, wrapper);
233 }
234
235 destroyWrapper(id, eventName, handler);
236
237 return element;
238 },
239
240 fire: function(element, eventName, memo) {
241 element = $(element);
242 if (element == document && document.createEvent && !element.dispatchEvent)
243 element = document.documentElement;
244
245 var event;
246 if (document.createEvent) {
247 event = document.createEvent("HTMLEvents");
248 event.initEvent("dataavailable", true, true);
249 } else {
250 event = document.createEventObject();
251 event.eventType = "ondataavailable";
252 }
253
254 event.eventName = eventName;
255 event.memo = memo || { };
256
257 if (document.createEvent) {
258 element.dispatchEvent(event);
259 } else {
260 element.fireEvent(event.eventType, event);
261 }
262
263 return Event.extend(event);
264 }
265 };
266})());
267
268Object.extend(Event, Event.Methods);
269
270Element.addMethods({
271 fire: Event.fire,
272 observe: Event.observe,
273 stopObserving: Event.stopObserving
274});
275
276Object.extend(document, {
277 fire: Element.Methods.fire.methodize(),
278 observe: Element.Methods.observe.methodize(),
279 stopObserving: Element.Methods.stopObserving.methodize(),
280 loaded: false
281});
282
283(function() {
284 /* Support for the DOMContentLoaded event is based on work by Dan Webb,
285 Matthias Miller, Dean Edwards and John Resig. */
286
287 var timer;
288
289 function fireContentLoadedEvent() {
290 if (document.loaded) return;
291 if (timer) window.clearInterval(timer);
292 document.fire("dom:loaded");
293 document.loaded = true;
294 }
295
296 if (document.addEventListener) {
297 if (Prototype.Browser.WebKit) {
298 timer = window.setInterval(function() {
299 if (/loaded|complete/.test(document.readyState))
300 fireContentLoadedEvent();
301 }, 0);
302
303 Event.observe(window, "load", fireContentLoadedEvent);
304
305 } else {
306 document.addEventListener("DOMContentLoaded",
307 fireContentLoadedEvent, false);
308 }
309
310 } else {
311 document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
312 $("__onDOMContentLoaded").onreadystatechange = function() {
313 if (this.readyState == "complete") {
314 this.onreadystatechange = null;
315 fireContentLoadedEvent();
316 }
317 };
318 }
319})();