[76] | 1 | /*! |
---|
| 2 | * Ext JS Library 3.4.0 |
---|
| 3 | * Copyright(c) 2006-2011 Sencha Inc. |
---|
| 4 | * licensing@sencha.com |
---|
| 5 | * http://www.sencha.com/license |
---|
| 6 | */ |
---|
| 7 | Ext.lib.Event = function() { |
---|
| 8 | var loadComplete = false, |
---|
| 9 | unloadListeners = {}, |
---|
| 10 | retryCount = 0, |
---|
| 11 | onAvailStack = [], |
---|
| 12 | _interval, |
---|
| 13 | locked = false, |
---|
| 14 | win = window, |
---|
| 15 | doc = document, |
---|
| 16 | |
---|
| 17 | // constants |
---|
| 18 | POLL_RETRYS = 200, |
---|
| 19 | POLL_INTERVAL = 20, |
---|
| 20 | TYPE = 0, |
---|
| 21 | FN = 1, |
---|
| 22 | OBJ = 2, |
---|
| 23 | ADJ_SCOPE = 3, |
---|
| 24 | SCROLLLEFT = 'scrollLeft', |
---|
| 25 | SCROLLTOP = 'scrollTop', |
---|
| 26 | UNLOAD = 'unload', |
---|
| 27 | MOUSEOVER = 'mouseover', |
---|
| 28 | MOUSEOUT = 'mouseout', |
---|
| 29 | // private |
---|
| 30 | doAdd = function() { |
---|
| 31 | var ret; |
---|
| 32 | if (win.addEventListener) { |
---|
| 33 | ret = function(el, eventName, fn, capture) { |
---|
| 34 | if (eventName == 'mouseenter') { |
---|
| 35 | fn = fn.createInterceptor(checkRelatedTarget); |
---|
| 36 | el.addEventListener(MOUSEOVER, fn, (capture)); |
---|
| 37 | } else if (eventName == 'mouseleave') { |
---|
| 38 | fn = fn.createInterceptor(checkRelatedTarget); |
---|
| 39 | el.addEventListener(MOUSEOUT, fn, (capture)); |
---|
| 40 | } else { |
---|
| 41 | el.addEventListener(eventName, fn, (capture)); |
---|
| 42 | } |
---|
| 43 | return fn; |
---|
| 44 | }; |
---|
| 45 | } else if (win.attachEvent) { |
---|
| 46 | ret = function(el, eventName, fn, capture) { |
---|
| 47 | el.attachEvent("on" + eventName, fn); |
---|
| 48 | return fn; |
---|
| 49 | }; |
---|
| 50 | } else { |
---|
| 51 | ret = function(){}; |
---|
| 52 | } |
---|
| 53 | return ret; |
---|
| 54 | }(), |
---|
| 55 | // private |
---|
| 56 | doRemove = function(){ |
---|
| 57 | var ret; |
---|
| 58 | if (win.removeEventListener) { |
---|
| 59 | ret = function (el, eventName, fn, capture) { |
---|
| 60 | if (eventName == 'mouseenter') { |
---|
| 61 | eventName = MOUSEOVER; |
---|
| 62 | } else if (eventName == 'mouseleave') { |
---|
| 63 | eventName = MOUSEOUT; |
---|
| 64 | } |
---|
| 65 | el.removeEventListener(eventName, fn, (capture)); |
---|
| 66 | }; |
---|
| 67 | } else if (win.detachEvent) { |
---|
| 68 | ret = function (el, eventName, fn) { |
---|
| 69 | el.detachEvent("on" + eventName, fn); |
---|
| 70 | }; |
---|
| 71 | } else { |
---|
| 72 | ret = function(){}; |
---|
| 73 | } |
---|
| 74 | return ret; |
---|
| 75 | }(); |
---|
| 76 | |
---|
| 77 | function checkRelatedTarget(e) { |
---|
| 78 | return !elContains(e.currentTarget, pub.getRelatedTarget(e)); |
---|
| 79 | } |
---|
| 80 | |
---|
| 81 | function elContains(parent, child) { |
---|
| 82 | if(parent && parent.firstChild){ |
---|
| 83 | while(child) { |
---|
| 84 | if(child === parent) { |
---|
| 85 | return true; |
---|
| 86 | } |
---|
| 87 | child = child.parentNode; |
---|
| 88 | if(child && (child.nodeType != 1)) { |
---|
| 89 | child = null; |
---|
| 90 | } |
---|
| 91 | } |
---|
| 92 | } |
---|
| 93 | return false; |
---|
| 94 | } |
---|
| 95 | |
---|
| 96 | // private |
---|
| 97 | function _tryPreloadAttach() { |
---|
| 98 | var ret = false, |
---|
| 99 | notAvail = [], |
---|
| 100 | element, i, v, override, |
---|
| 101 | tryAgain = !loadComplete || (retryCount > 0); |
---|
| 102 | |
---|
| 103 | if(!locked){ |
---|
| 104 | locked = true; |
---|
| 105 | |
---|
| 106 | for(i = 0; i < onAvailStack.length; ++i){ |
---|
| 107 | v = onAvailStack[i]; |
---|
| 108 | if(v && (element = doc.getElementById(v.id))){ |
---|
| 109 | if(!v.checkReady || loadComplete || element.nextSibling || (doc && doc.body)) { |
---|
| 110 | override = v.override; |
---|
| 111 | element = override ? (override === true ? v.obj : override) : element; |
---|
| 112 | v.fn.call(element, v.obj); |
---|
| 113 | onAvailStack.remove(v); |
---|
| 114 | --i; |
---|
| 115 | }else{ |
---|
| 116 | notAvail.push(v); |
---|
| 117 | } |
---|
| 118 | } |
---|
| 119 | } |
---|
| 120 | |
---|
| 121 | retryCount = (notAvail.length === 0) ? 0 : retryCount - 1; |
---|
| 122 | |
---|
| 123 | if (tryAgain) { |
---|
| 124 | startInterval(); |
---|
| 125 | } else { |
---|
| 126 | clearInterval(_interval); |
---|
| 127 | _interval = null; |
---|
| 128 | } |
---|
| 129 | ret = !(locked = false); |
---|
| 130 | } |
---|
| 131 | return ret; |
---|
| 132 | } |
---|
| 133 | |
---|
| 134 | // private |
---|
| 135 | function startInterval() { |
---|
| 136 | if(!_interval){ |
---|
| 137 | var callback = function() { |
---|
| 138 | _tryPreloadAttach(); |
---|
| 139 | }; |
---|
| 140 | _interval = setInterval(callback, POLL_INTERVAL); |
---|
| 141 | } |
---|
| 142 | } |
---|
| 143 | |
---|
| 144 | // private |
---|
| 145 | function getScroll() { |
---|
| 146 | var dd = doc.documentElement, |
---|
| 147 | db = doc.body; |
---|
| 148 | if(dd && (dd[SCROLLTOP] || dd[SCROLLLEFT])){ |
---|
| 149 | return [dd[SCROLLLEFT], dd[SCROLLTOP]]; |
---|
| 150 | }else if(db){ |
---|
| 151 | return [db[SCROLLLEFT], db[SCROLLTOP]]; |
---|
| 152 | }else{ |
---|
| 153 | return [0, 0]; |
---|
| 154 | } |
---|
| 155 | } |
---|
| 156 | |
---|
| 157 | // private |
---|
| 158 | function getPageCoord (ev, xy) { |
---|
| 159 | ev = ev.browserEvent || ev; |
---|
| 160 | var coord = ev['page' + xy]; |
---|
| 161 | if (!coord && coord !== 0) { |
---|
| 162 | coord = ev['client' + xy] || 0; |
---|
| 163 | |
---|
| 164 | if (Ext.isIE) { |
---|
| 165 | coord += getScroll()[xy == "X" ? 0 : 1]; |
---|
| 166 | } |
---|
| 167 | } |
---|
| 168 | |
---|
| 169 | return coord; |
---|
| 170 | } |
---|
| 171 | |
---|
| 172 | var pub = { |
---|
| 173 | extAdapter: true, |
---|
| 174 | onAvailable : function(p_id, p_fn, p_obj, p_override) { |
---|
| 175 | onAvailStack.push({ |
---|
| 176 | id: p_id, |
---|
| 177 | fn: p_fn, |
---|
| 178 | obj: p_obj, |
---|
| 179 | override: p_override, |
---|
| 180 | checkReady: false }); |
---|
| 181 | |
---|
| 182 | retryCount = POLL_RETRYS; |
---|
| 183 | startInterval(); |
---|
| 184 | }, |
---|
| 185 | |
---|
| 186 | // This function should ALWAYS be called from Ext.EventManager |
---|
| 187 | addListener: function(el, eventName, fn) { |
---|
| 188 | el = Ext.getDom(el); |
---|
| 189 | if (el && fn) { |
---|
| 190 | if (eventName == UNLOAD) { |
---|
| 191 | if (unloadListeners[el.id] === undefined) { |
---|
| 192 | unloadListeners[el.id] = []; |
---|
| 193 | } |
---|
| 194 | unloadListeners[el.id].push([eventName, fn]); |
---|
| 195 | return fn; |
---|
| 196 | } |
---|
| 197 | return doAdd(el, eventName, fn, false); |
---|
| 198 | } |
---|
| 199 | return false; |
---|
| 200 | }, |
---|
| 201 | |
---|
| 202 | // This function should ALWAYS be called from Ext.EventManager |
---|
| 203 | removeListener: function(el, eventName, fn) { |
---|
| 204 | el = Ext.getDom(el); |
---|
| 205 | var i, len, li, lis; |
---|
| 206 | if (el && fn) { |
---|
| 207 | if(eventName == UNLOAD){ |
---|
| 208 | if((lis = unloadListeners[el.id]) !== undefined){ |
---|
| 209 | for(i = 0, len = lis.length; i < len; i++){ |
---|
| 210 | if((li = lis[i]) && li[TYPE] == eventName && li[FN] == fn){ |
---|
| 211 | unloadListeners[el.id].splice(i, 1); |
---|
| 212 | } |
---|
| 213 | } |
---|
| 214 | } |
---|
| 215 | return; |
---|
| 216 | } |
---|
| 217 | doRemove(el, eventName, fn, false); |
---|
| 218 | } |
---|
| 219 | }, |
---|
| 220 | |
---|
| 221 | getTarget : function(ev) { |
---|
| 222 | ev = ev.browserEvent || ev; |
---|
| 223 | return this.resolveTextNode(ev.target || ev.srcElement); |
---|
| 224 | }, |
---|
| 225 | |
---|
| 226 | resolveTextNode : Ext.isGecko ? function(node){ |
---|
| 227 | if(!node){ |
---|
| 228 | return; |
---|
| 229 | } |
---|
| 230 | // work around firefox bug, https://bugzilla.mozilla.org/show_bug.cgi?id=101197 |
---|
| 231 | var s = HTMLElement.prototype.toString.call(node); |
---|
| 232 | if(s == '[xpconnect wrapped native prototype]' || s == '[object XULElement]'){ |
---|
| 233 | return; |
---|
| 234 | } |
---|
| 235 | return node.nodeType == 3 ? node.parentNode : node; |
---|
| 236 | } : function(node){ |
---|
| 237 | return node && node.nodeType == 3 ? node.parentNode : node; |
---|
| 238 | }, |
---|
| 239 | |
---|
| 240 | getRelatedTarget : function(ev) { |
---|
| 241 | ev = ev.browserEvent || ev; |
---|
| 242 | return this.resolveTextNode(ev.relatedTarget || |
---|
| 243 | (/(mouseout|mouseleave)/.test(ev.type) ? ev.toElement : |
---|
| 244 | /(mouseover|mouseenter)/.test(ev.type) ? ev.fromElement : null)); |
---|
| 245 | }, |
---|
| 246 | |
---|
| 247 | getPageX : function(ev) { |
---|
| 248 | return getPageCoord(ev, "X"); |
---|
| 249 | }, |
---|
| 250 | |
---|
| 251 | getPageY : function(ev) { |
---|
| 252 | return getPageCoord(ev, "Y"); |
---|
| 253 | }, |
---|
| 254 | |
---|
| 255 | |
---|
| 256 | getXY : function(ev) { |
---|
| 257 | return [this.getPageX(ev), this.getPageY(ev)]; |
---|
| 258 | }, |
---|
| 259 | |
---|
| 260 | stopEvent : function(ev) { |
---|
| 261 | this.stopPropagation(ev); |
---|
| 262 | this.preventDefault(ev); |
---|
| 263 | }, |
---|
| 264 | |
---|
| 265 | stopPropagation : function(ev) { |
---|
| 266 | ev = ev.browserEvent || ev; |
---|
| 267 | if (ev.stopPropagation) { |
---|
| 268 | ev.stopPropagation(); |
---|
| 269 | } else { |
---|
| 270 | ev.cancelBubble = true; |
---|
| 271 | } |
---|
| 272 | }, |
---|
| 273 | |
---|
| 274 | preventDefault : function(ev) { |
---|
| 275 | ev = ev.browserEvent || ev; |
---|
| 276 | if (ev.preventDefault) { |
---|
| 277 | ev.preventDefault(); |
---|
| 278 | } else { |
---|
| 279 | if (ev.keyCode) { |
---|
| 280 | ev.keyCode = 0; |
---|
| 281 | } |
---|
| 282 | ev.returnValue = false; |
---|
| 283 | } |
---|
| 284 | }, |
---|
| 285 | |
---|
| 286 | getEvent : function(e) { |
---|
| 287 | e = e || win.event; |
---|
| 288 | if (!e) { |
---|
| 289 | var c = this.getEvent.caller; |
---|
| 290 | while (c) { |
---|
| 291 | e = c.arguments[0]; |
---|
| 292 | if (e && Event == e.constructor) { |
---|
| 293 | break; |
---|
| 294 | } |
---|
| 295 | c = c.caller; |
---|
| 296 | } |
---|
| 297 | } |
---|
| 298 | return e; |
---|
| 299 | }, |
---|
| 300 | |
---|
| 301 | getCharCode : function(ev) { |
---|
| 302 | ev = ev.browserEvent || ev; |
---|
| 303 | return ev.charCode || ev.keyCode || 0; |
---|
| 304 | }, |
---|
| 305 | |
---|
| 306 | //clearCache: function() {}, |
---|
| 307 | // deprecated, call from EventManager |
---|
| 308 | getListeners : function(el, eventName) { |
---|
| 309 | Ext.EventManager.getListeners(el, eventName); |
---|
| 310 | }, |
---|
| 311 | |
---|
| 312 | // deprecated, call from EventManager |
---|
| 313 | purgeElement : function(el, recurse, eventName) { |
---|
| 314 | Ext.EventManager.purgeElement(el, recurse, eventName); |
---|
| 315 | }, |
---|
| 316 | |
---|
| 317 | _load : function(e) { |
---|
| 318 | loadComplete = true; |
---|
| 319 | |
---|
| 320 | if (Ext.isIE && e !== true) { |
---|
| 321 | // IE8 complains that _load is null or not an object |
---|
| 322 | // so lets remove self via arguments.callee |
---|
| 323 | doRemove(win, "load", arguments.callee); |
---|
| 324 | } |
---|
| 325 | }, |
---|
| 326 | |
---|
| 327 | _unload : function(e) { |
---|
| 328 | var EU = Ext.lib.Event, |
---|
| 329 | i, v, ul, id, len, scope; |
---|
| 330 | |
---|
| 331 | for (id in unloadListeners) { |
---|
| 332 | ul = unloadListeners[id]; |
---|
| 333 | for (i = 0, len = ul.length; i < len; i++) { |
---|
| 334 | v = ul[i]; |
---|
| 335 | if (v) { |
---|
| 336 | try{ |
---|
| 337 | scope = v[ADJ_SCOPE] ? (v[ADJ_SCOPE] === true ? v[OBJ] : v[ADJ_SCOPE]) : win; |
---|
| 338 | v[FN].call(scope, EU.getEvent(e), v[OBJ]); |
---|
| 339 | }catch(ex){} |
---|
| 340 | } |
---|
| 341 | } |
---|
| 342 | }; |
---|
| 343 | |
---|
| 344 | Ext.EventManager._unload(); |
---|
| 345 | |
---|
| 346 | doRemove(win, UNLOAD, EU._unload); |
---|
| 347 | } |
---|
| 348 | }; |
---|
| 349 | |
---|
| 350 | // Initialize stuff. |
---|
| 351 | pub.on = pub.addListener; |
---|
| 352 | pub.un = pub.removeListener; |
---|
| 353 | if (doc && doc.body) { |
---|
| 354 | pub._load(true); |
---|
| 355 | } else { |
---|
| 356 | doAdd(win, "load", pub._load); |
---|
| 357 | } |
---|
| 358 | doAdd(win, UNLOAD, pub._unload); |
---|
| 359 | _tryPreloadAttach(); |
---|
| 360 | |
---|
| 361 | return pub; |
---|
| 362 | }(); |
---|