/******************************************************************

Library Validation
(c) 2007 Websolvers, Inc.

By Michael Swain

These librarys may only be used with permission from Websolvers.

******************************************************************/

var reValidEmail = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/i;
var reValidUSPhone = /^(?:\([2-9]\d{2}\)\ ?|[2-9]\d{2}(?:\-?|\ ?))[2-9]\d{2}[- ]?\d{4}$/;
var reValidUSZip = /^\d{5}(?:-\d{4})?$/;

if(!window.getElementFor) {
function getElementFor(elm) {
	if(!elm.htmlFor) {
		return elm.getAttribute("for");
	} else {
		return elm.htmlFor;
	}
}
}

if(!(new Array()).indexOf) {
  Array.prototype.indexOf = function(search) {
    for(var i = 0; i < this.length; i++)
      if(this[i] == search)
        return i;
        
    return -1;
  }
}

if(!window.getElementStyle) {
function getElementStyle(elm) {
  if(elm.currentStyle)
    return elm.currentStyle;
  else if(document.defaultView && document.defaultView.getComputedStyle)
    return document.defaultView.getComputedStyle(elm,null);
  else
    return elm.style;
}
}
if(!window.setElementClass) {
function setElementClass(elm, className) {
  if(!elm.className && elm.className != "")
    elm.setAttribute("class", className);
  else
    elm.className = className;
}
}

if(!window.getElementClass) {
function getElementClass(elm) {
  if(!elm.className)
    return elm.getAttribute("class");
  else
    return elm.className;
}
}

if(!window.addPageLoadHandler) {
function addPageLoadHandler(func) {
	if(window.addEventListener) {
	    window.addEventListener("load", func, false);
	} else if(window.attachEvent) {
	    window.attachEvent("onload", func);
	} else if(document.getElementById) {
		if(!runPageLoadHandler.handlers)
			runPageLoadHandler.handlers = array();
		if(window.onload && window.onload != runPageLoadHandler)
			runPageLoadHandler.handlers[runPageLoadHandler.handlers.length] = window.onload;
			
	    window.onload = runPageLoadHandler;
		
		runPageLoadHandler.handlers[runPageLoadHandler.handlers.length] = func;
	}
}

function runPageLoadHandler(e) {
	var ret = true;
	
	for(var i = 0; i < runPageLoadHandler.handlers.length; i++)
		if(runPageLoadHandler.handlers[i] && !runPageLoadHandler.handlers[i](e))
			ret = false;
	
	return ret;
}
}

if(!window.applyFuncByTagClass) {
function applyFuncByTagClass(aryTagNames, aryClassNames, funcBuilder) {
	if(!funcBuilder)
		return;

	if(!aryTagNames || !aryTagNames.length)
		return;
	else if(!aryTagNames.join)
		aryTagNames = new Array(aryTagNames);
		
	if(!aryClassNames || !aryClassNames.length)
		return;
	else if(!aryClassNames.join)
		aryClassNames = new Array(aryClassNames);
		
	var aryElms = new Array();
	var tagIdx = 0;
	for(var tag = 0; tag < aryTagNames.length; tag++) {
		var aryTagElms = document.getElementsByTagName(aryTagNames[tag]);
		for(var elm = 0; elm < aryTagElms.length; elm++) {
			var classNames = getElementClass(aryTagElms[elm]);
			if(classNames && classNames.length) {
				classNames = classNames.split(' ');
				
				var match = false;
				for(var cls = 0; cls < aryClassNames.length; cls++) {
					if(match)
						break;
					for(var elmCls = 0; elmCls < classNames.length; elmCls++) {
						if((classNames[elmCls] == aryClassNames[cls])
							|| (classNames[elmCls].substring(0, aryClassNames[cls].length+1) == aryClassNames[cls]+'-')) {
							var tagElm = new Object();
							
							tagElm.match = aryClassNames[cls];
							tagElm.element = aryTagElms[elm];
							tagElm.params = classNames[elmCls].substring(aryClassNames[cls].length+1, classNames[elmCls].length).split('-'); 
							
							aryElms[aryElms.length] = tagElm;
							match = true;
							break;
						}
					}
				}
			}
		}
	}
	
	for(var elm = 0; elm < aryElms.length; elm++) {
		funcBuilder(aryElms[elm].match, aryElms[elm].element, aryElms[elm].params);
	}
}
}

function buildValField(matchClass, element, parameters) {
	var elmFor = null;
	var regExp = null;
	var valFunc = null;
	
	if(parameters && parameters.length) {
		for(param = 0; param < parameters.length; param++) {
			if(parameters[param].toLowerCase() == "required") {
				valFunc = validate_isRequired;
			} else if(parameters[param].toLowerCase() == "regex" || parameters[param].toLowerCase() == "regexp") {
				valFunc = validate_isMatch;
			} else if(elmFor == null && document.getElementById(parameters[param]) != null) {
				elmFor = document.getElementById(parameters[param]);
			} else if(regExp == null && (eval(parameters[param]))) {
				regExp = eval(parameters[param]);
			}
		}
	}

	if(regExp) {
		element.regExp = regExp;
	}
	
	if(valFunc) {
		if(!elmFor.form.validateElements) {
			elmFor.form.validateElements = new Array();
		}
		elmFor.form.validateElements[elmFor.form.validateElements.length] = element;
	
		if(!elmFor.validateElements) {
			elmFor.validateElements = new Array();

			elmFor._val_onblur = element.onblur;
			elmFor.onblur = element_validate_onblur;
			elmFor._val_onchange = element.onchange;
			elmFor.onchange = element_validate_onchange;
		}
		elmFor.validateElements[elmFor.validateElements.length] = element;
		element.isValid = valFunc;
		element.validateElement = elmFor;
	}
}

