/*
 * jQuery AjaxQ - AJAX request queueing for jQuery
 *
 * Version: 0.0.1
 * Date: July 22, 2008
 *
 * Copyright (c) 2008 Oleg Podolsky (oleg.podolsky@gmail.com)
 * Licensed under the MIT (MIT-LICENSE.txt) license.
 *
 * http://plugins.jquery.com/project/ajaxq
 * http://code.google.com/p/jquery-ajaxq/
 */

jQuery.ajaxq = function (queue, options) {
  // Initialize storage for request queues if it's not initialized yet
  if (typeof document.ajaxq == 'undefined') document.ajaxq = { q: {}, r: null };

  // Initialize current queue if it's not initialized yet
  if (typeof document.ajaxq.q[queue] == 'undefined') document.ajaxq.q[queue] = [];

  if (typeof options != 'undefined') // Request settings are given, enqueue the new request
  {
    // Copy the original options, because options.complete is going to be overridden

    var optionsCopy = {};
    for (var o in options) optionsCopy[o] = options[o];
    options = optionsCopy;

    // Override the original callback

    var originalCompleteCallback = options.complete;

    options.complete = function (request, status) {
      // Dequeue the current request
      document.ajaxq.q[queue].shift();
      document.ajaxq.r = null;

      // Run the original callback
      if (originalCompleteCallback) originalCompleteCallback(request, status);

      // Run the next request from the queue
      if (document.ajaxq.q[queue].length > 0) document.ajaxq.r = jQuery.ajax(document.ajaxq.q[queue][0]);
    };

    // Enqueue the request
    document.ajaxq.q[queue].push(options);

    // Also, if no request is currently running, start it
    if (document.ajaxq.q[queue].length == 1) document.ajaxq.r = jQuery.ajax(options);
  } else // No request settings are given, stop current request and clear the queue
  {
    if (document.ajaxq.r) {
      document.ajaxq.r.abort();
      document.ajaxq.r = null;
    }

    document.ajaxq.q[queue] = [];
  }
};
