	
	function emailValid(email) {
		emailreg=/^.+@.+\..{2,3}$/;
		return(emailreg.exec(email));
	}
	
	function zipValid(zip) {
		//zipreg=/^(\d{5}-\d{4}|\d{5})$|^([a-zA-Z]\d[a-zA-Z] \d[a-zA-Z]\d)$/;
		//allows for us and canada postal codes
		zipreg=/^((\d{5}-\d{4})|(\d{5})|([AaBbCcEeGgHhJjKkLlMmNnPpRrSsTtVvXxYy]\d[A-Za-z]\s?\d[A-Za-z]\d))$/;
		return(zipreg.exec(zip));
	}
	
	function ph1Valid(ph1field) {
		ph1reg=/(\d{3})[\s\.\-](\d{3})[\s\.\-](\d{4})/;
		ph1test=ph1reg.exec(ph1field.value);
		ph1field.value="(" + RegExp.$1 + ") " + RegExp.$2 + "-" + RegExp.$3;
		return(ph1test);
	}
	
	function stateValid(state) {
		statereg=/^[A-Z]{2}$/;
		return(statereg.exec(state));	
	}
	
	function isEmpty(notnullstring) {
		emptyreg=/^\S/;
		return(emptyreg.exec(notnullstring));
	}
	
	function isDifferent(astring,bstring){
		if (astring == bstring) return true;
		return false;
	}
	
	function pwdValid1(pwd) {
		pwdreg=/^(.|\n){4,}$/;
		return(pwdreg.exec(pwd));
	}
	
	function pwdValid2(pwd) {
		pwdreg=/^[a-zA-Z0-9]{5,}[0-9]|[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][0-9][a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][0-9][a-zA-Z0-9][a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9][0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]|[a-zA-Z0-9][0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]|[0-9][a-zA-Z0-9]{5,}$/;
		return(pwdreg.exec(pwd));
	}
	
	function pwdValid3(pwd) {
		pwdreg=/^\w{8,}$/;
		return(pwdreg.exec(pwd));
	}
	
	
	function hasAt(obj) {
		if (obj.value.indexOf("@") != -1) return true;
		return false;
	}
	
	function isSelected(list){
		if (list.options.selectedIndex != 0) return true;
		return false;
	}
	
	function isValidRadio(radio){
		var valid=false;
		for (var i = 0; i < radio.length; i++){
			if (radio[i].checked) {
				return true;
			}
		}
		return false;
	}
	
	function phoneValid(phone) {
		phonereg=/^(\()?([0-9])(\)|-)?([0-9]{3})(-)?([0-9]{4}|[0-9]{4})$/;
		return(phonereg.exec(phone));
	}
	
	function isAlphaNum(str) 
	{
		regex=/^[a-zA-Z0-9]+$/;
		return(regex.exec(str));
	}
	
	function isChecked(box){
		if(box.checked) return true;
		return false;
	}
	
	function setFocus(){
		for(var i=0;i< document.forms[0].elements.length;i++){
			if(document.forms[0].elements[i].type != 'hidden'){
				document.forms[0].elements[i].focus();
				break;
			}
		}
	}
	
	function isValiddCC(type,num)
	{
		var isValid;
		
		switch(type)
		{
			case "Mastercard":
				isValid = isMasterCard(num);
				break;
			case "Visa":
				isValid = isVisa(num);
		}
		
		return isValid;
	}
	
	function isMasterCard(cc)
	{
	  firstdig = cc.substring(0,1);
	  seconddig = cc.substring(1,2);
	  if ((cc.length == 16) && (firstdig == 5) &&
		  ((seconddig >= 1) && (seconddig <= 5)))
		return isCreditCard(cc);
	  return false;
	}
	
	function isVisa(cc)
	{
	  if (((cc.length == 16) || (cc.length == 13)) &&
		  (cc.substring(0,1) == 4))
		return isCreditCard(cc);
	  return false;
	}
	
	function isCreditCard(st) 
	{
	  // Encoding only works on cards with less than 19 digits
	  if (st.length > 19)
		return (false);
	
	  sum = 0; mul = 1; l = st.length;
	  for (i = 0; i < l; i++) 
	  {
		digit = st.substring(l-i-1,l-i);
		tproduct = parseInt(digit ,10)*mul;
		if (tproduct >= 10)
		  sum += (tproduct % 10) + 1;
		else
		  sum += tproduct;
		if (mul == 1)
		  mul++;
		else
		  mul--;
	  }
	  
		// Uncomment the following line to help create credit card numbers
		// 1. Create a dummy number with a 0 as the last digit
		// 2. Examine the sum written out
		// 3. Replace the last digit with the difference between the sum and
		//    the next multiple of 10.
		
		//  document.writeln("<BR>Sum      = ",sum,"<BR>");
		//  alert("Sum      = " + sum);
	
	  if ((sum % 10) == 0)
		return (true);
	  else
		return (false);
	
	}
	
	function trim(str) 
	{
	   return str.replace(/^\s*|\s*$/g,"");
	}
	
	
	function checkValueExists( elem ) 
	{
		var valid = 1;
		
		newval = trim(elem.value);
		
		if( newval.length < 1 ) 
			valid = 0;
		
		return valid;
	}
	
	function checkPostalCode( elem ) 
	{    
		var zval = trim(elem.value);
			
		if (!zipValid(zval))
			valid = 0; 
		else
			valid = 1;
					
		return valid;
	}
	
	function removeNonNumeric( strg ) 
	{
		var Numbers = "0123456789";
		var newstr
		
		for( i=0; i < strg.length; i++ ) 
		{
			if( Numbers.indexOf( strg.charAt(i) ) == -1 ) 
			{
				temp1 = strg.substr( 0, i );
				temp2 = strg.substr( i+1, strg.length );
				newstr = temp1 + temp2;
				
				newstr = removeNonNumeric( newstr );
			} 
			else 
				newstr = strg;
		}
		
		return newstr;
	}
	
	function formatUSPhone( phone ) 
	{
		var modval = "";
		var Numbers = "0123456789";
		
		remphone = removeNonNumeric( phone ); 
		
		if( remphone.length == 10 ||
			( remphone.length == 11 && remphone.charAt( 0 ) == "1" ) ) {
					
			if( remphone.length == 11 && remphone.charAt( 0 ) == "1" ) {
				modval = remphone.substr( 1, remphone.length );
			} else {
				modval = remphone;
			}
			
			modac  = modval.substr( 0,3 );
			modpre = modval.substr( 3,3 );
			modnum = modval.substr( 6,4 );
					
			modphone = "("+modac+") "+modpre+"-"+modnum;
		} else {
			modphone = phone;
		}
	
		return modphone;
	}
	
	
	function checkFormPhone( elem ) 
	{
		var valid = 1;
		//var GoodChars = "0123456789()-+. xXeEtT";
		var GoodChars = "0123456789()-. ";
		var i = 0;
		var newPhone;
		
		phone = elem.value;
		
		if (phone=="") 
		{
			valid = 0;
			return valid;
		}
		
		newPhone = removeNonNumeric( phone ); 
		
		if (newPhone.length != 10)
		{
			valid = 0;
			return valid;
		}
		
		for (i =0; i <= newPhone.length -1; i++) 
		{
			if (GoodChars.indexOf(newPhone.charAt(i)) == -1) 
			{
				valid = 0;
				return valid;
			}
		}
		
		if( valid > 0 ) 
		{        
			elem.value = formatUSPhone( newPhone );
		}
		
		return valid;
	}
	
	
	function checkFormEmailUsername( elem ) 
	{
		var valid = 1;
		var GoodChars = "0123456789abcdefghijklmnopqrstuvwxyz-_.";
		var i = 0;
		
		username = elem.value;
		username = username.toLowerCase();
		
		if ( username == "" || username.length < 2 ) {
			valid = 0
			return valid;
		}
		
		var supported = 0;
		if ( window.RegExp ) {
			var tempStr = "a";
			var tempReg = new RegExp(tempStr);
			
			if ( tempReg.test( tempStr ) ) {
				supported = 1;
			}
		}
		
		if ( !supported ) {
			for (i =0; i <= username.length -1; i++) {
				if( GoodChars.indexOf( username.charAt(i) ) == -1 ) {
					valid = 0;
				}
			}
		} 
		
		var r1 = new RegExp("^[a-z0-9][a-z0-9_.-]*[a-z0-9]$");
		valid = r1.test( username );
		
		if( valid > 0 ) {        
			elem.value = username.toLowerCase();
		}
		
		return valid;
	}
	
	
	function checkFormCreditCVV( elem ) 
	{
		var valid = 1;
		var i = 0;
		
		newval = elem.value;
		
		var supported = 0;
		if ( window.RegExp ) {
			var tempStr = "a";
			var tempReg = new RegExp(tempStr);
			
			if ( tempReg.test( tempStr ) ) {
				supported = 1;
			}
		}
		
		if ( !supported ) {
			valid = true;
		}
		
		var r2 = new RegExp("^([0-9\ ]{3,4})$");
		
	//    valid = ( !r1.test( newval ) && r2.test( newval ) );
		valid = r2.test( newval );
		
		if( valid > 0 ) {
			elem.value = newval.toLowerCase();
		}
		
		return valid;
	}
	
	function checkEmailIsDifferent( elem ) 
	{
		var valid = 0;
		var cemailval = trim(elem.value);
		var emailval = document.getElementById("Email").value;
		
		if (cemailval == emailval)
		{
			valid = 1;
		}
	
		return valid;
	}
	
	function checkPasswordIsDifferent( elem ) 
	{
		var valid = 0;
		var cpassval = trim(elem.value);
		var passval = document.getElementById("Password").value;
		
		if (cpassval == passval)
		{
			valid = 1;
		}
	
		return valid;
	}
	
	function isValidCreditCardNumber( elem )
	{
		var valid = 1;
		var ccval = elem.value;
		
		switch(document.getElementById("CreditCardType").selectedIndex)
		{
			case 1:
				if(!isVisa(ccval)) valid = 0;
				break;
			case 2:
				if(!isMasterCard(ccval)) valid = 0;
				break;
		}
		
		return valid;
	}
	
	function checkPositiveInteger( elem ) 
	{     
	
		var regex = new RegExp( "^0*(\\d+)(\\.0*)?$" );
		var regexMatch = regex.exec(elem.value);      
	  
		if (regexMatch == null) {                
		  return false;                           
		}
		
		elem.value = regexMatch[1];
		return true;     
	 
	}
		
	function checkFormEmail( elem ) 
	{
		var emailval = trim(elem.value);
			
		if (!emailValid(emailval))
			valid = 0; 
		else
			valid = 1;
					
		return valid;
	}
	
	function checkFormElement(elem,valtype) 
	{
		var divElement = document.getElementById(elem.name);
		var hidElement = document.getElementById(elem.name + 'Hidden');
		
		var valid = 1;
		
		if ((hidElement.value == 0) || (elem.value != ""))
		{
			switch(valtype)
			{
				case 'EMAIL':
					valid = checkFormEmail( elem );
					break;
	
				case 'CONFIRMEMAIL':
					valid = checkEmailIsDifferent( elem );
					break;
	
				case 'PHONE':
					valid = checkFormPhone( elem );
					break;
					
				case 'CREDITCARD':
					valid = isValidCreditCardNumber( elem );
					break;
			
				case 'CREDITCVV':
					valid = checkFormCreditCVV( elem );
					break;
				
				case 'CREDITEXPDATE':
					valid = checkFormCreditExpDate( elem );
					break;
					
				case 'PASSWORD':
					valid = checkPassword( elem );
					break;
		
				case 'CONFIRMPASSWORD':
					valid = checkPasswordIsDifferent( elem );
					break;
		
				case 'POSTAL':
					valid = checkPostalCode( elem );
					break;
				
				case 'POSITIVE-INTEGER':
					valid = checkPositiveInteger( elem );
					break;
		
				case 'SELECT':
					valid = isSelected( elem );
					break;
					
				case 'EMAIL2':
					valid = hasAt( elem );
					break;
		
				default:
					valid = checkValueExists( elem );
			}
		}
			
		if(( valid == 0 ) || ( valid == false ))
			SetElements(divElement.name,0);
		else
			SetElements(divElement.name,1);
			
		return valid;
	}
	
	
	function validateForm(form) 
	{
		var valid = 1;
			
		for (var i = 0; i < form.elements.length; i++)
		{				
			switch (form.elements[i].type)
			{
				case 'text': 
					
					//email fields are run through the CheckFormEmail function
					if (document.getElementById(form.elements[i].name).name.indexOf("Email") != -1)
					{
						valid = checkEmail(document.getElementById(form.elements[i].name));
	
						SetElements(form.elements[i].name,valid);
					}
					
					//hidden elements with a value of 2 do not get validated
					if (!isEmpty(document.getElementById(form.elements[i].name).value)) //name and id are intentionally assigned the same name for this purpose
					{
						if (document.getElementById(form.elements[i].name + "Hidden").value != 2)
						{
							valid = SetElements(form.elements[i].name,0);
						}
					}
					
					if (document.getElementById(form.elements[i].name + "Hidden").value == 0)
					{
						valid = SetElements(form.elements[i].name,0);
					}
					
					break;
					
				case 'password': 
				
					if (!isEmpty(document.getElementById(form.elements[i].name).value))
					{
						valid = SetElements(form.elements[i].name,0);
					}
					
					break;
					
				case 'select-one':
	
					if (!isSelected(document.getElementById(form.elements[i].name)))
					{
						if (document.getElementById(form.elements[i].name + "Hidden").value != 2)
						{
							valid = SetElements(form.elements[i].name,0);
						}
					}
	
					break;
					
				case 'checkbox':
					
					break;
					
				case 'radio':
									
					break;
									
				case 'hidden':
												
					break;
					
			}
		}
		
		//if something is not valid then loop back through elements look for hidden 
		//elements that are set to 1 and stop displaying error messaging
		
		if (valid == 0) 
		{
			for (var i = 0; i < form.elements.length; i++)
			{
				if (form.elements[i].type == 'hidden')
				{
					//hidden form elements posted from other forms have id attributes that start with post_ and do not need to be validated
					if (!document.getElementById('post_' + form.elements[i].name))
					{
						if (document.getElementById(form.elements[i].name).value == "1")
						{
							var formEle = document.getElementById(form.elements[i].name).name;
							
							if (formEle.indexOf("BasicGroupRegStage") == -1)
							{
								SetElements(formEle.replace("Hidden",""),1);
							}
						}
					}
				}
			}
					
			return false; 
		}
			
		return true;
	}
	
	function SetElements(elem,isValid)
	{
		var valid = isValid;
				
		if (isValid == 0)
		{
			document.getElementById(elem + 'Error').style.display = "";
			document.getElementById(elem).style.border = "1px solid #FAA59E";
			document.getElementById(elem + 'Hidden').value = "0";
		}
		else
		{
			document.getElementById(elem + 'Error').style.display = "none";
			document.getElementById(elem).style.border = "1px solid #A5ACB2";
			document.getElementById(elem + 'Hidden').value = "1";
		}
					
		return valid;	
	}
