formValidation = function(form_name, prefix, args){
	this.prefix = prefix;
	this.msg_prefix = '_MSG';
	this.formObj = eval('document.' +form_name);
	this.validateObj = new Array(); // fields to be validate
	this.error_count = 0;
	this.fields = 0; //total fields to be validate
	this.initialize(args);
}

formValidation.prototype = {
	initialize: function(args){
		for(i=0; i<this.formObj.length; i++){
			tmp_str = String(this.formObj[i].id);
			if(tmp_str.indexOf(this.prefix) == 0){
				this.validateObj[this.fields++] = this.formObj[i];
			}
		}
		this.start();
	},

	start: function(){
		if(this.fields<=0) return;
		
		//start validate
		for(i=0; i<this.fields; i++){			
			var len = String(this.prefix + this.validateObj[i].name).length;	
			//common checking
			var result = {};

			var extra = this.validateObj[i].id.substr(len+1, (this.validateObj[i].id.length)-(len+2));
			var extraObj = new Array();
			extraObj = extra.split(',');
			
			if(this.validateObj[i].type != 'radio' && this.validateObj[i] != 'checkbox'){
				results = this.validate('required', i);

				if(results.error && extra.indexOf('allow_empty') === 0){//reset back
					this.error_count -= 1;
					results = {};
				}
			}

			if(this.validateObj[i].id.length > len && !results.error){
				//var extra = this.validateObj[i].id.substr(len+1, (this.validateObj[i].id.length)-(len+2));
				//var extraObj = new Array();
				//extraObj = extra.split(',');
				var e=0;
				while(e<extraObj.length && !results.error){
					var results = this.validate(extraObj[e], i);
					e++;
				}
			}
			
			if(this.validateObj[i].className != ''){
				this.validateObj[i].className = (results.error >0) ? 'input-error' : 'input';	
			}

			document.getElementById(this.prefix +this.validateObj[i].name+ this.msg_prefix).style.display = (results.error >0) ? 'block' : 'none';
			document.getElementById(this.prefix +this.validateObj[i].name+ this.msg_prefix).style.color = (results.error >0) ? 'red' : 'green';
			document.getElementById(this.prefix +this.validateObj[i].name+ this.msg_prefix).innerHTML = (results.error >0) ? results.msg : '';
			//alert('done');
		}
	},

	validate: function(type, i){
		this.validateObj[i].value = trim(this.validateObj[i].value);
		var is_error = false; // no error detect by default
		var msg = '';

		var default_type = (type.indexOf('=') == 0) ? type : '';
		type = (type.indexOf('=') === 0) ? 'match' : type;
		//var value = (this.validateObj[i].type == 'checkbox' || this.validateObj[i].type == 'radio') ? this.validateObj[i].checked : this.validateObj[i].value;
		switch(type){
			case "checkbox": //must checked
				is_error = (this.validateObj[i].checked == true) ? false : true;
				msg += 'You need to accept the Terms and Conditions to complete your registration.';
			break;
			case "match":
				refer_id = default_type.substr(1);
				//is_error = (this.validateObj[i].value == document.getElementById(refer_id).value && this.validateObj[i].value != '') ? false : true;

				is_error = (this.validateObj[i].value == document.getElementById(refer_id).value) ? false : true;
				msg += (is_error == true) ? 'Verify Password does not match Original Password.' : '';
			break;
			case "required":
				is_error = (this.validateObj[i].value.match(/[^.*]/)) ? false : true;
				msg += (is_error == true) ? 'This field is required.' : '';
			break;
			case "email":
				is_error = (this.validateObj[i].value.match(/^[a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}$/i)) ? false : true;
				msg += (is_error == true) ? 'Please enter a valid email.' : '';
			break;
		}

		this.error_count += (is_error == true) ? 1 : 0;
		
		var obj = {};
		obj.error = is_error;
		obj.msg = msg;
		return obj;
	},
	
	submit: function(){
		this.formObj.submit();
	}
}

function validation(form_name, prefix, sfunc){	
	var form_name = form_name || 'adminForm';
	var prefix = prefix || 'REQ_';
	var fv = new formValidation(form_name, prefix);
	if(fv.error_count <=0){
		if(typeof sfunc == 'function'){
			sfunc();
		}
		else {
			fv.submit();
		}
		return true;
	}else{
		return false;
	}
}