/* 
--------------------------------------------------
RequiredFields [v2.0]
john's big hairy form validator
--------------------------------------------------
*/
function RequiredFields(oForm) {
	var bCompleted = true;
	var bValidEmail = true;
	var oField;
	var oEmailRegExp = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,})+$/;
	var bChecked = false;
	var bRequired = false;
	
	
	// loop through all form fields...
	for (var i=0; i<oForm.elements.length; i++) {
		oField = oForm.elements[i];
		if (oField!=undefined && oField!=null && oField.id.length) {		
			// check if the field is required...
			bRequired = Array.find(aRequired, oField.name)!=-1;
			
			if (bRequired) {
				// required field...
				if (oField.type=='text'||oField.type=='textarea'||oField.type=='password'||oField.type=='hidden') {
					if (oField.value.length==0) {
						bCompleted = false;
						highlight(oField);
					}
					else if (oField.name=='email') {
						if (!oEmailRegExp.test(oField.value)) {
							bValidEmail = false;
							highlight(oField);
						}
					}
				}
				else if (oField.type=='radio') {
					bChecked = false;
					for (j=0;j<oField.length;j++) {
						if (oField[j].checked) {
							bChecked = true;
						}
					}
					if (!bChecked) {
						highlight(oField);
						bCompleted = false;
					}
				}
				else if (oField.type=='select'||oField.type=='select-one') {
					if (oField.options[oField.selectedIndex].value.length==0) {
						bCompleted = false;
						highlight(oField);
					}
				}
				else if (oField.type=='checkbox') {
					if (!oField.checked) {
						bCompleted = false;
						highlight(oField);
					}
				}
				else {
					bChecked = false;
					for (j=0;j<oField.length;j++) {
						if (oField[j].checked) {
							bChecked = true;
						}
					}
					if (!bChecked) {
						highlight(oField);
						bCompleted = false;
					}
				}
			}
			if (bCompleted) {
//			else {
				// check that value is not the default value...	
				if (oField.type=='text'||oField.type=='textarea'||oField.type=='password'||oField.type=='hidden') {
					if (oField.title&&oField.title.length) {
						if (oField.title.toLowerCase()==oField.value.toLowerCase()) {
							highlight(oField);
							bCompleted = false;
						}
					}
					else if (oField.alt&&oField.alt.length) {
						if (oField.alt.toLowerCase()==oField.value.toLowerCase()) {
							highlight(oField);
							bCompleted = false;
						}
					}
				}
			}
		}
		if (!bCompleted) {
			if (bRequired) {
				if (oField.title&&oField.title.length) {
					alert('Please enter ' + oField.title);
				}
				else if (oField.alt&&oField.alt.length) {
					alert('Please enter ' + oField.alt);
				}
				else {
					alert('Please complete all required fields');
				}
			}
			else {
				if (oField.title&&oField.title.length) {
					alert('Please enter ' + oField.title + ' or leave blank');
				}
				else if (oField.alt&&oField.alt.length) {
					alert('Please enter ' + oField.alt + ' or leave blank');
				}
				else {
					alert('Please set blank any non essential information you prefer not to provide');
				}
			}
			break;
		}
	} // end loop
	

	if (bCompleted&&!bValidEmail) {
		alert('Please check your email address');
	}
	var bResult = bCompleted && bValidEmail;

	if (bResult) {
		// loop through fields and find submit buttons then disable....
		// we have an issue where a disabled field is not passed back in the form so need to check that only one submit button...
		var aSubmitButtons = new Array();
		for (i=0;i<oForm.elements.length;i++) {
			if (oForm.elements[i].type=='submit') {
				aSubmitButtons[aSubmitButtons.length] = oForm.elements[i];
;
			}
		}
		if (aSubmitButtons.length==1) {
			// only one submit button so OK to disable...
			aSubmitButtons[0].style.cursor = 'wait';
			aSubmitButtons[0].disabled = true;	
			aSubmitButtons[0].value = "sending";
		}
		else {
			// more than one submit button so disable each psuedo style...
			for (i=0;i<aSubmitButtons.length;i++) {
				aSubmitButtons[i].style.color = "#5F5F5F";
				aSubmitButtons[i].style.backgroundColor = "#F4F4F4";
				aSubmitButtons[i].style.cursor = 'wait';
				aSubmitButtons[i].value = "sending";
			}
		}
	}
	return bResult;
}

