| 'use strict'; | 
|   | 
| var EventEmitter = require('events').EventEmitter | 
|   , inherits = require('inherits') | 
|   , eventUtils = require('../../utils/event') | 
|   , browser = require('../../utils/browser') | 
|   , urlUtils = require('../../utils/url') | 
|   ; | 
|   | 
| var debug = function() {}; | 
| if (process.env.NODE_ENV !== 'production') { | 
|   debug = require('debug')('sockjs-client:sender:xdr'); | 
| } | 
|   | 
| // References: | 
| //   http://ajaxian.com/archives/100-line-ajax-wrapper | 
| //   http://msdn.microsoft.com/en-us/library/cc288060(v=VS.85).aspx | 
|   | 
| function XDRObject(method, url, payload) { | 
|   debug(method, url); | 
|   var self = this; | 
|   EventEmitter.call(this); | 
|   | 
|   setTimeout(function() { | 
|     self._start(method, url, payload); | 
|   }, 0); | 
| } | 
|   | 
| inherits(XDRObject, EventEmitter); | 
|   | 
| XDRObject.prototype._start = function(method, url, payload) { | 
|   debug('_start'); | 
|   var self = this; | 
|   var xdr = new global.XDomainRequest(); | 
|   // IE caches even POSTs | 
|   url = urlUtils.addQuery(url, 't=' + (+new Date())); | 
|   | 
|   xdr.onerror = function() { | 
|     debug('onerror'); | 
|     self._error(); | 
|   }; | 
|   xdr.ontimeout = function() { | 
|     debug('ontimeout'); | 
|     self._error(); | 
|   }; | 
|   xdr.onprogress = function() { | 
|     debug('progress', xdr.responseText); | 
|     self.emit('chunk', 200, xdr.responseText); | 
|   }; | 
|   xdr.onload = function() { | 
|     debug('load'); | 
|     self.emit('finish', 200, xdr.responseText); | 
|     self._cleanup(false); | 
|   }; | 
|   this.xdr = xdr; | 
|   this.unloadRef = eventUtils.unloadAdd(function() { | 
|     self._cleanup(true); | 
|   }); | 
|   try { | 
|     // Fails with AccessDenied if port number is bogus | 
|     this.xdr.open(method, url); | 
|     if (this.timeout) { | 
|       this.xdr.timeout = this.timeout; | 
|     } | 
|     this.xdr.send(payload); | 
|   } catch (x) { | 
|     this._error(); | 
|   } | 
| }; | 
|   | 
| XDRObject.prototype._error = function() { | 
|   this.emit('finish', 0, ''); | 
|   this._cleanup(false); | 
| }; | 
|   | 
| XDRObject.prototype._cleanup = function(abort) { | 
|   debug('cleanup', abort); | 
|   if (!this.xdr) { | 
|     return; | 
|   } | 
|   this.removeAllListeners(); | 
|   eventUtils.unloadDel(this.unloadRef); | 
|   | 
|   this.xdr.ontimeout = this.xdr.onerror = this.xdr.onprogress = this.xdr.onload = null; | 
|   if (abort) { | 
|     try { | 
|       this.xdr.abort(); | 
|     } catch (x) { | 
|       // intentionally empty | 
|     } | 
|   } | 
|   this.unloadRef = this.xdr = null; | 
| }; | 
|   | 
| XDRObject.prototype.close = function() { | 
|   debug('close'); | 
|   this._cleanup(true); | 
| }; | 
|   | 
| // IE 8/9 if the request target uses the same scheme - #79 | 
| XDRObject.enabled = !!(global.XDomainRequest && browser.hasDomain()); | 
|   | 
| module.exports = XDRObject; |