// Demoiselle Survey Recording Form 
// JavaSCript validation v5.0

	function checkForm(demRecord) 
	{
		//alert("checking entries now");
		// check if DOM is available
		if(!document.getElementById || !document.createTextNode){return;}	// If neither of these nodes is available, return false
				
		var senderNameValue, senderEmailValue, senderAddressValue, senderPostcodeValue, gridRefValue, siteNameValue, whenDateValue; // main text and textarea fields, not all required
		var supplyPhotoValue	// checkbox (optional)
		var BDSmemberAnsValue, ageRangeChosenValue, adultMaleNumValue, matingPairNumValue, waterBodyTypeValue; // required radio arrays
		var waterBodyOtherValue;	//text input, only required if waterBodyTypeValue = 'other'
	
		
		// Cleanup old mess
		// if there is an old errormessage field, delete it
			if(document.getElementById(errorID)) {
				var em=document.getElementById(errorID);
				em.parentNode.removeChild(em);
			}
		
		// remove old images and classes from the required fields
			for (var i=0; i<demRecord.elements.length; i++)	// Loop thru all the elements in the form
			{
				var elem = demRecord.elements[i]
				if(elem.previousSibling && /img/i.test(elem.previousSibling.nodeName)) 
				{ 
					elem.parentNode.removeChild(elem.previousSibling);
					elem.className='';
				}			
			//elem.className='';	// doing this here removes the class "MainInput" from each <fieldset>, which screws up the display
									// I moved it up into the if... statement, and it seems to be OK now. 
			}
			
		
		// Get the value for each element in the form that we are interested in
		var fElem, i=0;
			while (fElem = demRecord.elements[i++])	// Loop thru all the elements in the form   *** Maybe you should try getElementByTagName, and loop thru all <input> tags... ?
			{
				if (fElem.type == 'text' || fElem.type == 'textarea')
				{
					switch(fElem.name)	// all text and textarea inputs
					{
						case "senderName": 
							senderNameValue = fElem.value;	// required field
							if(fElem.value==''){cf_addError(demRecord.senderName);}
						break;
						/*
						case "senderEmail": 
							senderEmailValue = fElem.value;	// required field
							if(fElem.id=='senderEmail' && !cf_isEmailAddr(fElem.value)){cf_addError(demRecord.senderEmail);}
						break;
						*/
						case "senderEmail": 
							senderEmailValue = fElem.value;	// required field
							if(fElem.id=='senderEmail' && !cf_isEmail(fElem.value)){cf_addError(demRecord.senderEmail);}
						break;
						case "senderAddress": senderAddressValue = fElem.value;		// not mandatory
						break;
						case "senderPostcode": senderPostcodeValue = fElem.value;	// not mandatory
						break;
						case "gridRef": gridRefValue = fElem.value;	// conditional required field
						break;
						case "siteName": 
							siteNameValue = fElem.value;	// required field
							if(fElem.value==''){cf_addError(demRecord.siteName);}
						break;
						case "whenDate": 
							whenDateValue = fElem.value;	// required field
							if(fElem.value=='' || !cf_isOKDate(fElem.value)){cf_addError(demRecord.whenDate);}
						break;
						case "waterBodyOther": 
							waterBodyOtherValue = fElem.value;	// conditional required field
						break;
					}					
				}
				
				else if (fElem.type == 'radio' && fElem.checked)
				{
					switch(fElem.name)	// all radio arrays
					{
						case "BDSmemberAns": BDSmemberAnsValue = fElem.value;		// required field
						break;
						case "ageRangeChosen": ageRangeChosenValue = fElem.value;	// required field
						break;
						case "adultMaleNum": adultMaleNumValue = fElem.value;		// one or other of these two is required							
						break;
						case "matingPairNum": matingPairNumValue = fElem.value;		// one or other of these two is required							
						break;
						case "waterBodyType": waterBodyTypeValue = fElem.value;		// required field
						break;
					}
				}
				
				else (fElem.type == 'checkbox' && fElem.checked)
				{
					if (fElem.name == 'supplyPhoto') 
					{
						supplyPhotoValue = fElem.value;	// not mandatory
					}
				}
			}
			
			// Deal with conditional text box fields
			if (!gridRefValue && !siteNameValue){cf_addError(demRecord.gridRef);}
			
			// Deal with completely blank radio arrays, one by one
			if (!BDSmemberAnsValue){cf_addError(demRecord.BDSmemberAns1);}
			if (!ageRangeChosenValue){cf_addError(demRecord.ageRangeChosen1);}
			if (!adultMaleNumValue && !matingPairNumValue){cf_addError(demRecord.adultMaleNum1);}
			if (!waterBodyTypeValue){cf_addError(demRecord.waterBodyType1);}
			
			// If the user has selected "other" as the kind of waterbody, they must specify what that is in the text box below the radio array
			if (waterBodyTypeValue == 'other' && !waterBodyOtherValue){cf_addError(demRecord.waterBodyOther)};
			
					
		//alert(msg) went in here
		//if(!document.getElementById(errorID)){alert("There are no errors on this page");}
		
	return !document.getElementById(errorID);	// i.e. if there are no elements on the page with the ID "errorID", return true; otherwise, return false
	}
			
			
