Index: js/ajax-responder.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/ctools/js/ajax-responder.js,v
retrieving revision 1.18.2.23
diff -u -p -r1.18.2.23 ajax-responder.js
--- js/ajax-responder.js	20 Aug 2010 21:14:53 -0000	1.18.2.23
+++ js/ajax-responder.js	26 Aug 2010 21:43:03 -0000
@@ -1,4 +1,4 @@
-// $Id: ajax-responder.js,v 1.18.2.23 2010/08/20 21:14:53 merlinofchaos Exp $
+// $Id: ajax-responder.js,v 1.18.2.18 2010/07/22 21:18:03 merlinofchaos Exp $
 /**
  * @file
  *
@@ -49,7 +49,7 @@
     var $objects = $('a[href=' + old_url + ']')
     $objects.addClass('ctools-fetching');
     try {
-      url = old_url.replace(/\/nojs(\/|$)/g, '/ajax$1');
+      url = Drupal.urlReplaceNojs(url);
       $.ajax({
         type: "POST",
         url: url,
@@ -108,7 +108,7 @@
     var object = $(this);
     $(this).addClass('ctools-ajaxing');
     try {
-      url = url.replace(/\/nojs(\/|$)/g, '/ajax$1');
+      url = url.replace(/\/nojs(\/|\?|&|$)/g, '/ajax$1');
       $.ajax({
         type: "POST",
         url: url,
@@ -150,7 +150,7 @@
     var object = $(this);
     try {
       if (url) {
-        url = url.replace(/\/nojs(\/|$)/g, '/ajax$1');
+        url = Drupal.urlReplaceNojs(url);
         $.ajax({
           type: "POST",
           url: url,
@@ -169,7 +169,21 @@
       else {
         var form = this.form;
         url = $(form).attr('action');
-        setTimeout(function() { Drupal.CTools.AJAX.ajaxSubmit(form, url); }, 1);
+        url = Drupal.urlReplaceNojs(url);
+        $(form).ajaxSubmit({
+          type: "POST",
+          url: url,
+          data: { 'js': 1, 'ctools_ajax': 1},
+          global: true,
+          success: Drupal.CTools.AJAX.respond,
+          error: function(xhr) {
+            Drupal.CTools.AJAX.handleErrors(xhr, url);
+          },
+          complete: function() {
+            object.removeClass('ctools-ajaxing');
+          },
+          dataType: 'json'
+        });
       }
     }
     catch (err) {
@@ -181,69 +195,6 @@
   };
 
   /**
-   * Event handler to submit an AJAX form.
-   *
-   * Using a secondary event ensures that our form submission is last, which
-   * is needed when submitting wysiwyg controlled forms, for example.
-   */
-  Drupal.CTools.AJAX.ajaxSubmit = function (form, url) {
-    $form = $(form);
-
-    if ($form.hasClass('ctools-ajaxing')) {
-      return false;
-    }
-
-    $form.addClass('ctools-ajaxing');
-
-    try {
-      url = url.replace(/\/nojs(\/|$)/g, '/ajax$1');
-
-      var ajaxOptions = {
-        type: 'POST',
-        url: url,
-        data: { 'js': 1, 'ctools_ajax': 1},
-        global: true,
-        success: Drupal.CTools.AJAX.respond,
-        error: function(xhr) {
-          Drupal.CTools.AJAX.handleErrors(xhr, url);
-        },
-        complete: function() {
-          $form.removeClass('ctools-ajaxing');
-          $('div.ctools-ajaxing-temporary').remove();
-        },
-        dataType: 'json'
-      };
-
-      // If the form requires uploads, use an iframe instead and add data to
-      // the submit to support this and use the proper response.
-      if ($form.attr('enctype') == 'multipart/form-data') {
-        $form.append('<input type="hidden" name="ctools_multipart" value="1">');
-        ajaxIframeOptions = {
-          success: Drupal.CTools.AJAX.iFrameJsonRespond,
-          iframe: true
-        };
-        ajaxOptions = $.extend(ajaxOptions, ajaxIframeOptions);
-      }
-
-      $form.ajaxSubmit(ajaxOptions);
-    }
-    catch (err) {
-      alert("An error occurred while attempting to process " + url);
-      $form.removeClass('ctools-ajaxing');
-      $('div.ctools-ajaxing-temporary').remove();
-      return false;
-    }
-  };
-
-  /**
-   * Wrapper for handling JSON responses from an iframe submission
-   */
-  Drupal.CTools.AJAX.iFrameJsonRespond = function(data) {
-    var myJson = eval(data);
-    Drupal.CTools.AJAX.respond(myJson);
-  }
-
-  /**
    * Display error in a more fashion way
    */
   Drupal.CTools.AJAX.handleErrors = function(xhr, path) {
@@ -287,7 +238,7 @@
     var form_id = $(object).parents('form').get(0).id;
     try {
       if (url) {
-        url = url.replace(/\/nojs(\/|$)/g, '/ajax$1');
+        url = Drupal.urlReplaceNojs(url);
         $.ajax({
           type: "POST",
           url: url,
@@ -342,19 +293,6 @@
     return url;
   };
 
-  Drupal.CTools.AJAX.getPath = function (link) {
-    if (!link) {
-      return;
-    }
-
-    var index = link.indexOf('?');
-    if (index != -1) {
-      link = link.substr(0, index);
-    }
-
-    return link;
-  }
-
   Drupal.CTools.AJAX.commands.prepend = function(data) {
     $(data.selector).prepend(data.data);
     Drupal.attachBehaviors($(data.selector));
@@ -421,17 +359,14 @@
     // Build a list of css files already loaded:
     $('link:not(.ctools-temporary-css)').each(function () {
       if ($(this).attr('type') == 'text/css') {
-        var link = Drupal.CTools.AJAX.getPath($(this).attr('href'));
-        if (link) {
-          Drupal.CTools.AJAX.css[link] = $(this).attr('href');
-        }
+        Drupal.CTools.AJAX.css[$(this).attr('href')] = $(this).attr('href');
       }
     });
 
     var html = '';
     for (i in data.argument) {
-      var link = Drupal.CTools.AJAX.getPath(data.argument[i].file);
-      if (!Drupal.CTools.AJAX.css[link]) {
+      if (!Drupal.CTools.AJAX.css[data.argument[i].file]) {
+//        Drupal.CTools.AJAX.css[data.argument[i].file] = data.argument[i].file;
         html += '<link class="ctools-temporary-css" type="text/css" rel="stylesheet" media="' + data.argument[i].media +
           '" href="' + data.argument[i].file + '" />';
       }
@@ -451,18 +386,14 @@
     // Build a list of scripts already loaded:
     var scripts = {};
     $('script').each(function () {
-      var link = Drupal.CTools.AJAX.getPath($(this).attr('src'));
-      if (link) {
-        Drupal.CTools.AJAX.scripts[link] = $(this).attr('src');
-      }
+      Drupal.CTools.AJAX.scripts[$(this).attr('src')] = $(this).attr('src');
     });
 
     var html = '';
     var head = document.getElementsByTagName('head')[0];
     for (i in data.argument) {
-      var link = Drupal.CTools.AJAX.getPath(data.argument[i]);
-      if (!Drupal.CTools.AJAX.scripts[link]) {
-        Drupal.CTools.AJAX.scripts[link] = link;
+      if (!Drupal.CTools.AJAX.scripts[data.argument[i]]) {
+        Drupal.CTools.AJAX.scripts[data.argument[i]] = data.argument[i];
         // Use this to actually get the script tag into the dom, which is
         // needed for scripts that self-reference to determine paths.
         var script = document.createElement('script');
@@ -518,7 +449,22 @@
     $(data.selector).submit();
   }
 
-
+  /**
+   * Replacing 'nojs' with 'ajax' in the URL allows for an easy method to let
+   * the server detect when it needs to degrade gracefully. 
+   * There are four scenarios to check for:
+   * 1. /nojs/
+   * 2. /nojs$ - The end of a URL string.
+   * 3. /nojs? - Followed by a query (with cleanurls enabled).
+   *      eg: path/nojs?destination=foobar
+   * 4. /nojs& - Followed by a query (without cleanurls enabled).
+   *      eg: ?q=path/nojs&destination=foobar
+   *   url = old_url.replace(/\/nojs(\/|$|\?|&)/g, '/ajax$1');
+   */
+  Drupal.CTools.AJAX.urlReplaceNojs = function(url) {
+    return url.replace(/\/nojs(\/|$|\?|&)/g, '/ajax$1');
+  }
+  
   /**
    * Bind links that will open modals to the appropriate function.
    */
@@ -551,10 +497,10 @@
        .change(Drupal.CTools.AJAX.changeAJAX);
 
     // Add information about loaded CSS and JS files.
-    if (Drupal.settings.CToolsAJAX && Drupal.settings.CToolsAJAX.css) {
+    if (Drupal.settings.CToolsAJAX.css) {
       $.extend(Drupal.CTools.AJAX.css, Drupal.settings.CToolsAJAX.css);
     }
-    if (Drupal.settings.CToolsAJAX && Drupal.settings.CToolsAJAX.scripts) {
+    if (Drupal.settings.CToolsAJAX.scripts) {
       $.extend(Drupal.CTools.AJAX.scripts, Drupal.settings.CToolsAJAX.scripts);
     }
   };
