	// THIS FUNCTION ALLOWS A LISTBOX TO SUBMIT A FORM AFTER VERIFYING THAT A SELECTION IS MADE
	function formsubmit(formname, fieldname) {
		if (thisform = document.getElementById(formname)) {
			if (thisfield = document.getElementById(fieldname)) { 
				if (thisfield.selectedIndex) {
					if (thisfield.selectedIndex != 0)
						thisform.submit();
					else
						return;
				}
				else if (thisfield.value != '')
					thisform.submit();
				else
					return;
			}
			else 
				thisform.submit();
		}
	}
	
	
	function isNotEmpty(elem) {
		var str = elem.value;
		if(str == null || str.length == 0) 
			return false;
		else 
			return true;
	}
	
	// THIS FUNCTION PERFORMS VALIDATION BASED ON A SET OF CUSTOM HTML ATTRIBUTES
	function validate(form) {
		var attrVal, attrReg, attrEq, attrFail, strTemp;

		for (var i = 0; i < form.length; i++) {
			attrVal = form[i].getAttribute("validate");
			
			switch (attrVal) {
				case 'required' :
				if (!isNotEmpty(form[i])) {
					attrFail = form[i].getAttribute("failure");
					
					if (attrFail)
						alert(attrFail);
					else					
						alert('You must complete all required form fields.');
					form[i].focus();
					return false;
				}
				break;
				
				case 'regex' :
				attrReg = form[i].getAttribute("regex");
				if (attrReg != null && attrReg.length != 0) {
					var regex = new RegExp(attrReg);
					strTemp = form[i].value;
					if (!strTemp.match(regex)) {
						attrFail = form[i].getAttribute("failure");

						if (attrFail)
							alert(attrFail);
						else
							alert('Invalid data format at field "' + form[i].name + '".');
						form[i].focus();
						return false;
					}
				}
				break;
				
				case 'equals' :
				attrEq = form[i].getAttribute("equals");
				var objEq = document.getElementById(attrEq);
				if (objEq) {
					if (form[i].value != objEq.value) {
						attrFail = form[i].getAttribute("failure");
						
						if (attrFail)
							alert(attrFail);
						else
							alert('Form fields do not match');
						
						form[i].focus();
						return false;
					}
				}
				break;
			}
			
		}
		
		return true;
	}
	
	// THIS FUNCTION PREPARES ALL FORM FIELDS WITH A ROLLOVER/FOCUS HIGHLIGHT EFFECT
	function prepFormFields() {
		var htmlElements = Array('select', 'input', 'textarea');
		var htmlTempArray;
		for (var i = 0; i < htmlElements.length; i++) {
			htmlTempArray = document.getElementsByTagName(htmlElements[i]);
			for (var j = 0; j < htmlTempArray.length; j++) {
				htmlTempArray[j].onmouseover = htmlTempArray[j].onfocus = function() {
					this.className = 'selected';
				}
				htmlTempArray[j].onmouseout = htmlTempArray[j].onblur = function() {
					this.className = '';
				}
			}
		}
	}	
	
	// THIS FUNCTION ALLOWS YOU TO TYPE IN THE FIELD TEXTBOX AND AUTOSELECT MATCHING VALUES IN LISTBOX
	function suggestName(textbox, listboxName, level) {
		if (isNaN(level)) {
			level = textbox.value.length
		}
		var f = textbox.form;
		var listbox = document.getElementById(listboxName);
		var soFar = textbox.value.toString();
		var soFarLeft = soFar.substring(0, level).toLowerCase();
		var matched = false;
		var suggestion = '';
		
		for (var m = 0; m < listbox.length; m++) {
		  suggestion = listbox.options[m].text.toString();
		  suggestion = suggestion.substring(0, level).toLowerCase();
	
		  if (soFarLeft == suggestion) {
		   listbox.options[m].selected = true;
		   matched = true;
		   break;
		  }
		}
		if (matched && level < soFar.length) { 
			level++; 
			suggestName(level) ;
		}
	}	
	
	// USABLE FORMS
	var relatedTag = 'TR';

	var compatible = (
		document.getElementById && document.getElementsByTagName && document.createElement
		&&
		!(navigator.userAgent.indexOf('MSIE 5') != -1 && navigator.userAgent.indexOf('Mac') != -1)
		);
	
	if (compatible)
		document.write('<style>.accessibility{display: none}</style>');
	
	function prepareForm()
	{
		if (!compatible) return;
		var marker = document.createElement(relatedTag);
		marker.style.display = 'none';
	
		var x = document.getElementsByTagName(relatedTag);
		var toBeRemoved = new Array;
		for (var i=0;i<x.length;i++)
		{
			if (x[i].getAttribute('relation'))
			{
				var y = getAllFormFields(x[i]);
				x[i].nestedRels = new Array;
				for (var j=0;j<y.length;j++)
				{
					var rel = y[j].getAttribute('show');
					if (!rel || rel == 'none') continue;
					x[i].nestedRels.push(rel);
				}
				if (!x[i].nestedRels.length) x[i].nestedRels = null;
				toBeRemoved.push(x[i]);
			}
		}
	
		while (toBeRemoved.length)
		{
			var rel = toBeRemoved[0].getAttribute('relation');
			if (!document.getElementById(rel))
			{
				var newMarker = marker.cloneNode(true);
				newMarker.id = rel;
				toBeRemoved[0].parentNode.replaceChild(newMarker,toBeRemoved[0]);
			}
			document.getElementById('waitingRoom').appendChild(toBeRemoved.shift());
		}
		document.onclick = arrangeFormFields;
	
		var y = document.getElementsByTagName('input');
		for (var i=0;i<y.length;i++)
		{
			if (y[i].checked && y[i].getAttribute('show'))
				intoMainForm(y[i].getAttribute('show'))
		}
	
		var z = document.getElementsByTagName('select');
		
		// Opera weird with hidden selects in quirks mode: selectedIndex = -1
		
		for (var i=0;i<z.length;i++)
		{
			if (z[i].options[z[i].selectedIndex].getAttribute('show'))
			{
				z[i].onchange = arrangeFormFields;
				intoMainForm(z[i].options[z[i].selectedIndex].getAttribute('show'))
			}			
		}
	}
	
	function arrangeFormFields(e)
	{
		if (!e) var e = window.event;
		var tg = (e.target) ? e.target : e.srcElement;
		if (
			!(tg.nodeName == 'SELECT' && e.type == 'change')
			&&
			!(tg.nodeName == 'INPUT' && tg.getAttribute('show'))
		   ) return;
		var toBeInserted = tg.getAttribute('show');
	
		if (tg.type == 'checkbox')
		{
			if (tg.checked)
				intoMainForm(toBeInserted);
			else
				intoWaitingRoom(toBeInserted);
		}
		else if (tg.type == 'radio')
		{
			removeOthers(tg.form[tg.name],toBeInserted)
			intoMainForm(toBeInserted);
		}
		else if (tg.type == 'select-one')
		{
			toBeInserted = tg.options[tg.selectedIndex].getAttribute('show');
			removeOthers(tg.options,toBeInserted);
			intoMainForm(toBeInserted);
		}
	}
	
	function removeOthers(others,toBeInserted)
	{
		var toBeRemoved = new Array;
		for (var i=0;i<others.length;i++)
		{
			var show = others[i].getAttribute('show');
			if (show != toBeInserted)
				toBeRemoved.push(show);
		}
		while (toBeRemoved.length)
			intoWaitingRoom(toBeRemoved.shift());
	}
	
	function gatherElements(name)
	{
		var Elements = new Array;
		var x = document.getElementsByTagName(relatedTag);
		for (var i=0;i<x.length;i++)
			if (x[i].getAttribute('relation') == name)
				Elements.push(x[i]);
		return Elements;
	}
	
	function intoWaitingRoom(name)
	{
		if (name == 'none') return;
		var Elements = gatherElements(name);
		if (isInWaitingRoom(Elements[0])) return;
		while (Elements.length)
		{
			if (Elements[0].nestedRels)
				for (var i=0;i<Elements[0].nestedRels.length;i++)
					intoWaitingRoom(Elements[0].nestedRels[i]);
			document.getElementById('waitingRoom').appendChild(Elements.shift())
		}
	}
	
	function intoMainForm(name)
	{
		if (name == 'none') return;
		var Elements = gatherElements(name);
		if (!isInWaitingRoom(Elements[0])) return;
		var insertPoint = document.getElementById(name);
		while (Elements.length)
			insertPoint.parentNode.insertBefore(Elements.shift(),insertPoint)
	}
	
	function isInWaitingRoom(obj)
	{
		while(obj.nodeName != 'BODY')
		{
			obj=obj.parentNode;
			if (obj.id == 'waitingRoom')
				return true;
		}
		return false;
	}
	
	
	function getAllFormFields(node)
	{
		var allFormFields = new Array;
		var x = node.getElementsByTagName('input');
		for (var i=0;i<x.length;i++)
			allFormFields.push(x[i]);
		var y = node.getElementsByTagName('option');
		for (var i=0;i<y.length;i++)
			allFormFields.push(y[i]);
		return allFormFields;
	}
	
	// push and shift for IE5
	
	function Array_push() {
		var A_p = 0
		for (A_p = 0; A_p < arguments.length; A_p++) {
			this[this.length] = arguments[A_p]
		}
		return this.length
	}
	
	if (typeof Array.prototype.push == "undefined") {
		Array.prototype.push = Array_push
	}
	
	function Array_shift() {
		var A_s = 0
		var response = this[0]
		for (A_s = 0; A_s < this.length-1; A_s++) {
			this[A_s] = this[A_s + 1]
		}
		this.length--
		return response
	}
	
	if (typeof Array.prototype.shift == "undefined") {
		Array.prototype.shift = Array_shift
	}
	// USABLE FORMS
