Drupal.Ajax = new Object;
Drupal.Ajax.plugins = {};
Drupal.Ajax.pass = true;
Drupal.Ajax.firstRun = false;
Drupal.Ajax.init = function(context) {
  var f, s;
  if (f = $('.ajax-form', context)) {
    if (!Drupal.Ajax.firstRun) {
      Drupal.Ajax.invoke('init');
      Drupal.Ajax.firstRun = true;
    }
    s = $('input[type="submit"]', f);
    s.click(function(){
      this.form.ajax_activator = $(this);
      return true;
    });
    f.each(function(){
      this.ajax_activator = null;
      $(this).submit(function(){
        if (this.ajax_activator === null) {
          this.ajax_activator = $('#edit-submit', this);
        }
        if (this.ajax_activator.hasClass('ajax-trigger')) {
          Drupal.Ajax.go($(this), this.ajax_activator);
          return false;
        }
        else {
          return true;
        }
      });
      return true;
    });
  }
  return false;
}
Drupal.Ajax.invoke = function(hook, args) {
  var plugin, r;
  for (plugin in Drupal.Ajax.plugins) {
    r = Drupal.Ajax.plugins[plugin](hook, args);
    if (r === false) {
      return false;
    }
  }
  return true;
}
Drupal.Ajax.go = function(formObj, submitter) {
  var data, loadingBox, formObj, data, submitter, submitterVal, thisForm;
  if (!Drupal.Ajax.pass) {
    return false;
  }
  else {
    Drupal.Ajax.invoke('submit');
    submitterVal = submitter.val();
    data = formObj.serializeArray();
    data[data.length] = {
      name: submitter.attr('name'),
      value: submitterVal
    };
    data[data.length] = {
      name: 'ajax',
      value: 1
    };
    submitter.val(Drupal.t('Loading...'));
    $.ajax({
      url: formObj[0].getAttribute('action'),
      data: data,
      type: 'POST',
      async: true,
      dataType: 'json',
      success: function(data){
        submitter.val(submitterVal);
        Drupal.Ajax.response(submitter, formObj, data);
      }
    })
    return false;
  }
}
Drupal.Ajax.scroller = function(submitter) {
  var scroll_weight, box, found, timer;
  scroll_weight = 100;
  timer = window.setInterval(function() {
    box = submitter;
    found = false;
    while (box.parentNode !== null &&
        Drupal.Ajax.invoke('scrollFind', {container:box})) {
      box = box.parentNode;
      if (box === document) {
        if (box.documentElement.scrollTop &&
            box.documentElement.scrollTop > 0) {
          box.documentElement.scrollTop -= scroll_weight;
          found = true;
        }
      }
      else if (box === document.body) {
        if (box.scrollTop &&
            box.scrollTop > 0) {
          box.scrollTop -= scroll_weight;
          found = true;
        }
      }
      else if (box === window) {
        if ((window.pageYOffset && window.pageYOffset > 0) ||
            (window.scrollY && window.scrollY > 0)) {
          window.scrollBy(0, -scroll_weight);
          found = true;
        }
      }
      else {
        if (box.scrollTop &&
            box.scrollTop > 0) {
          box.scrollTop -= scroll_weight;
          found = true;
        }
      }
    }
    if (!found) {
      window.clearInterval(timer);
    }
    return true;
  }, 100);
  return true;
}

Drupal.Ajax.message = function(messages, type, formObj, submitter) {
  var i, _i, thisItem, log, errBox, h;
  $('.messages, .ajax-preview', formObj).remove();
  $('input, textarea').removeClass('error status warning required');
  if (type === 'preview') {
    log = $('<div>').addClass('ajax-preview');
    log.html(messages);
    formObj.prepend(log);
  }
  else {
    log = $('<ul>');
    errBox = $(".messages." + type, formObj[0])
    for (i = 0, _i = messages.length; i < _i; i++) {
      thisItem = $('#' + messages[i].id, formObj[0])
      thisItem.addClass(type);
      if (messages[i].required) {
        thisItem.addClass('required');
      }
      log.append('<li>' + messages[i].value + '</li>');
    }
    if (errBox.length === 0) {
      errBox = $("<div class='messages " + type + "'>");
      formObj.prepend(errBox);
    }
    errBox.html(log);
  }
  Drupal.Ajax.scroller(submitter[0]);
  return true;
}

Drupal.Ajax.updater = function(updaters) {
  var i, _i, elm;
  for (i = 0, _i = updaters.length; i < _i; i++) {
    elm = $(updaters[i].selector);
    if (updaters[i].type === 'html_in') {
      elm.html(updaters[i].value);
    }
    else if (updaters[i].type === 'html_out') {
      elm.replaceWith(updaters[i].value);
    }
    else if (updaters[i].type === 'field') {
      elm.val(updaters[i].value);
    }
    else if(updaters[i].type === 'remove') {
      elm.remove();
    }
  }
  return true;
}
Drupal.Ajax.response = function(submitter, formObj, data){
  var newSubmitter;
  /**
   * Failure
   */
  if (data.status === false) {
    Drupal.Ajax.updater(data.updaters);
    Drupal.Ajax.message(data.messages_error, 'error', formObj, submitter);
  }
  else {
    if (data.preview !== null) {
      Drupal.Ajax.updater(data.updaters);
      Drupal.Ajax.message(decodeURIComponent(data.preview), 'preview',
        formObj, submitter);
    }
    else if (data.redirect === null) {
      if (data.messages_status.length > 0) {
        Drupal.Ajax.message(data.messages_status, 'status', formObj, submitter);
      }
      if (data.messages_warning.length > 0) {
        Drupal.Ajax.message(data.messages_warning, 'warning', formObj, submitter);
      }
      if (data.messages_status.length === 0 &&
          data.messages_warning.length === 0) {
        Drupal.Ajax.message([{
          id : 0,
          value : Drupal.t('Submission Complete')
        }], 'status', formObj, submitter);
      }
    }
    else {
      window.location.href = data.redirect;
    }
  }
  return true;
}
Drupal.behaviors.Ajax = Drupal.Ajax.init;