Team:TU-Munich/AjaxExtension.js

From 2013.igem.org

/**

* jQuery.ajax mid - CROSS DOMAIN AJAX 
* ---
* @author James Padolsey (http://james.padolsey.com)
* @version 0.11
* @updated 12-JAN-10
* ---
* Note: Read the README!
* ---
* @info http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/
*/

jQuery.ajax = (function(_ajax){

   var protocol = location.protocol,
       hostname = location.hostname,
       exRegex = RegExp(protocol + '//' + hostname),
       YQL = 'http' + (/^https/.test(protocol)?'s':) + '://query.yahooapis.com/v1/public/yql?callback=?',
       query = 'select * from html where url="{URL}" and xpath="*"';
   
   function isExternal(url) {
       return !exRegex.test(url) && /:\/\//.test(url);
   }
   
   return function(o) {
       
       var url = o.url;
       
       if ( /get/i.test(o.type) && !/json/i.test(o.dataType) && isExternal(url) ) {
           
           // Manipulate options so that JSONP-x request is made to YQL
           
           o.url = YQL;
           o.dataType = 'json';
           
           o.data = {
               q: query.replace(
                   '{URL}',
                   url + (o.data ?
                       (/\?/.test(url) ? '&' : '?') + jQuery.param(o.data)
                   : )
               ),
               format: 'xml'
           };
           
           // Since it's a JSONP request
           // complete === success
           if (!o.success && o.complete) {
               o.success = o.complete;
               delete o.complete;
           }
           
           o.success = (function(_success){
               return function(data) {
                   
                   if (_success) {
                       // Fake XHR callback.
                       _success.call(this, {
                           responseText: (data.results[0] || )
                               // YQL screws with <script>s
                               // Get rid of them
                               .replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, )
                       }, 'success');
                   }
                   
               };
           })(o.success);
           
       }
       
       return _ajax.apply(this, arguments);
       
   };
   

})(jQuery.ajax);