function validate($fields) {
	var $errors = [];
	var $focus;
	for(var $i = 0; $i < $fields.length; $i ++) {
		var $field = $fields[$i];
		switch($field.type) {
			case "checkboxes":
			$field.element = document.form[$field.field + "[]"];
			break;
			case "fck":
			$field.element = $field.field;
			break;
			default:
			$field.element = document.form[$field.field];
			break;
		}
		if(elementVisible($field)) {
			var $valid = true;
			switch($field.type) {
				case "text":
				if($field.required && !validateText($field.element)) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				break;
				case "number":
				if(validateText($field.element)) {
					if(!validateNumber($field.element)) {
						$errors.push($field.title + " must contain only numbers");
						$valid = false;
					}
				} else if($field.required) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				break;
				case "float":
				if(validateText($field.element)) {
					if(!validateFloat($field.element)) {
						$errors.push($field.title + " must be a numeric value");
						$valid = false;
					}
				} else if($field.required) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				break;
				case "email":
				if(validateText($field.element)) {
					if(!validateEmail($field.element)) {
						$errors.push($field.title + " is invalid");
						$valid = false;
					}
				} else if($field.required) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				break;
				case "reenter":
				if(!validateReentry($field.element, $field.source)) {
					$errors.push($field.title + " do not match");
					$valid = false;
				}
				break;
				case "checkbox":
				if(!validateCheckbox($field.element)) {
					$errors.push($field.error);
					$valid = false;
				}
				break;
				case "checkboxes":
				if(!validateRadio($field.element)) {
					$errors.push($field.error);
					$valid = false;
				}
				break;
				case "radio":
				if(!validateRadio($field.element)) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				case "multiselect":
				if($field.required && !validateMultiselect($field.element)) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}				
				break;
				case "image":
				if(validateText($field.element)) {
					if(!validateImage($field.element)) {
						$errors.push($field.title + " is an invalid file format");
						$valid = false;
					}
				} else if($field.required) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				break;
				case "fck":
				if($field.required && !validateFCK(FCKeditorAPI.GetInstance($field.element))) {
					$errors.push($field.title + " is missing");
					$valid = false;
				}
				break;
			}
			if(!$valid && !$focus) $focus = $field;
		}
	}
	var $error = "";
	if($errors.length > 0) {
		if($errors.length > 1) {
			$error += "Please correct the following errors:\n";
		} else {
			$error += "Please correct the following error:\n";
		}
		for(var $i = 0; $i < $errors.length; $i ++) {
			$error += "- " + $errors[$i] + "\n";
		}
		alert($error);
		switch($focus.type) {
			case "text":
			$focus.element.focus();
			break;
			case "number":
			$focus.element.focus();
			break;
			case "float":
			$focus.element.focus();
			break;
			case "email":
			$focus.element.focus();
			break;
			case "reentry":
			$focus.element.focus();
			break;
			case "image":
			$focus.element.focus();
			break;
			case "fck":
			FCKeditorAPI.GetInstance($focus.element).Focus();
			break;
		}
		return false;
	} else {
		return true;
	}
}

function validateText($field) {
	return($field.value != "");
}

function validateNumber($field) {
	return(/^[0-9\s]+$/.test($field.value));
}

function validateFloat($field) {
	return(/^[0-9]*(\.[0-9]+)?$/.test($field.value));
}

function validateEmail($field) {
	return(/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test($field.value));
}

function validateReentry($field, $source) {
	return($field.value == document.form[$source].value);
}

function validateCheckbox($field) {
	return($field.checked);
}

function validateRadio($field) {
	$valid = false;
	for(var $i = 0; $i < $field.length; $i ++) {
		if($field[$i].checked) {
			$valid = true;
			break;
		}
	}
	return $valid;
}

function validateMultiselect($field) {
	$valid = false;
	for(var $i = 0; $i < $field.length; $i ++) {
		if($field[$i].selected) {
			$valid = true;
			break;
		}
	}
	return $valid;
}


function validateImage($field) {
	var $valid = ["gif", "jpg", "png"];
	var $extension = $field.value.split(".").pop().toLowerCase();
	for(var $i = 0; $i < $valid.length; $i ++) if($extension == $valid[$i]) return true;
	return false;
}

function validateFCK($field) {
	return($field.GetXHTML(true) != "");
}

function checkAll() {
	for($i = 0; $i < document.form.length; $i ++) {
		var $field = document.form[$i];
		if($field.type == "checkbox") {
			$field.checked = document.form.all.checked;
		}
	}
}

function elementVisible($field) {
	switch($field.type) {
		case "checkboxes":
		var $element = $field.element[0];
		break;
		case "fck":
		var $element = document.getElementById($field.element);
		break;
		default:
		var $element = $field.element;
		break;
	}
	do {
		if($element.style.display == "none") return false;
		$element = $element.parentNode;
	} while($element.tagName.toLowerCase() != "body");
	return true;
}