var formElements = new Array(), formObjs = new Array(), curForm, curElement, firstField = true;
var imgPath = "../shared/js/images/";
var fieldErrorOff = "default/clear.gif", fieldErrorOn = "bang.gif";
var formErrorOn = "problem.gif", formErrorOff = "default/whiteblock.gif";
var defaultFormErrorImage = "errorImage"
var validateIsOff = false;
var mssgWin, debug = false;

//----------------- public configuration functions --------------------
function enableValidation(){
	validateIsOff = false;
}
function disableValidation(){
	validateIsOff = true;
	for(var i in formElements){
		formElements[i].image.src = formElements[i].formObj.fieldErrorOff.src;
		if(formElements[i].validator != null) formElements[i].is_Valid = true;
	}
	for(var i in formObjs){
		formObjs[i].formErrorImage.src = formObjs[i].formErrorOff.src;
		formObjs[i].invalidCount = 0;
	}
}
function setFormErrorImageName(imageName){
	defaultFormErrorImage = imageName;
}
function setImagePath(path){
	imgPath = path;
}

//----------------- public functions --------------------
function usingForm(formObj){
	curForm = formObj;
	formObjs[curForm.name] = new FormObject(formObj);
	if(mssgWin == null) createMessageWindow();
}
function addElement(elementName, validationFunction, type, required){
	curElement = new RefElementObject(elementName, type);
	formElements[elementName] = curElement;
	addValidationAttribs(curElement, validationFunction, required);
	//firstFocus();
}
function addRefElement(elementName, type){
	curElement = new RefElementObject(elementName, type);
	formElements[elementName] = curElement;
	//firstFocus();
}
function getElement(elementName){
	return formElements[elementName];
}
function validate(formElement){
	var element = formElements[formElement.name];
	if(element.lastVal == element.get()) return true;
	return validateElementObj(element);
}
function validateByName(n){
	return validateElementObj(formElements[n]);
}
function validateAll(){
	return validateForm(curForm);
}
function validateForm(formRef){
	if(validateIsOff) return true;
	var formObj = formObjs[formRef.name], i, first = true;
	for(i in formElements)
		if(formElements[i].formObj == formObj && !validateElementObj(formElements[i]))
			if(first){
				window.setTimeout("focusElement('" + i + "');", 1500);
				first = false;
			}
	formObj.displayError(formObj.invalidCount > 0);
	return formObj.invalidCount == 0;
}
function forceError(elementName){
	formElements[elementName].image.src = formElements[elementName].formObj.fieldErrorOn.src;
	focusElement(elementName);
}

//----------------- helper functions --------------------
function formErrorDisplay(isOn){
	if(this.errorImageOn != isOn && this.formErrorImage != null){
		this.formErrorImage.src = isOn ? this.formErrorOn.src : this.formErrorOff.src;
		this.errorImageOn = isOn;
	}
}
//function firstFocus(){
	//if(firstField) focusElement(curElement.name);
	//firstField = false;
//}
function registerEvent(element, type, code){
	element.events[element.events.length] = new EventObject(type, code);
}
function validateElementObj(elementObj){
	if(debug) window.status = "Validating " + elementObj.name;
	var formObj = elementObj.formObj;
	if(elementObj.validator == null) return true;
	var is_Valid = ((!elementObj.required && elementObj.get() == "") || elementObj.validator())
	if(is_Valid != elementObj.is_Valid){
		elementObj.is_Valid = is_Valid;
		if(is_Valid){
			elementObj.image.src = formObj.fieldErrorOff.src;
			elementObj.message = "";
			returnVal = true;
			if(--elementObj.formObj.invalidCount == 0)
				formObj.displayError(false);
		}else{
			elementObj.image.src = formObj.fieldErrorOn.src;
			elementObj.formObj.invalidCount++;
		}
	}
	hideMessage();
	elementObj.lastVal = elementObj.get();
	elementObj.image.alt = elementObj.message;
	return is_Valid;
}