//----------------------------------------------------------------------------			
	
		var errorID='errormsg';
		var errorClass='error'
		var errorMsg='The record can\'t be submitted yet because there are some errors in the form. Please enter or change the fields marked with a ';
		var errorImg='../../images/schemes/formAlert.gif';
		var errorAlt='Error';
		var errorTitle='This field has an error!';
		var errorHeight='12';
		var errorWidth='12';
		
			
			/* Tool methods */
			function cf_addError(o)
			{
				//alert("Variable o = " + o);
				// create image, add to and colourise the error fields
				var errorIndicator=document.createElement('img');
				errorIndicator.alt=errorAlt;
				errorIndicator.src=errorImg;
				errorIndicator.title=errorTitle;
				errorIndicator.height=errorHeight;
				errorIndicator.width=errorWidth;
				o.className=errorClass;
				o.parentNode.insertBefore(errorIndicator,o);

			// Check if there is no error message
				if(!document.getElementById(errorID))
				{
				// create errormessage and insert before submit button
					var em=document.createElement('div');
					em.id=errorID;
					var newP=document.createElement('h5');
					newP.appendChild(document.createTextNode(errorMsg))
					// clone and insert the error image
					newP.appendChild(errorIndicator.cloneNode(true));
					em.appendChild(newP);
					// find the submit button 
					for(var i=0;i<document.demRecord.getElementsByTagName('input').length;i++)
					{
						if(/submit/i.test(document.demRecord.getElementsByTagName('input')[i].type))
						{
							var sb=document.demRecord.getElementsByTagName('input')[i];
							break;
						}
					}
					if(sb)
					{
						sb.parentNode.insertBefore(em,sb);
					}	
				} 
			}
			
			/*
			** no longer using cf_isEmailAddr()
			** It appeared to cause inescapable errors with certain email addresses, 
			** e.g. with jayneykel@yahoo.com
			** does this code expect two "."s after the @ symbol?
			*/
			function cf_isEmailAddr(str) 
			{
			    return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
			}
			
			/* So using thsi instead, which isn't as rigorous or elegant */
			function cf_isEmail(elem) 
			{
				if (elem.indexOf("@") != "-1" && elem.indexOf(".") != "-1")
				{
					return true;
				}
				else 
				{
					return false;
				}
			}						
			
			function cf_isOKDate(str)		// This is really simple and ugly, but doing it exhaustively requires STACKS of code!		
			{	
				var valid = "0123456789/";	// These are the characters which are valid in a date				
					for (var i=0; i<30; i++) {
						if (str.length != 10 || valid.indexOf(str.charAt(i)) < 0){return false;}
						else{return true;}
					}
			}
