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 })();