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 required");
					$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 required");
					$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 required");
					$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 required");
					$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 required");
					$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 required");
					$valid = false;
				}
				break;
				case "fck":
				if($field.required && !validateFCK(FCKeditorAPI.GetInstance($field.element))) {
					$errors.push($field.title + " is required");
					$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);
		focusTab($focus);
		switch($focus.type) {
			case "text":
			$focus.element.focus();
			break;
			case "number":
			$focus.element.focus();
			break;
			case "email":
			$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 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 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) {
	var $element = $field.type == "fck" ? document.getElementById($field.element) : $field.element;
	if($element) {
		if($element.length) $element = $element[0];
		do {
			if($element.style.display == "none") return false;
			$element = $element.parentNode;
		} while($element.tagName.toLowerCase() != "body");
		return true;
	}
}

function focusTab($field) {
	var $element = $field.type == "fck" ? document.getElementById($field.element) : $field.element;
	if($element) {
		if($element.length) $element = $element[0];
		while($element.tagName.toLowerCase() != "body") {
			if($element.className == "TabContent") {
				selectTab($element.id.substring(7));
				break;
			} else {
				$element = $element.parentNode;
			}
		}
	}
}
