		function validateForm(form) {
			//loop through form elements and validate
			var message = '';
			var requiredAtt = '';
			var messageAtt = '';
			var elem = '';
			//IE len is different to FireFox
			var len = form.elements.length.value;
			if (isNaN(len)) {
				len = form.elements.length;
			}
			for (i=0; i < len; i++) {
				try {
					requiredAtt = form.elements[i].getAttribute('required');
					messageAtt = form.elements[i].getAttribute('message');
					elem = form.elements[i];
					if (requiredAtt!="false") {						
						if(elem.type == "text" || elem.type == "textarea" || elem.type == "button" || elem.type == "file"){
							if (messageAtt!=''&&elem.value=='') { 
								message = message + messageAtt + '\n';
								elem.focus();
								break;
							}
							/*
							ignoring this for now, cause of damn american alphabet phone numbers...(555)USA-CALL
							else if (elem.name.indexOf("phone")!=-1) {
								phoneCheck((eval('form.' + elem.name)).value);
								if (phoneMessage!='') {
									message = message + phoneMessage + '\n';
									elem.focus();
									break;
								}
							}
							*/
						}
						else if(elem.type == "checkbox" || elem.type == "radio") {
							//loop through multiple
							var isChecked = false;
							var group = (eval('form.' + elem.name));
							for (x=0; x < group.length; x++ ) { 
								if (group[x].checked) { 
									isChecked = true;
									break;
								}
							}
							if (messageAtt!=''&&!isChecked) {
								message = message + messageAtt + '\n';
								elem.focus();
								break;
							}
						}
						else if(elem.type == "select-one"){
							if (messageAtt!=''&&(elem.value==''||elem.value=='SELECT ONE...'||elem.selectedIndex<=0)) { 
								message = message + messageAtt + '\n';
								elem.focus();
								break;
							}
						}
					}
					
					if (elem.name.indexOf("email")!=-1&&elem.value!='') {
						emailCheck((eval('form.' + elem.name)).value);
						if (emailMessage!='') {
							message = message + emailMessage + '\n';
							elem.focus();
							break;
						}
					}
					
				} catch(e) {
					//element does not exist
				}
			}
			if (message!='') {
				alert(message);
				return false;
			}
		}

		function emailCheck (emailValue) {
			var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum|COM|Com|cOm|coM|COm|cOM|NET|ORG|EDU|INT|MIL|GOV|ARPA|BIZ|AERO|NAME|COOP|INFO|PRO|MUSEUM)$/;
			var emailPat=/^(.+)@(.+)$/;
			var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
			var validChars="\[^\\s" + specialChars + "\]";
			var quotedUser="(\"[^\"]*\")";
			var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
			var atom=validChars + '+';
			var word="(" + atom + "|" + quotedUser + ")";
			var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
			var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
			
			var matchArray=emailValue.match(emailPat);

			if (matchArray==null) {
				emailMessage = "Email address seems incorrect (check @ and .'s')";
				return false;
			}
			var user=matchArray[1];
			var domain=matchArray[2];
			for (i=0; i<user.length; i++) {
			if (user.charCodeAt(i)>127) {
				emailMessage = "This username contains invalid characters";
				return false;
			   }
			}
			for (i=0; i<domain.length; i++) {
			if (domain.charCodeAt(i)>127) {
				emailMessage = "This domain name contains invalid characters";
				return false;
			   }
			}
			
			if (user.match(userPat)==null) {			
				emailMessage = "The username does not seem to be valid";
				return false;
			}
			
			var IPArray=domain.match(ipDomainPat);
			if (IPArray!=null) {
			
			for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				emailMessage = "Destination IP address is invalid";
				return false;
			   }
			}
			return true;
			}
			
			var atomPat=new RegExp("^" + atom + "$");
			var domArr=domain.split(".");
			var len=domArr.length;
			for (i=0;i<len;i++) {
			if (domArr[i].search(atomPat)==-1) {
				emailMessage = "The domain name does not seem to be valid";
				return false;
			   }
			}
			
			/* verify that the address ends in a two-letter country or well-known TLD */
			if (domArr[domArr.length-1].length!=2 && 
			domArr[domArr.length-1].search(knownDomsPat)==-1) {
				emailMessage = "The address must end in a well-known domain or two letter " + "country";
				return false;
			}
			
			if (len<2) {
				emailMessage = "This address is missing a hostname";
				return false;
			}
			
			emailMessage = '';
			return true;
		}

		function phoneCheck(phoneValue) {
	    var stripped = phoneValue.replace(/[\(\)\.\-\ ]/g, '');
			if (phoneValue.value == "") {
				phoneMessage = "You didn't enter a phone number.\n";
				return false;
			} else if (isNaN(parseInt(stripped))) {
	      phoneMessage = "The phone number contains illegal characters.\n";
				return false;
	    } else if (!(stripped.length == 10)) {
        phoneMessage = "The phone number is the wrong length. Make sure you included an area code.\n";
				return false;
	    }
			phoneMessage = '';
	    return true;
		}