	var invalidEmail = "@!\"#$%&'()*,/:;<=>?[\\]^{|}~` ";
	var invalidName = "+.0123456789";
	var newPassword;
	var elementId;
	var payMethod;

	document.onkeypress = ignoreEnter;

/******************************************************************************/
/***	selectively allows using Enter to submit forms to avoid confusions	***/
/******************************************************************************/
function ignoreEnter (evt) {
	var event = window.event;
	var keycode;
	if (event) {					// IE
		keycode = event.keyCode;
    } else {						// other
		event = evt;
		keycode = event.which;
    }

	var targ;
	if (event.target) targ = event.target;
	else if (event.srcElement) targ = event.srcElement;
	else return true;

	var form = targ.form;
	if (!form) return false;
	if (keycode != 13) return true;

	var formName = form.name;
	if (formName == 'login') return true;		// allow login
	if (formName == 'signup') return true;		// allow signup
	if (formName == 'feedback') return true;	// allow feedback

	return false;								// don't allow any other
}

/******************************************************************************/
function sendPassword (formName) {
	hideMessage("message");

	var form = document.forms[formName];
	var field = form.elements['account'];
	var value = field.value;
	value = trimSpaces(value);
	field.value = value;

	if (value.length == 0) {
		displayMessage("message", "Please enter your email address.", true);
		field.focus();
		return;
    } else if (!isEmailValid(value)) {
		displayMessage("message", "Email address is invalid or contains illegal chracters.", true);
		field.focus();
		return;
    }

	var reply = confirm("Your password will be sent to you at this address:\n\n" + value);
	if (reply) {
		var newField = document.createElement("input");
		newField.type = "hidden";
		newField.name = "function";
		newField.value = "PSW_RECOVER";

		form.action = "index.jsp";
		form.appendChild(newField);
		form.submit();
	}
}

