var validation = {
	version  : '1.0.2',
	options : {
		displayElement : 'errors'
	},
	patterns : {
		email : /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i,
		url   : /^(ht|f)tps?:\/\/[a-z0-9-\.]+?\.[a-z]{2,4}\/?([A-Za-z0-9-_#%&\?\/.=\,\{\}\\\[\]\`\^]+)?$/i
	},
	set_form : function (formname,checkers)
	{
		var form = document.forms[formname];
		var elm  = null;

		this.errors   = [];
		this.keys	  = new Object();
		this.form	  = form;
		this.checkers = checkers;
		this.options.displayElement = (typeof(this.options.displayElement)=='string' ? $(this.options.displayElement) : null);
		
		if(!form) return false;
			
		var count = 0;
		for(key in checkers)
		{
			if(form.elements[key])
			{
				elm = form.elements[key];
				this.keys[key] = count;
				
				if(checkers[key].image)
				{
					checkers[key].image[0] = $(checkers[key].image[0]);
					if(!checkers[key].image[0]) delete checkers[key].image;
				}
				
				switch(elm.type)
				{
					case 'textarea':
					case 'text':
						addEvent(elm,'keyup',new Function('validation.check_field("'+key+'");'),false);
						addEvent(elm,'blur',new Function('validation.check_field("'+key+'");'),false);
					break;
					case 'select-one':
						addEvent(elm,'change',new Function('validation.check_field("'+key+'");'),false);
						addEvent(elm,'blur',new Function('validation.check_field("'+key+'");'),false);
					break;
				}
				count++;
			}
		}
	},
	submit : function () {
		var errors = this.get();
		if(errors.length>0)
		{
			if(this.options.displayElement)
			{
				this.options.displayElement.innerHTML = this.errors.join('');
				location.href = location.href.replace(/#[a-z0-9-\_]+$/i,'')+'#view-errors';
			}
		}else{
			this.form.submit();
		}
	},
	set : function (formname,outerrors,checkers) {
		addLoadEvent(function (e) {
			validation.set_form(formname,outerrors,checkers);
		});
	},
	check : function () {
		addLoadEvent(function (e) {
			for(key in validation.checkers)
			{
				if(validation.form.elements[key])
				{
					validation.check_field(key);
				}
			}
		});
	},
	get : function () {
		for(key in this.checkers)
		{
			if(this.form.elements[key])
			{
				this.check_field(key);
			}
		}
		return this.errors.join('');
	},
	set_error : function (key,text) {
		this.errors[this.keys[key]] = text;

		if(this.checkers[key].image)
		{
			this.checkers[key].image[0].src = this.checkers[key].image[2];
		}
		return true;
	},
	remove_error : function (key) {
		this.errors[this.keys[key]] = '';
		
		if(this.checkers[key].image)
		{
			this.checkers[key].image[0].src = this.checkers[key].image[1];
		}
		return false;
	},
	check_field : function (name) {
		var obj = this.form.elements[name];
		var checkers = this.checkers[name];
		var value='';

		if(checkers.regexp)
		{
			var regexp = checkers.regexp;
			for(var i=0;i<regexp.length;i+=2)
			{
				value = '';
				switch(obj.type)
				{
					case 'select-one':
						if(obj.selectedIndex!=-1)
						{
							value = obj.options[obj.selectedIndex].value;
						}
					break;
					default:
						value = obj.value;
					break;
				}
				
				if(typeof(regexp[i])=='object')
				{
					if(!regexp[i].test(value))
					{
						this.set_error(name,regexp[i+1]);
						return false;
					}else{
						this.remove_error(name);
					}
				}else if(typeof(regexp[i])=='function')
				{
					if(!regexp[i](obj,value))
					{
						this.set_error(name,regexp[i+1]);
						return false;
					}else{
						this.remove_error(name);
					}
				}
			}
		}else if(checkers.func)
		{
			if((ret=checkers.func(obj))!==true)
			{
				this.set_error(name,ret);
				return false;
			}else{
				this.remove_error(name);
			}
		}
				
		return true;
	}
};
