(function($) {

	function catalog_treeview_load(url, $root, $container, div_id, id, lnk, lnk_target)
	{
		var $loading = $('<li><span class="loading">Идет загрузка..</span></li>').appendTo($root);
		$container.treeview({ add: $loading });

		$.ajax({
			url: url,
			timeout: 5000,
			success: function(content) {
				// get branches starting from div_id
				var $branches = $(content);
				if (div_id > 0 && id > 0) $branches = $branches.find("li[div_id=" + div_id + "] ul:first");
				// prepend and add loaded branches
				$root.html($branches.find("li").each(function() {
					$(this).find("a:first")
						//.wrap('<span class="folder"></span>')
						.wrap($(document.createElement("span"))
							.addClass($(this).attr("div_id") == id ? "selected" : "")
							.addClass("folder"))
						.attr({href: lnk.replace(/\{id\}/i, $(this).attr("div_id")), target: lnk_target});

					//У кого нет детей, тем устанавливаем класс file
					//$(this).not(":has(>ul)").find("span:first").replaceClass("folder", "file");

				}).end().html());

				$container.treeview({ add: $root }); // register loaded branches

				// correct links
				$root.find("span").each(function(){
					$(this).click(function() {
						$container.find("span.selected").removeClass("selected");
						$(this).addClass("selected");
						return true;
					})
				})

				// correct position for IE (sucks!!!)
				$root.find("li").each(function() {
					$(this).prepend($(this).find("ul").length == 0 ? '<div class="hitarea" style="visibility:hidden;" />' : "");
				});

				// open parents branches of current id
				if (id > 0) {
					$container.find("li[div_id=" + id + "]").parents("li").each(function() {
						$(this).find("div:eq(0)").click();
					});
				}

				// open child brach if exists
				$container.find("li[div_id=" + id + "]").find("div:first").click();
			},
				error: function(xhr,err) {
				  if (xhr.responseText.length > 0)
				  {
						alert("Ошибка чтения узла дерева!\n" + "readyState: " + xhr.readyState + "\nstatus: " + xhr.status);
						//alert("responseText: " + xhr.responseText);
				  }
				}
		});
	}


	function catalog_treeview_init($container, div_id, id, urls) {
		urls = $.extend({
			ent: "",
			lnk_url: "?div_id={id}",
			lnk_target: "_self",
			id_url:  "/adm/catalog/treexhtml.asp?id={id}",			// список детей по ID родителя
			sid_url: "/adm/catalog/treexhtml.asp?t=2&id={id}"}	// дерево до выбранного элемента
			, urls);

		$container.treeview({
			collapsed: true,
			unique: true,
			toggle: function() {
				var $ul = $("ul", this);

				$(this).find("span:first").toggleClass("open");

				if ($ul.length == 1 && $ul.html() == "") {
					var url = urls.id_url.replace(/\{id\}/i, $(this).attr("div_id"));
					if (urls.ent.length > 0) url += "&e=" + urls.ent;	// если задана сущность, то передаем её в строку запроса
					catalog_treeview_load(url, $ul, $container, div_id, 0, urls.lnk_url, urls.lnk_target);
				}
			},
			toggleoff: function() {$(this).parent().find("span:first").removeClass("open");} // чтобы работал unique: true
		});


		if (id == div_id) id = 0; // ID текущего раздела не может быть равно ID корневого раздела

		var url;

		if (id > 0)
			url = urls.sid_url.replace(/\{id\}/i, id)
		else
			url = urls.id_url.replace(/\{id\}/i, div_id);

		if (urls.ent.length > 0) url += "&e=" + urls.ent;	// если задана сущность, то передаем её в строку запроса

		catalog_treeview_load(url, $container, $container, div_id, id, urls.lnk_url, urls.lnk_target); // Начальная загрузка дерева

		return $container;
	}


	$.fn.ctreeview = function(div_id, id, urls) {
		return catalog_treeview_init($(this), div_id, id, urls);
	};

})(jQuery);