/******************************************************************************/
function submitLogin (formName) {
	hideMessage("message");

	var form = document.forms[formName];
	var field = form.elements['account'];
	var value = field.value;
	value = trimSpaces(value);
	field.value = value;

	if (value.length == 0) {
		displayMessage("message", "Please enter your email address.", true);
		field.focus();
		return false;
    }
	if (!isEmailValid(value)) {
		displayMessage("message", "Email address is invalid or contains illegal chracters.", true);
		field.focus();
		field.select();
		return false;
    }

	field = form.elements['password'];
	value = field.value;
	if (value.length == 0) {
		displayMessage("message", "Please enter your password", true);
		field.focus();
		return false;
    }
	if (value.length < 6 || value.length > 16 || !isPswValid(value)) {
		displayMessage("message", "Your password doesn't match the required password pattern.<br>\n" + 
						"Please correct the error and try again.", true);
		field.focus();
		return false;
    }

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "LOGIN";

	form.action = "index.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function submitSignup (formName) {
	hideMessage("message");

	var form = document.forms[formName];
	field = form.elements['account'];
	var value = field.value;
	value = trimSpaces(value);
	field.value = value;

	if (value.length == 0) {
		displayMessage("message", "Please enter your email address.", true);
		field.focus();
		return false;
    }
	if (!isEmailValid(value)) {
		displayMessage("message", "Email address is invalid or contains illegal chracters.", true);
		field.focus();
		field.select();
		return false;
    }

	var field = form.elements['first_name'];
	value = field.value;
	if (value.length == 0) {
		displayMessage("message", "Please provide your first name", true);
		field.focus();
		return false;
    }
	if (!isNameValid(value)) {
		displayMessage("message", "First name contains at least one illegal character.<br>\n" +
						"Please correct it before you can proceed.", true);
		field.focus();
		field.select();
		return false;
    }

	field = form.elements['last_name'];
	value = field.value;
	if (value.length == 0) {
		displayMessage("message", "Please provide your last name", true);
		field.focus();
		return false;
    }
	if (!isNameValid(value)) {
		displayMessage("message", "Last name contains at least one illegal character.<br>\n" +
						"Please correct it before you can proceed.", true);
		field.focus();
		field.select();
		return false;
    }

	field = form.elements['account'];
	value = field.value;
	if (!isEmailValid(value)) {
		displayMessage("message", "Please provide a valid email address", true);
		field.focus();
		field.select();
		return false;
    }

	field = form.elements['password'];
	value = field.value;
	if (value.length == 0) {
		displayMessage("message", "Please provide a password", true);
		field.focus();
		return false;
    }
	if (value.length < 6 || value.length > 16) {
		displayMessage("message", "Password must be 6 to 16 characters long.", true);
		field.focus();
		field.select();
		return false;
    }
	if (!isPswValid(value)) {
		displayMessage("message", "Your password contains at least one unsafe character.<br>\n" +
						"Please correct it before you can proceed.<br>\n" +
						"Unsafe characters are: " + invalidEmail + "and space.", true);
		field.focus();
		field.select();
		return false;
    }

	field = form.elements['captcha'];
	value = field.value;
	value = trimSpaces(value);
	field.value = value;
	if (value.length == 0) {
		displayMessage("message", "You must submit the CAPTCHA test. Please re-type the word you see against the CAPTCHA field.\n" +
						"Letters are not case sensitive.", true);
		field.focus();
		return false;
	}

	field = form.elements['agreement'];
	if(!field.checked) {
		displayMessage("message", "To use this website, your must agree to its terms and conditions before you can create an account. " +
						"Click on the \"Terms of Use\" link to view details. " +
						"If you do not agree to the Terms of Use you cannot use this website.", true);
		return false;
    }

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "SIGNUP";

	form.action = "index.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function submitAccount (formName) {
	hideMessage("message");

	var form = document.forms[formName];
	var first_name = form.elements['first_name'];
	var last_name = form.elements['last_name'];
	if (first_name.readOnly == true || last_name.readOnly == true) {
		var password = form.elements['password'];
		first_name.readOnly = false;
		last_name.readOnly = false;
		newPassword = setPswVisible(password);
		first_name.focus();
		first_name.select();

		var button = document.getElementById('update');
		button.src = "images/apply.png";
		button.alt = "Apply changes";
		return false;
    } else {
		var field, value;

		field = form.elements['first_name'];
		value = field.value;
		if (value.length == 0) {
			displayMessage("message", "First name is a mandatory field. Please enter your first name.", true);
			field.focus();
			return false;
		}
		if (!isNameValid(value)) {
			displayMessage("message", "First name contains at least one illegal character.<br>\n" +
							"Please correct it before you can proceed.", true);
			field.focus();
			field.select();
			return false;
		}

		field = form.elements['last_name'];
		value = field.value;
		if (value.length == 0) {
			displayMessage("message", "Last name is a mandatory field. Please enter your last name.", true);
			field.focus();
			return false;
		}
		if (!isNameValid(value)) {
			displayMessage("message", "Last name contains at least one illegal character.<br>\n" +
							"Please correct it before you can proceed.", true);
			field.focus();
			field.select();
			return false;
		}

		field = newPassword;
		value = field.value;
		if (value.length == 0) {
			displayMessage("message", "Please provide a password", true);
			field.focus();
			return false;
		}
		if (value.length < 6 || value.length > 16) {
			displayMessage("message", "Password must be 6 to 16 characters long.", true);
			field.focus();
			field.select();
			return false;
		}
		if (!isPswValid(value)) {
			displayMessage("message", "Your password contains at least one unsafe character.<br>\n" +
							"Please correct it before you can proceed.<br>\n" +
							"Unsafe characters are: " + invalidEmail + "and space.", true);
			field.focus();
			field.select();
			return false;
		}

		var newField = document.createElement("input");
		newField.type = "hidden";
		newField.name = "function";
		newField.value = "UPDATE";

		form.action = "account.jsp";
		form.appendChild(newField);
		return true;
    }
}

/******************************************************************************/
function submitActivate (formName) {
	hideMessage("message");

	var form = document.forms[formName];
	var field = form.elements['activation_code'];
	var value = field.value;
	value = trimSpaces(value);
	field.value = value;
	if (value.length == 0) {
		displayMessage("message", "Please enter your activation code.", true);
		field.focus();
		return false;
    }

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "ACTIVATE";

	form.action = "activate.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function submitLogout (formName) {
	var form = document.forms[formName];
	form.action = "index.jsp";
	return true;
}

