| 
									
										
										
										
											2017-01-18 22:56:07 +00:00
										 |  |  | (function () { | 
					
						
							|  |  |  |   'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // I did try to shim jQuery's deferred, but it's just too clunky.
 | 
					
						
							|  |  |  |   // Here I use es6-promise which lacks asynchrity, but it's the smallest Promise implementation.
 | 
					
						
							|  |  |  |   // Only Opera Mini and MSIE (even on 11) will use this shim, so no biggie;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var oauth3 = window.OAUTH3; | 
					
						
							|  |  |  |   var count = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function inject() { | 
					
						
							|  |  |  |     count += 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (count >= 100) { | 
					
						
							|  |  |  |       throw new Error("you forgot to include rsvp.js, methinks"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |         [window.Promise, window.ES6Promise, window.RSVP.Promise].forEach(function (PromiseA) { | 
					
						
							|  |  |  |           var x = 1; new PromiseA(function (resolve, reject) { console.log('x', 1 === x); resolve(); }); x = 2; void null; | 
					
						
							|  |  |  |           var y = 1; PromiseA.resolve().then(function () { console.log('y', 2 === x); }); y = 2; void null; | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     var PromiseA = /*(window.RSVP && window.RSVP.Promise) || window.ES6Promise || */window.Promise; | 
					
						
							|  |  |  |     if ('undefined' !== typeof PromiseA) { | 
					
						
							|  |  |  |       oauth3.providePromise(PromiseA).then(function () { | 
					
						
							|  |  |  |         // ignore
 | 
					
						
							|  |  |  |         window.jqOauth3 = oauth3; | 
					
						
							|  |  |  |       }, function (err) { | 
					
						
							|  |  |  |         console.error(err); | 
					
						
							|  |  |  |         console.error("Bad Promise Implementation!"); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // because MSIE can't tell when a script is loaded
 | 
					
						
							|  |  |  |     setTimeout(inject, 100); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if ('undefined' === typeof Promise) { | 
					
						
							|  |  |  |     // support Opera Mini and MSIE 11+ (which doesn't support <!-- [if IE]> detection)
 | 
					
						
							|  |  |  |     /* jshint ignore: start */ | 
					
						
							|  |  |  |     document.write('<script src="bower_components/es6-promise/promise.min.js"></script>'); | 
					
						
							|  |  |  |     /* jshint ignore: end */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |     // I would have used this, but it turns out that
 | 
					
						
							|  |  |  |     // MSIE can't tell when a script has loaded
 | 
					
						
							|  |  |  |     var js = document.createElement("script"); | 
					
						
							|  |  |  |     js.setAttribute("src", "bower_components/es6-promise/promise.js"); | 
					
						
							|  |  |  |     js.setAttribute("type", "text/javascript"); | 
					
						
							|  |  |  |     document.getElementsByTagName("head")[0].appendChild(js); | 
					
						
							|  |  |  |     */ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inject(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function Request(opts) { | 
					
						
							|  |  |  |     if (!opts.method) { | 
					
						
							|  |  |  |       throw new Error("Developer Error: you must set method as one of 'GET', 'POST', 'DELETE', etc"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var req = { | 
					
						
							|  |  |  |       url: opts.url | 
					
						
							|  |  |  |       // Noted: jQuery 1.9 finally added 'method' as an alias of 'type'
 | 
					
						
							|  |  |  |     , method: opts.method | 
					
						
							|  |  |  |       // leaving type for backwards compat
 | 
					
						
							|  |  |  |     , type: opts.method | 
					
						
							| 
									
										
										
										
											2017-02-06 20:10:24 -05:00
										 |  |  |     , headers: opts.headers || {} | 
					
						
							| 
									
										
										
										
											2017-01-18 22:56:07 +00:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // don't allow accidetal querystring via 'data'
 | 
					
						
							|  |  |  |     if (opts.data && !/get|delete/i.test(opts.method)) { | 
					
						
							|  |  |  |       req.data = opts.data; | 
					
						
							| 
									
										
										
										
											2017-02-06 20:10:24 -05:00
										 |  |  |       if (opts.data && 'object' === typeof opts.data) { | 
					
						
							|  |  |  |         req.data = JSON.stringify(req.data); | 
					
						
							|  |  |  |         req.headers['Content-Type'] = 'application/json; charset=utf-8'; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-01-18 22:56:07 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // I don't trust jQuery promises...
 | 
					
						
							|  |  |  |     return new oauth3.PromiseA(function (resolve, reject) { | 
					
						
							|  |  |  |       $.ajax(req).then(function (data, textStatus, jqXhr) { | 
					
						
							|  |  |  |         var resp = {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         Object.keys(jqXhr).forEach(function (key) { | 
					
						
							|  |  |  |           // particularly we have to get rid of .then
 | 
					
						
							|  |  |  |           if ('function' !== typeof jqXhr[key]) { | 
					
						
							|  |  |  |             resp[key] = jqXhr[key]; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         resp.data = data; | 
					
						
							|  |  |  |         resp.status = textStatus; | 
					
						
							|  |  |  |         resp.request = jqXhr; | 
					
						
							|  |  |  |         resolve(resp); | 
					
						
							|  |  |  |       }, function (jqXhr, textStatus, errorThrown) { | 
					
						
							|  |  |  |         errorThrown.request = jqXhr; | 
					
						
							|  |  |  |         errorThrown.response = jqXhr; | 
					
						
							|  |  |  |         errorThrown.status = textStatus; | 
					
						
							|  |  |  |         reject(errorThrown); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   oauth3.provideRequest(Request); | 
					
						
							|  |  |  | }()); |