
var msgCode =
{
	EMAIL:"email",
	DATE:"date",
	REQUIRED:"required",
	MATCH:"match",
	MIN_LEN:"minlen",
	ALPHA:"alha",
	INT:"int",
	FLOAT:"float",
	ALL:"all",
	ZIPCODE:"zipcode",
	PHONE:"phone",
	CREDIT:"credit"
}



function Validator(form)
{
	this.form = form;
	this.labels = this.form.getElementsByTagName("label");
	this.errorCnt=0;
	this.fields = new Array();
	
	if(this.labels.length)
	{
		for(index in this.labels)
		{
			var label = this.labels[index];
			
			if(label==undefined)
				continue
			
			if(label.innerHTML)
			{
				var fieldName = $(label).attr("for");
			
				if((fieldName)&&(this.form.elements[fieldName]!=undefined))
				{
					var inst2 = label.className.match(/\[(.*?)\]/);
					
					if(!inst2)
						continue;
					
					inst = inst2[1];
					var fieldItem = {label:label,field:this.form.elements[fieldName],ins:inst};
					this.fields.push(fieldItem);
				}
			}
			else{}
		}
	}
			
}


Validator.prototype.validate = function()
{
	while(this.fields.length>0)
	{
		if(!this.validateField(this.fields.pop()))
		{
			this.errorCnt++;
		}
		else
		{
			
		}
	}
	
	return this.errorCnt;
}

Validator.prototype.validateField = function(fieldItem)
{
	var instructions = fieldItem.ins;
	var field = fieldItem.field;
	var label = fieldItem.label;	
	
	var blah = instructions.split(":");
	var type = blah[0];
	var isRequired = (blah[1]==1?true:false);
	var msgParams = false;
	
	var valid=true;
		
	
	if(field.value.length>0)
	{
		switch(type)
		{
			case "date":
			
			
				if(string = field.value.match(/^[0-9]{1,2}[/]{1}[0-9]{1,2}[/]{1}[0-9]{4}$/))
					valid = true;
				else
				{
					msgID = msgCode.DATE;
					valid = false;
				}
			
			
			break;
			case "email":
			
				if(string = field.value.match(/^[0-9a-zA-Z_\.\+\-]+@([1-9a-zA-Z\.]+)[\.]{1}[a-zA-Z]{2,4}$/))
					valid=true;
				else
				{
					msgID = msgCode.EMAIL;	
					valid=false;
				}
				
			break;
			case "alpha":
				if(field.value.match(/^[A-Za-z ]+$/))
					valid=true;
				else
				{
					msgID = msgCode.ALPHA;	
					valid=false;
				}
			break;
			case "int":
			
				if(field.value.match(/^[0-9]+$/))
					valid=true;
				else
				{
					msgID = msgCode.INT;	
					valid=false;
				}
			break;
			case "float":
				if(field.value.match(/^[0-9\.\,]+$/))
					valid=true;
				else
				{
					msgID = msgCode.FLOAT;	
					valid=false;
				}
			break;
			case "zipcode":
				if(field.value.match(/^[0-9]{5}$/)?true:false)
					valid=true;
				else
				{
					msgID = msgCode.ZIPCODE;	
					valid=false;
				}
			break;
			case "phone":
				if(field.value.match(/^(\(??[0-9]{3}(?:\) |-)+?[0-9]{3}[-| ][0-9A-Z]{4})$/))
					valid=true;
				else
				{
					msgID = msgCode.PHONE;	
					valid=false;
				}
			break;
			case "credit":
				if(field.value.match(/^(\(??[0-9]{4}(?:\) |-)+?[0-9]{4}[-| ][0-9]{4}[-| ][0-9]{4})$/))
					valid=true;
				else
				{
					msgID = msgCode.CREDIT;	
					valid=false;
				}
			break;
			case "all":
			case "pwd":
				valid=true;
			break;
		}
	}
	else if(isRequired)
	{
		var valid=false;
		msgID = msgCode.REQUIRED;	
	}
	else
	{
		valid=true;
	}	
	
	
	
	if(blah[2]!=undefined)
	{
		var advIns = blah[2].split("&");
		
		for(index in advIns)
		{
			scrap = advIns[index].split("=");
				
			switch(scrap[0])
			{
				case "matchField":
					var fieldName = scrap[1]; // fieldName
					var eField = this.form.elements[fieldName];
						
					
					if(valid)
					{
						var valid = (eField.value == field.value?true:false);
					
						msgID = msgCode.MATCH;	
						msgParams = {field:scrap[2]}
					}
				break;
				case "minlen":
					if(valid==true)
					{
						var valid= (field.value.length>=scrap[1]?true:false);
						
						msgID = msgCode.MIN_LEN;	
						msgParams = {length:scrap[1]}
					}
					
				break;
			}
		}
	}
		
	
	
	if(!valid)
	{
		$(label).addClass("error");
		$(field).addClass("error");
		
		var msg = this.getMsg(msgID,msgParams);
		$(label).parent().contents(".validmsg").text(msg);
		
		// insert errorMsg to relevant verifyMsg
		return false;
	}
	else
	{
		$(label).parent().contents(".validmsg").text('');
		$(label).removeClass("error");
		$(field).removeClass("error");
		return true;
	}
}








Validator.prototype.getMsg = function(msgID,params)
{
	
	switch(msgID)
	{
		case msgCode.EMAIL:
			return "This need to be a valid email address";
		break;
		case msgCode.INT:
			return "This needs to be a valid number";
		break;
		case msgCode.DATE:
			return "This needs to be a valid date format (eg. MM/DD/YYYY)";
		break;
		case msgCode.ALPHA:
			return "This needs to contain only word characters";
		break;
		case msgCode.FLOAT:
			return "This needs to be a valid number with decimal places";
		break;
		case msgCode.PHONE:
			return "This needs to be a valid phone number";
		break;
		case msgCode.CREDIT:
			return "This needs to be a valid credit card number";
		break;
		case msgCode.REQUIRED:
			return "This field is required";
		break;
		case msgCode.MATCH:
			var msg = "This field must match " + params.field;
			return msg;
		break;
		case msgCode.ZIPCODE:
			var msg = "This field must be a valid zipcode";
			return msg;
		break;
		case msgCode.MIN_LEN:
			var msg = "This field must be at least " + params.length + " characters long";
			return msg;
		break;
		default:
			return "there was an error, apparently";
	}
}
