function WebForm() {
	var self = this;
	this.errors = new Array();
	this.addError = function(_x, _y, _z, _a, _b) {
		for (i=0; i < arguments.length; i++) {
			if(arguments[i] != null) {
				self.errors[self.errors.length] = new error(arguments[i]);
				
			}
		}
		
	}
	this.hasErrors = function() { return (self.errors.length != 0);	}
	this.resetErrors = function() {
		for (i = 0;  i < self.errors.length; i++) {
			self.errors[i].handle("reset");
		}
		self.errors = new Array();
	}
	this.showErrors = function() {
		for (i = 0;  i < self.errors.length; i++) {
			self.errors[i].handle();
		}
	}
	function error(_x) {
		var self = this;
		var errorCode;
		self.errorCode = _x;
		this.handle = function(reset) {
			set = (reset==null) ? reset=false : reset=true; 
			handleDisplay(self.errorCode, set);
		}
		return this;
	}
	this.collapseErrors = function(errorCode) {
		var count = 0;
		for (i = 0;  i < self.errors.length; i++) {		
			if (self.errors[i].errorCode.charAt(0) == "~") { count++; }
		}
		if (count > 1) {
			for (i = 0;  i < self.errors.length; i++) {	
				if (self.errors[i].errorCode.charAt(0) == "~") { self.errors[i].errorCode = null; }
			}
			self.errors[self.errors.length] = new error(errorCode);
		}
	}
}

function handleDisplay(_obj, reset) {
	if (_obj != null) {
		if (_obj.charAt(0) == "~") { _obj = _obj.substring(1);	}
		if (_obj.charAt(0) == "!") {
			reset = !reset;
			_obj = _obj.substring(1);
		}
		var obj = document.getElementById(_obj);
		if (obj.tagName == "LABEL") {
			obj.className = reset ? "" : "error";
		}  else {
			obj.style.display =  reset ? "none" : "";
		}
	}
}

function display(obj, state) {
	if (document.getElementById(obj)) {
		document.getElementById(obj).style.display = state;
	}
}

function validDate(_field) {
	var field;
	var d;
	
	field = _field;
	
	_s  = field.value;
	_d = getDateFromField(field, dateFormatString);
	this.valid = true;
	if ( isNaN(_d.getDate() ) ) {  // Basically, this allows the functions to gracefully return to the format string instead of putting a date in the field.
			this.valid = false;
	}

	this.d = _d;
	var xxxdgetY = function() {
		var y = (self.d.getYear() + 10000) % 100;
		y += (y < 38) ? 2000 : 1900; 
		return y
	}
	this.setField = function() {
		writeDateToField(field, this.d, dateFormatString);
	}
	this.setD = function(_d) {self.d = _d}
	this.nextDay = function() {return this.d.setDate(self.d.getDate()+1);}
	this.diffDate = function(dd) {
		return ( makeDate(dd).getTime() - makeDate(self.d).getTime()) / (1000*60*60*24);
	}
	function makeDate(md) { 
		return new Date( fixYear(md.getYear()), md.getMonth(), md.getDate() ); 
	}
	function lZero(nr) {if (nr < 10) nr = "0" + nr;return nr;}

	var self = this;
	return this;
}

function fixYear(_y) {
		var y = (_y + 10000) % 100;
		y += (y < 38) ? 2000 : 1900; 
		return y
}

function isValidEmail(field) {
	if (field != null && field != ''){
		field = stripCharsInBag (field, ' ')
		var regexp = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
		return (field.search(regexp) != -1);
	}
}

function doesUserNameContainHyphen(field) {
	var regExp = /-/;
	return (field.search(regExp) != -1)
}

function isValidZip(field, country){
	if (field != '' && field != null && country != '' && country != null){
		if (country == 'US'){
			var regExp = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
			return (field.search(regExp) != -1)
		} else if (country == 'CA'){
			v = stripCharsInBag(field, "- ");
			var regexp = /^[A-Va-v]|[X,Y,x,y]\d[A-Za-z]\d[A-Za-z]\d$/;
			return (v.length == 6 && !hasChars(v,'D', 'F', 'I', 'O', 'Q', 'U') && v.search(regexp) != -1)
		}
	}
}

function isUSCanZip(zip,country){
	if (zip != '' && zip != null)
		return (country == 'US' || country == 'CA');
}

function isValidPhone(phone,country){
	if (phone != null && phone != '' && country != null && country !=''){
		return (country == 'US' && isUSPhoneNumber (phone)) || (country != 'US' && isInternationalPhoneNumber (phone));
	}
	return true;
}

function isValidName(field){
	var regExp = /[0-9]/;
	if (field != null && field != '')
		return (field.search(regExp) != -1);
}

function isUSPhoneNumber(s){
	var phoneNumberDelimiters = "+.,()-xX# ";
	var digitsInUSPhoneNumber = 15; // allow 10 digits + 1- prefix (i.e +1 digit) + extension # (i.e +4 digits)
	var minDigitsInUSPhoneNumber = 10;
    s1 = stripCharsInBag(s, phoneNumberDelimiters);
    return (isInteger(s1) && (s1.length <= digitsInUSPhoneNumber && s1.length >= minDigitsInUSPhoneNumber));
}

function isInternationalPhoneNumber(s){
	var phoneNumberDelimiters = "+.,()-xX# ";
	s1 = stripCharsInBag(s, phoneNumberDelimiters);
    return (isInteger(s1));
}

