
// Променливата съдържа стойност true или false, според това дали страницата е отворена в Mozilla Firefox.
var isFF = navigator.userAgent ? (navigator.userAgent.indexOf("Firefox") != -1) : false;

/**
 * Прехвърля фокуса на зададения елемент от страницата.
 * @param obj Елемент от страницата, на който да се прехвърли фокуса.
 */
function focusElement (obj) {
	$(document).focus();
	if ($(obj).get(0) != null && !$(obj).attr('disabled')) {
		$(obj).focus();
		if ($(obj).val() != '')
			$(obj).select();
	}
}

/**
 * Превърта страницата до зададения елемент.
 * @param name Име на котва или елемент от страницата.
 */
function gotoName (name) {
	var a = document.anchors;
	var obj = (a ? a[name] : null);
	if (!obj && a) {
        for (var i = 0; i < a.length; ++i) {
            if (a[i].name == name) {
                obj = a[i];
                break;
            }
        }
    }
    if (!obj)
		$('#' + name).get(0);
    if (obj) {
		var XY = {X:0, Y:0};
		for (var node = obj; node; node = node.offsetParent) {
			XY.X += node.offsetLeft;
			XY.Y += node.offsetTop;
		}
        window.scrollTo(XY.X, XY.Y);
    }
}

/**
 * Презарежда стойностите на зададен ComboBox елемент.
 * @param type Тип на данните според дефинираните във файла "setup_combo.php".
 * @param field Идентификатор на елемента, чиито стойности се зареждат.
 * @param key Ключ за филтриране на данните.
 * @param value Стойност, която да се зададе на елемента след зареждането.
 */
function setupCombo (type, field, key, value) {
	if (!$('#action_div').get(0))
		$('body').append('<div id="action_div" style="display:none;"></div>');
    $('#action_div').load("setup_combo.php?t=" + type + "&f=" + field + "&k=" + key + "&v=" + value + "&x=" + (new Date().getTime()));
}

// ————————————————————————————————————————————————————————————————————————————————————————————————————
//   ФУНКЦИИ ЗА УПРАВЛЕНИЕ НА ПОЛЕТАТА ЗА РЕДАКТИРАНЕ НА ДАННИ
// ————————————————————————————————————————————————————————————————————————————————————————————————————

/**
 * Връща позицията на маркираната част от текста в зададения елемент.
 * @param obj Елемент, който се проверява.
 * @return Началната позиция на маркираната част от текста.
 */
function selectionStart (obj) {
    if (obj.createTextRange) {
        var r = document.selection.createRange().duplicate();
        var s = obj.value;
        if (s) {
            r.moveEnd('character', s.length);
            if (r.text == '')
                return s.length;
            return s.lastIndexOf(r.text);
        }
		return 0;
    }
    return obj.selectionStart;
}

/**
 * Проверява дали натиснатият клавиш в зададения елемент е валиден.
 * @param tp Тип на данните в елемента: D=дата, F=реално число, I=цяло число.
 * @param obj Елемента, в който е натиснат клавиш.
 * @param e Събитието onkeypress.
 * @return True, ако натиснатият клавиш е валиден.
 */
