function changeText(strIdentifier, strNewText)
{
	var obj = document.getElementById(strIdentifier);
	var oTextNode = document.createTextNode(strNewText);

	obj.replaceChild(oTextNode, obj.childNodes[0]);
}

function isCourseChosen()
{
	var arrCourseTimes = document.getElementsByName("cboTime");
	var intNumCourses = arrCourseTimes.length;

	for (var i=0; i<=intNumCourses - 1; ++i)
	{
		if (!arrCourseTimes[i].disabled)
		{
			return true;
		}
	}

	return false;
}

function submitForm()
{
	var objForm = document.forms[0];

	if (!isCourseChosen())
	{
		alert("You must choose a course before applying.");
		return;
	}	

	if (isDataValid(objForm))
	{
		if (document.getElementById("txtemail").value != document.getElementById("txtemail2").value)
		{
			alert("The two e-mail addresses do not match each other. Please re-enter them. ");
			return;
		}

		objForm.submit();
	}
}

function isNumericValid(elem)
{
	
	if (isNaN(elem.value))
	{
		alert(elem.alerttext + " must be a numeric value.");
		setFocus(elem);
		return false;
	}
					
	// values getting this far are definitely numbers
					
	// check against min and max value
					
	if (elem.value < elem.minvalue)
	{
		alert(elem.alerttext + " must be greater than or equal to " +
			  elem.minvalue + ".");
		setFocus(elem);
		return false;
	}
					
	if (elem.value > elem.maxvalue)
	{
		alert(elem.alerttext + " must be less than or equal to " +
			  elem.maxvalue + ".");
		setFocus(elem);
		return false;
	}
		
	// check against inf and sup values
		
	if (elem.value <= elem.infvalue)
	{
		alert(elem.alerttext + " must be greater than " +
			  elem.infvalue + ".");
		setFocus(elem);
		return false;
	}
					
	if (elem.value >= elem.supvalue)
	{
		alert(elem.alerttext + " must be less than " +
			  elem.supvalue + ".");
		setFocus(elem);
		return false;
	}
					
	// check if integer and number of decimal places					
					
	if (elem.isInteger)
	{
		if (Math.ceil(elem.value) != elem.value)
		{
			alert(elem.alerttext + " must be an integer value.");
			setFocus(elem);
			return false;
		}
	}
	else
	{
		if (elem.maxDecimalPlaces)
		{
			if (getNumberOfDecimalPlaces(elem.value)>elem.maxDecimalPlaces)
			{
				alert(elem.alerttext + " can only have " + 
					  elem.maxDecimalPlaces + " decimal places maximum.");
				setFocus(elem);
				return false;	
			}
		}
						
		if (elem.minDecimalPlaces)
		{
			if (getNumberOfDecimalPlaces(elem.value)<elem.minDecimalPlaces)
			{
				alert(elem.alerttext + " must have at least " + 
					  elem.minDecimalPlaces + " decimal places.");
				setFocus(elem);
				return false;	
			}
		}				
	}
	
	return true;
	
}