//----------------- message window functions --------------------
var windowHeight = 75, windowWidth = 250;
//var wrapperBegin = '<div class="errormessage">';
//var wrapperEnd = '</div>';
var wrapperBegin = '<table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td background="/member/images/errorborder.gif" height="' + windowHeight +'" style="color: red; font-family: arial, helvetica; font-weight: bold; padding-top: 11px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; width: ' + windowWidth + 'px; height: ' + windowHeight + 'px; vertical-align: middle;">';
var wrapperEnd = '</td></tr></table>';
//var wrapperBegin = '<div style="vertical-align: middle; color: red; font-size: 14px; font-family: arial, helvetica; font-weight: bold; padding-top: 11px; padding-right: 6px; padding-bottom: 6px; padding-left: 6px; width: ' + windowWidth + 'px; height: ' + windowHeight + 'px; display: block;">';
//var wrapperEnd = '</div>';
function showMessage(element){
	return;
	var message = formElements[element.name].message;
	if(message > "")
		mssgWin.setMessage(message);
	else
		mssgWin.setVisible(false);
}
function hideMessage(){
	mssgWin.setVisible(false);
}
function createMessageWindow(){
	if(document.all)
		mssgWin = new CreateIEWindow();
	else
		mssgWin = new CreateNSWindow();
}
function CreateIEWindow(){
	this.setPos = setPosIE;
	this.setMessage = setMessageIE;
	this.setVisible = setVisibleIE;
	this.visible = false;
	document.body.insertAdjacentHTML("beforeEnd", '<div id="validationMessage" style="background-image: url(/member/images/errorborder.gif); position: absolute; visibility: hidden; width: ' + windowWidth + 'px; height: ' + windowHeight + 'px;"></div>')
	this.mssgWindow = document.all["validationMessage"]
}
function CreateNSWindow(){
	this.setPos = setPosNS;
	this.setMessage = setMessageNS;
	this.setVisible = setVisibleNS;
	this.visible = false;
	document.layers['validationMessage'] = new Layer(windowWidth);
	win = document.layers['validationMessage'];
	win.visibility = "hide"
	win.resizeTo(windowWidth, windowHeight);
	win.background = "http://preview.myassoc.com/member/images/errorborder.gif"
	this.mssgWindow = win;
}
function setPosIE(){
	this.mssgWindow.style.pixelTop = document.body.clientHeight - windowHeight - 5 + document.body.scrollTop;
	this.mssgWindow.style.pixelLeft = document.body.clientWidth - windowWidth - 5;
	if(this.visible) setTimeout("mssgWin.setPos()", 200);
}
function setPosNS(){
	this.mssgWindow.top = window.innerHeight - windowHeight - 5 + window.pageYOffset;	
	this.mssgWindow.left = window.innerWidth - windowWidth - 16 - 5;
	if(this.visible) setTimeout("mssgWin.setPos()", 200);
}
function setMessageIE(message){
	this.mssgWindow.innerHTML = wrapperBegin + message + wrapperEnd;
	this.setVisible(true);
	this.setPos();
}
function setMessageNS(message){
	this.mssgWindow.document.open();
	this.mssgWindow.document.writeln(wrapperBegin + message + wrapperEnd);
	this.mssgWindow.document.close();
	this.setVisible(true);
	this.setPos();
}
function setVisibleIE(visible){
	if(visible){
		this.visible = true;
		this.mssgWindow.style.visibility = "visible";
		this.setPos()
	}else{
		this.visible = false;
		this.mssgWindow.style.visibility = "hidden";
	}
}
function setVisibleNS(visible){
	if(visible){
		this.visible = true;
		this.mssgWindow.visibility = "show"
		this.setPos()
	}else{
		this.visible = false;
		this.mssgWindow.visibility = "hide"
	}
}

//----------------- object creation functions --------------------
function FormObject(formObj){
	this.form = formObj;
	this.fieldErrorOn = new Image();
	this.fieldErrorOn.src = imgPath + fieldErrorOn;
	this.fieldErrorOff = new Image();
	this.fieldErrorOff.src = imgPath + fieldErrorOff;
	this.formErrorOn = new Image();
	this.formErrorOn.src = imgPath + formErrorOn;
	this.formErrorOff = new Image();
	this.formErrorOff.src = imgPath + formErrorOff;
	this.formErrorImage = document.images[defaultFormErrorImage];
	this.errorImageOn = false;
	this.displayError = formErrorDisplay;
	this.invalidCount = 0;
	formObj.onsubmit = submitEvent;
}
function RefElementObject(elementName, type){
	if(debug) window.status = "Adding " + elementName;
	this.name = elementName;
	this.formObj = formObjs[curForm.name];
	this.element = curForm.elements[elementName];

	type = normalizeType(type);
	this.type = type;
	eval("this.get = get" + type);
	eval("this.set = set" + type);
	this.lastVal = this.get();

	this.events = new Array();
	if(type == "radio"){
		trapRadioEvent(this);
	}else{
		trapEvent(this, "focus", "focus");
		trapEvent(this, "blur", "blur");
		if(type == "checkbox")
			trapEvent(this, "click", "change");
	}
}
function addValidationAttribs(elementObj, validationFunction, required){
	elementObj.image = document.images[elementObj.name + "Img"];
	elementObj.validator = validationFunction;
	elementObj.message = "";
	elementObj.required = required;
	elementObj.is_Valid = true;
	registerEvent(elementObj, "onChange", "validateElementObj(formElements[this.name])");
	//registerEvent(elementObj, "onFocus", "showMessage(this)");
}
function EventObject(type, code){
	this.type = type.toLowerCase();
	this.code = code;
}
function normalizeType(type){
	type = type.toLowerCase();
	if(type == "textarea" || type == "hidden" || type == "password" || type == "file") return "text";
	return type;
}
function trapEvent(elementObj, event, storeAs){
	if(eval("elementObj.element.on" + event + " != null"))
		registerEvent(elementObj, "on" + storeAs, parseEvent(eval("elementObj.element.on" + event + ".toString();")));
	eval("elementObj.element.on" + event + " = " + event + "Event;")
}
function trapRadioEvent(elementObj){
	for(var i = 0; i < elementObj.element.length; i++){
		if(elementObj.element[i].onclick != null){
			registerEvent(elementObj, "onclick", parseEvent(elementObj.element[i].onclick.toString()));
			elementObj.events[elementObj.events.length - 1].whichRadio = elementObj.element[i].value;
		}
		elementObj.element[i].onclick = clickEvent;
	}
}
function parseEvent(eventStr){
	return eventStr.substring(eventStr.indexOf("{") + 1, eventStr.lastIndexOf("}"));
}