/******************************************************************************/
function submitCheckout (formName) {
	hideMessage("message_2");
	calcPayment(formName);

	var form = document.forms[formName];
	var oldExpire = document.forms['account'].elements['expires'].value;
	var token = oldExpire.split("-");
	oldExpire = new Date(token[0], token[1] - 1, token[2]);

	var today = serverTime;
	if (today < oldExpire) {
		var y = parseInt(today.getFullYear());
		var m = parseInt(today.getMonth());
		var d = parseInt(today.getDate());
		if (d < parseInt(token[2])) {
			d = parseInt(token[2]);
        } else {
			d = parseInt(token[2]);
			m = m + 1;
        }
		today = new Date(y, m, d);
    }

	var newExpire  = form.elements['period_ends'].value;
	token = newExpire.split("-");
	newExpire = new Date(token[0], token[1] - 1, token[2]);

	var options = form.elements['payment_period'].options;
	var len = options.length;
	var max = options[len - 1].value;

	y = parseInt(today.getFullYear());
	m = parseInt(today.getMonth()) + (max - 1);
	d = parseInt(today.getDate());
	var maxAllowed = new Date(y, m, d);

	if (maxAllowed <= oldExpire) {
		displayMessage("message_2", "You have already purchased " + max + " months of service (maximum allowed). No more payments can be made at this time.", true);
		return false;
    }

	if (maxAllowed < newExpire) {
		displayMessage("message_2", "You cannot pay for more than " + max + " months of service total. Please select smaller period to pay for.", true);
		return false;
    }

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "CHECKOUT";

	form.action = "account.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function submitPayment (formName) {
	hideMessage("message");

	var form = document.forms[formName];
	var field;
	var value;

	if (payMethod == 'visa' || payMethod == 'mastercard') {
		field = form.elements['card_number'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;

		if (value.length == 0) {
			displayMessage("message", "Please enter credit card number", true);
			field.focus();
			return false;
		} else {
			var cardno = value.replace(/\s/g, "");	// remove spaces
			for (i=0; i<cardno.length; i++) {
				chr = cardno.charAt(i);
				if ("0123456789".indexOf(chr) == -1) {
					displayMessage("message", "The card number you have entered is invalid. Please ensure you entered digits only. No other characters are allowed.", true);
					field.focus();
					return false;
				}
			}
		}

		field = form.elements['card_cvv2'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;
		var errmsg = "Please enter the verification code exactly as it appears on the card.";

		if (value.length < 3 || value.length > 4) {
			displayMessage("message", errmsg, true);
			field.focus();
			return false;
		} else {
			var cvv2 = value.replace(/\s/g, "");	// remove spaces
			for (i=0; i<cvv2.length; i++) {
				chr = cvv2.charAt(i);
				if ("0123456789".indexOf(chr) == -1) {
					displayMessage("message", errmsg, true);
					field.focus();
					return false;
				}
			}
		}

		field = form.elements['first_name'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;

		if (value.length == 0) {
			displayMessage("message", "Please enter the first name of the cardholder exactly as it appears on the card.", true);
			field.focus();
			return false;
		}

		field = form.elements['last_name'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;

		if (value.length == 0) {
			displayMessage("message", "Please enter the last name of the cardholder exactly as it appears on the card.", true);
			field.focus();
			return false;
		}

		field = form.elements['street_1'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;

		if (value.length == 0) {
			displayMessage("message", "Please enter your address information exactly as it appears on your credit card statement.", true);
			field.focus();
			return false;
		}

		field = form.elements['city'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;

		if (value.length == 0) {
			displayMessage("message", "Please provide your complete address information (city)", true);
			field.focus();
			return false;
		}

	} else if (payMethod == 'paypal') {
		field = form.elements['account'];
		value = field.value;
		value = trimSpaces(value);
		field.value = value;

		if (!isEmailValid(value)) {
			displayMessage("message", "Email address is invalid or contains illegal chracters.", true);
			field.focus();
			field.select();
			return false;
		}
    } else {
		displayMessage("message", "Please select payment method.", true);
		return false;
    }

	document.getElementById('disable').style.display = "block";		// wait

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "PAYMENT";

	form.action = "checkout.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function submitCancel (formName) {
	var form = document.forms[formName];

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "ACCOUNT";

	form.action = "account.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function submitFeedback (formName) {
	hideMessage("message");

	var form = document.forms[formName];

	var field = form.elements['account'];
	var value = field.value;
	value = trimSpaces(value);
	field.value = value;

	if (value.length == 0) {
		displayMessage("message", "Please enter your email address.", true);
		field.focus();
		return false;
    }
	if (!isEmailValid(value)) {
		displayMessage("message", "Email address is invalid or contains illegal chracters.", true);
		field.focus();
		field.select();
		return false;
    }

	field = form.feedback;
	value = field.value;
	field.value = trimSpaces(value);
	value = field.value;

	if (value.length == 0) {
		displayMessage("message", "Please type your message in the text area.", true);
		field.focus();
		return false;
	}

	if (value.length > 4096) {
		displayMessage("message", "Your message exceeds the maximum size of 4 KB. Please reduce the size of your message.", true);
		field.focus();
		return false;
	}

	field = form.elements['captcha'];
	value = field.value;
	value = trimSpaces(value);
	field.value = value;
	if (value.length == 0) {
		displayMessage("message", "You must submit the CAPTCHA test. Please re-type the word you see against the CAPTCHA field.\n" +
						"Letters are not case sensitive.", true);
		field.focus();
		return false;
    }

	var newField = document.createElement("input");
	newField.type = "hidden";
	newField.name = "function";
	newField.value = "FEEDBACK";

	form.action = "support.jsp";
	form.appendChild(newField);
	return true;
}

/******************************************************************************/
function calcPayment (formName) {
	var form = document.forms[formName];
	var period = form.elements['payment_period'];
	var amount = form.elements['amount'];
	var starts = form.elements['period_starts'];
	var ends   = form.elements['period_ends'];

	for (var i=0; i<period.options.length; i++){
		if (period.options[i].selected == true) {
			period = period.options[i].value;
			break;
		}
	}

	amount.value = "US $" + (5 * period);

	var oldExpire = document.forms['account'].elements['expires'].value;
	var token = oldExpire.split("-");
	oldExpire = new Date(token[0], token[1] - 1, token[2]);
	var today = serverTime;
	if (oldExpire < today) oldExpire = today;
	var y = parseInt(oldExpire.getFullYear());
	var m = parseInt(oldExpire.getMonth()) + parseInt(period);
	var d = parseInt(oldExpire.getDate());
	var newExpire = new Date(y, m, d);
	starts.value = oldExpire.format("yyyy-mm-dd");
	ends.value = newExpire.format("yyyy-mm-dd");
}

/******************************************************************************/
function addField (formName, fieldName, value) {
	var form = document.forms[formName];
	var field = document.createElement("input");
	field.type = "hidden";
	field.name = fieldName;
	field.value = value;
	var old = document.forms[formName].elements[fieldName];
	if (old != null) form.removeChild(old);
	form.appendChild(field);
}

/******************************************************************************/
function displayMessage (id, message, error) {
	var element = document.getElementById(id);
	if (!element) element = document.getElementById("message");
	element.innerHTML = message;
	element.style.display = "none";
	element.style.background = error ? "#ffdddd" : "#ddffdd";
	elementId = id;
	setTimeout("setVisible(true)", 100);
}

/******************************************************************************/
function hideMessage (id) {
	var element = document.getElementById(id);
	if (!element) element = document.getElementById("message");
	if (element) {
		element.innerHTML = "";
		element.style.display = "none";
	}
}

/******************************************************************************/
function setVisible (visible) {
	var element = document.getElementById(elementId);
	if (visible) element.style.display = "block";
	else element.style.display = "none";
}

/******************************************************************************/
function radioChange(element) {
	hideMessage("message");

	payMethod = element.value.toLowerCase();
	if (payMethod == "visa" || payMethod == "mastercard") {
		switchToCreditCard();
    } else if (payMethod == "paypal") {
		switchToPaypal();
    }
}

/******************************************************************************/
function switchToCreditCard () {
	var elements = document.getElementsByClassName("ccard");
	for(var i=0; i<elements.length; i++) {
		elements[i].style.display = "block";
	}

	elements = document.getElementsByClassName("paypal");
	for(i=0; i<elements.length; i++) {
		elements[i].style.display = "none";
	}
}

/******************************************************************************/
function switchToPaypal () {
	var elements = document.getElementsByClassName("paypal");
	for(var i=0; i<elements.length; i++) {
		elements[i].style.display = "block";
	}

	elements = document.getElementsByClassName("ccard");
	for(i=0; i<elements.length; i++) {
		elements[i].style.display = "none";
	}
}

/******************************************************************************/
document.getElementsByClassName = function (className) {
	var array = [];
	var elements = document.getElementsByTagName("*");
	for(var i=0; i<elements.length; i++) {
		if (elements[i].className == className) array.push(elements[i]);
	}
	return array;
}

/******************************************************************************/
function isEmailValid (email) {
	var atIndex = email.indexOf("@");
	var dotIndex = email.lastIndexOf(".");
	if (atIndex < 1) return false;
	if (dotIndex < 0) return false;
	if (dotIndex >= (email.length - 2)) return false;
	if (atIndex >= (dotIndex - 1)) return false;
	var name = email.substring(0, atIndex);
	var domain = email.substring(atIndex + 1);
	var i;
	for (i=0; i<domain.length; i++) {
		if (invalidEmail.indexOf(domain.charAt(i)) >= 0) return false;
    }
	for (i=0; i<name.length; i++) {
		if (invalidEmail.indexOf(name.charAt(i)) >= 0) return false;
    }
	return true;
}

/******************************************************************************/
function isNameValid (name) {
	var i;
	for (i=0; i<name.length; i++) {
		if (invalidEmail.indexOf(name.charAt(i)) >= 0) return false;
    }
	for (i=0; i<name.length; i++) {
		if (invalidName.indexOf(name.charAt(i)) >= 0) return false;
    }
	return true;
}

/******************************************************************************/
function isPswValid (password) {
	var i;
	for (i=0; i<password.length; i++) {
		if (invalidEmail.indexOf(password.charAt(i)) >= 0) return false;
    }
	return true;
}

/******************************************************************************/
function setPswVisible (oldPsw) {
	var newPsw = document.createElement('input');
	newPsw.type = 'text';
	if(oldPsw.size) newPsw.size = oldPsw.size;
	if(oldPsw.value) newPsw.value = oldPsw.value;
	if(oldPsw.name) newPsw.name = oldPsw.name;
	if(oldPsw.id) newPsw.id = oldPsw.id;
	if(oldPsw.className) newPsw.className = oldPsw.className;
	oldPsw.parentNode.replaceChild(newPsw, oldPsw);
	return newPsw;
}

/******************************************************************************/
function trimSpaces (text) {
	while (text.substring(0, 1) == " " || text.substring(0, 1) == "\t") 
		text = text.substring(1, text.length);
	while (text.substring(text.length - 1, text.length) == " " || text.substring(text.length - 1, text.length) == "\t")
		text = text.substring(0, text.length - 1);
	return text;
}

/******************************************************************************/
function showTerms(id) {
	var element = document.getElementById(id);
	var request = false;

	if (window.ActiveXObject) {			// IE
		try {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				request = false;
			}
		}
	} else if (window.XMLHttpRequest) {	// non-IE
		try {
			request = new XMLHttpRequest();
		} catch (e) {
			request = false;
		}
	}

	if (element && request) {
		request.open('GET', "terms.html", false);
		request.send(null);
		element.innerHTML = request.responseText;
		return true;
	}
	return false;
}

/******************************************************************************/
function loadHtml(id, file) {
	var element = document.getElementById(id);
	var request = false;

	if (window.ActiveXObject) {			// IE
		try {
			request = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				request = false;
			}
		}
	} else if (window.XMLHttpRequest) {	// non-IE
		try {
			request = new XMLHttpRequest();
		} catch (e) {
			request = false;
		}
	}

	if (element && request) {
		request.open('GET', file, false);
		request.send(null);
		element.innerHTML = request.responseText;
		return true;
	}
	return false;
}
