var validation = new Class ({

	initialize: function(form, handler) {
		this.f = $(form);
		this.validate = handler;
		this.f.addEvent('submit', function(e) {if(!this.validate()) new Event(e).stop();}.bind(this));
	},
	
	failed: function(field, form) {
		form = $(form) || this.f;
		if (form[field].length) $try(function() {form[field][0].focus()});
		else $try(function() {form[field].focus()});
		return false;
	},
	
	notempty: function(field, minlength, maxlength) {
		if (!this.f[field]) return true;
		var value = this.f[field].value.trim();
		minlength = minlength || 1;
		maxlength = maxlength || 65536;
		return (value.length >= minlength && value.length <= maxlength);
	},

	password: function(field, field2) {
		if (!this.f[field]) return true;
		return (this.f[field].value == this.f[field2].value);
	},

	radio: function(field) {
		if (!this.f[field]) return true;
		for (var i = 0; i < this.f[field].length; i++) {
			if (this.f[field][i].checked) return true;
		}
		return false;
	},

	selected: function(field) {
		if (!this.f[field]) return true;
		return (this.f[field].selectedIndex != 0);
	},

	email: function(field) {
		if (!this.f[field]) return true;
		var expression = new RegExp(/([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/);
		return expression.test(this.f[field].value);
	},

	login: function(field) {
		if (!this.f[field]) return true;
		var expression = new RegExp(/^[a-zA-Z0-9\-]{3,16}$/);
		return expression.test(this.f[field].value);
	},
	
	url: function(field) {
		if (!this.f[field]) return true;
		var expression = new RegExp(/^(http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*$/i);
		return expression.test(this.f[field].value);
	},
	
	num: function(field, minvalue) {
		if (!this.f[field]) return true;
		var value = this.f[field].value.trim().replace(/\s+/, '');
		var expression = new RegExp(/^[-+]?\d*\.?\d+$/);
		if (expression.test(value)) {
			if (minvalue && parseFloat(value) < minvalue) return false;
			return true;
		} else
			return false;
	}

});