function isValidSPGNum(field) {
	if (field != null && field != ''){
		// one optional letter + any number of digits + zero or more whitespace chars at the beginning and at the end
		var re = /^\s*[A-Za-z0-9]\d+\s*$/;
		if (field != null && field != ''){
			return (field.search(re) != -1);
		}
	}
}

function parseDate(_s) {
	try {
		d = Date.parse(_s);
		return d;
	} catch(err) {
		var dateArray = _s.split("/");
		var tempMonth = parseInt(dateArray[0],10);
		var tempDay = parseInt(dateArray[1],10);
		var tempYear = parseInt(dateArray[2],10);
		d = new Date(tempYear,(tempMonth-1),tempDay);
		return d;
	}
}

//--------------------------------------------------------
//Get the Date from a form field - Based on Internationalization Variables
//--------------------------------------------------------
function getDateFromField(formField, dateFormat) {
	// formField is a reference to a text field
	// dateFormat is a string describing the local date format
	//	Current options for dateFormat:
	//		mm/dd/yyyy - English
	//		dd/mm/yyyy - Non-English, Non-Japanese
	//		yyyy/mm/dd - Japanese
	
	var date = new Date(); // Default the date to today ready to be overwritten.
	var currDate = new Date(); // Today's date and time for comparison's sake.

	dateFormat = dateFormat.toLowerCase();
	var fieldString;
	if (typeof formField == "object") { fieldString= formField.value; } // Get the current value of the field
		else { fieldString = formField; } // We were passed a direct value
	if (fieldString.search("/") > 0) { // check if we have / to delimit
		var dateValues = fieldString.split("/");
	} else if (fieldString.search("-") > 0) { // They used - instead of /
		var dateValues = fieldString.split("-");
	} else if (fieldString.search("[.]") > 0) { // They used . instead of /
		var dateValues = fieldString.split(".");
	} else if (fieldString != "") {  // Assume there are no delimiters, assume one number
		var dateValues = new Array(fieldString);
	} else if (fieldString == "") {  // If there's not data there, assume it was deleted, and throw back a validDate object compatible invalid date.
		date.setTime(Date.parse(dateFormatString));
		return date;
	}

	if (fieldString.toLowerCase() == dateFormatString) { 
		date.setTime(Date.parse(fieldString));
		return date;
	}
	
	var year;
	var month;
	var day;
	
	switch(dateFormat) {
		case 'mm/dd/yyyy':
			if (dateValues[0]) month = dateValues[0];
			if (dateValues[1]) day = dateValues[1];
			if (dateValues[2]) year = dateValues[2];
			break;
		case 'dd/mm/yyyy':
			if (dateValues[0]) day = dateValues[0];
			if (dateValues[1]) month = dateValues[1];
			if (dateValues[2]) year = dateValues[2];
			break;
		case 'dd.mm.yyyy':
			if (dateValues[0]) day = dateValues[0];
			if (dateValues[1]) month = dateValues[1];
			if (dateValues[2]) year = dateValues[2];
			break;
		case 'yyyy/mm/dd':
			if (dateValues[0]) year = dateValues[0];
			if (dateValues[1]) month = dateValues[1];
			if (dateValues[2]) day = dateValues[2];
			break;
		case 'yyyy/dd/mm':
			if (dateValues[0]) year = dateValues[0];
			if (dateValues[1]) day = dateValues[1];
			if (dateValues[2]) month = dateValues[2];
			break;
		default:  // Default to mm/dd/yyyy
			if (dateValues[0]) month = dateValues[0];
			if (dateValues[1]) day = dateValues[1];
			if (dateValues[2]) year = dateValues[2];
			break;
	}
			
	if (year) { 
		if (year.length == 2) { year = "20" + year; } // Try to make the year 4 digits
		if (year.length == 4) { // If it's not 4 digits, just fall back to using the current year
			date.setFullYear(year);
		}
	}
	date.setDate(1);
	if (month) date.setMonth(month - 1); // setMonth uses a zero-based number
	if (day) date.setDate(day);
	if (date.getTime() < currDate.getTime()) date.setYear(currDate.getFullYear() + 1); // For dates in the past, set to next year.
	writeDateToField(formField, date, dateFormat);
	return date;
}

//--------------------------------------------------------
//Write the date to a form field - Based on Internationalization Variables
//--------------------------------------------------------

function writeDateToField(formField, date, dateFormat) {

	if ( isNaN(date.getDate() ) ) {
		formField.value = dateString;
		return;
	}
	
	dateFormat = dateFormat.toLowerCase();
	var month = date.getMonth() + 1;
	month = paddZero(month);
	var day = date.getDate();
	day = paddZero(day);
	var year = date.getFullYear();
	var dateString;
	var sep = "/";
	var sepDE = ".";
	switch(dateFormat) {
		case 'mm/dd/yyyy':
			dateString = month + sep + day + sep + year;
			break;
		case 'dd/mm/yyyy':
			dateString = day + sep + month + sep + year;
			break;
		case 'dd.mm.yyyy':
			dateString = day + sepDE + month + sepDE + year;
			break;
		case 'yyyy/mm/dd':
			dateString = year + sep + month + sep + day;
			break;
		case 'yyyy/dd/mm':
			dateString = year + sep + day + sep + month;
			break;
		default:  // Default to mm/dd/yyyy
			dateString = month + sep + day + sep + year;
			break;
	}
	
	formField.value = dateString;
}

//-----------------------------------------------
// padd a zero if string is one char
function paddZero(s)
{
	if(s >= 0 && s <= 9){
	  s = '0' + s;
	}
	return s;
}
//------------------------------------------------------