// Some regexes stolen blatently from http://tetlaw.id.au/upload/dev/validation/validation.jsvar filters = {	requiredField: function(v) {		var item = v.length ? v[0] : v		var signature = item.tagName.toUpperCase() + (item.type ? "." + item.type.toUpperCase() : "")		switch(signature) {			case 'INPUT.TEXT':			case 'INPUT.PASSWORD':			case 'TEXTAREA.TEXTAREA':				return /./.test(trim(v.value)) ? "" : "Field is empty."			case 'INPUT.RADIO':			case 'INPUT.CHECKBOX':				var collection = document.forms[0][v.name]				// I check for both .checked and .selectedIndex to cover for freak situations like the event list, where				//	the hidden field is always a checkbox while the visible one is a drop-down				for(var j = 0; j < collection.length; j++) { if(collection[j].checked | collection[j].selectedIndex > -1) { return "" } }				return "Please select " + (signature == "INPUT.CHECKBOX" ? "at least one" : "an") + " option."			case 'SELECT':			case 'OPTION':				return /./.test(trim(v[v.selectedIndex].value)) ? "" : "Please select an option."		}		return ""	},	numericField:  function(v) { return trim(v.value) == "" || !isNaN(trim(v.value)) ? "" : "Not a valid number." },	digitField:    function(v) { return trim(v.value) == "" || !/[^\d]/.test(clear_space(v.value)) ? "" : "Not a valid number." },	alphaField:    function(v) { return trim(v.value) == "" || /^[a-zA-Z]+$/.test(clear_space(v.value)) ? "" : "Contains non-letter characters." },	alphanumField: function(v) { return trim(v.value) == "" || !/\W/.test(clear_space(v.value)) ? "" : "Contains non-alphanumeric characters." },	//emailField:  function(v) { return trim(v.value) == "" || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(trim(v.value)) ? "" : "Not a valid email address." },	//emailField:  function(v) { return trim(v.value) == "" || /^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z]{2,9})$/.test(trim(v.value)) ? "" : "Not a valid email address." },	emailField:    function(v) { return trim(v.value) == "" || /^([0-9a-zA-Z-!\'%&\*\+\/=\?^`{}\|$~]([-.!\'%&\*\+\/=\?^`{}\|$~\w]*[0-9a-zA-Z\-!\'%&\*\+\/=\?^`{}\|$~])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z]{2,9})$/.test(trim(v.value)) ? "" : "Not a valid email address." },	zipField:      function(v) { return trim(v.value) == "" || /^\d\d\d\d\d(-?)(\d\d\d\d)?$/.test(clear_space(v.value)) ? "" : "Not a valid US ZIP code." },	//phoneField:  function(v) { return trim(v.value) == "" || /^[\d]{10,11}$/.test(strip_non_digits(v.value)) ? "" : "Not a valid phone number." }	phoneField:    function(v) { return trim(v.value) == "" || /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/.test(trim(v.value)) ? "" : "Not a valid phone number." },	eventField:    function(v) { return this.requiredField(v) }}	validateFields = function(elements) {	// if we're not really submitting (i.e. we're just refreshing fields), don't run the checks	if(!document.__is_submitting) { return true }		var content = document.getElementById("content")		errorMessage = ""	//var elements = specificElement ? [specificElement] : document.forms[0].elements	var hitElements = new Object()	for(var i = 0; i < elements.length; i++) {		if(hitElements[elements[i].name]) { continue }				var parentElement = document.getElementById(elements[i].name + "_Row")				// clear out any old error nodes		if(parentElement) {			var errorMessages = children_by_class(parentElement, "errorMessage")			for(var j = errorMessages.length - 1; j >= 0; j--) { errorMessages[j].parentNode.removeChild(errorMessages[j]) }		}			if(/\s+notesEventField\s+/.test(" " + elements[i].className + " ")) { continue }		if(parentElement) parentElement.className = parentElement.className.replace(" missingRequiredField", "")		if(parentElement) parentElement.className = parentElement.className.replace(" textFieldError", "")		var classes = elements[i].className.split(/\s/)		for(filterClass in filters) {			if(classes.indexOf(filterClass) > -1) {				var result = filters[filterClass](elements[i])				if(result != "") {					errorMessage += elements[i].title + ": " + result + "\n"					if(parentElement) {						var itemError = document.createElement('div')						itemError.className = "errorMessage"						itemError.style.visibility = "hidden"												itemError.style.opacity = 0						itemError.style.filter = "alpha(opacity=0)"												itemError.appendChild(document.createElement('span'))						itemError.firstChild.appendChild(document.createTextNode(result))						last_real_element(parentElement.childNodes).appendChild(itemError)						//parentElement.appendChild(itemError)												if(["TEXT", "TEXTAREA", "PASSWORD"].indexOf(elements[i].type.toUpperCase()) > -1) {							itemError.style.width = elements[i].offsetWidth > 150 ? elements[i].offsetWidth : 150							itemError.className += " textFieldError"							parentElement.className += " textFieldError"						} else {							itemError.style.width = itemError.firstChild.offsetWidth + 20						}												itemError.style.visibility = "visible"						new Effect.Opacity(itemError, {							duration: 1, 							transition: Effect.Transitions.linear, 							from: 0, to: 1 }						)						parentElement.className += " missingRequiredField"					}					break				}			}		}		hitElements[elements[i].name] = true	}	document.__is_submitting = false	if(errorMessage != "") { alert(errorMessage); return false }	if(document.getElementById("submitButton")) {		document.getElementById("submitButton").disabled = true		document.getElementById("submitButton").value = "Please wait..."	}		return true}trim = function(v) { return v.replace(/^\s+/, "").replace(/\s+$/, "") }clear_space = function(v) { return v.replace(/\s/g, "") }strip_non_digits = function(v) { return v.replace(/[^\d]/g, "") }last_real_element = function(v) { for(var i = v.length - 1; i >= 0; i--) { if(v[i].nodeType == 1) { return v[i] } } return null }// modified from http://www.webxpertz.net/forums/showthread.php?t=30555function children_by_class(container, className) {	var arr   = []	var reg   = new RegExp("\\b" + className + "\\b")	container = document.getElementById(container) || container || document	var all   = container.all || container.getElementsByTagName("*")	var elm	for(index = 0; index < all.length; index++) {		elm = all[index]		if(reg.test(elm.className)) { arr[arr.length] = elm }	}	return arr}// Firefox has this method already, but IE seems to not, so I'll patch in my own iff it doesn't existif(!Array.prototype.indexOf) { Array.prototype.indexOf = function(v) { for(var i = 0; i < this.length; i++) if(this[i] == v) return i; return -1 } }