//var VAL_NOT_EMPTY = /[a-zA-Z0-9'-]+/;
var VAL_NOT_EMPTY = /\S/;
var VAL_PHONE = /^[2-9][0-9]{2}[2-9][0-9]{2}[0-9]{4}$/;
var VAL_NAME = /^[a-zA-Z'-]+$/;
var VAL_DATE_MMDDYYYY = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/;
var VAL_POSTAL_CODE = /^[A-Za-z][0-9][A-Za-z][0-9][A-Za-z][0-9]$/;
var VAL_ANYTHING = /[.\s]*/;
var VAL_ONLY_NUMS = /^[\d]+$/;
var VAL_EMAIL = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
var VAL_URL = /https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?/;
var VAL_JPEG = /[.]*.jpg|.jpeg/i;
var VAL_PDFDOC = /[.]*.doc|.pdf/i;
var VAL_MONEY = /^[0-9,]+(.[0-9]{2})?$/;
var VAL_SOMEMONEY = /^[1-9]{1}[0-9,]*(.[0-9]{2})?$/;

function ValidatorFactory(subject) {
	if (subject == 'Range1to25Validator') {
		return new RangeValidator(1, 25, false);	
	}
	if (subject == 'SomeMoneyValidator') {
		return new Validator(VAL_SOMEMONEY, false);	
	}
	if (subject == 'MoneyValidator') {
		return new Validator(VAL_MONEY, false);	
	}
	if (subject == 'PDFDOCOrBlankValidator') {
		return new Validator(VAL_PDFDOC, true);	
	}
	if (subject == 'JPGOrBlankValidator') {
		return new Validator(VAL_JPEG, true);	
	}
	if (subject == 'EmailValidator') {
		return new Validator(VAL_EMAIL, false);	
	}
	if (subject == 'URLValidator') {
		return new Validator(VAL_URL, false);	
	}
	if (subject == 'NameValidator') {
		return new Validator(VAL_NAME, false);
	}
	else if(subject == 'PhoneValidator') {
		return new Validator(VAL_PHONE, false);
	}
	else if(subject == 'PhoneOrBlankValidator') {
		return new Validator(VAL_PHONE, true);
	}
	else if(subject == 'NotBlankValidator') {
		return new Validator(VAL_NOT_EMPTY, false);
	}
	else if(subject == 'PostalCodeValidator') {
		return new Validator(VAL_POSTAL_CODE, false);
	}
	else if(subject == 'NoValidator') {
		return new Validator(VAL_ANYTHING, true);
	}
	else if(subject == 'OnlyNumbersValidator') {
		return new Validator(VAL_ONLY_NUMS, false);
	}
	else if(subject == 'OnlyNumbersOrBlankValidator') {
		return new Validator(VAL_ONLY_NUMS, true);
	}
	else {
		alert('No such validator as ' + subject);
	}
	return null;
}


var Validator = Class.create({
		initialize: function(valRegEx, canBeBlank) {
			this.valRegEx = valRegEx;
			this.canBeBlank = canBeBlank;
		},
		validate: function(valString) {
			return (this.valRegEx.test(valString) || (this.canBeBlank && valString.strip() == ''));
		}
	}
);

var RangeValidator = Class.create({
		initialize: function(greaterThan, lessThan, canBeBlank) {
			this.greaterThan = greaterThan;
			this.lessThan = lessThan;
			this.canBeBlank = canBeBlank;
		},
		validate: function(valString) {
			if(valString == '' && this.canBeBlank) {
				return true;	
			}
			var valInt = parseInt(valString);
			if(isNaN(valInt)) {
			  return false;
			}
			if(valInt >= this.greaterThan && valInt <= this.lessThan) {
				return true;
			}
			return false;
		}
	}
);
