/**
 * Visual form update monitor
 * 01/2006
 * alex at zybar.net
 * @require jsJDK/ElementUtil.js
 */

var formValues = new Array();

function MonitorUpdateForm() {
};

MonitorUpdateForm.monitorForms = function(className) {
       for (var i = 0; i < document.forms.length; i++) {
          var f = document.forms[i];
	  if (className == null || ElementUtil.hasClass(f, className)) {
		  if (f.onreset) {
			  f.oldOnReset = f.onreset;
		  }
		  f.onreset = function(event) {
			  if (this.oldOnReset) {
				  this.oldOnReset(event);
			  }
			  for (var j = 0; j < this.elements.length; j++) {
				  var field = this.elements[j];
				  ElementUtil.removeClass(field, "MonitorForm_modified");
			  }
		  };
		  formValues[f.name] = new Array();
		  for (var j = 0; j < f.elements.length; j++) {
			  var field = f.elements[j];
			  this.monitorField(field);
		  }
	  }
       }
};

MonitorUpdateForm.monitorField = function(field) {
       if (field.onchange) {
          field.oldOnChange = field.onchange;  
       }

       // setDefaultValue
       if ("text" == field.type || "password" == field.type ||
           "textarea" == field.type || "checkbox" == field.type) {
         // nothing to do
       } else {
         var value = this.getValue(field);
         if (value != null) {
            this.setDefaultValue(field, value);
         }
       }
       
       // (re)define "onchange"
       field.onchange = function(event) {
             if (MonitorUpdateForm.hasChanged(this)) {
                 ElementUtil.addClass(this, "MonitorForm_modified");
             } else {
	         ElementUtil.removeClass(this, "MonitorForm_modified");
             }
             if (this.oldOnChange) {
	             this.oldOnChange(event);
             }
       }
};

MonitorUpdateForm.setDefaultValue = function(elem, value) {
	    formValues[elem.form.name][elem.name] = value;
};

MonitorUpdateForm.getDefaultValue = function(elem) {
       if ("text" == elem.type || "password" == elem.type || "textarea" == elem.type) {
          return elem.defaultValue;
       } else if ("checkbox" == elem.type) {
          return elem.defaultChecked;
       }
       return formValues[elem.form.name][elem.name];
};

MonitorUpdateForm.getValue = function(elem) {
       var value = null;
       if ("text" == elem.type || "password" == elem.type ||
           "textarea" == elem.type || "checkbox" == elem.type) {
          value = elem.value;
       } else if ("select-one" == elem.type) {
           if (elem.selectedIndex >= 0) {
             value = elem.selectedIndex;
           } else {
             value = 0;
           }
       } else if ("select-multiple" == elem.type) {
           value = new Array();
           for (var i = 0; i < elem.options.length; i++) {
             if (elem.options[i].selected) {
               value[value.length] = i;
             }
           }
       } else if ("radio" == elem.type) {
           if (elem.defaultChecked) {
              value = elem.value;
           }
       }
       
       return value;
};

MonitorUpdateForm.hasChanged = function(elem) { 
        return !this.equals(this.getDefaultValue(elem), this.getValue(elem));
};
    
MonitorUpdateForm.equals = function (val1, val2) {
       var type1 = typeof(val1);
       var type2 = typeof(val2);
       if (type1 != type2) {
          return false;
       }
       if (Array.prototype.isPrototypeOf(val1)) {
          if (val1.length != val2.length) {
             return false;
          }
          for (var i = 0; i < val1.length; i++) {
             if (!this.equals(val1[i], val2[i])) {
                return false;
             }
          }
          return true;
       }
       return val1 == val2;
};
