	function $() {
	  var results = [], element;
	  for (var i = 0; i < arguments.length; i++) {
		element = arguments[i];
		if (typeof(element) == 'string')
		  element = document.getElementById(element);
		results.push(element);
	  }
	  return ((results.length < 2) ? results[0] : results);
	}

	function trim(str) {
	  return str.replace(/(\s+$)|(^\s+)/g, '');
	}

	var FIELDS = new Object();

	FIELDS['name']		= {'msg': "Please enter your Name.", 	'valType':'non-empty|name'};
	FIELDS['email'] 		= {'msg': "Please enter your Email.", 		'valType':'non-empty|email'};
	FIELDS['msg'] 		= {'msg': "Please enter your Message.", 		'valType':'non-empty'};
	FIELDS['check'] 		= {'msg': "Please select your Category of Interest.", 	'valType':'multi_checkbox:ad,pub,dev,biz,press,gen'};

	function validateForm() {
		var isError = false;
		var errorStr = "";

		for (field in FIELDS) {
			if(!validateElement(field)) {
				isError = true;
				errorStr += getErrorString(FIELDS[field].msg);
			}
		}
	
		if(isError)	{
			writeErrorString(errorStr);
			showErrorsBox();
		} else {
			showErrorsBox(false);
		}
	
		return !isError;
	}
	
	function validateElement(field){
		var valParts = FIELDS[field].valType.split("|");  // valType has a structure:   valType[:valParam][|valType[:valParam]]
		for (var i = 0; i < valParts.length; i++){
			if(!validateField(field, valParts[i])) return false;
		}
		return true;
	}
	
	function validateField(field, valType){
		var res = false;
		var valTypeArr = valType.split(":");
		var validationType = valTypeArr[0];
		var validationParam = valTypeArr[1];
		var realField = $(field);
		if (realField) {
			var fieldValue = trim(realField.value);
		} else {
			fieldValue = '';
		}
		switch(validationType){
			case "non-empty":
				if (fieldValue.length > 0) res = true;
				break;
			case "name":
				if (!fieldValue.length) {res = true; break;}
				var re = /^[a-zA-Z][ a-zA-Z\-\']*$/;
				if (re.test(fieldValue)) res = true;
				break;
			case "email":
				if (!fieldValue.length) {res = true; break;}
				if (fieldValue.indexOf('@') && fieldValue.indexOf('@') != fieldValue.lastIndexOf('@')) break;
				var re = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
				if(fieldValue.length > 0 && re.test(fieldValue)) res = true;
				break;
			case "url":
				if (!fieldValue.length) {res = true; break;}
				var re = /^(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;:/~\+#]*[\w\-\@?^=%&amp;/~\+#])?$/;
				if(re.test(fieldValue)) res = true;
				break;
			case "at-least-one":
				var fields = realField.form[ realField.name ];
				if (! fields.length) {
					res = trim(fields.value).length > 0;
				} else {
					var at_least_checked = false;
					for (i = 0; i < fields.length; i++) {
						if (fields[i].value && trim(fields[i].value).length > 0) {
							at_least_checked = true;
							break;
						}
					}
					if (at_least_checked) res = true;
				}
				break;
			case "multi_checkbox":
				var checkboxes = validationParam.split(",");
				var at_least_checked = false;
				for (i = 0; i < checkboxes.length; i++) {
					if ($(checkboxes[i]).checked) {
						at_least_checked = true;
						break;
					}
				}
				if (at_least_checked) res = true;
				break;
		}
		return res;
	}

	function getErrorString(message) {
		if (window.alert_error || !$("errorsList")) {
			return (message) ? "- " + message + "\n" : "";
		} else {
			return (message) ? "<li>" + message + "</li>" : "";
		}
	}
	
	function writeErrorString(errorStr) {
		if (window.alert_error || !$("errorsList")) {
			alert("Please verify the following information before we continue with your request.\n" + errorStr);
		} else {
			$("errorsList").innerHTML = errorStr;
		}
	}
	
	function showErrorsBox(show) {
		if (!window.alert_error) {
			if(!$("errorsBox")) return;
			if(show === false) {
				addClass($("errorsBox"), "hidden");
			} else {
				removeClass($("errorsBox"), "hidden");
			}
		}
	}

