function XForm(form) {
    this.form = form;
    this.elements = new Array();
}

XForm.prototype.add = function(element) {
                         this.elements[this.elements.length] = element;
                         return this;
                     }

XForm.prototype.validate = function() {
                              try {
                                  for (var i = 0; i < this.elements.length; i++) {
                                      if (!this.elements[i].validate()) {
                                          return false;
                                      }
                                  }
                              } catch (e) {
                                  alert(e.name + ": " + e.message);
                                  return false;
                              }
                              return true;
                          }

XForm.alert = function(element, errorType) {
                 var input = element.element;
                 var label = input.form.getElementsByTagName("label");
                 var name = input.id;
                 for (var i = 0; i < label.length; i++) {
                     if (name == label[i].htmlFor) {
                         if (label[i].firstChild.tagName == "IMG") {
                             name = label[i].firstChild.alt;
                         } else {
                             name = label[i].innerHTML;
                         }
                         break;
                     }
                 }
                 name = name.replace(/<br>/g, " ");
                 if (errorType == 1) {
                     messages.alert("M053", name);
                     
                 } else if (errorType == 2) {
                     if (element instanceof XText) {
                         messages.alert("M054", [name, element.min, element.max]);
                     } else {
                         messages.alert("M055", [name, element.min, element.max]);
                     }
                 } else if (errorType == 3) {
                     messages.alert("M056", name);
                 } else if (errorType == 4) {
                	 messages.alert("M058", name);
                 }

                 input.focus();
                 if (element instanceof XText
                      || element instanceof XNumber) {
                     if (element.element.tagName != "SELECT") {
                         input.select();
                     }
                 }
                 return false;
             }

function XText(element, name) {
    this.element = $(element);
    if (!this.element) {
        alert("Invalid input: " + element);
    }
    this.name = name;
}

XText.prototype.nullable = function() {
                              this.isNullale = true;
                              return this;
                          }

XText.prototype.range = function(min, max) {
                 this.min = min;
                 this.max = max;
                 return this;
             }

XText.prototype.checkEmail = function() {
	this.isCheckEmail = true;
	return this;
}

XText.prototype.validate = function() {
                              var errorType = 1;
                              if (this.element) {
                                  var text = this.element.value;
                                  if (text) {
                                      text = new String(text);
                                      var length = text.strip().length;
                                      if (length > 0) {
                                    	  if (this.isCheckEmail) {
                                    		  var emailRegExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i;
                                    		  if (emailRegExp.test(text)) {
                                    			  return true;
                                    		  } else {
                                    			  errorType = 4;
                                    			  XForm.alert(this, errorType);
                                                  return false;
                                    		  }
                                    	  }
                                          if (this.min) {
                                              if (length >= this.min && length <= this.max) {
                                                  return true;
                                              }
                                              errorType = 2;
                                          } else {
                                              return true;
                                          }
                                      } else if (this.isNullale) {
                                          return true;
                                      }
                                  } else if (this.isNullale) {
                                      return true;
                                  } 
                              }
                              XForm.alert(this, errorType);
                              return false;
                          }

function XNumber(element) {
    this.element = $(element);
    if (!this.element) {
        alert("Invalid input: " + element);
    }
}

XNumber.prototype.nullable = function() {
                                 this.isNullable = true;
                                 return this;
                             }

XNumber.prototype.range = function(min, max) {
                              this.rangeCheck = true;
                              this.min = min;
                              this.max = max;
                              return this;
                          }

XNumber.prototype.validate = function() {
                                 var number = this.element.value;
                                 if (!number || number.length == 0) {
                                     if (this.isNullable) {
                                         return true;
                                     } else {
                                         return XForm.alert(this, 1);
                                     }
                                 }
                                 if (isNaN(number)) {
                                     return XForm.alert(this, 3);
                                 } else {
                                     number = Number(number);
                                     if (this.rangeCheck) {
                                         if (number < this.min || number > this.max) {
                                             return XForm.alert(this, 2);
                                         }
                                     }
                                 }
                                 return true;
                             }

function XCheck(element) {
    this.element = $(element);
}

XCheck.prototype.validate = function() {
                               if (this.element) {
                                   if (this.element.length) {
                                       for (var i = 0; i < this.element.length; i++) {
                                           if (this.element[i].checked) {
                                               return true;
                                           }
                                       }
                                   } else {
                                       if (this.element.checked) {
                                           return true;
                                       }
                                   }
                               } else {
                                   return false;
                               }
                               var name;
                               if (this.element.length) {
                                   name = this.element[0].title;
                               } else {
                                   name = this.element.title;
                               }
                               messages.alert("M057", name);
                               return false;
                           }

XForm.numberFilter = function(element, event) {
                         var code = event.charCode || event.keyCode;
                         if (event.shiftKey) {
                             return false;
                         }
                         
                         if (event.ctlrkey || event.altkey) {
                            return true;
                         }
                         if (code < 32) {
                            return true;
                         }
                         if (code == Event.KEY_END || code == Event.KEY_HOME || code == Event.KEY_LEFT || code == Event.KEY_RIGHT || code == Event.KEY_DELETE) {
                             return true;
                         }
                         var c = String.fromCharCode(code);
                         return !isNaN(c);
                     }
 
