1 (function(){
  2   
  3   function addParamToUrl(url, param) {
  4     return url + (/\?/.test(url) ? '&' : '?') + param;
  5   }
  6   
  7   var makeXHR = (function() {
  8     var factories = [
  9       function() { return new ActiveXObject("Microsoft.XMLHTTP"); },
 10       function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
 11       function() { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); },
 12       function() { return new XMLHttpRequest(); }
 13     ];
 14     for (var i = factories.length; i--; ) {
 15       try {
 16         var req = factories[i]();
 17         if (req) {
 18           return factories[i];
 19         }
 20       }
 21       catch (err) { }
 22     }
 23   })();
 24 
 25   function emptyFn() { };
 26   
 27   /**
 28    * Cross-browser abstraction for sending XMLHttpRequest
 29    * @method request
 30    * @memberOf fabric.util
 31    * @param {String} url URL to send XMLHttpRequest to
 32    * @param {Object} [options] Options object
 33    * @param {String} [options.method="GET"]
 34    * @param {Function} options.onComplete Callback to invoke when request is completed
 35    * @return {XMLHttpRequest} request
 36    */
 37   function request(url, options) {
 38 
 39     options || (options = { });
 40 
 41     var method = options.method ? options.method.toUpperCase() : 'GET',
 42         onComplete = options.onComplete || function() { },
 43         request = makeXHR(),
 44         body;
 45         
 46     /** @ignore */
 47     request.onreadystatechange = function() {
 48       if (request.readyState === 4) {
 49         onComplete(request);
 50         request.onreadystatechange = emptyFn;
 51       }
 52     };
 53     
 54     if (method === 'GET') {
 55       body = null;
 56       if (typeof options.parameters == 'string') {
 57         url = addParamToUrl(url, options.parameters);
 58       }
 59     }
 60 
 61     request.open(method, url, true);
 62     
 63     if (method === 'POST' || method === 'PUT') {
 64       request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 65     }
 66 
 67     request.send(body);
 68     return request;
 69   };
 70   
 71   fabric.util.request = request;
 72 })();