function checkform(of,msgtype,addtlErrorArray,insertBeforeID)
		{
		/* this function will validate fields on a form.
			To use it, specify fields that are required and fields that require further validation
			on your form, via hidden fields called required and validate:
				<input type="hidden" name="required" id="required" value="Email,Name" />
				<input type="hidden" name="validate" id="validate" value="Email" />
			Then, for all the fields in the validate hidden field, see the comment below 
			Check fields that need validating and follow the same format. Make sure you add the field
			to the case statement and also add a corresponding validate function. 
			
			Note: Your field on your html page must have an id. It
			will use this when showing error messages and also when highlighting the field.
			ex> <input name="Email" id="Email" type="text" value="Email Address" size="25">
			
			If you want something other than the id to be used in the error message, use a label:
		<label for="FirstName">First Name</label>
	<input type="text" size="19" name="FirstName" id="FirstName">

			Parameters:
			of - the form containing the fields
			msgtype -  1 to display via popups, 2 to display the errors on the page.
			addtlErrorArray (optional) - an array containing id,errorMsg of any field 
				that was validated before this function was called. Those error messages will be 
				added to the error box.
			insertBeforeID - the ID of the form element that the error box should be put before. If left
				blank, it will use any object that is of type=submit.
			*/
			var reqfields,valfields,em,i,f,ty;
			var labels,fieldnames,returnvalue;
			returnvalue=true;
			fieldnames=new Array();
			if(document.getElementsByTagName('label').length>0)
			{
				labels=document.getElementsByTagName('label');
for(i=0;i<labels.length;i++)
				{
					fieldnames[labels[i].getAttribute('for')?labels[i].getAttribute('for'):labels[i].getAttribute('htmlFor')]=labels[i].firstChild.nodeValue;
				}
			}
			
			if(document.getElementById('required') || document.getElementById('validate') || 
				( addtlErrorArray != null && addtlErrorArray.length > 0))
			{
				if(document.getElementById('errormsg')){
					em=document.getElementById('errormsg');
					em.parentNode.removeChild(em);
				}
			}

			/* Check fields that are required */
			if(document.getElementById('required'))
			{
				reqfields=document.getElementById('required').value.split(',');
				for(i=0;i<reqfields.length;i++)
				{
					f=document.getElementById(reqfields[i]);
					f.style.background='transparent';
					if(f){
						ty=f.type.toLowerCase();
						switch(ty)
						{								
							case 'text':
								if(f.value==''){
									adderr(f.id,fieldnames[f.id],of,msgtype,"",insertBeforeID);
									returnvalue=false;
								}							
							break;
							case 'textarea':
								if(f.value==''){
									adderr(f.id,fieldnames[f.id],of,msgtype,"",insertBeforeID);
									returnvalue=false;
								}	
							break;
							case 'checkbox':
								if(!f.checked){
									adderr(f.id,fieldnames[f.id],of,msgtype,"",insertBeforeID);
									returnvalue=false;
								}							
							break;
							/* extend as needed */
						}
					}
				}
			}

			/* Check fields that need validating */
			if(document.getElementById('validate'))
			{
				valfields=document.getElementById('validate').value.split(',');
				for(i=0;i<valfields.length;i++)
				{
					f=document.getElementById(valfields[i]);

					if (f.id=="ZIP" && f.value!='' && !isZipValid(f.value)) {
						adderr(f.id,fieldnames[f.id],of,msgtype,'Zip Code format must be 12345 or 12345-1234.',insertBeforeID);
						returnvalue=false;
					}
					if (f.id=="Email" && f.value!='') { 
						if (!isEmailValid(f.value)) {
							adderr(f.id,fieldnames[f.id],of,msgtype,'Email is an invalid format.',insertBeforeID);
							returnvalue=false;
						}
					}
					if (f.id=="CCType" && !isChoiceSelected(f.value)) {
						adderr(f.id,fieldnames[f.id],of,msgtype,'Please choose a credit card type.',insertBeforeID);
						returnvalue=false;
					}
					if (f.id=="CreditCard" && f.value!='' && !isValidCardNumber(f.value)) {
						adderr(f.id,fieldnames[f.id],of,msgtype,'Credit Card Number is invalid.',insertBeforeID);
						returnvalue=false;
					}
					if (f.id=="CCExpire" && f.value!='' && !isValidExpDate(f.value)) {
						adderr(f.id,fieldnames[f.id],of,msgtype,'Invalid expiration date',insertBeforeID);
						returnvalue=false;
					}
					
				}
			}
			
			/* Report the fields that were captured outside this function */
			if (addtlErrorArray != null && addtlErrorArray.length > 0) {
				var errorInfo = new Array(2);
				returnvalue=false;
				for(i=0;i<addtlErrorArray.length;i++) {
					errorInfo = addtlErrorArray[i].split(','); 
					adderr(errorInfo[0],fieldnames[errorInfo[0]],of,msgtype,errorInfo[1],insertBeforeID);

				}
			}
			return returnvalue;

		}
		
		function adderr(id,name,of,msgtype,msg,insertBeforeID)
		{
			if(msgtype==2){
				var se,nli,na,newli,newa;
				se=document.getElementById(id);
				//se.parentNode.insertBefore(i,se)
				se.style.background='#fcc';
				if(!document.getElementById('errormsg')){
					var em=document.createElement('p');
					em.id='errormsg';
					if(msg=="") {
						em.appendChild(document.createTextNode('Please enter the following fields: '))
						ul=document.createElement('ul');
						ul.id='errorlist';
						em.appendChild(ul);				
					}
					else
					{
						em.appendChild(document.createTextNode('Please correct the following fields: '))
					}	
					if (insertBeforeID == null) {
						for(var i=0;i<of.getElementsByTagName('input').length;i++)
						{
							if(/submit/i.test(of.getElementsByTagName('input')[i].getAttribute('type')))
							{

								var sb=of.getElementsByTagName('input')[i];
								break;
							}
						}
					}
					else
					{
						var sb=document.getElementById(insertBeforeID);
					}
					em.style.border='2px solid #c00';
					em.style.padding='5px';
					em.style.width='24em';
					sb.parentNode.insertBefore(em,sb);
				}
				if (msg=="")
				{
				newli=document.createElement('li');
		
					/* List blank fields */
					newa=document.createElement('a');
					newa.appendChild(document.createTextNode(name));
					newa.href='#'+id;
					newli.appendChild(newa);
					document.getElementById('errorlist').appendChild(newli);
				}
				else {
					pn=document.createElement('p');
					pn.appendChild(document.createTextNode(msg));
					document.getElementById('errormsg').appendChild(pn);
				}
			}
			else {
				if (msg=="") {
					alert ("You must must fill in the "+id+" field.");
				}
				else {
					alert (msg);
				}
			}
		}

		function isValidCardNumber (strNum) 
		{
		   var nCheck = 0;
		   var nDigit = 0;
		   var bEven  = false;
		   
		   for (n = strNum.length - 1; n >= 0; n--) 
		   {
			  var cDigit = strNum.charAt (n);
			  if (isDigit (cDigit))
			  {
				 var nDigit = parseInt(cDigit, 10);
				 if (bEven)
				 {
					if ((nDigit *= 2) > 9)
					   nDigit -= 9;
				 }
				 nCheck += nDigit;
				 bEven = ! bEven;
			  }
			  else if (cDigit != ' ' && cDigit != '.' && cDigit != '-')
			  {
				 return false;
			  }
		   }
		   return (nCheck % 10) == 0;
		}
		function isDigit (c)
		{
		   var strAllowed = "1234567890";
		   return (strAllowed.indexOf (c) != -1);
		}
		function isCardTypeCorrect (strNum, type)
		{
		   var nLen = 0;
		   for (n = 0; n < strNum.length; n++)
		   {
			  if (isDigit (strNum.substring (n,n+1)))
				 ++nLen;
		   }
		   
		   if (type == 'Visa')
			  return ((strNum.substring(0,1) == '4') && (nLen == 13 || nLen == 16));
		   else if (type == 'Amex')
			  return ((strNum.substring(0,2) == '34' || strNum.substring(0,2) == '37') && (nLen == 15));
		   else if (type == 'Master Card')
			  return ((strNum.substring(0,2) == '51' || strNum.substring(0,2) == '52'
					  || strNum.substring(0,2) == '53' || strNum.substring(0,2) == '54'
					  || strNum.substring(0,2) == '55') && (nLen == 16));
		   else
			  return false;
		   
		}


		function isEmailValid(str) 
		{
		    return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
		}
		
		function isZipValid(field) {
		//this function returns false if the zip code is not in this format:
		//12345 
		//12345-6789
		var valid = "0123456789-";
		var hyphencount = 0;
		
		if (field.length!=5 && field.length!=10) {
		return false;
		}
		for (var i=0; i < field.length; i++) {
		temp = "" + field.substring(i, i+1);
		if (temp == "-") hyphencount++;
		if (valid.indexOf(temp) == "-1") {
		return false;
		}
		if ((hyphencount > 1) || ((field.length==10) && ""+field.charAt(5)!="-")) {
		return false;
		   }
		}
		return true;
		}

		function isChoiceSelected (strType) 
		{
		   return (strType != "Choose One");
		}
		   
		 
		function isValidExpDate(strExpDate) {
 		/* Check that strExpDate is a valid credit card expiration date. 
			It must be in the format MM/YY and the month/year cannot be earlier than today. */
	
		if (strExpDate.length != 5) {
				return false;
			}
			
		var eMonth = strExpDate.substring(0,2); 
		var strExpYear = strExpDate.substring(3,5);
		
		if (isDigits(eMonth) == false)
			{
			return false;
			}
		if (isDigits(strExpYear) == false)
			{
			return false;
			}
		if (strExpDate.substring(2,3) != "/")
			{
			return false;
			}
	
	
		if (eMonth < 1 || 12 < eMonth)
			{
			return false;
			}

		var eYear = parseInt(strExpYear,10) + 2000;
		var today = new Date(); // get today's date
		var thisYear = today.getFullYear();
		var thisMonth = 1 + today.getMonth();
		if (eYear < thisYear)
			{
			return false;
			}
		if (thisYear < eYear)
			{
			return true;
			}
		if (eMonth < thisMonth)
			{
			return false;
			}
		return true;
	 }
	
	
	function isDigit(c) {
		// check that c is a valid numeric digit
		
		var test = "" + c;
		if (test == "0" || test == "1" || test == "2" || test == "3" || test == "4" 
		|| test == "5" || test == "6" || test == "7" || test == "8" || test == "9")
			{
			return true;
			}
		return false;
		}
		
	function isDigits(strString) {
	   //  check for valid digits in strString 
	   
	   var strValidChars = "0123456789";
	   var strChar;
	   var blnResult = true;
	
	   if (strString.length == 0) return false;
	
	   //  test strString consists of valid characters listed above
	   for (i = 0; i < strString.length && blnResult == true; i++)
		  {
		  strChar = strString.charAt(i);
		  if (strValidChars.indexOf(strChar) == -1)
			 {
			 blnResult = false;
			 }
		  }
	   return blnResult; 
	   }

