| 'use strict'; | 
|   | 
| var random = require('./random'); | 
|   | 
| var onUnload = {} | 
|   , afterUnload = false | 
|     // detect google chrome packaged apps because they don't allow the 'unload' event | 
|   , isChromePackagedApp = global.chrome && global.chrome.app && global.chrome.app.runtime | 
|   ; | 
|   | 
| module.exports = { | 
|   attachEvent: function(event, listener) { | 
|     if (typeof global.addEventListener !== 'undefined') { | 
|       global.addEventListener(event, listener, false); | 
|     } else if (global.document && global.attachEvent) { | 
|       // IE quirks. | 
|       // According to: http://stevesouders.com/misc/test-postmessage.php | 
|       // the message gets delivered only to 'document', not 'window'. | 
|       global.document.attachEvent('on' + event, listener); | 
|       // I get 'window' for ie8. | 
|       global.attachEvent('on' + event, listener); | 
|     } | 
|   } | 
|   | 
| , detachEvent: function(event, listener) { | 
|     if (typeof global.addEventListener !== 'undefined') { | 
|       global.removeEventListener(event, listener, false); | 
|     } else if (global.document && global.detachEvent) { | 
|       global.document.detachEvent('on' + event, listener); | 
|       global.detachEvent('on' + event, listener); | 
|     } | 
|   } | 
|   | 
| , unloadAdd: function(listener) { | 
|     if (isChromePackagedApp) { | 
|       return null; | 
|     } | 
|   | 
|     var ref = random.string(8); | 
|     onUnload[ref] = listener; | 
|     if (afterUnload) { | 
|       setTimeout(this.triggerUnloadCallbacks, 0); | 
|     } | 
|     return ref; | 
|   } | 
|   | 
| , unloadDel: function(ref) { | 
|     if (ref in onUnload) { | 
|       delete onUnload[ref]; | 
|     } | 
|   } | 
|   | 
| , triggerUnloadCallbacks: function() { | 
|     for (var ref in onUnload) { | 
|       onUnload[ref](); | 
|       delete onUnload[ref]; | 
|     } | 
|   } | 
| }; | 
|   | 
| var unloadTriggered = function() { | 
|   if (afterUnload) { | 
|     return; | 
|   } | 
|   afterUnload = true; | 
|   module.exports.triggerUnloadCallbacks(); | 
| }; | 
|   | 
| // 'unload' alone is not reliable in opera within an iframe, but we | 
| // can't use `beforeunload` as IE fires it on javascript: links. | 
| if (!isChromePackagedApp) { | 
|   module.exports.attachEvent('unload', unloadTriggered); | 
| } |