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();
		}
        if ((typeof s != 'undefined') && (typeof s.prop11 != 'undefined')) {
            var s_prop11 = s.prop11;
            s.prop11 += 'Error';
            setOmniVars(s.charSet, s.server, s.channel, s.prop2, s.prop3, s.prop1, "", s.prop11);
            var s_code=s.t();
            s.prop11 = s_prop11;
        }
    }
	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) {
            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;
  var getDate = true;
	field = _field;

	_s  = field.value;

    _d = getDateFromField(field, dateFormatString);
  this.valid = true;
  // safari will not return true for isNaN check even when the date is initialized with day = dd, month = mm, and year = yyyy
	if (isNaN(_d.getDate() ) || (field.value.toLowerCase() == dateFormatString.toLowerCase()) ) {  // 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  Math.round( (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]+$/; (oldone)
        var regexp = /^\w+((-\w+)|(\`\w+)|(\.\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, Chinese
    //		dd.mm.yyyy - German

    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;
    var hasSlashOrDash = false;
    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("/");
        hasSlashOrDash = true;
    } else if (fieldString.search("-") > 0) { // They used - instead of /
		var dateValues = fieldString.split("-");
        hasSlashOrDash = true;
    } else if (fieldString.indexOf(".") >= 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/aaaa':
        case 'jj/mm/aaaa':
        case 'gg/mm/aaaa':
        case 'tt.mm.jjjj':
			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;
        case 'dd.mm.yyyy':
        case 'dd/mm/yyyy':
            if (dateValues[0]) day = dateValues[0];
			if (dateValues[1]) month = dateValues[1];
			if (dateValues[2]) year = dateValues[2];
			break;
        case "yy\u5E74mm\u6708dd\u65E5":            
            if(!hasSlashOrDash) {
                //dateValues = fieldString.split(" ");
                year = fieldString.substr(0,2);
                month = fieldString.substr(3,2);
                day = fieldString.substr(6,2);
            } else {
                if (dateValues[0]) year = dateValues[0];
			    if (dateValues[1]) month = dateValues[1];
			    if (dateValues[2]) day = 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.
  // safari will not return true for isNaN check even when the date is initialized with day = dd, month = mm, and year = yyyy
  if(isNaN(month)&&isNaN(day)&&isNaN(year)) {
    if(!isNaN(date.getDate())) {
      date = {
        getDate: function() {
          return NaN;
        }
      }
    }
  }
  writeDateToField(formField, date, dateFormat);
	return date;
}

//--------------------------------------------------------
//Write the date to a form field - Based on Internationalization Variables
//--------------------------------------------------------

function writeDateToField(formField, date, dateFormat) {
// prevent "undefined" string from showing
  var dateString = "";
	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 sep = "/";
	var dot = ".";
	switch(dateFormat) {
		case 'mm/dd/yyyy':
			dateString = month + sep + day + sep + year;
			break;
		case 'dd/mm/aaaa':
        case 'jj/mm/aaaa':
        case 'gg/mm/aaaa':
            dateString = day + sep + month + sep + year;
			break;
        case 'tt.mm.jjjj':
            dateString = day + dot + month + dot + year;
            break;
        case 'yyyy/mm/dd':
			dateString = year + sep + month + sep + day;
			break;
		case 'yyyy/dd/mm':
			dateString = year + sep + day + sep + month;
			break;
        case "yy\u5E74mm\u6708dd\u65E5":
            dateString = String(year).substr(2,2) + "\u5E74" + month  + "\u6708" + day  + "\u65E5";
            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;
}
//------------------------------------------------------
