function TestObligate(value) {
	if (!value.length) { return false; }
	return true;
}

function TestRegexp(value, regexp) {
	var pattern = new RegExp(regexp);
	if (value.length && !pattern.test(value)) { return false; }
	return true;
}

function TestLength(value, length) {
	if (value.length && (value.length > length)) { return false; }
	return true;
}

function TestEqual(first, second) {
	return (first == second);
}

function MessageLabel(message, label) {
  return message.replace(/%item/, label);
}

function escapeBrackets (name) {
	name = name.replace(/\[/, "\\[");
	name = name.replace(/\]/, "\\]");
	return name;
}

function FormValidator(form, regexps, labels, messages, maxlengths, obligates, equalGroups, invalidClass) {
	var messageArray = new Array();
	var notValid = new Array();
	formName = form.attr("name");
	
	//testuje validitu obsahu polozky
	$.each(regexps, function(name, regexp) {
		escName = escapeBrackets(name);
		if (!TestRegexp(form.find("#"+formName+"_"+escName).val(), regexp)) {
			notValid.push(escName);
			messageArray.push(MessageLabel(messages['regexp'], labels[name]));
		}
		else {
			form.find("#"+formName+"_"+escName).removeClass(invalidClass);			
		}
	});

	//testuje delku obsahu polozky
	$.each(maxlengths, function(name, maxlength) {
		escName = escapeBrackets(name);
		if (!TestLength(form.find("#"+formName+"_"+escName).val(), maxlength)) {
			notValid.push(escName);
			messageArray.push(MessageLabel(messages['length'], labels[name]));
		}
		else {
			form.find("#"+formName+"_"+escName).removeClass(invalidClass);			
		}
	});
	
	//testuje existenci hodnot povinnych polozek
	$.each(obligates, function(index, name) {
		escName = escapeBrackets(name);
		if (!TestObligate(form.find("#"+formName+"_"+escName).val())) {
			notValid.push(escName);
			messageArray.push(MessageLabel(messages['obligate'], labels[name]));
		}
		else {
			form.find("#"+formName+"_"+escName).removeClass(invalidClass);			
		}
	});
	
	//testuje shodu hodnot prvku
	$.each(equalGroups, function(index_1, equalGroup) {
		invalid = false;
		$.each(equalGroup, function(index_2, name) {
			escName = escapeBrackets(name);
			if (index_2 != 0) {
				if (!TestEqual(form.find("#"+formName+"_"+escName).val(), form.find("#"+formName+"_"+previous).val())) {
					invalid = true;
					notValid.push(escName);
					notValid.push(previous);
				}
			}
			
			previous = escName;
		});
		
		if (invalid == true) { //prvky ve skupine se neshoduji
			//vytvori retezec z nazvu prvku ve skupine
			groupstring = '';
			$.each(equalGroup, function(index_2, name) {
				if (groupstring != '') {
					groupstring += ', ';
				}
				groupstring += labels[name];
			});
			
			messageArray.push(MessageLabel(messages['equals'], groupstring));
		}
	});
	
	$.each(notValid, function(key, name) {
		form.find("#"+formName+"_"+name).addClass(invalidClass);
	});
	
	return messageArray.join("<br/>");
}

function multitext_reindex(name, formName) {
	index = 0;
	$("#"+formName+"_"+name).children("div").each(function(i) {
		new_id = name+"\["+index+"\]";
		$(this).children("input").attr("name", new_id).attr("id", formName+"_"+new_id).siblings("img[id$='_remove']").attr("id", formName+"_"+new_id+"_remove").siblings("img[id$='_insert']").attr("id", formName+"_"+new_id+"_insert");
		index++;
	});
}

function multitext_count(name, formName) {
	return $("#"+formName+"_"+name).children("div").length;
}

function multitext_add_click(button, name, formName, max) {
	count = multitext_count(name, formName);
	
	old_div = $("#"+formName+"_"+name+"\\["+(count-1)+"\\]").parent();
	new_div = old_div.clone(true).hide().insertAfter(old_div).fadeIn(500).children("input").val("");
	multitext_reindex(name, formName);

	count++
	
	if (count >= max) {
		button.fadeOut();
	}

	if ($("#"+formName+"_"+name+"\\[0\\]_remove").css("display") == "none") {
		$("#"+formName+"_"+name).children("div").each(function(i) {
			$(this).children("img[id$='_remove']").fadeIn(500);
		});
	}
}

