addEvent(window, 'load', initForm);

function initForm(){
	browserDetect();
	initializeFocus();
}

function ValidateRequiredFields(form) {
	var required = getElementsByClassName("req", "span", form);
	var validated = true;
	for (var i = 0; i < required.length; i++) {
		var area = GetHighlightArea(required[i]);
		if (hasClassName(area, "complex")) {
			var fields = getElementsByClassName("field", "input", area)
			for (var j = 0; j < fields.length; j++) {
				validated = VerifyRequiredField(area, fields[j]) && validated;
			}
		} else {
			var fieldName = required[i].parentNode.attributes["for"].value;
			var field = document.forms[0].elements[fieldName];
			validated = VerifyRequiredField(area, field) && validated;
		}
	}
	return validated;
}

function VerifyRequiredField(area, field) {
	if (IsEmpty(field)) {
		addClassName(area, "error", true);
		return false;
	} else {
		removeClassName(area, "error");
		return true;
	}
}

function IsEmpty(field) {
	switch (field.type) {
		case 'text':
		case 'textarea':
		case 'password':
			return (field.value.length == 0 || (hasClassName(field, "email") && !IsValidEmail(field.value)));
			break;
		case 'checkbox':
		case 'radio':
			return (!field.checked);
			break;
		case 'select':
		case 'select-one':
			return (field.selectedIndex == 0);
			break
	}

	if (field.length) {
		var isEmpty = true;
		for (var i = 0; i < field.length; i++) {
			isEmpty = isEmpty && IsEmpty(field[i]);
		}
		return isEmpty;
	}

	return true;
}

function IsValidEmail(email) {
	if (email == null || email == "") return false;
	var at = "@";
	var dot = ".";
	var lat = email.indexOf(at);
	var lstr = email.length;
	var ldot = email.indexOf(dot);
	if (lat <= 0 || lat == lstr) return false;
	if (ldot <= 0 || ldot == lstr) return false;
	if (email.indexOf(at, (lat + 1)) != -1) return false;
	if (email.substring(lat - 1, lat) == dot || email.substring(lat + 1, lat + 2) == dot) return false;
	if (email.indexOf(dot, (lat + 2)) == -1) return false;
	if (email.indexOf(" ") != -1) return false;
	return true;
}

function GetHighlightArea(element) {
	var tagName = element.tagName.toLowerCase();
	if (tagName == "span" && hasClassName(element, "half")) return element;
	if (tagName == "li" || tagName == "body" || element.parentNode == null) return element;
	return GetHighlightArea(element.parentNode);
}

function initializeFocus(){
	var fields = getElementsByClassName("field", null, document);
	for (i = 0; i < fields.length; i++) {
		if (fields[i].type == 'radio' || fields[i].type == 'checkbox') {
			fields[i].onclick = function () { fieldHighlight(this); };
			fields[i].onfocus = function () { fieldHighlight(this); };
		}
		else if (fields[i].className.match('addr') || fields[i].className.match('other')) {
			fields[i].onfocus = function () { fieldHighlight(this); };
		}
		else if (fields[i].className.match('select')) {
			fields[i].onmousedown = function () { addClassName(this, "ieSelectFix", true); };
			fields[i].onchange = function () { removeClassName(this, "ieSelectFix"); };
			fields[i].onfocus = function () { addClassName(this, "ieSelectFix", true); fieldHighlight(this); };
			fields[i].onblur = function () { removeClassName(this, "ieSelectFix"); };
		}
		else {
			fields[i].onfocus = function () { fieldHighlight(this); };
		}
	}
}

function fieldHighlight(element) {
	var fieldContainer = GetHighlightArea(element.parentNode);
	addClassName(fieldContainer, "focused", true);

	var focusedFields = getElementsByClassName("focused", null, document);
	for (i = 0; i < focusedFields.length; i++) {
		if (focusedFields[i] != fieldContainer) {
			removeClassName(focusedFields[i], "focused");
		}
	}
}

function browserDetect(){
	var detect = navigator.userAgent.toLowerCase();
	var container = document.getElementsByTagName('html');
	if(detect.indexOf('firefox') + 1){
		addClassName(container[0], 'firefox', true);
	}
	else if(detect.indexOf('chrome') + 1){
		addClassName(container[0], 'chrome', true);
	}
	else if(detect.indexOf('safari') + 1){
		addClassName(container[0], 'safari', true);
	}
}

function GetChildElementById(parentElement, elementName) {
	var child = null;
	if (parentElement.getElementById) child = parentElement.getElementById(elementName);
	else if (parentElement.all) child = parentElement.all[elementName];
	else if (document.all) child = document.all[elementName];
	else if (document.getElementById) child = document.getElementById(elementName);
	return child;
}


/*
Developed by Robert Nyman, http://www.robertnyman.com
Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/
var getElementsByClassName = function (className, tag, elm) {
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag) ? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for (var i = 0, il = elements.length; i < il; i += 1) {
				current = elements[i];
				if (!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace) ? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for (var j = 0, jl = classes.length; j < jl; j += 1) {
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for (var k = 0, kl = classes.length; k < kl; k += 1) {
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for (var l = 0, ll = elements.length; l < ll; l += 1) {
				current = elements[l];
				match = false;
				for (var m = 0, ml = classesToCheck.length; m < ml; m += 1) {
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};

//http://www.bigbold.com/snippets/posts/show/2630
function addClassName(objElement, strClass, blnMayAlreadyExist) {
	if (objElement.className){
		var arrList = objElement.className.split(' ');
		if (blnMayAlreadyExist){
			var strClassUpper = strClass.toUpperCase();
			for (var i = 0; i < arrList.length; i++) {
				if (arrList[i].toUpperCase() == strClassUpper) {
					arrList.splice(i, 1);
					i--;
				}
			}
		}
		arrList[arrList.length] = strClass;
		objElement.className = arrList.join(' ');
	}
	else{  
		objElement.className = strClass;
	}
}

//http://www.bigbold.com/snippets/posts/show/2630
function removeClassName(objElement, strClass){
	if ( objElement.className ) {
		var arrList = objElement.className.split(' ');
		var strClassUpper = strClass.toUpperCase();
		for (var i = 0; i < arrList.length; i++) {
			if (arrList[i].toUpperCase() == strClassUpper) {
				arrList.splice(i, 1);
				i--;
			}
		}
		objElement.className = arrList.join(' ');
	}
}

function hasClassName(objElement, strClass) {
	if (objElement.className) {
		var arrList = objElement.className.split(' ');
		var strClassUpper = strClass.toUpperCase();
		for (var i = 0; i < arrList.length; i++) {
			if (arrList[i].toUpperCase() == strClassUpper) {
				return true;
			}
		}
	}
	return false;
}

//http://ejohn.org/projects/flexible-javascript-events/
function addEvent( obj, type, fn ) {
	if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ) };
		obj.attachEvent( "on"+type, obj[type+fn] );
	} else {
		obj.addEventListener( type, fn, false );	
	}
}

