| /* |
| Copyright (c) 2004-2006, The Dojo Foundation |
| All Rights Reserved. |
| |
| Licensed under the Academic Free License version 2.1 or above OR the |
| modified BSD license. For more information on Dojo licensing, see: |
| |
| http://dojotoolkit.org/community/licensing.shtml |
| */ |
| |
| |
| |
| dojo.provide("dojo.event.browser"); |
| dojo.require("dojo.event.common"); |
| dojo._ie_clobber = new function () { |
| this.clobberNodes = []; |
| function nukeProp(node, prop) { |
| try { |
| node[prop] = null; |
| } |
| catch (e) { |
| } |
| try { |
| delete node[prop]; |
| } |
| catch (e) { |
| } |
| try { |
| node.removeAttribute(prop); |
| } |
| catch (e) { |
| } |
| } |
| this.clobber = function (nodeRef) { |
| var na; |
| var tna; |
| if (nodeRef) { |
| tna = nodeRef.all || nodeRef.getElementsByTagName("*"); |
| na = [nodeRef]; |
| for (var x = 0; x < tna.length; x++) { |
| if (tna[x]["__doClobber__"]) { |
| na.push(tna[x]); |
| } |
| } |
| } else { |
| try { |
| window.onload = null; |
| } |
| catch (e) { |
| } |
| na = (this.clobberNodes.length) ? this.clobberNodes : document.all; |
| } |
| tna = null; |
| var basis = {}; |
| for (var i = na.length - 1; i >= 0; i = i - 1) { |
| var el = na[i]; |
| try { |
| if (el && el["__clobberAttrs__"]) { |
| for (var j = 0; j < el.__clobberAttrs__.length; j++) { |
| nukeProp(el, el.__clobberAttrs__[j]); |
| } |
| nukeProp(el, "__clobberAttrs__"); |
| nukeProp(el, "__doClobber__"); |
| } |
| } |
| catch (e) { |
| } |
| } |
| na = null; |
| }; |
| }; |
| if (dojo.render.html.ie) { |
| dojo.addOnUnload(function () { |
| dojo._ie_clobber.clobber(); |
| try { |
| if ((dojo["widget"]) && (dojo.widget["manager"])) { |
| dojo.widget.manager.destroyAll(); |
| } |
| } |
| catch (e) { |
| } |
| if (dojo.widget) { |
| for (var name in dojo.widget._templateCache) { |
| if (dojo.widget._templateCache[name].node) { |
| dojo.dom.destroyNode(dojo.widget._templateCache[name].node); |
| dojo.widget._templateCache[name].node = null; |
| delete dojo.widget._templateCache[name].node; |
| } |
| } |
| } |
| try { |
| window.onload = null; |
| } |
| catch (e) { |
| } |
| try { |
| window.onunload = null; |
| } |
| catch (e) { |
| } |
| dojo._ie_clobber.clobberNodes = []; |
| }); |
| } |
| dojo.event.browser = new function () { |
| var clobberIdx = 0; |
| this.normalizedEventName = function (eventName) { |
| switch (eventName) { |
| case "CheckboxStateChange": |
| case "DOMAttrModified": |
| case "DOMMenuItemActive": |
| case "DOMMenuItemInactive": |
| case "DOMMouseScroll": |
| case "DOMNodeInserted": |
| case "DOMNodeRemoved": |
| case "RadioStateChange": |
| return eventName; |
| break; |
| default: |
| var lcn = eventName.toLowerCase(); |
| return (lcn.indexOf("on") == 0) ? lcn.substr(2) : lcn; |
| break; |
| } |
| }; |
| this.clean = function (node) { |
| if (dojo.render.html.ie) { |
| dojo._ie_clobber.clobber(node); |
| } |
| }; |
| this.addClobberNode = function (node) { |
| if (!dojo.render.html.ie) { |
| return; |
| } |
| if (!node["__doClobber__"]) { |
| node.__doClobber__ = true; |
| dojo._ie_clobber.clobberNodes.push(node); |
| node.__clobberAttrs__ = []; |
| } |
| }; |
| this.addClobberNodeAttrs = function (node, props) { |
| if (!dojo.render.html.ie) { |
| return; |
| } |
| this.addClobberNode(node); |
| for (var x = 0; x < props.length; x++) { |
| node.__clobberAttrs__.push(props[x]); |
| } |
| }; |
| this.removeListener = function (node, evtName, fp, capture) { |
| if (!capture) { |
| var capture = false; |
| } |
| evtName = dojo.event.browser.normalizedEventName(evtName); |
| if (evtName == "key") { |
| if (dojo.render.html.ie) { |
| this.removeListener(node, "onkeydown", fp, capture); |
| } |
| evtName = "keypress"; |
| } |
| if (node.removeEventListener) { |
| node.removeEventListener(evtName, fp, capture); |
| } |
| }; |
| this.addListener = function (node, evtName, fp, capture, dontFix) { |
| if (!node) { |
| return; |
| } |
| if (!capture) { |
| var capture = false; |
| } |
| evtName = dojo.event.browser.normalizedEventName(evtName); |
| if (evtName == "key") { |
| if (dojo.render.html.ie) { |
| this.addListener(node, "onkeydown", fp, capture, dontFix); |
| } |
| evtName = "keypress"; |
| } |
| if (!dontFix) { |
| var newfp = function (evt) { |
| if (!evt) { |
| evt = window.event; |
| } |
| var ret = fp(dojo.event.browser.fixEvent(evt, this)); |
| if (capture) { |
| dojo.event.browser.stopEvent(evt); |
| } |
| return ret; |
| }; |
| } else { |
| newfp = fp; |
| } |
| if (node.addEventListener) { |
| node.addEventListener(evtName, newfp, capture); |
| return newfp; |
| } else { |
| evtName = "on" + evtName; |
| if (typeof node[evtName] == "function") { |
| var oldEvt = node[evtName]; |
| node[evtName] = function (e) { |
| oldEvt(e); |
| return newfp(e); |
| }; |
| } else { |
| node[evtName] = newfp; |
| } |
| if (dojo.render.html.ie) { |
| this.addClobberNodeAttrs(node, [evtName]); |
| } |
| return newfp; |
| } |
| }; |
| this.isEvent = function (obj) { |
| return (typeof obj != "undefined") && (obj) && (typeof Event != "undefined") && (obj.eventPhase); |
| }; |
| this.currentEvent = null; |
| this.callListener = function (listener, curTarget) { |
| if (typeof listener != "function") { |
| dojo.raise("listener not a function: " + listener); |
| } |
| dojo.event.browser.currentEvent.currentTarget = curTarget; |
| return listener.call(curTarget, dojo.event.browser.currentEvent); |
| }; |
| this._stopPropagation = function () { |
| dojo.event.browser.currentEvent.cancelBubble = true; |
| }; |
| this._preventDefault = function () { |
| dojo.event.browser.currentEvent.returnValue = false; |
| }; |
| this.keys = {KEY_BACKSPACE:8, KEY_TAB:9, KEY_CLEAR:12, KEY_ENTER:13, KEY_SHIFT:16, KEY_CTRL:17, KEY_ALT:18, KEY_PAUSE:19, KEY_CAPS_LOCK:20, KEY_ESCAPE:27, KEY_SPACE:32, KEY_PAGE_UP:33, KEY_PAGE_DOWN:34, KEY_END:35, KEY_HOME:36, KEY_LEFT_ARROW:37, KEY_UP_ARROW:38, KEY_RIGHT_ARROW:39, KEY_DOWN_ARROW:40, KEY_INSERT:45, KEY_DELETE:46, KEY_HELP:47, KEY_LEFT_WINDOW:91, KEY_RIGHT_WINDOW:92, KEY_SELECT:93, KEY_NUMPAD_0:96, KEY_NUMPAD_1:97, KEY_NUMPAD_2:98, KEY_NUMPAD_3:99, KEY_NUMPAD_4:100, KEY_NUMPAD_5:101, KEY_NUMPAD_6:102, KEY_NUMPAD_7:103, KEY_NUMPAD_8:104, KEY_NUMPAD_9:105, KEY_NUMPAD_MULTIPLY:106, KEY_NUMPAD_PLUS:107, KEY_NUMPAD_ENTER:108, KEY_NUMPAD_MINUS:109, KEY_NUMPAD_PERIOD:110, KEY_NUMPAD_DIVIDE:111, KEY_F1:112, KEY_F2:113, KEY_F3:114, KEY_F4:115, KEY_F5:116, KEY_F6:117, KEY_F7:118, KEY_F8:119, KEY_F9:120, KEY_F10:121, KEY_F11:122, KEY_F12:123, KEY_F13:124, KEY_F14:125, KEY_F15:126, KEY_NUM_LOCK:144, KEY_SCROLL_LOCK:145}; |
| this.revKeys = []; |
| for (var key in this.keys) { |
| this.revKeys[this.keys[key]] = key; |
| } |
| this.fixEvent = function (evt, sender) { |
| if (!evt) { |
| if (window["event"]) { |
| evt = window.event; |
| } |
| } |
| if ((evt["type"]) && (evt["type"].indexOf("key") == 0)) { |
| evt.keys = this.revKeys; |
| for (var key in this.keys) { |
| evt[key] = this.keys[key]; |
| } |
| if (evt["type"] == "keydown" && dojo.render.html.ie) { |
| switch (evt.keyCode) { |
| case evt.KEY_SHIFT: |
| case evt.KEY_CTRL: |
| case evt.KEY_ALT: |
| case evt.KEY_CAPS_LOCK: |
| case evt.KEY_LEFT_WINDOW: |
| case evt.KEY_RIGHT_WINDOW: |
| case evt.KEY_SELECT: |
| case evt.KEY_NUM_LOCK: |
| case evt.KEY_SCROLL_LOCK: |
| case evt.KEY_NUMPAD_0: |
| case evt.KEY_NUMPAD_1: |
| case evt.KEY_NUMPAD_2: |
| case evt.KEY_NUMPAD_3: |
| case evt.KEY_NUMPAD_4: |
| case evt.KEY_NUMPAD_5: |
| case evt.KEY_NUMPAD_6: |
| case evt.KEY_NUMPAD_7: |
| case evt.KEY_NUMPAD_8: |
| case evt.KEY_NUMPAD_9: |
| case evt.KEY_NUMPAD_PERIOD: |
| break; |
| case evt.KEY_NUMPAD_MULTIPLY: |
| case evt.KEY_NUMPAD_PLUS: |
| case evt.KEY_NUMPAD_ENTER: |
| case evt.KEY_NUMPAD_MINUS: |
| case evt.KEY_NUMPAD_DIVIDE: |
| break; |
| case evt.KEY_PAUSE: |
| case evt.KEY_TAB: |
| case evt.KEY_BACKSPACE: |
| case evt.KEY_ENTER: |
| case evt.KEY_ESCAPE: |
| case evt.KEY_PAGE_UP: |
| case evt.KEY_PAGE_DOWN: |
| case evt.KEY_END: |
| case evt.KEY_HOME: |
| case evt.KEY_LEFT_ARROW: |
| case evt.KEY_UP_ARROW: |
| case evt.KEY_RIGHT_ARROW: |
| case evt.KEY_DOWN_ARROW: |
| case evt.KEY_INSERT: |
| case evt.KEY_DELETE: |
| case evt.KEY_F1: |
| case evt.KEY_F2: |
| case evt.KEY_F3: |
| case evt.KEY_F4: |
| case evt.KEY_F5: |
| case evt.KEY_F6: |
| case evt.KEY_F7: |
| case evt.KEY_F8: |
| case evt.KEY_F9: |
| case evt.KEY_F10: |
| case evt.KEY_F11: |
| case evt.KEY_F12: |
| case evt.KEY_F12: |
| case evt.KEY_F13: |
| case evt.KEY_F14: |
| case evt.KEY_F15: |
| case evt.KEY_CLEAR: |
| case evt.KEY_HELP: |
| evt.key = evt.keyCode; |
| break; |
| default: |
| if (evt.ctrlKey || evt.altKey) { |
| var unifiedCharCode = evt.keyCode; |
| if (unifiedCharCode >= 65 && unifiedCharCode <= 90 && evt.shiftKey == false) { |
| unifiedCharCode += 32; |
| } |
| if (unifiedCharCode >= 1 && unifiedCharCode <= 26 && evt.ctrlKey) { |
| unifiedCharCode += 96; |
| } |
| evt.key = String.fromCharCode(unifiedCharCode); |
| } |
| } |
| } else { |
| if (evt["type"] == "keypress") { |
| if (dojo.render.html.opera) { |
| if (evt.which == 0) { |
| evt.key = evt.keyCode; |
| } else { |
| if (evt.which > 0) { |
| switch (evt.which) { |
| case evt.KEY_SHIFT: |
| case evt.KEY_CTRL: |
| case evt.KEY_ALT: |
| case evt.KEY_CAPS_LOCK: |
| case evt.KEY_NUM_LOCK: |
| case evt.KEY_SCROLL_LOCK: |
| break; |
| case evt.KEY_PAUSE: |
| case evt.KEY_TAB: |
| case evt.KEY_BACKSPACE: |
| case evt.KEY_ENTER: |
| case evt.KEY_ESCAPE: |
| evt.key = evt.which; |
| break; |
| default: |
| var unifiedCharCode = evt.which; |
| if ((evt.ctrlKey || evt.altKey || evt.metaKey) && (evt.which >= 65 && evt.which <= 90 && evt.shiftKey == false)) { |
| unifiedCharCode += 32; |
| } |
| evt.key = String.fromCharCode(unifiedCharCode); |
| } |
| } |
| } |
| } else { |
| if (dojo.render.html.ie) { |
| if (!evt.ctrlKey && !evt.altKey && evt.keyCode >= evt.KEY_SPACE) { |
| evt.key = String.fromCharCode(evt.keyCode); |
| } |
| } else { |
| if (dojo.render.html.safari) { |
| switch (evt.keyCode) { |
| case 25: |
| evt.key = evt.KEY_TAB; |
| evt.shift = true; |
| break; |
| case 63232: |
| evt.key = evt.KEY_UP_ARROW; |
| break; |
| case 63233: |
| evt.key = evt.KEY_DOWN_ARROW; |
| break; |
| case 63234: |
| evt.key = evt.KEY_LEFT_ARROW; |
| break; |
| case 63235: |
| evt.key = evt.KEY_RIGHT_ARROW; |
| break; |
| case 63236: |
| evt.key = evt.KEY_F1; |
| break; |
| case 63237: |
| evt.key = evt.KEY_F2; |
| break; |
| case 63238: |
| evt.key = evt.KEY_F3; |
| break; |
| case 63239: |
| evt.key = evt.KEY_F4; |
| break; |
| case 63240: |
| evt.key = evt.KEY_F5; |
| break; |
| case 63241: |
| evt.key = evt.KEY_F6; |
| break; |
| case 63242: |
| evt.key = evt.KEY_F7; |
| break; |
| case 63243: |
| evt.key = evt.KEY_F8; |
| break; |
| case 63244: |
| evt.key = evt.KEY_F9; |
| break; |
| case 63245: |
| evt.key = evt.KEY_F10; |
| break; |
| case 63246: |
| evt.key = evt.KEY_F11; |
| break; |
| case 63247: |
| evt.key = evt.KEY_F12; |
| break; |
| case 63250: |
| evt.key = evt.KEY_PAUSE; |
| break; |
| case 63272: |
| evt.key = evt.KEY_DELETE; |
| break; |
| case 63273: |
| evt.key = evt.KEY_HOME; |
| break; |
| case 63275: |
| evt.key = evt.KEY_END; |
| break; |
| case 63276: |
| evt.key = evt.KEY_PAGE_UP; |
| break; |
| case 63277: |
| evt.key = evt.KEY_PAGE_DOWN; |
| break; |
| case 63302: |
| evt.key = evt.KEY_INSERT; |
| break; |
| case 63248: |
| case 63249: |
| case 63289: |
| break; |
| default: |
| evt.key = evt.charCode >= evt.KEY_SPACE ? String.fromCharCode(evt.charCode) : evt.keyCode; |
| } |
| } else { |
| evt.key = evt.charCode > 0 ? String.fromCharCode(evt.charCode) : evt.keyCode; |
| } |
| } |
| } |
| } |
| } |
| } |
| if (dojo.render.html.ie) { |
| if (!evt.target) { |
| evt.target = evt.srcElement; |
| } |
| if (!evt.currentTarget) { |
| evt.currentTarget = (sender ? sender : evt.srcElement); |
| } |
| if (!evt.layerX) { |
| evt.layerX = evt.offsetX; |
| } |
| if (!evt.layerY) { |
| evt.layerY = evt.offsetY; |
| } |
| var doc = (evt.srcElement && evt.srcElement.ownerDocument) ? evt.srcElement.ownerDocument : document; |
| var docBody = ((dojo.render.html.ie55) || (doc["compatMode"] == "BackCompat")) ? doc.body : doc.documentElement; |
| if (!evt.pageX) { |
| evt.pageX = evt.clientX + (docBody.scrollLeft || 0); |
| } |
| if (!evt.pageY) { |
| evt.pageY = evt.clientY + (docBody.scrollTop || 0); |
| } |
| if (evt.type == "mouseover") { |
| evt.relatedTarget = evt.fromElement; |
| } |
| if (evt.type == "mouseout") { |
| evt.relatedTarget = evt.toElement; |
| } |
| this.currentEvent = evt; |
| evt.callListener = this.callListener; |
| evt.stopPropagation = this._stopPropagation; |
| evt.preventDefault = this._preventDefault; |
| } |
| return evt; |
| }; |
| this.stopEvent = function (evt) { |
| if (window.event) { |
| evt.cancelBubble = true; |
| evt.returnValue = false; |
| } else { |
| evt.preventDefault(); |
| evt.stopPropagation(); |
| } |
| }; |
| }; |
| |