/* 
--------------------------------------------------
highlight [v1.2]
john's highlight form elements
--------------------------------------------------
*/
function highlight(oField) {
	// pick mode - highlight table cell (true) or form field (false)...
	var bHighlightTd = true;
	var sStyleParentBorder = '';
	var sStyleParentBackgroundColor = '';
	var sStyleFieldBorder = '1px solid #2D8298';
	var sStyleFieldBackgroundColor = '#FFFFFF';

	if (oField.type=='select'||oField.type=='select-one'||oField.type=='text'||oField.type=='textarea'||oField.type=='password') {
		oField.focus();
		if (bHighlightTd && oField.id) {
			if (sStyleParentBackgroundColor.length) {
				document.getElementById(oField.id).parentNode.style.backgroundColor = sStyleParentBackgroundColor;
			}
			if (sStyleParentBorder.length) {
				document.getElementById(oField.id).parentNode.style.border = sStyleParentBorder;
			}
			if (sStyleFieldBackgroundColor.length) {
				document.getElementById(oField.id).style.backgroundColor = sStyleFieldBackgroundColor;
			}
			if (sStyleFieldBorder.length) {
				document.getElementById(oField.id).style.border = sStyleFieldBorder;
			}
		}
		else {
			if (sStyleFieldBackgroundColor.length) {
				oField.style.backgroundColor = sStyleFieldBackgroundColor;
			}
			if (sStyleFieldBorder.length) {
				oField.style.border = sStyleFieldBorder;
			}
		}
	}
	else {
//		oField.parentNode.style.backgroundColor = 'lightyellow';
//		oField.parentNode.style.border = '1px solid red';
		// radio...
		for (var i=0;i<oField.length;i++) {
			oField[i].focus();
			if (bHighlightTd && oField[i].id) {
				if (sStyleParentBackgroundColor.length) {
					document.getElementById(oField[i].id).parentNode.style.backgroundColor = sStyleParentBackgroundColor;
				}
				if (sStyleParentBorder.length) {
					document.getElementById(oField[i].id).parentNode.style.border = sStyleParentBorder;
				}
				if (sStyleFieldBackgroundColor.length) {
					oField[i].style.backgroundColor = sStyleFieldBackgroundColor;
				}
				if (sStyleFieldBorder.length) {
					oField[i].style.border = sStyleFieldBorder;
				}
			}
			else {
				if (sStyleFieldBackgroundColor.length) {
					oField[i].style.backgroundColor = sStyleFieldBackgroundColor;
				}
				if (sStyleFieldBorder.length) {
					oField[i].style.border = sStyleFieldBorder;
				}
			}
		}
	}
//	alert(oField.name);
}

/* 
--------------------------------------------------
clearFieldValues [v1.0]
--------------------------------------------------
*/
function clearFieldValues(oForm) {
	for (var i=0; i<oForm.elements.length; i++){
		oField = oForm.elements[i];
		if (oField!=undefined && oField!=null && oField.id.length) {	
			addEvent(
				document.getElementById(oField.id), 
				'focus', 
				function() { 
					if (this.id!=undefined && this!=null) {
						if (this.title==this.value) { 
							this.value='';
						}
					}
					else if (event.srcElement) {
						oElement = event.srcElement;
						if (oElement.title==oElement.value) { 
							oElement.value='';
						}
					}
					else {
						// not DOM or IE5.5+
					}
				}
				, false 
			);
		}
	}
}
//var aRequired = new Array();

/* 
--------------------------------------------------
extend Array with Find Method [v1.0]
--------------------------------------------------
*/
Array.find = function(ary, element){
    for(var i=0; i<ary.length; i++){
        if(ary[i] == element){
            return i;
        }
    }
    return -1;
}


/*
-------------------------------------------------------- 
-------------------------------------------------------- 
Event Handling...
-------------------------------------------------------- 
-------------------------------------------------------- 
*/

/*
-------------------------------------------------------- 
addEvent [v1.0]
--------------------------------------------------------
usage: 
	addEvent(document.getElementById('tb1'), 'keyup', handleKeyUp, false);
	addEvent(document.getElementById('tb1'), 'keyup', function(){handleKeyUp(your, parms, here)}, false);
--------------------------------------------------------
*/
function addEvent(element, eventType, func, capt) {
	if (element.addEventListener) {
		element.addEventListener(eventType, func, capt);
	}
	else if (element.attachEvent) {
		var r = element.attachEvent('on' + eventType, func);
		return r;
	} 
	else {
		if (element['on' + eventType]==null) {
			element['on' + eventType] = func;
		}
		else {
			oldEventType = element['on' + eventType];
			element['on' + eventType] = function(e) {
				oldEventType(e);
				element['on' + eventType][func]();
			}
		}
	}
}


/*
--------------------------------------------------------
addOnloadEvent [v1.0]
handle multiple window onload events
--------------------------------------------------------
usage: 
	addOnloadEvent(function(){ myFunctionName('myArgument') });
	addOnloadEvent(myFunctionName);
--------------------------------------------------------
*/
function addWindowOnload(func){
	addEvent(window, 'load', func, false);
}


/*
add getElementById functionality to IE4
-------------------------------------------------------- 
*/
if (!document.getElementById && document.all) { 
	document.getElementById = new Function('id', 'return document.all[id]') 
}