function isDataValid(frm)
{

	/*
		required		   -
		reSpecialFormat    - special format that element must have, written in terms of
						   - a regular expression. must supply an attribute 
						   - specialFormatDescription aswell.
		isNumeric		   -
		isInteger		   -
		maxDecimalPlaces   -
		minDecimalPlaces   -
		minValue		   -
		maxValue		   -
		infValue		   - infemum value
		supValue		   - supremum value
		isAlphabet         -
		isPhoneNumber	   -
		isCreditCardNumber -
		maxChars		   - max number of characters allowed
		minChars		   - min number of characters allowed
	*/
	
	var reAlphabet = /^([A-Za-z,'\s]|-|[\.])*$/;
	var rePhoneNumber = /^([0-9\,\s+()]|-)*([0-9\s])+$/;
	var reCreditCardNumber = /^((\d{4}-){3}(\d{4}))|((\d{4}\s){3}(\d{4}))|(\d{16})$/;
	var reEmail = /(@.*@)|(\.\.)|(^\.)|(^@)|(@$)|(\.$)|(@\.)/;
	var reEmail_two = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
	var reTime = /^(([0-1][0-9])|2[0-3])(:[0-5][0-9]){1,2}$/;
	var reTimeAmPm = /^((0?[0-9])|(1[0-2]))((:|\.)[0-5][0-9])[AaPp][Mm]$/;
	
	for (var i=0; i<frm.elements.length; ++i)
	{
	
		var elem = frm.elements[i];	
		
		if (elem.type == "select-one")
		{
			if ((elem.getAttribute("required")) && (elem.selectedIndex == -1))
			{
				alert(elem.getAttribute("alerttext") + " is a required field.");
				setFocus(elem);
				return false;
			}

			if (elem.getAttribute("isDob"))
			{				
				var objDay = document.getElementById("cbodob_day");
				var objMonth = document.getElementById("cbodob_month");
				var objYear = document.getElementById("txtdob_year");

				var minAge = document.getElementById("cbodob_day").getAttribute("minAge");

				var dte = new Date();	
				var dteNow = new Date();

				try
				{	
					dte.setFullYear(objYear.value, objMonth.value - 1, objDay.value);
					
					if (isNaN(dte.getDate()))
					{
						alert("Date of Birth has been incorrectly filled in. Please correct this.");
						objYear.style.backgroundColor = "#ECFF86"; 
						objMonth.style.backgroundColor = "#ECFF86";
						setFocus(objDay);
						return false;
					}
					else
					{
						if (dte.getDate() != objDay.value)
						{
							alert("An Invalid Date of Birth has filled in. The Month chosen does not have " + objDay.value + " days in it. \n"+
							      "Please choose a valid date.");
							objYear.style.backgroundColor = "#ECFF86"; 
							objMonth.style.backgroundColor = "#ECFF86";
							setFocus(objDay);
							return false;
						}
						else
						{
							var intYearDiff = Math.floor((dteNow - dte)/31536000000);
							if (elem.getAttribute("minAge"))
							{
								if (intYearDiff < elem.getAttribute("minAge"))
								{
									alert("Date is invalid. You must be over "+ elem.getAttribute("minAge") +
							     		      " years of age to apply.");
									objYear.style.backgroundColor = "#ECFF86"; 
									objMonth.style.backgroundColor = "#ECFF86";
									setFocus(objDay);
									return false;
								}
							}
							
						}
					}
				}
				catch (e)
				{}		

			}
		}
		
		if (elem.type == "text")
		{
				
			if ((elem.getAttribute("required")) && (elem.value == ""))
			{
				alert(elem.getAttribute("alerttext") + " is a required field.");
				setFocus(elem);
				return false;
			}
				
			if ((elem.value != null) && (elem.value != ""))
			{
				
				if (elem.getAttribute("reSpecialFormat"))
				{
					if (!eval(elem.reSpecialFormat).test(elem.value))
					{
						alert(elem.getAttribute("alerttext") + elem.specialFormatDescription);
					}
				}
					
				if ((elem.getAttribute("isNumeric")) || (elem.getAttribute("isInteger")))
				{	
					
					if (!isNumericValid(elem))
					{
						return false;
					}
				}
				else
				{
					if ((elem.getAttribute("isAlphabet")) && (!reAlphabet.test(elem.value)))
					{
						alert(elem.getAttribute("alerttext") + " must consist only of letters,spaces and any of , . '- .");
						setFocus(elem);
						return false;
					}
					
					if ((elem.getAttribute("isCreditCardNumber")) && (!reCreditCardNumber.test(elem.value)))
					{
						alert(elem.getAttribute("alerttext") + " must be of the format xxxx-xxxx-xxxx-xxxx.");
						setFocus(elem);
						return false;
					}
				
					if ((elem.getAttribute("isPhoneNumber")) && (!rePhoneNumber.test(elem.value)))
					{
						alert("Please enter a phone number for the field " + elem.getAttribute("alerttext") + ". \n" +
							  "A phone number can only consist of the characters 0-9 , - ( ) and space.");
						setFocus(elem);
						return false;
					}
					
					if ((elem.getAttribute("isTime")) && 
						!(
							(reTime.test(elem.value)) || (reTimeAmPm.test(elem.value))
						 )
						)
					{
						alert("Please enter a time (of format HH:MM[:SS] OR hh.MM {am/pm}) for the field " + elem.getAttribute("alerttext") + ".");
						setFocus(elem);
						return false;
					}
					
					if (elem.getAttribute("isEmail"))
					{
					
						var ok = "1234567890qwertyuiop[]asdfghjklzxcvbnm.@-_QWERTYUIOPASDFGHJKLZXCVBNM";

						for(j=0; j < elem.length ;j++)
						{
							if(ok.indexOf(elem.charAt(j))<0)
							{ 
								alert("Please enter in a valid e-mail address.");
								setFocus(elem);
								return false;
							}	
						} 
						
						if (!elem.value.match(reEmail) && !elem.value.match(reEmail_two))
						{
							alert("Please enter in a valid e-mail address.");
							setFocus(elem);
							return false;
						} 
					}
					
				}
				
				if (elem.value.length > elem.getAttribute("maxChars"))
				{
					alert("The text in the field " + elem.getAttribute("alerttext") + " can only have at most " +
						  elem.getAttribute("maxChars") + " characters.")
					setFocus(elem);
					return false;
				}
				
				if (elem.value.length < elem.getAttribute("minChars"))
				{
					alert("The text in the field " + elem.getAttribute("alerttext") + " must have at least " +
						  elem.getAttribute("minChars") + " characters.")
					setFocus(elem);
					return false;
				}
				
			}

		}
		
		elem.style.backgroundColor = "";

	}

	return true;
}

function setFocus(elem)
{
	elem.style.backgroundColor = "#ECFF86";
	elem.focus();
}