function multitext_remove_click(button, name, formName, min, max) {
	count = multitext_count(name, formName);
	
	button.parent().fadeOut(500, function() {
		$(this).remove();
		multitext_reindex(name, formName);
	});
	count--;

	if (min >= count) {
		$("#"+formName+"_"+name).children("div").each(function(i) {
			$(this).children("img[id$='_remove']").fadeOut(500);
		});
	}

	if ($("#"+formName+"_"+name+"_add").css("display") == "none") {
		$("#"+formName+"_"+name+"_add").fadeIn(500);
	}
}

function multitext_init(name, formName, min, max, insertInto, insertCode) {
	//vychozi stav
	$(document).ready(function() {
		//vychozi pocet polozek >= maximum -> schova pridavaci tlacitka
		if (multitext_count(name, formName) >= max) {
			$("#"+formName+"_"+name+"_add").hide();
		}
		
		//vychozi pocet polozek <= minimum -> schova odebiraci tlacitka
		if (multitext_count(name, formName) <= min) {
			$("#"+formName+"_"+name).children("div").each(function(i) {
				$(this).children("img[id$='_remove']").hide();
			});
		}
	});

	//nastavi reakce na kliknuti na odebiraci a vkladaci tlacitka (kazdemu zvlast, protoze kazde operuje se svym vlastnim inputem)
	for (i = 0; i < multitext_count(name, formName); i++) {
		//kliknuti na odebiraci tlacitko
		$("#"+formName+"_"+name+"\\["+i+"\\]_remove").click(function() {
			multitext_remove_click($(this), name, formName, min, max);
		});
		
		//kliknuti na vkladaci tlacitko
		if (insertInto && insertCode) {
			$("#"+formName+"_"+name+"\\["+i+"\\]").siblings("img[id$='_insert']").click(function() {
				value = $(this).siblings("input").val();
				if (value != "") {
					value = insertCode.replace(/%__value/, value);
					//alert($(value).html());
					obj = $("[id^="+formName+"_"+insertInto+"]:visible");
					insertAroundSelection(obj[0], value, '');
				}
			});
		}
	}
	
	$("#"+formName+"_"+name+"_add").click(function() {
		multitext_add_click($(this), name, formName, max); 
	});
}

function multiupload_init(name, formName, min, max, insertInto, insertCode, extensions) {
	multitext_init(name, formName, min, max, insertInto, insertCode);
	
}

function setCursorPos (elm, begin, end)
{
    if (typeof elm.selectionStart != "undefined" && typeof elm.selectionEnd != "undefined")
    {
        elm.setSelectionRange (begin, end);
        elm.focus ();
    }

    else if (document.selection && document.selection.createRange)
    {
        var range = elm.createTextRange ();
        range.move ("character", begin);
        range.moveEnd ("character", end - begin);
        range.select ();
    }
}

//vlo�en� textu na pozici
function insertAtCursor(obj,val) {
	var o = obj;
	o.focus();
	if (document.selection)	{
		sel = document.selection.createRange();
		sel.text = val;
	}
	else if (o.selectionStart || o.selectionStart == '0') {
		var startPos = o.selectionStart;
		var endPos = o.selectionEnd;
		o.value = o.value.substring(0,startPos) + val + o.value.substring(endPos, o.value.length);
		setCursorPos (document.formular.text, startPos,startPos);
	}
	else {
		o.value += val;
		setCursorPos (document.formular.text, startPos,startPos);
	}
}

//vlo�en� kolem vybran�ho textu
function insertAroundSelection(obj,startVal,endVal) {
	var o = obj;
	o.focus();
	if (document.selection)
	{
		sel = document.selection.createRange();
		var selText = sel.text;
		sel.text = startVal + selText + endVal;
	
	}
	else if (o.selectionStart || o.selectionStart == '0') {
		var startPos = o.selectionStart;
		var endPos = o.selectionEnd;
		o.value = o.value.substring(0,startPos) + startVal + o.value.substring(startPos,endPos) + endVal + o.value.substring(endPos,o.value.length);
		setCursorPos (document.formular.text, startPos,startPos);
	}
	else {
		o.value += startVal + endVal;
		setCursorPos (document.formular.text, startPos, startPos);
	}
}

