--- js/modal.js	2010-07-23 00:26:04.000000000 +0200
+++ js/altered-modal.js	2010-08-11 23:02:42.384380500 +0200
@@ -1,271 +1,329 @@
-// $Id: modal.js,v 1.17.2.14 2010/07/22 22:26:04 merlinofchaos Exp $
-/**
- * @file
- *
- * Implement a modal form.
- *
- * @see modal.inc for documentation.
- *
- * This javascript relies on the CTools ajax responder.
- */
-
-(function ($) {
-  // Make sure our objects are defined.
-  Drupal.CTools = Drupal.CTools || {};
-  Drupal.CTools.Modal = Drupal.CTools.Modal || {};
-
-  /**
-   * Display the modal
-   */
-  Drupal.CTools.Modal.show = function() {
-    var resize = function(e) {
-      // For reasons I do not understand, when creating the modal the context must be
-      // Drupal.CTools.Modal.modal but otherwise the context must be more than that.
-      var context = e ? document : Drupal.CTools.Modal.modal;
-      $('div.ctools-modal-content', context).css({
-        'width': $(window).width() * .8 + 'px',
-        'height': $(window).height() * .8 + 'px'
-      });
-      $('div.ctools-modal-content .modal-content', context).css({
-        'width': ($(window).width() * .8 - 25) + 'px',
-        'height': ($(window).height() * .8 - 35) + 'px'
-      });
-    }
-
-    if (!Drupal.CTools.Modal.modal) {
-      Drupal.CTools.Modal.modal = $(Drupal.theme('CToolsModalDialog'));
-      $(window).bind('resize', resize);
-    }
-
-    resize();
-    $('span.modal-title', Drupal.CTools.Modal.modal).html(Drupal.t('Loading...'));
-    var opts = {
-      // @todo this should be elsewhere.
-      opacity: Drupal.settings.CToolsModal.backDropOpacity,
-      background: Drupal.settings.CToolsModal.backDropColor
-    };
-
-    Drupal.CTools.Modal.modalContent(Drupal.CTools.Modal.modal, opts);
-    $('#modalContent .modal-content').html(Drupal.theme('CToolsModalThrobber'));
-  };
-
-  /**
-   * Hide the modal
-   */
-  Drupal.CTools.Modal.dismiss = function() {
-    if (Drupal.CTools.Modal.modal) {
-      Drupal.CTools.Modal.unmodalContent(Drupal.CTools.Modal.modal);
-    }
-  };
-
-  /**
-   * Provide the HTML to create the modal dialog.
-   */
-  Drupal.theme.prototype.CToolsModalDialog = function () {
-    var html = ''
-    html += '  <div id="ctools-modal">'
-    html += '    <div class="ctools-modal-content">' // panels-modal-content
-    html += '      <div class="modal-header">';
-    html += '        <a class="close" href="#">';
-    html +=            Drupal.settings.CToolsModal.closeText + Drupal.settings.CToolsModal.closeImage;
-    html += '        </a>';
-    html += '        <span id="modal-title" class="modal-title">&nbsp;</span>';
-    html += '      </div>';
-    html += '      <div id="modal-content" class="modal-content">';
-    html += '      </div>';
-    html += '    </div>';
-    html += '  </div>';
-
-    return html;
-  }
-
-  /**
-   * Provide the HTML to create the throbber.
-   */
-  Drupal.theme.prototype.CToolsModalThrobber = function () {
-    var html = '';
-    html += '  <div id="modal-throbber">';
-    html += '    <div class="modal-throbber-wrapper">';
-    html +=        Drupal.settings.CToolsModal.throbber;
-    html += '    </div>';
-    html += '  </div>';
-
-    return html;
-  };
-
-  /**
-   * Click function for modals that can be cached.
-   */
-  Drupal.CTools.Modal.clickAjaxCacheLink = function () {
-    Drupal.CTools.Modal.show();
-    return Drupal.CTools.AJAX.clickAJAXCacheLink.apply(this);
-  };
-
-  /**
-   * Generic replacement click handler to open the modal with the destination
-   * specified by the href of the link.
-   */
-  Drupal.CTools.Modal.clickAjaxLink = function () {
-    // show the empty dialog right away.
-    Drupal.CTools.Modal.show();
-    Drupal.CTools.AJAX.clickAJAXLink.apply(this);
-    if (!$(this).hasClass('ctools-ajaxing')) {
-      Drupal.CTools.Modal.dismiss();
-    }
-
-    return false;
-  };
-
-  /**
-   * Generic replacement click handler to open the modal with the destination
-   * specified by the href of the link.
-   */
-  Drupal.CTools.Modal.clickAjaxButton = function() {
-    if ($(this).hasClass('ctools-ajaxing')) {
-      return false;
-    }
-
-    Drupal.CTools.Modal.show();
-    Drupal.CTools.AJAX.clickAJAXButton.apply(this);
-    if (!$(this).hasClass('ctools-ajaxing')) {
-      Drupal.CTools.Modal.dismiss();
-    }
-
-    return false;
-  };
-
-  /**
-   * Submit responder to do an AJAX submit on all modal forms.
-   */
-  Drupal.CTools.Modal.submitAjaxForm = function() {
-    if ($(this).hasClass('ctools-ajaxing')) {
-      return false;
-    }
-
-    url = $(this).attr('action');
-    $(this).addClass('ctools-ajaxing');
-    var object = $(this);
-    try {
-      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() {
-          object.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 ($(this).attr('enctype') == 'multipart/form-data') {
-        $(this).append('<input type="hidden" name="ctools_multipart" value="1">');
-        ajaxIframeOptions = {
-          success: Drupal.CTools.AJAX.iFrameJsonRespond,
-          iframe: true
-        };
-        ajaxOptions = $.extend(ajaxOptions, ajaxIframeOptions);
-      }
-
-      $(this).ajaxSubmit(ajaxOptions);
-    }
-    catch (err) {
-      alert("An error occurred while attempting to process " + url);
-      $(this).removeClass('ctools-ajaxing');
-      $('div.ctools-ajaxing-temporary').remove();
-      return false;
-    }
-    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);
-  }
-
-  /**
-   * Bind links that will open modals to the appropriate function.
-   */
-  Drupal.behaviors.ZZCToolsModal = function(context) {
-    // Bind links
-    // Note that doing so in this order means that the two classes can be
-    // used together safely.
-    $('a.ctools-use-modal-cache:not(.ctools-use-modal-processed)', context)
-      .addClass('ctools-use-modal-processed')
-      .click(Drupal.CTools.Modal.clickAjaxCacheLink)
-      .each(function () {
-        Drupal.CTools.AJAX.warmCache.apply(this);
-      });
-
-    $('a.ctools-use-modal:not(.ctools-use-modal-processed)', context)
-      .addClass('ctools-use-modal-processed')
-      .click(Drupal.CTools.Modal.clickAjaxLink);
-
-    // Bind buttons
-    $('input.ctools-use-modal:not(.ctools-use-modal-processed), button.ctools-use-modal:not(.ctools-use-modal-processed)', context)
-      .addClass('ctools-use-modal-processed')
-      .click(Drupal.CTools.Modal.clickAjaxButton);
-
-    // Bind submit links in the modal form.
-    $('#modal-content form:not(.ctools-use-modal-processed)', context)
-      .addClass('ctools-use-modal-processed')
-      .submit(Drupal.CTools.Modal.submitAjaxForm);
-    // add click handlers so that we can tell which button was clicked,
-    // because the AJAX submit does not set the values properly.
-
-    $('#modal-content input[type="submit"]:not(.ctools-use-modal-processed), button:not(.ctools-use-modal-processed)', context)
-      .addClass('ctools-use-modal-processed')
-      .click(function() {
-        if (Drupal.autocompleteSubmit && !Drupal.autocompleteSubmit()) {
-          return false;
-        }
-
-        // Make sure it knows our button.
-        if (!$(this.form).hasClass('ctools-ajaxing')) {
-          this.form.clk = this;
-          $(this).after('<div class="ctools-ajaxing ctools-ajaxing-temporary"> &nbsp; </div>');
-        }
-      });
-
-  };
-
-  // The following are implementations of AJAX responder commands.
-
-  /**
-   * AJAX responder command to place HTML within the modal.
-   */
-  Drupal.CTools.AJAX.commands.modal_display = function(command) {
-    $('#modal-title').html(command.title);
-    $('#modal-content').html(command.output);
-    Drupal.attachBehaviors();
-  }
-
-  /**
-   * AJAX responder command to dismiss the modal.
-   */
-  Drupal.CTools.AJAX.commands.modal_dismiss = function(command) {
-    Drupal.CTools.Modal.dismiss();
-    $('link.ctools-temporary-css').remove();
-  }
-
-  /**
-   * Display loading
-   */
-  Drupal.CTools.AJAX.commands.modal_loading = function(command) {
-    Drupal.CTools.AJAX.commands.modal_display({
-      output: Drupal.theme('CToolsModalThrobber'),
-      title: Drupal.t('Loading...')
-    });
-  }
-})(jQuery);
+// $Id: modal.js,v 1.17.2.14 2010/07/22 22:26:04 merlinofchaos Exp $
+/**
+ * @file
+ *
+ * Implement a modal form.
+ *
+ * @see modal.inc for documentation.
+ *
+ * This javascript relies on the CTools ajax responder.
+ */
+
+(function ($) {
+  // Make sure our objects are defined.
+  Drupal.CTools = Drupal.CTools || {};
+  Drupal.CTools.Modal = Drupal.CTools.Modal || {};
+
+  /**
+   * Display the modal
+   *
+   * @todo -- document the settings.
+   */
+  Drupal.CTools.Modal.show = function(choice) {
+    var opts = {};
+
+    if (choice && typeof choice == 'string' && Drupal.settings[choice]) {
+      // This notation guarantees we are actually copying it.
+      $.extend(opts, Drupal.settings[choice]);
+    }
+    else if (choice) {
+      $.extend(opts, choice);
+    }
+
+    var defaults = {
+      modalTheme: 'CToolsModalDialog',
+      throbberTheme: 'CToolsModalThrobber',
+      animation: 'show',
+      animationSpeed: 'fast',
+      modalSize: {
+        type: 'scale',
+        width: .8,
+        height: .8,
+        addWidth: 0,
+        addHeight: 0
+      },
+      modalOptions: {
+        opacity: .55,
+        background: '#fff'
+      }
+    };
+
+    var empty = {};
+    opts = $.extend(empty, Drupal.settings.CToolsModal, opts);
+
+    empty = {};
+    var settings = $.extend(empty, defaults, opts);
+
+    var resize = function(e) {
+      // When creating the modal, it actually exists only in a theoretical
+      // place that is not in the DOM. But once the modal exists, it is in the
+      // DOM so the context must be set appropriately.
+      var context = e ? document : Drupal.CTools.Modal.modal;
+
+      if (settings.modalSize.type == 'scale') {
+        var width = $(window).width() * settings.modalSize.width;
+        var height = $(window).height() * settings.modalSize.height;
+      }
+      else {
+        var width = settings.modalSize.width;
+        var height = settings.modalSize.height;
+      }
+      
+      // Define the additional pixel vars.
+      var addWidth = settings.modalSize.addWidth;
+      var addHeight = settings.modalSize.addHeight;
+
+      $('div.ctools-modal-content', context).css({
+        'width': width + addWidth + 'px',
+        'height': height + addHeight + 'px'
+      });
+      $('div.ctools-modal-content .modal-content', context).css({
+        'width': (width - 25) + 'px',
+        'height': (height - 42) + 'px'
+      });
+    }
+
+    if (!Drupal.CTools.Modal.modal) {
+      Drupal.CTools.Modal.modal = $(Drupal.theme(settings.modalTheme));
+      if (settings.modalSize.type == 'scale') {
+        $(window).bind('resize', resize);
+      }
+    }
+
+    resize();
+
+    $('span.modal-title', Drupal.CTools.Modal.modal).html(Drupal.t('Loading...'));
+    Drupal.CTools.Modal.modalContent(Drupal.CTools.Modal.modal, settings.modalOptions, settings.animation, settings.animationSpeed);
+    $('#modalContent .modal-content').html(Drupal.theme(settings.throbberTheme));
+  };
+
+  /**
+   * Hide the modal
+   */
+  Drupal.CTools.Modal.dismiss = function() {
+    if (Drupal.CTools.Modal.modal) {
+      Drupal.CTools.Modal.unmodalContent(Drupal.CTools.Modal.modal);
+    }
+  };
+
+  /**
+   * Provide the HTML to create the modal dialog.
+   */
+  Drupal.theme.prototype.CToolsModalDialog = function () {
+    var html = ''
+    html += '  <div id="ctools-modal">'
+    html += '    <div class="ctools-modal-content">' // panels-modal-content
+    html += '      <div class="modal-header">';
+    html += '        <a class="close" href="#">';
+    html +=            Drupal.settings.CToolsModal.closeText + Drupal.settings.CToolsModal.closeImage;
+    html += '        </a>';
+    html += '        <span id="modal-title" class="modal-title">&nbsp;</span>';
+    html += '      </div>';
+    html += '      <div id="modal-content" class="modal-content">';
+    html += '      </div>';
+    html += '    </div>';
+    html += '  </div>';
+
+    return html;
+  }
+
+  /**
+   * Provide the HTML to create the throbber.
+   */
+  Drupal.theme.prototype.CToolsModalThrobber = function () {
+    var html = '';
+    html += '  <div id="modal-throbber">';
+    html += '    <div class="modal-throbber-wrapper">';
+    html +=        Drupal.settings.CToolsModal.throbber;
+    html += '    </div>';
+    html += '  </div>';
+
+    return html;
+  };
+
+  /**
+   * Figure out what settings string to use to display a modal.
+   */
+  Drupal.CTools.Modal.getSettings = function (object) {
+    var match = $(object).attr('class').match(/ctools-modal-(\S+)/);
+    if (match) {
+      return match[1];
+    }
+  }
+
+  /**
+   * Click function for modals that can be cached.
+   */
+  Drupal.CTools.Modal.clickAjaxCacheLink = function () {
+    Drupal.CTools.Modal.show(Drupal.CTools.Modal.getSettings(this));
+    return Drupal.CTools.AJAX.clickAJAXCacheLink.apply(this);
+  };
+
+  /**
+   * Generic replacement click handler to open the modal with the destination
+   * specified by the href of the link.
+   */
+  Drupal.CTools.Modal.clickAjaxLink = function () {
+    // show the empty dialog right away.
+    Drupal.CTools.Modal.show(Drupal.CTools.Modal.getSettings(this));
+    Drupal.CTools.AJAX.clickAJAXLink.apply(this);
+    if (!$(this).hasClass('ctools-ajaxing')) {
+      Drupal.CTools.Modal.dismiss();
+    }
+
+    return false;
+  };
+
+  /**
+   * Generic replacement click handler to open the modal with the destination
+   * specified by the href of the link.
+   */
+  Drupal.CTools.Modal.clickAjaxButton = function() {
+    if ($(this).hasClass('ctools-ajaxing')) {
+      return false;
+    }
+
+    Drupal.CTools.Modal.show(Drupal.CTools.Modal.getSettings(this));
+    Drupal.CTools.AJAX.clickAJAXButton.apply(this);
+    if (!$(this).hasClass('ctools-ajaxing')) {
+      Drupal.CTools.Modal.dismiss();
+    }
+
+    return false;
+  };
+
+  /**
+   * Submit responder to do an AJAX submit on all modal forms.
+   */
+  Drupal.CTools.Modal.submitAjaxForm = function() {
+    if ($(this).hasClass('ctools-ajaxing')) {
+      return false;
+    }
+
+    url = $(this).attr('action');
+    $(this).addClass('ctools-ajaxing');
+    var object = $(this);
+    try {
+      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() {
+          object.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 ($(this).attr('enctype') == 'multipart/form-data') {
+        $(this).append('<input type="hidden" name="ctools_multipart" value="1">');
+        ajaxIframeOptions = {
+          success: Drupal.CTools.AJAX.iFrameJsonRespond,
+          iframe: true
+        };
+        ajaxOptions = $.extend(ajaxOptions, ajaxIframeOptions);
+      }
+
+      $(this).ajaxSubmit(ajaxOptions);
+    }
+    catch (err) {
+      alert("An error occurred while attempting to process " + url);
+      $(this).removeClass('ctools-ajaxing');
+      $('div.ctools-ajaxing-temporary').remove();
+      return false;
+    }
+    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);
+  }
+
+  /**
+   * Bind links that will open modals to the appropriate function.
+   */
+  Drupal.behaviors.ZZCToolsModal = function(context) {
+    // Bind links
+    // Note that doing so in this order means that the two classes can be
+    // used together safely.
+    $('a.ctools-use-modal-cache:not(.ctools-use-modal-processed)', context)
+      .addClass('ctools-use-modal-processed')
+      .click(Drupal.CTools.Modal.clickAjaxCacheLink)
+      .each(function () {
+        Drupal.CTools.AJAX.warmCache.apply(this);
+      });
+
+    $('a.ctools-use-modal:not(.ctools-use-modal-processed)', context)
+      .addClass('ctools-use-modal-processed')
+      .click(Drupal.CTools.Modal.clickAjaxLink);
+
+    // Bind buttons
+    $('input.ctools-use-modal:not(.ctools-use-modal-processed), button.ctools-use-modal:not(.ctools-use-modal-processed)', context)
+      .addClass('ctools-use-modal-processed')
+      .click(Drupal.CTools.Modal.clickAjaxButton);
+
+    // Bind submit links in the modal form.
+    $('#modal-content form:not(.ctools-use-modal-processed)', context)
+      .addClass('ctools-use-modal-processed')
+      .submit(Drupal.CTools.Modal.submitAjaxForm);
+    // add click handlers so that we can tell which button was clicked,
+    // because the AJAX submit does not set the values properly.
+
+    $('#modal-content input[type="submit"]:not(.ctools-use-modal-processed), button:not(.ctools-use-modal-processed)', context)
+      .addClass('ctools-use-modal-processed')
+      .click(function() {
+        if (Drupal.autocompleteSubmit && !Drupal.autocompleteSubmit()) {
+          return false;
+        }
+
+        // Make sure it knows our button.
+        if (!$(this.form).hasClass('ctools-ajaxing')) {
+          this.form.clk = this;
+          $(this).after('<div class="ctools-ajaxing ctools-ajaxing-temporary"> &nbsp; </div>');
+        }
+      });
+
+  };
+
+  // The following are implementations of AJAX responder commands.
+
+  /**
+   * AJAX responder command to place HTML within the modal.
+   */
+  Drupal.CTools.AJAX.commands.modal_display = function(command) {
+    $('#modal-title').html(command.title);
+    $('#modal-content').html(command.output);
+    Drupal.attachBehaviors();
+  }
+
+  /**
+   * AJAX responder command to dismiss the modal.
+   */
+  Drupal.CTools.AJAX.commands.modal_dismiss = function(command) {
+    Drupal.CTools.Modal.dismiss();
+    $('link.ctools-temporary-css').remove();
+  }
+
+  /**
+   * Display loading
+   */
+  Drupal.CTools.AJAX.commands.modal_loading = function(command) {
+    Drupal.CTools.AJAX.commands.modal_display({
+      output: Drupal.theme('CToolsModalThrobber'),
+      title: Drupal.t('Loading...')
+    });
+  }
+})(jQuery);
