// Form Validation copyright 2006 Norfolkbroads.com

String.prototype.isNotBlank = function()
{
	return !this.isBlank();
}

String.prototype.isBlank = function()
{
	return this.match(/^\s*$/) != null;
}

String.prototype.isEmail = function()
{
	return this.match(/^\S+@\S+$/) != null;
}

String.prototype.isInteger = function(min, max)
{
	return (this.match(/^\d+$/) != null) && (this.isDecimal(min, max) != null);
}

String.prototype.isDecimal = function(min, max)
{
	if (!this.match(/^-?\d+(\.\d+)?/)) {
		return false;
	}
	
	var num = new Number(this);
	if (min != null && num < min) return false;
	if (max != null && num > max) return false;
	
	return true;
}

String.prototype.isImageFile = function()
{
	return this.match(/\.(jpg|jpe|jpeg|gif|png)/i) != null;
}

String.prototype.trim = function() { return this.ltrim().rtrim(); }

String.prototype.ltrim = function()
{
	var result = this.match(/^\s+/);
	if (result)
		return this.substr(result[0].length);
	else
		return this;
}

String.prototype.rtrim = function()
{
	var result = this.match(/\s+$/);
	if (result)
		return this.substr(0, this.length - result[0].length);
	else
		return this;
}

function alertErrorHandler(form, errors)
{
	if (errors.length == 0) {
		return;
	}
	
	with (errors[0])
	{
		if (field && field.select) field.select();
		if (field && field.focus)  field.focus();
		
		if (site_error) {
			alert('Website error - please contact the owner, quoting the following information:\n\n' + message);
		} else {
			alert(message);
		}
	}
}

function htmlErrorHandler(form, errors)
{
	function addClassName(element, class_name)
	{
		var class_names = element.className.split(/\s+/);
		for (var i = 0; i < class_names.length; i++) {
			if (class_names[i] == class_name) {
				return;
			}
		}
		
		class_names[class_names.length] = class_name;
		
		element.className = class_names.join(' ');
	}
	
	function removeClassName(element, class_name)
	{
		var class_names = element.className.split(/\s+/);
		var new_class_names = [];
		for (var i = 0; i < class_names.length; i++) {
			if (class_names[i] != class_name) {
				new_class_names[new_class_names.length] = class_names[i];
			}
		}
		
		element.className = new_class_names.join(' ');
	}
	
	function fadeIn(element, duration)
	{
		var start = new Date();
		
		if (element.filters) {
			element.style.zoom = 1;
		}
		
		tick();
		
		function tick()
		{
			var now = new Date();
			var progress = Math.min(1, (now - start) / duration);
			
			element.style.filter = 'alpha(opacity=' + Math.round(progress * 100) + ')';
			element.style.opacity = progress;
			
			if (progress < 1) {
				setTimeout(tick, 1);
			}
		}
	}
	
	try
	{
		var curr_div = document.getElementById('fv-errors');
		
		for (var i = 0; i < form.elements.length; i++) {
			removeClassName(form.elements[i], 'fv-error');
		}
		
		if (errors.length == 0) {
			if (curr_div) {
				while (curr_div.childNodes.length > 0) {
					curr_div.removeChild(curr_div.childNodes[0]);
				}
				curr_div.style.display = 'none';
			}
			return;
		}
		
		var div = document.createElement('DIV');
		div.id = 'fv-errors';
		div.style.filter = 'alpha(opacity=0)';
		div.style.opacity = 0;
		
		div.appendChild(document.createElement('P')).appendChild(document.createTextNode('Errors'));
		
		var ul = div.appendChild(document.createElement('UL'));
		var a;
		
		for (var i = 0; i < errors.length; i++)
		{
			ul.appendChild(document.createElement('LI')).appendChild(document.createTextNode(errors[i].message));
			addClassName(errors[i].field, 'fv-error');
		}
		
		if (curr_div) {
			curr_div.parentNode.replaceChild(div, curr_div);
		} else {
			form.insertBefore(div, form.childNodes[0]);
		}
		
		var offsetLeft = 0;
		var offsetTop = 0;
		var element = div;
		
		while (element) {
			offsetLeft += element.offsetLeft;
			offsetTop += element.offsetTop;
			element = element.offsetParent;
		}
		
		div.style.position = 'relative'; // Mac IE fix
		
		scroll(offsetLeft, offsetTop);
		
		fadeIn(div, 200);
	}
	catch (e)
	{
		alertErrorHandler(form, errors);
	}
}

var FormValidation =
{
	nsPrefix: 'fv',
	namespace: 'http://ns.cookeryclub.co.uk/fv',
	
	errors: [],
	
	errorHandler: htmlErrorHandler,
	
	getNbAttr: function(element, name)
	{
		var value = element.getAttribute(FormValidation.nsPrefix + ':' + name);
		if (!value && element.getAttributeNS) {
			value = element.getAttributeNS(FormValidation.namespace, name);
		}
		
		return value;
	},
	
	validate: function(form)
	{
		FormValidation.errors = [];
		
		var validation;
		for (var i = 0; i < form.elements.length; i++) {
			validation = FormValidation.validateField(form, form.elements[i]);
			if (validation.result == false) {
				FormValidation.errors[FormValidation.errors.length] = {
					field: form.elements[i], site_error: validation.site_error, message: validation.message
				};
			}
		}
		
		if (FormValidation.errorHandler) {
			FormValidation.errorHandler(form, FormValidation.errors);
		}
		
		return (FormValidation.errors.length == 0);
	},
	
	validateField: function(form, field)
	{
		var result = true;
		var site_error = true;
		var message = 'Unknown error';
		
		var validate = FormValidation.getNbAttr(field, 'validate');
		var validate_error = FormValidation.getNbAttr(field, 'error');
		
		var value;
		
		if (validate)
		{
			try
			{
				value = field.value;
				
				with (form) {
					result = eval(validate)
					site_error = false;
					message = validate_error;
				};
			}
			catch (e)
			{
				result = false;
				site_error = true;
				message = e.name + ': ' + e.message + ' in ' + validate;
			}
		}
		else
		{
			result = true;
			site_error = false;
			message = '';
		}
		
		return { result: result, site_error: site_error, message: message };
	}
}
