var VALIDATOR_MODE_ALERT = 1;
var VALIDATOR_MODE_DIV = 2;

function validator_form_submit_handler(e) {
  if(this.validationset) {
    if(this.validationset.validate()) {
    	if(this.validationset.old_onsubmit) {
	      var r =  this.validationset.old_onsubmit(e);
    	  return r;
    	}
    	return true;
    }
  }
  return false;
}

function JHPValidator(formname,mode) {
  if(!mode) {
    this.mode = VALIDATOR_MODE_DIV;
  } else {
    this.mode = mode;
  }
  this.formname = formname;
  this.validations = new Array();
  this.add = _add;
  this.validate = _validate;
  this.showMessage = _showMessage;
  this.cleanMessage = _cleanMessage;
  this.getMessage = _getMessage;
  this.formobj=document.forms[formname];

  this.formobj.validationset = this;
  if(!this.formobj) {
    alert("BUG: couldnot get Form object "+formname);
    return;
  }
  if(this.formobj.onsubmit) {
//	alert(this.formobj.onsubmit);
    this.old_onsubmit = this.formobj.onsubmit;
  } else {
    this.formobj.old_onsubmit = null;
  }
  this.formobj.onsubmit=validator_form_submit_handler;


  function _add(fieldname,type,options) {
    this.validations[fieldname] = new Validation(fieldname,type,options);
  }

  function _validate() {
  //alert("Validate " +this.formname+this.validations+this.validations.length);
    var i;
    var ar = true;
    for(var k in this.validations) {
//		alert(typeof k+":"+k);
      if(this.validations[k].validate) {
        var r = this.validations[k].validate();
        if(r) {
          this.showMessage(r,this.validations[k]);
          if(this.mode == VALIDATOR_MODE_ALERT) {
            return false;
          } else {
          }
          ar = ar && !r;
        } else {
          this.cleanMessage(this.validations[k]);
        }



      }
    }
    return ar;
  }
  function _cleanMessage(v) {
      if ($(v.fieldname+"_error")) $(v.fieldname+"_error").innerHTML= '';

  }
  function _showMessage(r,v) {
    if(this.mode == VALIDATOR_MODE_ALERT) {
      alert(v.fieldname +':'+this.getMessage(r) );
    } else {
      $(v.fieldname+"_error").innerHTML= this.getMessage(r);
    }
  }
  function _getMessage(r) {
    return JHPExtensions.constant(r);
  }

}

function Validation(fieldname,type,opt){
  this.fieldname = fieldname;
  this.type = type;
  this.options = opt;
  this.validate = _validate;
  this.getValue = _getValue;
  this.isSet = _isSet;

  function _getValue(v) {
  	if(v) {
	    return $(v).getValue();
  	} else {
//  		alert(this.fieldname);
	    return $(this.fieldname) ? $(this.fieldname).getValue():"";
	}
  }

  function _isSet(v) {
    return (v && v.length != 0);
  }
  function _validate() {
//		alert("validate" + this.fieldname);
    var v = this.getValue();
    if(typeof v == 'object' && v != null) {
      alert('internal not implemented array values ' +v +":"+this.fieldname);
      return 'not_implemented';
    }

    if(this.options['required']) {
      if(!this.isSet(v)) {
        return 'is_required';
      }
    }
    if(this.options['min_length'] && this.isSet(v)) {
      if(v.length < parseInt(this.options['min_length'])) {
        return 'min_length';
      }
    }
    if(this.options['max_length'] && this.isSet(v)) {
      if(v.length > parseInt(this.options['max_length'])) {
        return 'max_length';
      }
    }
    if(this.options['equals']) {
      if(v != this.getValue(this.options['equals'])) {
      	return 'equals';
      }
    }
    if(this.options['max_value'] !=null) {
    	t = parseFloat(this.options['max_value']);
    	v = parseFloat(v);
//    	alert("max " +t+":"+v);
    	if(v > t) return 'max_value';
    }
    if(this.options['min_value'] !=null) {
    	t = parseFloat(this.options['min_value']);
    	v = parseFloat(v);
    	if(v < t) return 'min_value';

    }

    if(this.type == 'email' && this.isSet(v)) {
        var usr = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
        var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
        var regex = "^"+usr+"\@"+domain+"$";
        var myrxp = new RegExp(regex);
        var check = (myrxp.test(v));
        if(!check) {
      return 'no_email';
        }


    } else if(this.type == 'url' && this.isSet(v)) {
        var protocol = "[a-zA-Z]{2,5}";
        var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
        var regex = "^"+protocol+":\/\/"+domain+"$";
        var myrxp = new RegExp(regex);
        var check = (myrxp.test(v));
        if(!check) {
	      return 'no_url';
        }
    } else if(this.type == 'integer' && this.isSet(v)) {
        var myrxp = new RegExp("^-?([0-9])*$");
        var check = (myrxp.test(v));
        if(!check) {
	      return 'no_integer';
        }
    } else if(this.type == 'float' && this.isSet(v)) {
        var myrxp = new RegExp("^-?([0-9])+\.?([0-9])*$");
        var check = (myrxp.test(v));
        if(!check) {
	      return 'no_float';
        }
    }
    return false;
  }

}
