function validate_form (id) {

  this.validate_rules = new Array();
  this.form_id = id;
  this.validate_errors = new Array();
  this.invalid_fields = new Array();
  this.all_blank = true;
  
  this.add_validate_rule = function(field, rule, err) {
    crule = new Object();
    crule.rule = rule;
    crule.field = field;
    crule.err = err;
    this.validate_rules[this.validate_rules.length] = crule;
  }
  
  this.validate = function(field, rule) {
    if (
        document.getElementById(this.form_id+"_"+field) &&
        typeof(document.getElementById(this.form_id+"_"+field)) != "undefined" &&
        typeof(document.getElementById(this.form_id+"_"+field).value) != "undefined"
      )
    {
      value = document.getElementById(this.form_id+"_"+field).value;
    }
    
    if (rule == "firstname" || rule == "lastname"){
      if (value != "" && value.length >= 3) {
        return true;
      }
    }
    else if (rule == "email"){
      return this.email_check(value);
    }
    else if (rule == "password"){
      if (value.length >= 4){
        return true;
      }
    }
    else if (rule == "cpassword") {
      temp = field.split(",");
      field1 = temp[0];
      field2 = temp[1];
      if (
        document.getElementById(this.form_id+"_"+field1).value ==
        document.getElementById(this.form_id+"_"+field2).value
      ) 
      return true;
    }
    else if (rule == "username"){
      if (value.length >= 4 && value.indexOf(" ") == -1){
        return true;
      }
    }
    else if (rule == "yahooid"){
      if (value.length >= 2){
        return true;
      }
    }
    else if (rule == "sex"){
      if (document.getElementById(this.form_id+"_sex_m") && document.getElementById(this.form_id+"_sex_f")) {
        if (document.getElementById(this.form_id+"_sex_m").checked || document.getElementById(this.form_id+"_sex_f").checked){
          return true;
        }
      }
      else
        return true;
    }
    else if (rule == ":not_empty") {
      if (value != "") {
        return true;
      }
    }
    else if (rule == "!=") {
      temp = field.split(",");
      field1 = temp[0];
      field2 = temp[1];
      if (
        document.getElementById(this.form_id+"_"+field1).value !=
        document.getElementById(this.form_id+"_"+field2).value
      ) 
      return true;
    }

    return false;
  }
  
  this.email_check = function (str) {
		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		if (str.indexOf(at)==-1){
		   return false
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   return false
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    return false
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		    return false
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){

		    return false
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		    return false
		 }
		
		 if (str.indexOf(" ")!=-1){
		    return false
		 }
     
 		 return true;
  }
  
  this.validate_form = function() {
    valid = true;
    this.all_blank = true;
    for (i=0; i<this.validate_rules.length; i++) {
      if (document.getElementById(this.form_id + "_" + this.validate_rules[i].field)){
        if (document.getElementById(this.form_id + "_" + this.validate_rules[i].field).value)
          if (document.getElementById(this.form_id + "_" + this.validate_rules[i].field).value != "")
            this.all_blank=false;
      }
      if (!this.validate (this.validate_rules[i].field, this.validate_rules[i].rule)){
        this.validate_errors[this.validate_errors.length] = this.validate_rules[i].err;
        this.invalid_fields[this.invalid_fields.length] = this.validate_rules[i].field;
        valid = false;
      }
    }
    return valid;
  }
}

function validate_form_func (formid, rules, all_blank_err) {
  f = new validate_form (formid);
  
  for (i=0;i<rules.length;i++) {
    f.add_validate_rule (rules[i].field, rules[i].rule, rules[i].err_msg);
  }
  
  for(i=0;i<rules.length;i++) {
    fld = rules[i].field;
    if (document.getElementById(formid+"_"+fld+"_tr"))
      document.getElementById(formid+"_"+fld+"_tr").className = "";
  }
  
  if (!f.validate_form ()) {
    
    if (f.all_blank) {
      err (all_blank_err);
    }
    
    else {
      var errs = "";
      for(i=0;i<f.validate_errors.length;i++) {
        errs += f.validate_errors[i];
        if (i<f.validate_errors.length - 1) {
          errs += "<br />";
        }
      }
    
      for(i=0;i<f.invalid_fields.length;i++) {
        field = f.invalid_fields[i];
        if (document.getElementById(formid+"_"+field+"_tr"))
          document.getElementById(formid+"_"+field+"_tr").className = "error_tr";
      }
    
      // Display the errors
      err(errs);
    }
    
    return false;
  }
  else {
    return true;
  }
}
