var Validator = Class.create();
Validator.prototype = {
	
  initialize : function(form,callback) {
	this.form = form;
	this.isValidForm = true;
	this.isValidFld = true;
	this.errors = 0;
	this.callback = callback;
	this.allFields = Form.getElements(this.form);
	
	this.validClasses = Array(10);
	this.validClasses[0] =  Array("notempty","isNotEmpty");	
	this.validClasses[1] =  Array("validemail","isValidEmail");
	this.validClasses[2] =  Array("validtel","isValidTel");
	this.validClasses[3] =  Array("match","isMatch");
	this.validClasses[4] =  Array("validpass","isValidPass");
	this.validClasses[5] =  Array("isselect","isSelected");
	this.validClasses[6] =  Array("isvalidcc","isValidCard");
	this.validClasses[7] =  Array("validcarddate","isValidCardDate");
	this.validClasses[8] =  Array("isnumeric","isNumeric");
	this.validClasses[9] =  Array("issecnum","isSecurityNum");
	this.validClasses[10] =  Array("validpc","isValidPC");
	this.validClasses[11] =  Array("ischecked","isChecked");
},

processForm : function(){

	 	this.allFields.each(this.validate.bind(this));

		if(this.errors == 0){ 
		this.callback();
	}	
	
},

validate : function(elm){
	//set validation classes
//alert($(elm).id);
	//reset error messages
	for (i=0;i<this.validClasses.length;i++){
		if($(elm).hasClassName(this.validClasses[i][0])){
	this.resetErrorMsg(elm);
}
}
	if($(elm).hasClassName("required") || $F(elm)!="" || $F(elm)>0){

	
	for (i=0;i<this.validClasses.length;i++){
		if($(elm).hasClassName(this.validClasses[i][0])){
			validFunc = this.validClasses[i][1];
			this.isValidFld = this[validFunc](elm);
			if(!this.isValidFld) this.errors++;
		}
	}
	
}
},

resetForm : function(){
	$(this.form).reset();
		this.allFields.each(this.resetErrorMsg.bind(this));
},

	
setFormStatus : function(elm){
	//$("formStatus").innerHTML = value;
	var thiselm = $(elm).id;
	$("status").innerHTML = 'You have errors in your form. Please complete required fields and re-submit';
	$("status").show();
	//console.log(thiselm);
	$(thiselm + "_err").show();		
	},

resetErrorMsg : function(elm){
	for (i=0;i<this.validClasses.length;i++){
		if($(elm).hasClassName(this.validClasses[i][0])){
	var thiselm = $(elm).id;
//	alert(thiselm);
	var errorElm = thiselm + "_err";
	$(errorElm).hide();
	}
	}	
	},

isNotEmpty : function(elm){
//alert($(elm).id)
	this.resetErrorMsg(elm);
	var valid = true;
	if($F(elm).length < 2){
	valid = false;
	this.setFormStatus(elm);
	}
	return valid;
	},

isMatch : function(elm){
	this.resetErrorMsg(elm);
	var matchField = $(elm).id.gsub('_2', '');
	var valid = true;
	if($F(elm) != $F(matchField)){
	valid = false;
	this.setFormStatus(elm);
	}
	return valid;
	},

isValidEmail : function(elm){
//alert($(elm).id)
	this.resetErrorMsg(elm);
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	valid = filter.test($F(elm));
	if(!valid) this.setFormStatus(elm);
	return valid;
	},

isAlpha : function(elm){
	this.resetErrorMsg(elm);
	var filter =  /^[a-zA-z\s]+$/	;
	valid = filter.test($F(elm))
	if(!valid) this.setFormStatus(elm);
	return valid;
},

isAlphaNumeric : function(elm){
	this.resetErrorMsg(elm);
	var filter =   /^[a-zA-Z0-9]+$/	;
	valid = filter.test($F(elm))
	if(!valid) this.setFormStatus(elm);
	return valid;
},

isNumeric : function(elm){
	var valid = false;
	this.resetErrorMsg(elm);
	var filter =  /^[-]?\d+(\.\d+)?$/	;
	valid = filter.test($F(elm))
	if(!valid) this.setFormStatus(elm);
	return valid;
},

isSecurityNum : function(elm){
	var valid = true;
	this.resetErrorMsg(elm);
	var filter =  /^[-]?\d+(\.\d+)?$/	;
	valid = filter.test($F(value))
	if($F(elm).length < 3) valid = false;
	if(!valid) this.setFormStatus(elm);
	return valid;
},


isValidTel : function(elm){
	var tel = $F(elm).replace(" ","");
	this.resetErrorMsg(elm);
	valid = false;
	var filter  = /^([0-9]{11})$/;
	valid = filter.test(tel)
	if(!valid) this.setFormStatus(elm);
	return valid;
},

isValidCard : function(elm){
	var valid = true;
	var cardno = $F(elm).replace(" ","");
	this.resetErrorMsg(elm);
	//return false if number less than 13 chars or higher than 16
	if(cardno.length < 13) valid = false;
	//check is numeric
	if(isNaN(cardno))  valid = false;
	if(!valid) this.setFormStatus(elm);
	return valid;
},

isValidCardDate : function(elm){
	
},

isValidPC : function(elm){
	this.resetErrorMsg(elm);
	var valid = false;
	var pc = $F(elm).replace(" ","");
	var filter  = /^([A-Za-z]{1,2})([0-9]{2,3})([A-Za-z]{2})$/;
	valid = filter.test(pc)
	if(!valid) setFormStatus(elm);
	return valid;
},

isValidPass : function(elm){
	this.resetErrorMsg(elm);
	var valid = true;
	if($F(elm).length > 20 || $F(elm).length < 8 || $F(elm).indexOf(" ")> -1){
	valid = false;
	this.setFormStatus(elm);
	}
	return valid;
},

isSelected : function(elm){
	this.resetErrorMsg(elm);
	var valid = true;
	if($(elm).selectedIndex < 1){
	valid = false;
	this.setFormStatus(elm);
	}
	return valid;
	},
	
	
isChecked : function(elm){
	group = $(elm).name;
	this.resetErrorMsg(elm);
	var checkGroup = $$('[name="'+group+'"]');
	//$('apples').select('[title="yummy!"]');
	var totalchecked = 0;
	//console.log(checkGroup.length)
	for(var i=0;i< checkGroup.length ;i++){
	  if(checkGroup[i].checked == true){
	//	  console.log(checkGroup[i]+' is checked');
	   totalchecked +=1;
	   }
   }
   //console.log(totalchecked);
   if(totalchecked>0){
	   return true;
   } else {
	   this.setFormStatus(elm);
	   return false;
   }
}

}



