/*
 *  $Id: ajaxForm.js 3281 2008-04-16 22:34:53Z zs $
 *
 *  Copyright (c) 2007 Underlying Inc. All rights reserved.
 *
 */
var ajaxForm = function(form_id, onInit, onSuccess, onSubmit, onError, options) 
{
  var formObject = document.getElementById(form_id); 

  if (typeof(onInit) != "undefined" && onInit != null && onInit != '') {
    onInit(this);
  }

  this.submit = function() {
    if (typeof(onSubmit) != "undefined" && onSubmit != null && onSubmit != '') {
      onSubmit(formObject);
    }
    YAHOO.util.Connect.setForm(formObject, (options && options.upload ? true : false)); 
    var callback = {
      success: function(o) { this_obj.processResponse(o); },
      upload: function(o) { this_obj.processUploadResponse(o); },
      failure: function(o) { this_obj.processError(o); }
    };
    cObj = YAHOO.util.Connect.asyncRequest('POST', formObject.action, callback);
    YAHOO.util.Dom.addClass(form_id + "_submit", "loading");
  }

  this.processError = function(o) {
    console.error("AJAX Form Error", o);
  }

  this.processUploadResponse = function(o) {
    if (o.responseText.substr(0,5) == '<pre>') {
      o.responseText = o.responseText.substr(5);
    }
    if (o.responseText.substr(o.responseText.length - 6) == '</pre>') {
      o.responseText = o.responseText.substr(0, o.responseText.length - 6);
    }
    this.processResponse(o);
  }

  this.processResponse = function(o) {
    var d = {};

    if (typeof(o.responseText) != "undefined") {
      d = eval('(' + o.responseText + ')');
    } else {
      this.processError(o);
    }

    if (d.valid == 1) {
      if (typeof(onSuccess) == "undefined" || onSuccess == null || onSuccess == '') {
        if (options && options.success_redirect_top && options.success_redirect_top == 1) {
          top.location.href = d.done;
        } else {
          window.location.href = d.done;
        }
        return;
      } else {
        // remove error state from fields
        for (var field in d.fields) {
          if (typeof(field) == "string") {
            YAHOO.util.Dom.removeClass(form_id + "_" + field, "ajaxform_invalid");
            YAHOO.util.Dom.addClass(form_id + "_" + field + "_err", "ajaxform_nodisp");
          }
        }
        YAHOO.util.Dom.removeClass(form_id + "_submit", "loading");
        return onSuccess(d);
      }
    } else {
      var focused = 0;
      for (var field in d.fields) {
        if (typeof(field) == "string") {
          if (d.fields[field].valid != 1) {
            if (focused == 0) {
              var elem = document.getElementById(form_id + "_" + field);
              if (elem) {
                try { document.getElementById(form_id + "_" + field).focus(); } catch(e) {}
                focused = 1;
              }
            }
            YAHOO.util.Dom.addClass(form_id + "_" + field, "ajaxform_invalid");
            var err_elem = document.getElementById(form_id + "_" + field + "_err");
            if (err_elem) {
              err_elem.innerHTML = d.fields[field].msg;
              YAHOO.util.Dom.removeClass(err_elem, "ajaxform_nodisp");
            } else {
            }
          } else {
            YAHOO.util.Dom.removeClass(form_id + "_" + field, "ajaxform_invalid");
            YAHOO.util.Dom.addClass(form_id + "_" + field + "_err", "ajaxform_nodisp");
          }
        }

	// resize forms if necessary
	var hash = window.name;
	if (typeof(parent.dipity.dialogs) != "undefined" &&
	    typeof(parent.dipity.dialogs[hash]) != "undefined") {
    autoResizePopupDialog();
	  document.body.scrollTop = 0;
	}
      }
      if (typeof(onError) != "undefined" && onError != null && onError != '') {
        YAHOO.util.Dom.removeClass(form_id + "_submit", "loading");
        return onError(d);
      }
    }
    YAHOO.util.Dom.removeClass(form_id + "_submit", "loading");
  }

  this.reset = function () {
    var error_fields = YAHOO.util.Dom.getElementsByClassName("ajaxform_invalid");
    YAHOO.util.Dom.removeClass(error_fields, "ajaxform_invalid");
    var error_divs = YAHOO.util.Dom.getElementsByClassName("ajaxform_err");
    YAHOO.util.Dom.addClass(error_divs, "ajaxform_nodisp");
    formObject.reset();
  };

  var this_obj = this;
};
