//document.write("<style>.form_message_error{background-color:red}.form_message_ok{background-color:blue}.form_item_error{background-color:red}.form_item_ok{background-color:blue}.form_status_error{background-color:red}.form_status_ok{background-color:blue}</style>");
function form_validator(form_elm_id){
	/////////texty
	this.status_default_class_name="form_status_ok";
	this.status_error_class_name="form_status_error";
	this.message_default_class_name="form_message_ok";
	this.message_error_class_name="form_message_error";
	this.item_default_class_name="";
	this.item_error_class_name="form_item_error";
	this.item_not_set="Vyplňte položku.";
	this.item_not_checked="Vyberte položku.";
	this.passwords_not_equal="Hesla se nerovnají.";
	this.passwords_equal="Hesla se rovnají.";
	this.password_safety=new Array(
		{pattern:/[^\w]+/,min_length:1,status:"Nepovolené znaky",acceptable:false},
		{pattern:/(\w*[A-Z]+\w*[0-9]+\w*|\w*[0-9]+\w*[A-Z]+\w*)/,min_length:10,status:"Silné",acceptable:true},
		{pattern:/([a-z]+[0-9]+)/,min_length:5,status:"Dobré",acceptable:true},
		{pattern:/[a-z]+/,min_length:5,status:"Slabé",acceptable:true},
		{pattern:/[\w]/,min_length:1,status:"Krátké",acceptable:true},
		{pattern:"",min_length:0,status:"Nezadáno",acceptable:false}
	);
	this.website_valid=new Array(
		{pattern:/[^a-zA-Z0-9\.]+/,min_length:1,status:"Nepovolené znaky",acceptable:false},
		{pattern:/[a-zA-Z0-9\.]+/,min_length:1,status:"Ok",acceptable:true},
		{pattern:"",min_length:0,status:"Nezadáno",acceptable:false}
	);
	this.email_valid=new Array(
		{pattern:/[^a-zA-Z0-9\.@]+/,min_length:1,status:"Nepovolené znaky",acceptable:false},
		{pattern:/[a-zA-Z0-9\.]+@[a-zA-Z0-9\.]+\.[a-zA-Z]+/,min_length:1,status:"Ok",acceptable:true},
		{pattern:"",min_length:1,status:"Špatný formát",acceptable:false},
		{pattern:"",min_length:0,status:"Nezadáno",acceptable:false}
	);
	this.phone_valid=new Array(
		{pattern:/[^0-9\+]+/,min_length:1,status:"Nepovolené znaky",acceptable:false},
		{pattern:/[\+]?[0-9]+/,min_length:1,status:"Ok",acceptable:true},
		{pattern:"",min_length:0,status:"Nezadáno",acceptable:false}
	);

	//////////
	var form_validator_object=this;
	var form_elm=$(form_elm_id);
	this.focus_item_elm="";
	this.validation_items=new Array;
	this.focus_item=function(focus_item_id){
		if(focus_item_id){
			form_validator_object.focus_item_elm=$(focus_item_id);
		}
		if(form_validator_object.focus_item_elm == "first_item"){
			for(var i=0;i<form_elm.elements.length;i++){
				if(form_elm.elements[i].type != "hidden" && form_elm.elements[i].tagName.toLowerCase() == "input"){
					form_elm.elements[i].focus();
					break;
				}
			}
		}
		else if($(form_validator_object.focus_item_elm) && $(form_validator_object.focus_item_elm).tagName.toLowerCase() == "input" && $(form_validator_object.focus_item_elm).type != "hidden"){
			$(form_validator_object.focus_item_elm).focus();
		}
	}
	this.add_validation=function(item,settings){
		if(settings.type == "radio" || settings.type == "checkbox")this.validation_items.push({item:$$("input[id^=" + item.item + "]"),item_message_box:$(item.message_box),item_status_box:$(item.status_box),settings:settings});
		else this.validation_items.push({item:$(item.item),item_message_box:$(item.message_box),item_status_box:$(item.status_box),settings:settings});
		if(settings.type == "password" && settings.required && settings.equal_to){
			$(item.item).addEvent("keydown",function(){
				(function(){
					$(item.item).className=form_validator_object.item_default_class_name;
					if($(item.item).value == $(settings.equal_to).value){
						$(item.status_box).setHTML(form_validator_object.passwords_equal);
						$(item.status_box).className=form_validator_object.status_default_class_name;
					}
					else {
						$(item.status_box).setHTML(form_validator_object.passwords_not_equal);
						$(item.status_box).className=form_validator_object.status_error_class_name;
					}
				}).delay(100);
			});
		}
		else if(settings.type == "password" && settings.check_safety){
			$(item.item).addEvent("keydown",function(){
				(function(){
					var valid=form_validator_object.preg_match_validation($(item.item).value,form_validator_object.password_safety);
					$(item.status_box).setHTML(valid.status);
					$(item.item).className=form_validator_object.item_default_class_name;
					if(valid.acceptable)$(item.status_box).className=form_validator_object.status_default_class_name;
					else $(item.status_box).className=form_validator_object.status_error_class_name;
				}).delay(100);
			});
		}
		else if(settings.required || settings.valid){
			if(settings.type == "file"){
				$(item.item).addEvent("change",function(){
					(function(){
						$(item.item).className=form_validator_object.item_default_class_name;
					}).delay(100);
				});
			}
			else if(settings.type == "radio" || settings.type == "checkbox"){
				$$("input[id^=" + item.item + "]").each(function(elm){
					elm.addEvent("mousedown",function(){
							$$("input[id^=" + item.item + "]").each(function(elm_inner){
								elm_inner.parentNode.className=form_validator_object.item_default_class_name;
							});
					});
				});
			}
			else{
				$(item.item).addEvent("keydown",function(){
					(function(){
						$(item.item).className=form_validator_object.item_default_class_name;
					}).delay(100);
				});
			}
		}
	}
	form_elm.addEvent("submit",function(e){
		var e = new Event(e);
		//e.stop();
		var result=true;
		var first_denied_item=false;
		for(var i=0;i<form_validator_object.validation_items.length;i++){
			var item_obj=form_validator_object.validation_items[i];
			var result_inner=true;
			$(item_obj.item_status_box).setHTML("");
			$(item_obj.item_status_box).className="";
			if((item_obj.settings.type == "radio" || item_obj.settings.type == "checkbox") && item_obj.settings.required){
				result_inner=false;
				item_obj.item.each(function(elm){
					if(elm.checked)result_inner=true;
				});
				if(!result_inner)item_obj.item_message_box.innerHTML=form_validator_object.item_not_checked;
			}

			if(item_obj.item.value == "" && item_obj.settings.required && (item_obj.settings.type == "text" || item_obj.settings.type == "select" || item_obj.settings.type == "textarea" || item_obj.settings.type == "file")){
				result_inner=false;
				item_obj.item_message_box.innerHTML=form_validator_object.item_not_set;
			}
			else if(item_obj.settings.type == "password" && !form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.password_safety).acceptable && item_obj.settings.required){
				result_inner=false;
				if(item_obj.item.value == "")item_obj.item_message_box.innerHTML=form_validator_object.item_not_set;
				else item_obj.item_message_box.innerHTML=form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.password_safety).status;
			}
			else if(item_obj.settings.type == "password" && item_obj.settings.required && item_obj.settings.equal_to && $(item_obj.settings.equal_to).value != item_obj.item.value){
				result_inner=false;
				item_obj.item_message_box.innerHTML=form_validator_object.passwords_not_equal;
			}
			else if(item_obj.settings.type == "email" && ((!form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.email_valid).acceptable && item_obj.settings.required) || ($(item_obj.item).value && !form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.email_valid).acceptable && !item_obj.settings.required && item_obj.settings.valid))) {
				result_inner=false;
				if(item_obj.item.value == "")item_obj.item_message_box.innerHTML=form_validator_object.item_not_set;
				else item_obj.item_message_box.innerHTML=form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.email_valid).status;
			}
			else if(item_obj.settings.type == "website" && !form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.website_valid).acceptable && item_obj.settings.required){
				result_inner=false;
				item_obj.item_message_box.innerHTML=form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.website_valid).status;
			}
			else if(item_obj.settings.type == "phone" && !form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.phone_valid).acceptable && item_obj.settings.required){
				result_inner=false;
				item_obj.item_message_box.innerHTML=form_validator_object.preg_match_validation($(item_obj.item).value,form_validator_object.phone_valid).status;
			}
			else if(result_inner){
				item_obj.item_message_box.innerHTML="";
			}
			if(!result_inner){
				if(!first_denied_item && typeof item_obj.item.focus == "function"){
					first_denied_item=true;
					item_obj.item.focus();
				}
				if(item_obj.settings.type == "checkbox" || item_obj.settings.type == "radio"){
					item_obj.item.each(function(elm){
						elm.parentNode.className=form_validator_object.item_error_class_name;
					});
				}
				else{
					item_obj.item.className=form_validator_object.item_error_class_name;
				}
				item_obj.item_message_box.className=form_validator_object.message_error_class_name;
				result=false;
			}
			else{
				if(item_obj.settings.type == "checkbox" || item_obj.settings.type == "radio"){
					item_obj.item.each(function(elm){
						elm.parentNode.className=form_validator_object.item_ok_class_name;
					});
				}
				else{
					item_obj.item.className=form_validator_object.item_ok_class_name;
				}
				item_obj.item_message_box.className=form_validator_object.message_default_class_name;
			}
		}
		if(!result)e.stop();
	});
	this.preg_match_validation=function(check_text,pattern_object){
		for(var i=0;i<pattern_object.length;i++){
			if(check_text.test(pattern_object[i].pattern) && check_text.length >= pattern_object[i].min_length){
				return pattern_object[i];
			}
		};
	};
}