var predefinedReq = {
	//not_empty	: 	'^\\w +$',
	//not_empty	: 	'^([a-zA-Z0-9ěščřžýáíéúůďťĚŠČŘŽÝÁÍÉÚŮĎŤ]{1})+([a-zA-Z0-9 ěščřžýáíéúůďťĚŠČŘŽÝÁÍÉÚŮĎŤ]?)+$',
	not_empty	: 	'^([a-zA-Z0-9ščřžňúěůŠČŘŽÚ+]{1})+([a-zA-Z0-9 %&\n_:<br />!ěščřžýáíéňúůďťĚŠČŘŽÝÁÍÉÚŮĎŤ\.,]?)+$',
	email		: 	'^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$',
	password	:	'^(?=.*\d)(?=.*[a-zA-Z])(?!.*[\W_\x7B-\xFF]).{6,15}$' //Password validator Requires 6-20 characters including at least 1 upper or lower alpha, and 1 digit. It should disallow just about everything else, inluding extended characters.
}
var validation = new Class({
	predefined:{
		testReq: function(object,arguments){
			if (predefinedReq[arguments]){
				return (object.value.test(predefinedReq[arguments]));
			} else {
				return (object.value.test(arguments));
			}
		},
		isConfirm		: function(object,arguments){
			return (object.value == $(arguments.secObject).value);
		},
		not_equal		: function (object,arguments){
			return (object.value != arguments);
		},
		length		:	function(object,arguments){
							var value = object.value;
							if (arguments.min == null){
								if (value.length < arguments.min){
									return false;
								} else {
									return true;
								}
							} else if (arguments.max == null){
								if (value.length > arguments.max){
									return false;
								} else {
									return true;
								}
							} else {
								if (value.length < arguments.min || value.length > arguments.max){
									return false;
								} else {
									return true;
								}
							}
						},
		isUnique	:	function(object,arguments){
			var value = object.value;
			object.removeClass('invalid');
			object.removeClass('require');
			object.removeClass('valid');
			object.addClass('wait');
			new Request.JSON({
				url: '/pages/isUnique/' + arguments.model + '/' + arguments.field + '/' + value,
				onComplete: function(json){
					if (json['return'] == true){
						object.removeClass('invalid');
						object.removeClass('require');
						object.removeClass('wait');
						object.addClass('valid');
					} else {
						object.removeClass('valid');
						object.removeClass('require');
						object.removeClass('wait');
						object.addClass('invalid');
					}
				}
			}).send();
			return null;
		},
		isChecked	:	function(object,arguments){
			return object.checked;
		}
	},
	
	val:{},
	valideForm:function(id_form){
		var element = $(id_form);
		not_valid_el = element.getElements('.invalid, .require');
		if (not_valid_el.length == 0)
			return true;
		else {
			errors = [];
			not_valid_el.each(function(ivi){
				errors[errors.length] = ivi.err_message['type_' + ivi.valid_error];
			});
			return errors;
		}
	},
	define:function(id_form,options){
		if (!this.val[id_form]) this.val[id_form] = {};
		$extend(this.val[id_form],options);
	},
	show: function(){
		alert(JSON.encode(this.val));
	},
	generate: function(id_form,edit){
		if (edit==true) className='valid'; else className = 'require';
		$each(this.val[id_form], function(items,id){
			node = $(id);
			if (node){
				node.err_message = [];
				start_valid = false;
				
				$each(items, function(item, fnc){
					if (start_valid == false) start_valid = fnc;
					node.err_message['type_' + fnc] = item['err_message'];
				});
				
				if (node.nodeName == 'INPUT' && (node.getProperty('type') == 'text' || node.getProperty('type') == 'password')){
					event_ = 'keyup';
				} else if (node.nodeName == 'INPUT' && node.getProperty('type') == 'checkbox'){
					event_ = 'click';
				} else if (node.nodeName == 'INPUT' && node.getProperty('type') == 'hidden'){
					event_ = 'zmena';
				} else if (node.nodeName == 'SELECT'){
					event_ = 'change';
				} else if (node.nodeName == 'TEXTAREA'){
					event_ = 'keyup';
				}
				node.addEvent(event_,(function(e){
					target = new Event(e).target;
					
					for (fnc in items){
						parameters = items[fnc]['condition'];
						fnc_string = fnc;
						fnc = eval(this.predefined[fnc]);
						func_return = fnc(target,parameters);
						if ( func_return == true){						
							target.removeClass('invalid');
							target.removeClass('require');
							target.addClass('valid');
						} else if (func_return == false) {
							target.removeClass('valid');
							target.removeClass('require');
							target.addClass('invalid');
							target.valid_error = fnc_string;
							break;
						} else {
							target.removeClass('valid');
							target.removeClass('require');
							target.removeClass('invalid');
						}
					}
				}).bind(this))
				.addClass(className);
				node.valid_error = start_valid;
			}
		},this);
	}
		
});
validation = new validation();
