SerializedLoader = Class.create();
SerializedLoader.prototype =
{
    initialize: function()
    {
      this.queue = $A();
      this.index = 0;
    },
    addRequest:function(prio,elementToUpdate,urlToCall,parameters)
    {
      this.queue[this.queue.size()] = new QueueEntry('load',prio,elementToUpdate,urlToCall,parameters);
    },
    addDispatch:function(prio,func)
    {
      this.queue[this.queue.size()] = new QueueEntry('exe',prio,func);
    },
    doLoad:function()
    {
       // Sort
       this.queue.sort(this._prioSort);

       // start loading
       this._loadNext();
    },
    _loadNext: function()
    {
        var item = this.queue[this.index];

        if(item)
        {
          this.index++;
          if(item.type == 'load')
          {
            item.parameters.onSuccess = this.onSuccess.bind(this);
            item.parameters.onFailed = this.onFailed.bind(this);
            new Ajax.Updater(item.elementToUpdate,item.urlToCall,item.parameters);
          }
          else
          {
              item.elementToUpdate(this._loadNext.bind(this));
          }
        }
    },
    onSuccess: function()
    {
      this._loadNext();
    },
    onFailed: function()
    {
      this._loadNext();
    },
    _prioSort: function(a,b)
    {
      if(a.prio > b.prio)
          return 1;
      else
          return -1;
    }
};

function QueueEntry(type,prio,elementToUpdate,urlToCall,parameters)
{
    this.type = type;
    this.prio = prio;
    this.elementToUpdate =elementToUpdate;
    this.urlToCall = urlToCall;
    this.parameters = parameters;
}

var serializedLoader = null;

function loadMe(prio,elementToUpdate,urlToCall,parameters)
{
  if(serializedLoader == null)
  {
    serializedLoader = new SerializedLoader();
    Event.observe(window, 'load',serializedLoader.doLoad.bind(serializedLoader));
  }
  serializedLoader.addRequest(prio,elementToUpdate,urlToCall,parameters);
}
function dispatchMe(prio,func)
{
  if(serializedLoader == null)
  {
    serializedLoader = new SerializedLoader();
    Event.observe(window, 'load',serializedLoader.doLoad.bind(serializedLoader));
  }
  serializedLoader.addDispatch(prio,func);
}
