//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,settings){
	/////////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-z0-9!#$%&\'*+/=?^_`{|}~@\.]+/,min_length:1,status:"Nepovolené znaky",acceptable:false},
		{pattern:/[-a-z0-9!#$%&\'*+/=?^_`{|}~]+(\.[-a-z0-9!#$%&\'*+/=?^_`{|}~])*@([a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?\.)+[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])/,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}
	);
	this.status_not_filled_items='<span class="form_error_text">K odeslání formuláře je potřeba správně vyplnit zvýrazněné položky</span>';
	this.status_not_filled_items_row='';
	this.status_not_filled_items_pad='';
	this.settings=settings;
	if(this.settings.commands.length){
		if(command_matches=this.settings.commands.match(/\$\('[^\(\)]*'\)/g)){
			form_validator=this;
			command_matches.each(function(elm){
				elm_id=form_elm_id+'_item_'+elm.match(/\$\('(.*)'\)/)[1];
				if(elm_obj=$(elm_id)){
					elm_obj.form_validator=form_validator;
					elm_obj.addEvent('change',function(){this.form_validator.do_commands()});
				}
			});
		}
	}
	this.do_commands=function(){
		try{
			if(!this.commands_temp)this.commands_temp=this.settings.commands.replace(/\$\('/g,'$(\''+form_elm_id+'_item_');
			eval(this.commands_temp);
		}
		catch(e){if(this.settings.debug)alert(e)}
	}

	//////////
	var form_validator_object=this;
	this.form_elm=$(form_elm_id);
	this.form_elm.form_validator=form_validator_object;
	this.form_report_elm=$(form_elm_id+'_report');
	this.validation_items=new Array;
	this.focus_item=function(focus_item_id){
		if(focus_item_id){
			this.settings.focus_item=$(focus_item_id);
		}
		if(this.settings.focus_item == 'first_item'){
			for(var i=0;i<this.form_elm.elements.length;i++){
				if(this.form_elm.elements[i].type != 'hidden' && this.form_elm.elements[i].tagName.toLowerCase() == 'input'){
					this.form_elm.elements[i].focus();
					break;
				}
			}
		}
		else if((this.settings.focus_item) && $(this.settings.focus_item).tagName.toLowerCase() == 'input' && $(this.settings.focus_item).type != 'hidden'){
			$(this.settings.focus_item).focus();
		}
	}
	this.add_validation=function(item,settings){
		if(settings.type == 'radio' || settings.type == 'checkbox')this.validation_items.push({item:$$('input[id^=' + item.item + ']'),name:item.name,item_message_box:$(item.message_box),item_status_box:$(item.status_box),settings:settings});
		else this.validation_items.push({item:$(item.item),name:item.name,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);
				});
			}
		}
	}
	this.form_elm.addEvent('submit',function(e){
		var e = new Event(e);
		//e.stop();
		var result=true;
		var first_denied_item=false;
		var problematic_items=new Array();
		for(var i=0;i<this.form_validator.validation_items.length;i++){
			var item_obj=this.form_validator.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=this.form_validator.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' || item_obj.settings.type == 'date')){
				result_inner=false;
				item_obj.item_message_box.innerHTML=this.form_validator.item_not_set;
			}
			else if(item_obj.settings.type == 'password' && !this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.password_safety).acceptable && item_obj.settings.required){
				result_inner=false;
				if(item_obj.item.value == "")item_obj.item_message_box.innerHTML=this.form_validator.item_not_set;
				else item_obj.item_message_box.innerHTML=this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.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=this.form_validator.passwords_not_equal;
			}
			else if(item_obj.settings.type == "email" && ((!this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.email_valid).acceptable && item_obj.settings.required) || ($(item_obj.item).value && !this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.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=this.form_validator.item_not_set;
				else item_obj.item_message_box.innerHTML=this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.email_valid).status;
			}
			else if(item_obj.settings.type == "website" && !this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.website_valid).acceptable && item_obj.settings.required){
				result_inner=false;
				item_obj.item_message_box.innerHTML=this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.website_valid).status;
			}
			else if(item_obj.settings.type == "phone" && !this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.phone_valid).acceptable && item_obj.settings.required){
				result_inner=false;
				item_obj.item_message_box.innerHTML=this.form_validator.preg_match_validation($(item_obj.item).value,this.form_validator.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=this.form_validator.item_error_class_name;
					});
				}
				else{
					item_obj.item.className=this.form_validator.item_error_class_name;
				}
				item_obj.item_message_box.className=this.form_validator.message_error_class_name;
				problematic_items.push(item_obj);
				result=false;
			}
			else{
				if(item_obj.settings.type == "checkbox" || item_obj.settings.type == "radio"){
					item_obj.item.each(function(elm){
						elm.parentNode.className=this.form_validator.item_ok_class_name;
					});
				}
				else{
					item_obj.item.className=this.form_validator.item_ok_class_name;
				}
				item_obj.item_message_box.className=this.form_validator.message_default_class_name;
			}
		}
		this.form_validator.process_status(problematic_items);
		if(!result)e.stop();
	});
	this.process_status=function(problematic_items){
		if(!this.form_report_elm || problematic_items.length == 0)return false;
		var inner_html=this.status_not_filled_items;
		if(this.status_not_filled_items_row){
			for(var i=0,l=problematic_items.length;i<l;i++){
				row=problematic_items[i];
				var temp_text=eval(this.status_not_filled_items_row);
				inner_html+=temp_text;
			}
		}
		inner_html+=this.status_not_filled_items_pad;
		this.form_report_elm.innerHTML=inner_html;
	}
	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];
			}
		};
	};
}
function parse_date(format,date){
	var items_array_keys=new Array(),items_array=new Array();
	var pos=0;
	format.match(/%./g).each(function(item){
		items_array_keys[pos++]=item.replace('%','');
	});
	format_ereg=format.replace(/%./g,'(.*)');
	pos=-1;
	date.match(format_ereg).each(function(matched_value){
		items_array[items_array_keys[pos++]]=matched_value;
	});
	return new Date(items_array['y'],items_array['m'],items_array['d']);
}
function date_diff(obj){
	if(!obj.division)obj.division=3600*24*1000;
	if(!obj.format2)obj.format2=obj.format;
	return (parse_date(obj.format2,obj.date2)-parse_date(obj.format,obj.date))/obj.division;
}