function add(ins) {
	document.all.text.value=document.all.text.value+ins;
	review();
}

function confirmSubmit (name) {
	$("#"+name).fadeOut(250, function () {
		$("#"+name+"_confirm").fadeIn(250);
	});
	
	$("#"+name+"_confirm_yes").click(function () {
		$(this).parents("form").submit();
	});
	
	$("#"+name+"_confirm_no").click(function () {
		$("#"+name+"_confirm").fadeOut(250, function () {
			$("#"+name).fadeIn(250);
		});
	});
}

function disableIfIn (controled, controling, disabling_values) {
	$(document).ready(function() {
		if ($.inArray(controling.val(), disabling_values) != -1) {
			controled.hide();
			controled.find("input, select").attr("disabled", "disabled");
		}
	});
	
	controling.change(function () {
		if ($.inArray($(this).val(), disabling_values) != -1) {
			controled.hide();
			controled.find("input, select").attr("disabled", "disabled");
		}
		else {
			controled.hide(function() {
				$(this).show();
			});
			controled.find("input, select").removeAttr("disabled");
		}
	});
}

function fadeIfIn (controled, controling, disabling_values) {
	$(document).ready(function() {
		if ($.inArray(controling.val(), disabling_values) != -1) {
			controled.hide();
			controled.find("input, select").attr("disabled", "disabled");
		}
	});
	
	controling.change(function () {
		if ($.inArray($(this).val(), disabling_values) != -1) {
			controled.fadeOut(500);
			controled.find("input, select").attr("disabled", "disabled");
		}
		else {
			controled.fadeIn(500, function() {
				$(this).show();
			});
			controled.find("input, select").removeAttr("disabled");
		}
	});
}

function disableIfNotIn (controled, controling, enabling_values) {
	$(document).ready(function() {
		if ($.inArray(controling.val(), enabling_values) == -1) {
			controled.hide();
			controled.find("input, select").attr("disabled", "disabled");
		}
	});
	
	controling.change(function () {
		if ($.inArray($(this).val(), enabling_values) == -1) {
			controled.hide();
			controled.find("input, select").attr("disabled", "disabled");
		}
		else {
			controled.show();
			controled.find("input, select").removeAttr("disabled");
		}
	});
}

function fadeIfNotIn (controled, controling, enabling_values) {
	$(document).ready(function() {
		if ($.inArray(controling.val(), enabling_values) == -1) {
			controled.hide();
			controled.find("input, select").attr("disabled", "disabled");
		}
	});
	
	controling.change(function () {
		if ($.inArray($(this).val(), enabling_values) == -1) {
			controled.fadeOut(500);
			controled.find("input, select").attr("disabled", "disabled");
		}
		else {
			controled.fadeIn(500);
			controled.find("input, select").removeAttr("disabled");
		}
	});
}

function fillForm (data, formName) {
	clearForm(formName);
	$.each(data, function(index, value) {
		if (index != "sentFormName") {
			index = escapeBrackets(index);
			if (typeof(value) == "object" && (value instanceof Array)) { //pole - vicehodnotovy prvek
				element = $("#" + formName + "_" + index + "\\[\\]");
				alert("#" + formName + "_" + index + "\\[\\]");
				if (element[0].tagName.toLowerCase() == "select" && element.attr("multiple") == true) { //select
					$.each(value, function(i, v) { //vybere moznosti podle hodnot v poli
						element.children("option[value=" + v + "]").attr("selected", "selected").change();
					});
				}
			}
			else {
				element = $("#" + formName + "_" + index);
				if (value == null)
					element.val("").change();
				else
					element.val(value).change();
			}
		}
	});
}

function clearForm (formName) {
	form = $("#" + formName);
	form.find(":input").not(":button").not(":submit").not("#" + formName + "_sentFormName").val("").change();
}