function checkKeyPressed (tp, obj, e) {
	if (tp == 'D')
		obj.value = obj.value.replace(/-/, ".").replace(/\//, ".");
	var key = e.charCode ? e.charCode : (e.keyCode ? e.keyCode : 0);
	if (key == 13)
		return (obj.nodeName.toLowerCase() == "input"); // позволява Enter само ако е в input елемент
	if ((e.ctrlKey && key == 97 /* firefox */) || (e.ctrlKey && key == 65) /* opera */) return true; // позволява Ctrl+A
	if ((e.ctrlKey && key == 120 /* firefox */) || (e.ctrlKey && key == 88) /* opera */) return true; // позволява Ctrl+X (cut)
	if ((e.ctrlKey && key == 99 /* firefox */) || (e.ctrlKey && key == 67) /* opera */) return true; // позволява Ctrl+C (copy)
	if ((e.ctrlKey && key == 122 /* firefox */) || (e.ctrlKey && key == 90) /* opera */) return true; // позволява Ctrl+Z (undo)
	if ((e.ctrlKey && key == 118 /* firefox */) || (e.ctrlKey && key == 86 /* opera */ ) || (e.shiftKey && key == 45)) return true; // позволява Ctrl+V (paste), Shift+Ins
	if (key < 48 || key > 57) {
		if (key == 45 && (tp == 'I' || tp == 'F')) {
			if (obj.value.length == 0 || (obj.value.length > 0 && obj.value.charAt(0) != '-' && selectionStart(obj) == 0))
				return true;
		}
		if ((key == 44 || key == 46) && tp == 'F') {
        	if (typeof obj.value == "undefined" || obj.value == '')
         		obj.value = '0';
			if (obj.value.length == 0 || (obj.value.length > 0 && obj.value.indexOf('.') < 0 && obj.value.indexOf(',') < 0))
				return true;
		}
		if ((key == 45 || key == 46 || key == 47) && tp == 'D') {
			if (e.charCode) e.charCode = 46;
			if (e.keyCode) e.keyCode = 46;
			if (obj.value.length == 0 || (obj.value.length > 0 && (obj.value.indexOf('.') >= 0 ? obj.value.indexOf('.',obj.value.indexOf('.')+1) : -1) < 0))
				return true;
		}
		if (key == 8 || key == 9 || key == 13 || key == 35 || key == 36 || key == 37 || key == 39 || key == 46) {
            if (typeof e.charCode != "undefined") {
                if ((e.keyCode == e.which && e.which != 0) || (e.keyCode != 0 && e.charCode == 0 && e.which == 0))
					return true;
            }
        }
	    return false;
    }
	return true;
}

/**
 * Преобразува зададения стринг в дата.
 * @param s Стринг, който да се преобразува.
 * @return Датата, която е записана в стринга.
 */
function parseDate (s) {
	if (s == "") return false;
	var a = -1, b = -1, yy = -1, mm = -1, dd = -1;
	a = s.indexOf('.');
	b = s.indexOf('.', a + 1);
	if (a >= 0) {
		dd = Number(s.substr(0, a));
		if (b > 0) {
			mm = Number(s.substr(a + 1, b - a - 1));
			yy = Number(s.substr(b + 1));
			if (!isNaN(yy) && yy < 100)
				yy += (yy > 30) ? 1900 : 2000;
		} else
			mm = Number(s.substr(a + 1));
	} else
		dd = Number(s);
	var d = new Date();
	if (!isNaN(dd) && dd > 0) d.setDate(dd);
	if (!isNaN(mm) && mm > 0) d.setMonth(mm - 1);
	if (!isNaN(yy) && yy > 0) d.setFullYear(yy);
	return isNaN(d.getTime()) ? false : d;
}

/**
 * Инициализира зададения елемент за въвеждане на дата.
 * @param id Идентификатор на елемента.
 */
function dateInputInit (id) {
	if (id.substr(0, 1) != '#')
		id = '#' + id;
	$(id).datePicker({startDate:"01.01.1980", endDate:"31.12.2020"});
	$(id).keypress(function (e) {
		return checkKeyPressed('D', this, e);
	});
	$(id).blur(function () {
		this.value = this.value.replace(/-/, ".").replace(/\//, ".");
		var dt = parseDate(this.value);
		if (dt) {
			this.value = dt.asString();
			if ($.event._dpCache && this._dpId) {
				var controller = $.event._dpCache[this._dpId];
				if (controller)
					controller.setSelected(dt, true, true);
			}
		}
	});
}

/**
 * Добавя функция на jQuery, която задава на зададения елемент процедура при натискане на Enter, той да действа като Tab.
 */
jQuery.fn.enter2tab = function() { 
    this.keypress(function(e) { 
        var key = e.charCode ? e.charCode : (e.keyCode ? e.keyCode : 0); 
        if ((key == 13)  && /^(input|select)$/i.test(this.nodeName)) { 
                this.focus(); 
                return false; 
            var list, next = this.tabIndex + 1; 
            list = $("select[@tabIndex='" + next + "'],input[@tabIndex='" + next + "']"); 
            if (list.size() > 0) { 
                list.get(0).focus(); 
                return false; 
            } else if (this.form) { 
                var current = this, focusNext = false, gotFocus = false; 
                $($.getAll(this.form, [])).each(function(i, elem) { 
                    if (current == elem) { 
                        focusNext = true; 
                    } else if (focusNext && /^(input|select)$/i.test(elem.nodeName)) { 
                        elem.focus(); 
                        gotFocus = true; 
                        return false; 
                    } 
                }); 
                if (gotFocus) { 
                    return false; 
                } 
            } 
        } 
    }); 
    return this; 
} 

// ————————————————————————————————————————————————————————————————————————————————————————————————————
//   ФУНКЦИИ ЗА УПРАВЛЕНИЕ НА POPUP ПРОЗОРЦИ
// ————————————————————————————————————————————————————————————————————————————————————————————————————

/**
 * Инициализиране на popup прозорецa.
 */
function popupInit () {
	$(".popup-container form").ajaxForm({target:"#popup_window", type:'GET'});
}

/**
 * Скрива отворения popup прозорец.
 */
function popupHide () {
	$(document).unbind('keyup');
	$('#popup_overlay, #popup_window').css({display:"none"});
    $('#popup_window').empty();
}

/**
 * Показва popup прозорец като зарежда съдържанието му от зададения адрес.
 * @param url Адрес, от който да се зареди съдържанието на прозореца.
 */
function popupShow (url) {
	if (document.getElementById("popup_window") === null)
		$("body").append("<div id=\"popup_overlay\"></div><div id=\"popup_window\"></div>");
	var e = document.documentElement;
    var h = window.innerHeight || self.innerHeight || (e && e.clientHeight) || document.body.clientHeight;
	var pc = document.getElementById('page_content');
    var h2 = pc ? pc.innerHeight || pc.offsetHeight || pc.style.pixelHeight : 0;
	$("#popup_overlay").css({display:"block"});
    $("#popup_overlay").css("height", Math.max(h,h2) + "px");
	url = url + (url.indexOf("?") !== -1 ? "&" : "?") + "random=" + (new Date().getTime());
	$("#popup_window").load(url, '', function() { 
		if (h < $(this).height()) {
			$(this).css({position:"absolute", top:"0", left:"0", width:"100%", height:"100%"});
			$("#popup_window table.popup-container").css("margin-top", 50);
		} else {
			$(this).css("top", (h-$(this).height()) / 2);
		}
		$(this).css({display:"block"});
	});
	$(document).bind('keyup', function (e) {
		keycode = e ? e.which : event.keyCode;
		if (keycode == 27)
			popupHide();
	});
	return false;
}

/**
 * Записва съдържанието на формата в popup прозореца.
 */
function popupSubmit () {
	$(".popup-container form").submit();
}

// ————————————————————————————————————————————————————————————————————————————————————————————————————
//   ФУНКЦИИ ЗА УПРАВЛЕНИЕ ПОЛЕТАТА НА ФОРМУЛЯР
// ————————————————————————————————————————————————————————————————————————————————————————————————————

/**
 * Връща стойността на зададения елемент от страницата като реално число.
 * Ако елементът съдържа невалидна реална стойност, функцията връща стойност нула.
 * @param obj Елемент или идентификатор на елемент от страницата.
 */
function f (obj) {
	var s = ($('#' + obj).get(0) ? $('#' + obj).val() : $(obj).val());
	s = s.replace(/,/, ".");
	if (s) {
		if (s.indexOf(')') > 0)
			s = eval(s + '*1');
		var res = parseFloat(s);
		if (!isNaN(res))
			return res;
	}
	return 0.00;
}

/**
 * Връща стойността на зададения елемент от страницата като цяло число.
 * Ако елементът съдържа невалидна целочислена стойност, функцията връща стойност нула.
 * @param obj Идентификатор на елемента от страницата.
 */
function i (obj) {
	var s = ($('#' + obj).get(0) ? $('#' + obj).val() : $(obj).val());
	if (s) {
		if (s.indexOf(')') > 0)
			s = eval(s + '*1');
		var res = parseInt(s);
		if (!isNaN(res))
			return res;
	}
	return 0;
}

/**
 * Връща стойността на зададения атрибут на елемент от страницата като цяло число.
 * @param obj Елемент от страницата.
 * @param attributeName Име на атрибута.
 * @param defaultValue Стойност по подразбиране.
 * @return Стойността на зададения атрибут като цяло число.
 */
function getAttrAsInt (obj, attributeName, defaultValue) {
	var res = parseInt($(obj).attr(attributeName));
	return (isNaN(res) ? defaultValue : res);
}

/**
 * Определя типа на данните, които се въвеждат в зададения елемент от страницата.
 * @param obj Елемент от страницата.
 * @return "i" - в елемента се въвеждат цели числа, "f" - в елемента се въвеждат реални числа, или null.
 */
function getFieldType (obj) {
	return ($(obj).hasClass('int') ? "i" : ($(obj).hasClass('float') ? "f" : null));
}

/**
 * Определя какви стойности може да приема зададения елемент от страницата.
 * @param obj Елемент от страницата.
 * @return
 *   -1 ако елементът приема неположителна стойност,
 *   +1 ако елементът приема неотрицателна стойност или
 *    0 ако елементът може да приема всякаква стойност.
 */
function getFieldSign (obj) {
	return ($(obj).hasClass('negative') ? -1 : ($(obj).hasClass('positive') ? 1 : 0));
}

/*
 *	Функцията форматира и изчиства стойността на зададения елемент.
 *	Параметри:
 *		obj			- елемент, чиято стойност да се обработи
 */
function clearFieldValue (obj) {
	if ($(obj).get(0)) {
		var v = $(obj).val();
		if (v && eval(v + '*1') < 0 && !(v.indexOf(')') > 0))
			$(obj).val('(' + v + ')');
		if (/^(0{1})\.?(0*)$/.test(v))
			$(obj).val('');
	}
}

/*
 *	Функцията подготвя стойността на зададения елемент за редактиране.
 *	Параметри:
 *		obj			- елемент, чиято стойност да се подготви
 */
function prepareFieldValue (obj) {
	if ($(obj).get(0)) {
		var n = getFieldType(obj);
		var p = getAttrAsInt(obj, 'precision', 3);
		if (n) {
			$(obj).val((n == 'f' ? f(obj).toFixed(p).replace(/(0)+$/g, '').replace(/(\.)+$/g, '') : '' + i(obj)));
			if (/^(0{1})\.?(0*)$/.test($(obj).val()))
				$(obj).val('');
			if ($(obj).val() != '')
				$(obj).select();
		}
	}
}

/**
 * Записва в зададения елемент на страницата зададената стойност.
 * @param obj Елемент от страницата.
 * @param value Стойност на елемента.
 */
function putValue (obj, value) {
	$(obj).val(value);
	clearFieldValue($(obj).get(0));
}

/**
 * Записва в зададения елемент на страницата зададената реална стойност.
 * @param id Идентификатор на елемент от страницата.
 * @param value Стойност на елемента.
 * @param decimals Ако е зададен, този атрибут определя до колко знака
 *   след десетичната точка да се форматира зададената стойност.
 */
function putFloat (id, value, decimals) {
	if (typeof(decimals) == 'undefined')
		decimals = 3;
	putValue('#' + id, value.toFixed(decimals));
}

/**
 * Записва в зададения елемент на страницата зададената целочислена стойност.
 * @param id Идентификатор на елемент от страницата.
 * @param value Стойност на елемента.
 */
function putInt (id, value) {
	putValue('#' + id, value);
}

/**
 * Търси следващата клетка в матрицата за навигация по формуляра.
 * @param id Име на началното поле за търсене.
 * @param inc_x Стъпка на изместване по X.
 * @param inc_y Стъпка на изместване по Y.
 * @return Намереният обект или null.
 */
function searchMatrix (id, inc_x, inc_y) {
	if (matrix && matrix.length > 0) {
		var x, y, size_y = matrix.length, size_x = (matrix[0]).length;
		for (y = 0; y < size_y; y++) {
			for (x = 0; x < size_x; x++) {
				if (matrix[y][x] && matrix[y][x] == id) break;
			}
			if (x < size_x && matrix[y][x] && matrix[y][x] == id) break;
		}
		if (!(y < size_y && x < size_x && matrix[y][x] && matrix[y][x] == id))
			return null;
		do {
			if (inc_x != 0) {
				x = x + inc_x;
				if (x < 0) {
					x = size_x - 1;
					y--;
					if (y < 0)
						y = size_y - 1;
				}
				if (x >= size_x) {
					x = 0;
					y++;
					if (y >= size_y)
						y = 0;
				}
			} else {
				y = y + inc_y;
				if (y < 0) {
					y = size_y - 1;
					x--;
					if (x < 0)
						x = size_x - 1;
				}
				if (y >= size_y) {
					y = 0;
					x++;
					if (x >= size_x)
						x = 0;
				}
			}
			if (matrix[y][x]) {
				n = $('#' + matrix[y][x]).get(0);
				if (n && !n.readOnly && !n.disabled)
					return n;
			}
		} while (!(matrix[y][x] && matrix[y][x] == id));
	}
	return null;
}

// ————————————————————————————————————————————————————————————————————————————————————————————————————
//   ФУНКЦИИ ЗА ПРОВЕРКА ПОЛЕТАТА НА ФОРМУЛЯР
// ————————————————————————————————————————————————————————————————————————————————————————————————————

/**
 * Показва съобщение за грешка и прехвърля фокуса на зададения елемент от страницата.
 * @param obj Елемент от страницата.
 * @param msg Съобщение за грешка към потребителя.
 */
function alertElement (obj, msg) {
	if (!isFF)
		focusElement(obj);
	if (msg && msg != '')
		alert(msg);
	if (isFF)
		focusElement(obj);
	return false;
}

/**
 * Проверява и форматира стойността на зададения елемент от страницата.
 * @param obj Елемент от страницата.
 */
function checkFieldValue (obj) {
	if (obj) {
		var n = getFieldType(obj);
		var s = getFieldSign(obj);
		if (n && s) {
			if ((n == 'i' && s > 0 && i(obj) < 0) || (n == 'f' && s > 0 && f(obj) < 0)) {
				obj.value = '';
				return alertElement(obj, 'Стойността в тази клетка не може да е отрицателно число.');
			}
			if ((n == 'i' && s < 0 && i(obj) > 0) || (n == 'f' && s < 0 && f(obj) > 0)) {
				obj.value = '';
				return alertElement(obj, 'Стойността в тази клетка не може да е положително число.');
			}
		}
		if (n && n == 'f') {
			var v = f(obj);
			var n1 = getAttrAsInt(obj, 'whole', 0);
			var n2 = getAttrAsInt(obj, 'precision', 3);
			if (n1 > 0 && v >= Math.pow(10, n1-n2))
				return alertElement(obj, 'Стойността в тази клетка е прекалено голяма за базата данни.');
			if (v.toFixed)
				putValue(obj, v.toFixed(n2));
		}
		return true;
	}
	return false;
}

/**
 * Проверява дали стойността на първата клетка е по-голяма или равна на стойността на втората клетка от формуляра.
 * Ако това не е така, се показва съобщение за грешка и стойността на втората клетка се нулира.
 * @param obj Елемент от страницата, който се проверява.
 * @param name1 Име на първата клетка.
 * @param name2 Име на втората клетка.
 * @param message Съобщение за грешка, което да се покаже, ако не е изпълнено условието.
 */
function checkGreaterOrEqual (obj, name1, name2, message) {
	var n = $(obj).attr('name');
	if (n == name1 || n == name2) {
		var n = getFieldType(obj);
		var ok = (n == 'i') ?
			(i(name1) >= i(name2)) :
			(f(name1) >= f(name2));
		if (!ok) {
			putInt(name2, '');
			alertElement(obj, message);
		}
	}
}

/**
 * Проверява дали стойността на първата клетка е по-голяма или равна на сумата от стойностите на останалите две клетки от формуляра.
 * Ако това не е така, се показва съобщение за грешка и стойностите на останалите две клетки се нулират.
 * @param obj Елемент от страницата, който се проверява.
 * @param name1 Име на първата клетка.
 * @param name2 Име на втората клетка.
 * @param name3 Име на третата клетка.
 * @param message Съобщение за грешка, което да се покаже, ако не е изпълнено условието.
 */
function checkGreaterOrEqual2 (obj, name1, name2, name3, message) {
	var n = $(obj).attr('name');
	if (n == name1 || n == name2 || n == name3) {
		var ok = i(name1) < 0 ?
			(i(name1) <= i(name2) + i(name3)) :
			(i(name1) >= i(name2) + i(name3));
		if (!ok) {
			putInt(name2, '');
			putInt(name3, '');
			alertElement(obj, message);
		}
	}
}

/**
 * Проверява дали стойността на първата клетка е по-голяма или равна на сумата от стойностите на останалите три клетки от формуляра.
 * Ако това не е така, се показва съобщение за грешка и стойностите на останалите три клетки се нулират.
 * @param obj Елемент от страницата, който се проверява.
 * @param name1 Име на първата клетка.
 * @param name2 Име на втората клетка.
 * @param name3 Име на третата клетка.
 * @param name4 Име на четвъртата клетка.
 * @param message Съобщение за грешка, което да се покаже, ако не е изпълнено условието.
 */
function checkGreaterOrEqual3 (obj, name1, name2, name3, name4, message) {
	var n = $(obj).attr('name');
	if (n == name1 || n == name2 || n == name3 || n == name4) {
		var ok = (i(name1) >= i(name2) + i(name3) + i(name4));
		if (!ok) {
			putInt(name2, '');
			putInt(name3, '');
			putInt(name4, '');
			alertElement(obj, message);
		}
	}
}

/*
 * Проверява стойностите на две клетки от формата, ако втората клетка има стойност, по-голяма от
 * стойността на първата клетка, се показва съобщение за грешка. Стойността на първата клетка се нулира.
 * Стойностите и на двете клетки трябва да са по-големи от нула.
 * @param obj Елемент от страницата, който се проверява.
 * @param name1 Име на първата клетка.
 * @param name2 Име на втората клетка.
 * @param message Съобщение за грешка, което да се покаже, ако не е изпълнено условието.
 */
function checkLessOrEqualNZ (obj, name1, name2, message) {
	var n = $(obj).attr('name');
	if (n == name1 || n == name2) {
		if (i(name1) > 0 && i(name2) > 0 && !(i(name1) <= i(name2))) {
			putInt(name1, '');
			alertElement(obj, message);
		}
	}
}

/**
 * Проверява дали стойността на първата клетка е по-малка или равна на сумата от стойностите на останалите две клетки от формуляра.
 * Ако това не е така, се показва съобщение за грешка и стойността на първата клетка се нулира.
 * @param obj Елемент от страницата, който се проверява.
 * @param name1 Име на първата клетка.
 * @param name2 Име на втората клетка.
 * @param name3 Име на третата клетка.
 * @param message Съобщение за грешка, което да се покаже, ако не е изпълнено условието.
 */
function checkLessOrEqual2 (obj, name1, name2, name3, message) {
	var n = $(obj).attr('name');
	if (n == name1 || n == name2 || n == name3) {
		var ok = (i(name1) <= i(name2) + i(name3));
		if (!ok) {
			putInt(name1, '');
			alertElement(obj, message);
		}
	}
}

// ————————————————————————————————————————————————————————————————————————————————————————————————————
//   ДРУГИ ФУНКЦИИ, ИЗПОЛЗВАНИ ОТ СИСТЕМАТА
// ————————————————————————————————————————————————————————————————————————————————————————————————————

/**
 * Определя ЕКН на управляващата организация на зададената.
 * @param ekn ЕКН на кооперативната организация.
 * @return ЕКН на управляващата организация на зададената.
 */
function getParentEkn (ekn) {
	var a = ekn.substring(0,2);
	var b = ekn.substring(2,5);
	var c = ekn.substring(5);
	return (c != '000' ? a + b + '000' : (b != '000' ? a + '000000' : (a != '99' ? '99000000' : '')));
}

/**
 * Променя статуса на CheckBox-овете на избраните организации.
 * @param obj Елемент, който е променен.
 * @param custom Флаг, показващ дали е избран елемент от списъка организации.
 */
function reportEknCheckboxClick (obj, custom) {
	if (custom) {
		$('#org1').attr('checked', '');
		$('#org2').attr('checked', '');
		$('#org3').attr('checked', '');
		$('#org4').attr('checked', '');
		$('#org5').attr('checked', '');
		$('#org6').attr('checked', '');
		var chk = $(obj).attr('checked');
		$('#custom_ekns').css('display', (chk ? 'block' : 'none'));
	} else {
		$('#org0').attr('checked', '');
		$('#custom_ekns').css('display', 'none');
	}
}

/**
 * Обновява броя избрани кооперативни организации от списъка.
 */
function reportTreeUpdate () {
	var cnt = 0;
	$('#custom_ekns input[@type=checkbox]').each(function (i) {
		if ($(this).attr('checked')) cnt++;
	})
	$('#selected_cnt').empty();
	if (cnt > 0) {
		$('#selected_cnt').html('(' + cnt + ')');
	}
}

/**
 * Демаркира всички избрани организации от списъка.
 */
function reportTreeClear () {
	$('#custom_ekns input[@type=checkbox]').attr('checked', '');
	$('#select_id').val('');
	reportTreeUpdate();
	return false;
}

/**
 * Извиква се за отваряне/затваряне на клон от дървото на организациите.
 * @param name Идентификатор на елемента, който да се покаже или скрие.
 * @param img Идентификатор на картинката, която показва дали в момента клона е отворен или затворен.
 */
function reportTreeIconClick (name, img) {
	var e = $('#' + name).get(0);
	if (e) {
		var visible = ($(e).css('display') != 'none');
		$(e).css('display', (visible ? 'none' : 'block'));
		var i = $('#' + img).get(0);
		if (i) {
			$(i).attr('src', (visible ? 'images/icons/tree_closed.png' : 'images/icons/tree_opened.png'));
		}
	}
	return false;
}

/**
 * Извиква се за маркиране/демаркиране на всички подчинени елементи в зададения клон.
 * @param type Вид на организациите, които се маркират: 1-организации, 2-търговски дружества.
 * @param ekn ЕКН на организацията, чиито подчинени организации се маркират/демаркират.
 * @param checked Флаг, показващ дали да се маркират всички елементи.
 */
function reportTreeCheckboxClick (type, ekn, checked) {
	$('input[@type=checkbox]').each(function (i) {
		var thisekn = getParentEkn(this.id.substring(3));
		var thistype = (this.id.substring(8) == '000') ? 1 : 2;
		if (thisekn == ekn && thistype == type) {
			this.checked = checked;
		}
	});
	reportTreeUpdate();
	return false;
}

function reportTreeEknClick () {
	$('#select_id').val('');
	//alert('Value: ' + $('#select_id').val());
	reportTreeUpdate();
}

/**
 * Показва или скрива списъка с организациите, включени в справката.
 * @param vis Флаг, показващ дали списъка да се покаже или скрие.
 */
function showOrgList (vis) {
	if (vis) {
		$('#org_list_on').css("display", "none");
		$('#org_list').css("display", "block");
	} else {
		$('#org_list_on').css("display", "block");
		$('#org_list').css("display", "none");
	}
	return false;
}

/**
 * Показва или скрива допълнителните филтри според избраната специфична справка.
 * @param type_id Код на избраната специфична справка.
 */
function reportSpecificChange (type_id) {
	$('#filter_groups').css("display", ((type_id == 2 || type_id == 4
		|| type_id == 6 || type_id == 8 || type_id == 10 || type_id == 12
		|| type_id == 14 || type_id == 16 || type_id == 17 || type_id == 18) ? "block" : "none"));
}