//----------------- eventHandler functions --------------------
function clickEvent(){
	var events = formElements[this.name].events;
	var isRadio = (formElements[this.name].type == "radio");
	var radioVal = getElement(this.name).get();
	for(i in events)
		if(events[i].type == "onchange" || (isRadio && (events[i].whichRadio == null || events[i].whichRadio == radioVal)))
			eval(events[i].code);
}
function focusEvent(){
	var events = formElements[this.name].events;
	for(i in events)
		if(events[i].type == "onfocus")
			eval(events[i].code);
}
function blurEvent(){
	var element = formElements[this.name];
	var changed = (element.get() != element.lastVal && element.type != "checkbox");
	var events = element.events;
	for(i in events)
		if(events[i].type == "onblur" || (changed && events[i].type == "onchange"))
			eval(events[i].code);
	if(element.validator == null) element.lastVal = element.get();
}
function submitEvent(){
	return validateForm(this);
}

//----------------- focus functions --------------------
function focusElement(elementName){
	if(formElements[elementName].type == "radio")
		focusRadio(formElements[elementName].element);
	else
		formElements[elementName].element.focus();
}
function focusRadio(element){
	for(var i = 0; i < element.length; i++)
		if(element[i].checked)
			return element[i].focus();
	return element[0].focus();
}

//----------------- Get and Set functions --------------------
function getcheckbox(){
	return this.element.checked ? this.element.value : "";
}
function setcheckbox(val){
	this.element.checked = (val != "");
}
function getmultiselect(){
	var returnVal = ""
	for(var i = 0; i < this.element.length; i++)
		if(this.element.options[i].selected)
			returnVal += ',' + this.element.options[i].value;
	return returnVal.substring(1, returnVal.length);
}
function setmultiselect(val){
	val = ',' + val;
	for(var i = 0; i < this.element.length; i++)
		this.element.options[i].selected = (val.indexOf(',' + this.element.options[i].value) != -1);
}
function getradio(){
	for(var i = 0; i < this.element.length; i++)
		if(this.element[i].checked)
			return this.element[i].value;
	return "";
}
function setradio(val){
	for(var i = 0; i < this.element.length; i++)
		this.element[i].checked = (this.element[i].value == val)
}
function getselect(){
	return this.element.options[this.element.selectedIndex].value;
}
function setselect(val){
	for(var i = 0; i < this.element.length; i++)
		if(this.element.options[i].value == val){
			this.element.selectedIndex = i;
			break;
		}
}
function gettext(){
	return this.element.value;
}
function settext(val){
	this.element.value = val;
}
//----------------- Basic/Shared validation --------------------
var LOWERALPHA = "abcdefghijklmnopqrstuvwxyz",
	UPPERALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
	ALPHA = LOWERALPHA + UPPERALPHA,
	NUMERIC = "0123456789",
	ALPHANUMERIC = ALPHA + NUMERIC;

function extract(str, mask){
	var out = "";
	for(var i = 0; i < str.length; i++)
		if(mask.indexOf(str.charAt(i)) != -1)
			out += str.charAt(i);
	return out;
}
function isRequired(){
	this.message = "This is a required field.";
	return this.get() != "";
}