function valGetValue(elm) {
	if(elm.nodeName == "SELECT") {
		if(elm.selectedIndex < 0 || elm.selectedIndex >= elm.options.length)
			return null;
		
		if(elm.options[elm.selectedIndex].value)
			return elm.options[elm.selectedIndex].value;
		else
			return elm.options[elm.selectedIndex].text;
			
	} else if(elm.nodeName == "INPUT") {
		var test = elm.value;
		
		if(elm.type.toLowerCase() == "checkbox" && !elm.checked) {
			test = null;
			var elms = elm.form.elements[elm.name];
			var i = 0;
			for(i = 0; i < elms.length; i++) {
				if(elms[i].checked) {
					return elms[i].value;
				}
			}
		} else if(elm.type.toLowerCase() == "radio" && !elm.checked) {
			test = null;
			var elms = elm.form.elements[elm.name];
			var i = 0;
			for(i = 0; i < elms.length; i++) {
				if(elms[i].checked) {
					return elms[i].value;
				}
			}
		}
		
		return test;
	}
	
	return null;
}

function validate_isRequired() {
	var val = true;
	var test = valGetValue(this.validateElement);

	while(test && test.length && test.substring(0, 1) == " ") {
		test = test.substring(1, test.length);
	}

	while(test && test.length && test.substring(test.length-1, test.length) == " ") {
		test = test.substring(0, test.length-1);
	}

	if(!test || !test.length)
		val = false;
	
	if(val && this.onvalid) {
		if(this.onvalid() == false) {
			val = false;
		}
	} else if(!val && this.oninvalid) {
		if(this.oninvalid() == true) {
			val = true;
		}
	}
	
	return val;
}

function validate_isMatch() {
	var val = true;
	var test = valGetValue(this.validateElement);
	var regExp = this.regExp;
	
	while(test && test.length && test.substring(0, 1) == " ") {
		test = test.substring(1, test.length);
	}

	while(test && test.length && test.substring(test.length-1, test.length) == " ") {
		test = test.substring(0, test.length-1);
	}

	if(!test || !test.length) {
		return true;
	}
	
	if(!test.match(regExp)) {
		val = false;
	}
	
	if(val && this.onvalid) {
		if(this.onvalid() == false) {
			val = false;
		}
	} else if(!val && this.oninvalid) {
		if(this.oninvalid() == true) {
			val = true;
		}
	}
	
	return val;
}

function element_validate_onchange(e) {
	if(this.validateElements)
		validateElements(this.validateElements);
		
	if(this._val_onchange)
		return this._val_onchange(e);
}

function element_validate_onblur(e) {
	if(this.validateElements)
		validateElements(this.validateElements);

	if(this._val_onblur)
		return this._val_onblur(e);
}

function validateElements(aryElms, useFocus) {
	if(!aryElms || !aryElms.length)
		return true;

	var val = true;
	for(var elm = 0; elm < aryElms.length; elm++) {
		if(!validateElement(aryElms[elm], val || useFocus)) {
			if(aryElms[elm].validateElement.focus && useFocus && val) {
				aryElms[elm].validateElement.focus();
			}
			val = false;
		}
	}
	
	return val;
}

function validateElement(elm, test) {
	if(!test) {
		if(elm._isHidden)
			elm.style.visibility = "hidden";
		if(elm._isAbsolute)
			elm.style.position = "absolute";

		return true;
	} if(elm.isValid()) {
		if(elm._isHidden)
			elm.style.visibility = "hidden";
		if(elm._isAbsolute)
			elm.style.position = "absolute";

		return true;
	} else {
		if(getElementStyle(elm).visibility == "hidden") {
			elm._isHidden = 1;
			elm.style.visibility = "visible";
		}
		
		if(getElementStyle(elm).position == "absolute") {
			elm._isAbsolute = 1;
			elm.style.position = "relative";
		}

		return false;
	}
}

function buildSubmitField(classMatch, element, parameters) {
	element._val_onclick = element.onclick;
	element.onclick = validate_submit_onclick;
}

function validate_submit_onclick(e) {
	if(!validateElements(this.form.validateElements, true))
		return false;

	if(this._val_onclick)
		return this._val_noclick(e);
		
	return true;
}

function buildLabel(classMatch, element, parameters) {
	var htmlFor = getElementFor(element);
	if(htmlFor && htmlFor.length) {
		var elm = document.getElementById(htmlFor);
		if(elm) {
			elm.labelElement = element;
			element.labelElement = elm;
		}
	}
}

function initLibValidation() {
	applyFuncByTagClass("LABEL", "", buildLabel);
	applyFuncByTagClass("SPAN", "apply-validator", buildValField);
	applyFuncByTagClass("INPUT", "apply-validate", buildSubmitField);
}

addPageLoadHandler(initLibValidation);

