﻿/// <reference name="MicrosoftAjax.js"/>
Type.registerNamespace("Finatica");
Type.registerNamespace("Finatica.Controls");
Type.registerNamespace("Finatica.Controls.MultiDictionary");
Type.registerNamespace("Finatica.Controls.MD");

Finatica.Controls.MultiDictionary = function(element) {
	Finatica.Controls.MultiDictionary.initializeBase(this, [element]);
	this.selectedValues = null;
	this.treeViews = null;
	this.treeViewContainers = null;
	this.controlID = '';
	this.popupDivID = '';
	this.hiddenFieldID = '';
	this.listBoxID = '';
	this.btnClearAllID = '';
	this.currentDictionary = '';
	this.reqDictionaries = 0;
	this.dictionaries = { Sectors2: 2, Regions: 4, Goods: 8 };
	this.searchTextBoxID = '';
	this.innerRadTabsID = '';
	this.pageViewID = '';
	this.pagerClientID = '';
	this.innerSplitterID = '';
	this.nodesToExpand = null;
	this.recreatePager = true;
	this.history = new Object();
	this.currentHistoryPosition = new Object();
	this.filteredItems = new Object();
	this.filterState = new Object();
	this.keywords = new Object();
	this.searchResultsPage = new Object();
	this.argument = null;
	this.sortHelp = new Object();
	this.isFilter = false;
	this.HDserviceProxy = null;
	this.saveIDInResult = false;
	this.needFiltering = true;
	this.selectOnlyIcons = false;
}

Finatica.Controls.MultiDictionary.prototype = {
	initialize: function () {
		Finatica.Controls.MultiDictionary.callBaseMethod(this, 'initialize');

		if (this.treeViews != null)
			this.treeViews = JSON.parse(this.treeViews);

		if (this.argument != null)
			this.argument = JSON.parse(this.argument);

		if (this.treeViewContainers != null)
			this.treeViewContainers = JSON.parse(this.treeViewContainers);

		if (this.sortHelp != null)
			this.sortHelp = JSON.parse(this.sortHelp);

		$("div#" + this.controlID).find(" a.service ").bind("click", { eventArgs: this }, this.openPopup);
		$("div#" + this.popupDivID).find(" a.window-button").bind("click", { eventArgs: this }, this.closePopup);
		$("div#" + this.popupDivID).find("input[type='button'].close-button ").bind("click", { eventArgs: this }, this.closePopup);
		$("div#" + this.popupDivID + "> div.d-header > ul.tabs > li > a").bind("click", { eventArgs: this }, this.showTreeView);
		$("div#" + this.popupDivID).find("input[type='button'].ok-button ").bind("click", { eventArgs: this }, this.saveValues);
		$("#" + this.btnClearAllID).bind('click', { sender: this }, this.clearSelection);
		$("#" + this.popupDivID).find("td.d-search > input[type=button]").bind('click', { sender: this }, this.search);
		$("#" + this.popupDivID).find("div.arrows > a.hdBackArrow").bind('click', { sender: this }, this.historyStepBack);
		$("#" + this.popupDivID).find("div.arrows > a.hdForwardArrow").bind('click', { sender: this }, this.historyStepForward);
		$("#" + this.popupDivID).find("input[type=button]#btnFilter").bind('click', { eventArgs: this }, this.filter);
		$("#" + this.popupDivID + " .sectors-path-ul a").bind('click', { eventArgs: this }, this.clickSectorPath);
		$("#" + this.popupDivID + " .showSectorIcons").bind('click', { eventArgs: this }, this.clickShowSectorIcons);

		this.riseLoaded();
	},

	clear: function () {
		$('#' + this.hiddenFieldID).val('{}');
		$("#" + this.controlID + " > ul > li > a").parent().find("ul").html('');
		for (var dict in this.treeViews) {
			$find(this.treeViews[dict]).get_nodes().clear();
		}
	},

	setSingleValue: function (dictionary, itemId) {
		itemId = itemId.match(/(?:\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(?:\}){0,1}/)
		if (itemId == null)
			return;
		itemId = itemId[0];

		$('#' + this.hiddenFieldID).val('{"' + dictionary + '":[{"Id":"' + itemId + '","Order":1}]}');
		if (this.HDserviceProxy == undefined || this.HDserviceProxy == null)
			this.HDserviceProxy = new Finatica.WebServices.HDictionaryService();
		var uc = Array(this, dictionary);
		this.HDserviceProxy.GetNames(itemId, 'ru-RU', dictionary, this.onGetNamesSucceeded, this.onGetNamesFailed, uc);
	},

	setSelectedValues: function (dictionary, items) {
		$('#' + this.hiddenFieldID).val('{"' + dictionary + '":' + items + '}');
		var ids = '';
		var i = 0;
		var jitems = JSON.parse(items)
		for (i = 0; i < jitems.length; i++) {
			ids += jitems[i].Id + ',';
		}

		if (ids.length > 0)
			ids = ids.substring(0, ids.length - 1);

		if (this.HDserviceProxy == undefined || this.HDserviceProxy == null)
			this.HDserviceProxy = new Finatica.WebServices.HDictionaryService();
		var uc = Array(this, dictionary);
		this.HDserviceProxy.GetNames(ids, 'ru-RU', dictionary, this.onGetNamesSucceeded, this.onGetNamesFailed, uc);
	},

	onGetNamesSucceeded: function (result, userContext, methodName) {
		var md = userContext[0];
		var dictionary = userContext[1];
		for (var dict in md.treeViews) {
			$find(md.treeViews[dict]).get_nodes().clear();
		}
		$("#" + md.controlID + " > ul > li > a").parent().find("ul").html('');
		var innerHtml = "";

		var sres = result.split(';');
		for (var i = 0; i < sres.length; i++)
			innerHtml += "<li>" + sres[i].trim() + "</li>";
		$("#" + md.controlID + " > ul > li > a.md-" + dictionary).parent().find("ul").html(innerHtml);
	},

	onGetNamesFailed: function (result, userContext, methodName) {
		$find(Finatica.Common.NotificatorID).addMessage('error', 'Ошибка поиска');
	},

	getSelectedValues: function () {
		return JSON.parse($('#' + this.hiddenFieldID).val());
	},

	dispose: function () {
		Finatica.Controls.MultiDictionary.callBaseMethod(this, 'dispose');
	},

	disableFilter: function (dictName) {

		var changeButtons = false;
		if (dictName == undefined) {
			dictName = this.currentDictionary;
			changeButtons = true;
		}

		this.filteredItems[dictName] = null;
		this.filterState[dictName] = '';
		if (changeButtons == true) {
			var text = this.currentDictionary == "Goods" ? "Отфильтровать по выбраным отраслям" : "Отфильтровать по выбраным товарам";
			$("#" + this.popupDivID).find("input[type=button]#btnFilter").attr("title", text);
			$("#" + this.popupDivID).find("input[type=button]#btnFilter").val("Отфильтровать");
		}
		var nodes = $find(this.treeViews[dictName]).get_nodes();
		this.enableNodes(nodes);
	},

	enableNodes: function (collection) {
		for (var i = 0; i < collection.get_count(); i++) {
			var node = collection.getNode(i);
			node.enable();
			this.enableNodes(node.get_nodes());
		}
	},

	filter: function (event) {
		var control = event.data.eventArgs;
		if (control.filterState[control.currentDictionary] != undefined && control.filterState[control.currentDictionary] != null && control.filterState[control.currentDictionary] == 'filtered') {
			control.disableFilter();
			return;
		}
		if ((control.currentDictionary == "Goods" && (control.selectedValues["Sectors2"] == undefined || control.selectedValues["Sectors2"] == null || control.selectedValues["Sectors2"].length == 0)) ||
				(control.currentDictionary == "Sectors2" && (control.selectedValues["Goods"] == undefined || control.selectedValues["Goods"] == null || control.selectedValues["Goods"].length == 0)))
			return;
		var proxy = new Finatica.WebServices.HDictionaryService();

		var context = new Array();
		context[0] = control;
		context[1] = event.data.node;

		proxy.Filter(control.currentDictionary, JSON.stringify(control.selectedValues), control.filterSuccess, control.filterFail, context);
	},

	filterSuccess: function (result, userContext, methodName) {
		if (result.length == 0)
			return;
		var treeViewNodes = $find(userContext[0].treeViews[userContext[0].currentDictionary]).get_nodes();
		var items = JSON.parse(result);
		if (items.length > 0) {
			userContext[0].filteredItems[userContext[0].currentDictionary] = items;
			userContext[0].filterNodes(treeViewNodes);
			userContext[0].filterState[userContext[0].currentDictionary] = 'filtered';
			$("#" + userContext[0].popupDivID).find("input[type=button]#btnFilter").val('Отменить фильтр');
			if (userContext[1] != undefined && userContext[1] != null)
				$(userContext[1].get_element()).find("div.rtMid").addClass("rtSelected");
		}
	},

	disableAllExceptOneNode: function (node, nodesCollection) {
		if (nodesCollection == null || node == null)
			return;

		for (var i = 0; i < nodesCollection.get_count(); i++) {
			var collectionNode = nodesCollection.getNode(i);
			this.disableAllExceptOneNode(node, collectionNode.get_nodes());
			if (node.get_value() != collectionNode.get_value())
				collectionNode.disable();
		}
	},

	filterNodes: function (nodesCollection) {
		if (nodesCollection == null)
			return;

		if (this.filteredItems[this.currentDictionary] != undefined && this.filteredItems[this.currentDictionary] != null)
			for (var i = 0; i < nodesCollection.get_count(); i++) {
				var node = nodesCollection.getNode(i);
				this.filterNodes(node.get_nodes());
				if (this.filteredItems[this.currentDictionary].indexOf(node.get_value()) == -1)
					node.disable();
			}
	},

	filterFail: function () { alert('error'); },

	openPopup: function (event) {
		var eventArgs = event.data.eventArgs;
		if ($("#" + eventArgs.hiddenFieldID).val() != null && $("#" + eventArgs.hiddenFieldID).val().length > 0)
			eventArgs.selectedValues = JSON.parse($("#" + eventArgs.hiddenFieldID).val());
		eventArgs.riseOpening();
		var dictionaryName = $(event.target).children("input[type=hidden]").val();
		$("div#" + eventArgs.popupDivID + "> div.d-header > ul.tabs > li > a > input[type='hidden'][value='" + dictionaryName + "']").parent().trigger('click');
		$(".overlayShadow").show();
		$('#' + eventArgs.popupDivID).show();
	},

	closePopup: function (event) {
		var eventArgs = event.data.eventArgs;
		eventArgs.riseClosing();
		for (var dict in eventArgs.treeViews) {
			$find(eventArgs.treeViews[dict]).get_nodes().clear();
		}
		$('#' + eventArgs.popupDivID).hide();
		for (dict in eventArgs.treeViewContainers) {
			$('#' + eventArgs.treeViewContainers[dict]).hide();
		}
		$(".overlayShadow").hide();
		eventArgs.riseClosed(false);
	},

	showTreeView: function (event) {
		var eventArgs = event.data.eventArgs;
		var dictionary = $(event.target).children("input[type='hidden']").val();
		$("div#" + eventArgs.popupDivID + "> div.d-header > ul.tabs > li > a.active").removeClass('active');
		for (dict in eventArgs.treeViewContainers) {
			$('#' + eventArgs.treeViewContainers[dict]).hide();
		}
		$('#' + eventArgs.treeViewContainers[dictionary]).show();
		$(event.target).addClass('active');

		var treeView = $find(eventArgs.treeViews[dictionary]);
		var treeViewNodes = treeView.get_nodes();

		if (treeViewNodes.get_count() == 0) {
			$(".overlayLoading").show();

			var restrict = treeView.get_attributes().getAttribute('restrict');
			var additionalArgument = treeView.get_attributes().getAttribute('AddArg');
			var proxy = new Finatica.WebServices.HDictionaryService();
			proxy.GetMDictionaryNodes(dictionary, JSON.stringify(eventArgs.selectedValues), restrict, additionalArgument, eventArgs.showTreeSuccess, eventArgs.showTreeFail, new Array(eventArgs, dictionary));
		}
		else {
			eventArgs.fillListBox(eventArgs, dictionary);
			eventArgs.currentDictionary = dictionary;
			eventArgs.clearOnShowTree();

			if ((dictionary == "Sectors2" || dictionary == "Goods") && (((eventArgs.selectedValues[dictionary] == undefined ||
				eventArgs.selectedValues[dictionary] == null ||
				eventArgs.selectedValues[dictionary].length == 0) || eventArgs.selectOnlyIcons == true)
				 && eventArgs.getSectorIconsVisibleCookie() == true)) {
				eventArgs.createSectorIcons(null);
			}
			else {
				eventArgs.hideSectorIcons();
			}


			if (eventArgs.keywords[eventArgs.currentDictionary] != undefined && eventArgs.keywords[eventArgs.currentDictionary] != null
				&& eventArgs.keywords[eventArgs.currentDictionary].length > 0) {
				$find(eventArgs.searchTextBoxID).set_value(eventArgs.keywords[eventArgs.currentDictionary]);
				eventArgs.recreatePager = true;
				eventArgs.performSearch();
			}
			$(".overlayLoading").hide();
		}
	},

	showIconsVisibleButton: function () {
		if (this.selectOnlyIcons == false)
			$(".showSectorIcons").show();
		if ($(".sector-selector").is(":hidden") == false) {
			$(".showSectorIcons").val("Классический");
		}
		else {
			$(".showSectorIcons").val("C иконками");
		}
	},

	createSectorIcons: function (id) {
		var proxy = new Finatica.WebServices.HDictionaryService();
		if (id != null) {
			$(".overlayLoading").show();

			var node = $find(this.treeViews[this.currentDictionary]).findNodeByValue(id);
			if (node != null && node.get_expandMode() == 3)
				node.expand();
			node.select(); node.scrollIntoView();
			$(".overlayLoading").hide();

			$("#" + this.popupDivID + " .sectors-path-ul").show();
		}
		else {
			$("#" + this.popupDivID + " .sectors-path-ul").hide();
		}
		proxy.GetIconsList(id,this.currentDictionary, this.createSectorIconsSuccess, this.createSectorIconsFail, this);
	},

	hideSectorIcons: function () {
		$(".d-buttons > input[type=button]").show();
		if ($("#" + this.popupDivID + " .sectors-path-ul li").length > 1)
			$("#" + this.popupDivID + " .sectors-path-ul li:last-child").remove();
		$("#" + this.popupDivID + " .sectors-path-ul").hide();
		$(".sector-selector").hide();
		$(".showSectorIcons").hide();
	},

	createSectorIconsSuccess: function (result, userContext, methodName) {
		if (result != null && result != "") {
			$("#" + userContext.popupDivID + " .sectors-main-ul").html(result);
			$("#" + userContext.popupDivID + " .sectors-main-ul a").bind('click', { eventArgs: userContext }, userContext.clickSectorIcon);
			$("#" + userContext.popupDivID + " .sectors-main-ul li").mouseover(userContext.sectorIconOver).mouseout(userContext.sectorIconOut);
			$(".d-buttons > input[type=button]").hide();

			if (userContext.selectOnlyIcons == false)
				$(".showSectorIcons").show();
			else $(".showSectorIcons").hide();
			$(".sector-selector").show();
			$(".overlayLoading").hide();

		}
		else {
			userContext.hideSectorIcons();
		}
		userContext.showIconsVisibleButton();
	},

	sectorIconOver: function () {
		$(this).find('img:first').hide();
		$(this).find('img:last').show();
	},

	sectorIconOut: function () {
		$(this).find('img:first').show();
		$(this).find('img:last').hide();
	},

	clickSectorIcon: function (event) {
		var eventArgs = event.data.eventArgs;
		var id = $(this).parent().find("input[type=hidden]").val();
		if ($("#" + eventArgs.popupDivID + " .sectors-path-ul li").length < 2) {
			$("#" + eventArgs.popupDivID + " .sectors-path-ul").append("<li>" + $(this).parent().html() + "</li>");
			$("#" + eventArgs.popupDivID + " .sectors-path-ul a:last-child").bind('click', { eventArgs: eventArgs }, eventArgs.clickSectorPath);
		}
		else if (eventArgs.selectOnlyIcons == true) {
			var node = $find(eventArgs.treeViews[eventArgs.currentDictionary]).findNodeByValue(id);
			node.check();
			eventArgs.selectedValues[eventArgs.currentDictionary] = new Array();
			eventArgs.addSelectedValue(node);
			eventArgs.saveValues(event);
			eventArgs.hideSectorIcons();
			return;
		}
		eventArgs.createSectorIcons(id);
	},

	clickShowSectorIcons: function (event) {
		var eventArgs = event.data.eventArgs;
		eventArgs.setSectorIconsVisibleCookie($("#" + eventArgs.popupDivID + " .sector-selector").is(":hidden"));
		if (eventArgs.getSectorIconsVisibleCookie() == true) {
			eventArgs.createSectorIcons(null);
		}
		else {
			eventArgs.hideSectorIcons();
		}
		eventArgs.showIconsVisibleButton();
	},

	setSectorIconsVisibleCookie: function (value) {
		$.cookie('sectorIconsVisible', value);
	},

	getSectorIconsVisibleCookie: function () {
		return $.cookie('sectorIconsVisible') == undefined || $.cookie('sectorIconsVisible') == null || $.cookie('sectorIconsVisible') == 'true';
	},

	clickSectorPath: function (event) {
		var eventArgs = event.data.eventArgs;
		var id = $(this).parent().find("input[type=hidden]").val();
		$(this).parent().nextAll().remove();
		eventArgs.createSectorIcons(id == "null" ? null : id);
	},

	clearOnShowTree: function () {
		$find(this.searchTextBoxID).set_value('');
		var pageViews = $find(this.pageViewID).get_pageViews();
		var pageViewDiv = pageViews.getPageView(0).get_element().id;
		if ($("#" + pageViewDiv + " > div.d-content > ol").length == 0) {
			$("#" + pageViewDiv + " > div.d-content").html('');
		}
		pageViewDiv = pageViews.getPageView(1).get_element().id;
		$("#" + pageViewDiv + " > div.d-content").html('');
		$find(this.pagerClientID).clear();

		var tabs = $find(this.innerRadTabsID);

		if (this.currentDictionary == "Regions") {
			$("#" + this.popupDivID).find("div.arrows").hide();
			tabs.get_tabs().getTab(0).hide();
			$("#" + this.popupDivID).find("input[type=button]#btnFilter").hide();
		}
		else {
			$("#" + this.popupDivID).find("div.arrows").show();
			tabs.get_tabs().getTab(0).show();

			if (this.treeViews["Sectors2"] == undefined || this.treeViews["Goods"] == undefined || (this.currentDictionary == "Sectors2" && this.getSectorIconsVisibleCookie() == true)) {
				$("#" + this.popupDivID).find("input[type=button]#btnFilter").hide();
			}
			else {
				$("#" + this.popupDivID).find("input[type=button]#btnFilter").show();
				var text;

				if (this.filterState[this.currentDictionary] == 'filtered') {
					text = "Отменить фильтр";
				}
				else {
					text = this.currentDictionary == "Goods" ? "Отфильтровать по выбраным отраслям" : "Отфильтровать по выбраным товарам";
				}
				$("#" + this.popupDivID).find("input[type=button]#btnFilter").attr('title', text);
				$("#" + this.popupDivID).find("input[type=button]#btnFilter").val(this.filterState[this.currentDictionary] == 'filtered' ? "Отменить фильтр" : "Отфильтровать");
			}
		}
	},

	showTreeSuccess: function (result, userContext, methodName) {
		var items = JSON.parse(result);
		var control = userContext[0];
		var currDictionary = userContext[1];
		var treeViewNodes = $find(control.treeViews[currDictionary]).get_nodes();
		control.currentDictionary = currDictionary;
		control.clearOnShowTree();
		control.createTreeNodes(treeViewNodes, items, control);
		$(".overlayLoading").hide(); ;
		control.fillListBox(control, currDictionary);

		if (control.argument[control.currentDictionary] == "checkSingle" && $find(control.treeViews[currDictionary]).get_checkedNodes().length > 0) {
			control.disableAllExceptOneNode($find(control.treeViews[currDictionary]).get_checkedNodes()[0], $find(control.treeViews[currDictionary]).get_nodes());
		}

		if (control.isFilter == true) {
			$(".rlbButton").hide();
		}
		else {
			$("p.sorthelp").text(control.sortHelp[control.currentDictionary]);
			$(".rlbButton").show();
		}

		if ((currDictionary == "Sectors2" || currDictionary == "Goods") && (((control.selectedValues[currDictionary] == undefined ||
				control.selectedValues[currDictionary] == null ||
				control.selectedValues[currDictionary].length == 0) || control.selectOnlyIcons == true)
				 && control.getSectorIconsVisibleCookie() == true)) {
			control.createSectorIcons(null);
		}
		else {
			control.hideSectorIcons();
		}

		control.riseOpened();
	},

	showTreeFail: function (error, userContext) {
		$(".overlayLoading").hide();
		alert(error.get_message());
	},

	saveValues: function (event) {
		event.data.eventArgs.fillULs();
		event.data.eventArgs.riseClosing();
		$('#' + event.data.eventArgs.popupDivID).hide();
		$(".overlayShadow").hide();
		$('#' + event.data.eventArgs.hiddenFieldID).val(JSON.stringify(event.data.eventArgs.selectedValues));
		event.data.eventArgs.isValid();
		event.data.eventArgs.riseClosed(true);
	},

	createTreeNodes: function (parenCollection, items, eventArgs) {
		for (var i = 0; i < items.length; i++) {
			var newNode = new Telerik.Web.UI.RadTreeNode();
			newNode.set_text(items[i].text);
			newNode.set_value(items[i].value);
			newNode.set_expandMode(items[i].expandMode);
			newNode.set_expanded(items[i].expanded);
			newNode.set_checkable(items[i].checkable);
			newNode.set_checked(items[i].checked);
			if (items[i].items != undefined && items[i].items != null && items[i].items.length > 0)
				eventArgs.createTreeNodes(newNode.get_nodes(), items[i].items, eventArgs);
			parenCollection.add(newNode);
		}
	},

	fillListBox: function (sender, dictionary) {
		var listBox = $find(sender.listBoxID);
		var listBoxItems = listBox.get_items();
		listBoxItems.clear();
		currentDictionary = sender.selectedValues[dictionary];
		if (currentDictionary != null) {
			var treeView = $find(sender.treeViews[dictionary]);
			currentDictionary.sort(sender.sortSelectedValues);
			for (var i = 0; i < currentDictionary.length; i++) {
				if (currentDictionary[i].Order != null) {
					var item = new Telerik.Web.UI.RadListBoxItem();
					var node = treeView.findNodeByValue(currentDictionary[i].Id);
					item.set_text(node != null ? node.get_text() : "Ошибка");
					item.set_value(currentDictionary[i].Id);
					listBoxItems.insert(currentDictionary[i].Order - 1, item);
				}
			}
		}
	},

	sortSelectedValues: function (a, b) {
		return a.Order - b.Order;
	},

	fillULs: function () {
		for (dictionary in this.selectedValues) {
			if ($find(this.treeViews[dictionary]).get_nodes().get_count() == 0)
				continue;
			this.fillListBox(this, dictionary);
			var items = $find(this.listBoxID).get_items();
			var innerHtml = '';
			for (var i = 0; i < items.get_count(); i++) {
				var item = items.getItem(i);
				innerHtml += "<li>" + item.get_text();
				if (this.saveIDInResult == true) innerHtml += "<input type='hidden' value='" + item.get_value() + "' />";
				innerHtml += "</li>";
			}
			$("#" + this.controlID + " > ul > li > a.md-" + dictionary).parent().find("ul").html(innerHtml);
		}
	},

	addSelectedValue: function (node, maxOrder) {
		if (this.selectedValues[this.currentDictionary] == null) {
			this.selectedValues[this.currentDictionary] = new Array();
		}

		if (this.currentDictionary == "Sectors2" && this.filterState["Goods"] == 'filtered')
			this.disableFilter("Goods");
		else if (this.currentDictionary == "Goods" && this.filterState["Sectors2"] == 'filtered')
			this.disableFilter("Sectors2");

		var nodeValue = node.get_value();
		var searchMaxOrder = false;
		if (maxOrder == null || maxOrder == undefined);
		{
			maxOrder = 0;
			searchMaxOrder = true;
		}
		var alreadyAddedIndex = null;

		for (var i = 0; i < this.selectedValues[this.currentDictionary].length; i++) {
			if (this.selectedValues[this.currentDictionary][i].Id == nodeValue) {
				if (this.selectedValues[this.currentDictionary][i].Order == null && node.get_checkable() == true && node.get_checked() == true)
					alreadyAddedIndex = i;
				else
					return false;
			}
			if (node.get_checkable() == true && node.get_checked() && searchMaxOrder == true) {
				maxOrder = this.selectedValues[this.currentDictionary][i].Order != null
						&& this.selectedValues[this.currentDictionary][i].Order > maxOrder ?
						   this.selectedValues[this.currentDictionary][i].Order : maxOrder;
			}
		}

		//Вот эта хрень, расположенная ниже, нада, чтобы все работало при выделении нескольких нодов снизу
		if (alreadyAddedIndex != null && node.get_checkable() == true && node.get_checked() == true) {
			var newItem = new Telerik.Web.UI.RadListBoxItem();
			var lb = $find(this.listBoxID);
			if (lb.findItemByValue(nodeValue) != null)
				return false;
			newItem.set_value(nodeValue);
			newItem.set_text(node.get_text());
			lb.get_items().add(newItem);
			this.selectedValues[this.currentDictionary][alreadyAddedIndex].Order = maxOrder + 1;
			return false;
		}


		var newValue = new Object();
		newValue.Id = nodeValue;

		if (node.get_checkable() == true && node.get_checked() == true) {
			var newItem = new Telerik.Web.UI.RadListBoxItem();
			newItem.set_value(newValue.Id);
			newItem.set_text(node.get_text());
			$find(this.listBoxID).get_items().add(newItem);
			newValue.Order = maxOrder + 1;
		}
		else
			newValue.Order = null;

		var index = this.selectedValues[this.currentDictionary].push(newValue);
		var parent = node.get_parent();
		var restrict = node.get_treeView().get_attributes().getAttribute('restrict');
		if (parent != node.get_treeView() && restrict != undefined && restrict != true) {
			this.addSelectedValue(parent, maxOrder + 1);
		}
	},

	removeSelectedValue: function (node) {
		var dictionary = this.selectedValues[this.currentDictionary];
		if (dictionary == undefined || dictionary == null)
			return false;

		if (this.currentDictionary == "Sectors2" && this.filterState["Goods"] == 'filtered')
			this.disableFilter("Goods");
		else if (this.currentDictionary == "Goods" && this.filterState["Sectors2"] == 'filtered')
			this.disableFilter("Sectors2");

		var id = node.get_value();
		var elementIndex = null;
		var element = null;
		for (var i = 0; i < dictionary.length; i++) {
			if (dictionary[i].Id == id) {
				elementIndex = i;
				element = dictionary[i];
				break;
			}
		}
		if (element != null && elementIndex != null) {
			dictionary.splice(elementIndex, 1);
			if (element.Order != null) {
				for (var i = 0; i < dictionary.length; i++) {
					if (dictionary[i].Order > element.Order) { dictionary[i].Order -= 1; }
				}
			}
		}

		var listItem = $find(this.listBoxID).findItemByValue(id);
		if (listItem != null)
			var listItems = $find(this.listBoxID).get_items().remove(listItem);

		if (Finatica.Controls.MD.hasCheckedChildren(node) == false) {
			var parent = node.get_parent();
			var check_state;
			if (parent != null) {
				check_state = Finatica.Controls.MD.hasCheckedChildren(parent);
			}

			if (parent != null && parent != node.get_treeView() && parent.get_checkBoxElement() == null && check_state == false) {
				parent.set_checkable(true);
				parent.set_checked(check_state);
				parent.set_checkable(false);
				this.removeSelectedValue(parent);
			}
		}
		else {
			var childNodes = node.get_nodes();
			for (var i = 0; i < childNodes.get_count(); i++) {
				childNode = childNodes.getNode(i);
				if (childNode.get_checked() == true) {
					childNode.set_checked(false);
					this.removeSelectedValue(childNode);
				}
			}
		}
	},

	clearSelection: function (event) {
		var sender = event.data.sender;
		var dictionary = sender.currentDictionary;
		var checkedNodes = $find(sender.treeViews[dictionary]).get_checkedNodes();

		if (checkedNodes != null) {
			for (var i = 0; i < checkedNodes.length; i++) {
				if (checkedNodes[i].get_checkable() == false) {
					checkedNodes[i].set_checkable(true);
					checkedNodes[i].set_checked(false);
					checkedNodes[i].set_checkable(false);
				}
				else { checkedNodes[i].set_checked(false); }
			}
		}

		var listBox = $find(sender.listBoxID).get_items().clear();
		if (sender.argument[sender.currentDictionary] != undefined && sender.argument[sender.currentDictionary] == "checkSingle") {
			var nodes = $find(sender.treeViews[sender.currentDictionary]).get_nodes();
			sender.enableNodes(nodes);
		}
		sender.selectedValues[sender.currentDictionary] = new Array();
	},

	reoderValues: function (id, offset, oldItemOrder) {
		var dictionary = this.selectedValues[this.currentDictionary];
		if (dictionary == undefined || dictionary == null)
			return false;

		for (var i = 0; i < dictionary.length; i++) {
			if (dictionary[i].Id == id) {
				dictionary[i].Order += offset;
			}
			if (dictionary[i].Order == (oldItemOrder + offset) && dictionary[i].Id != id)
				dictionary[i].Order -= offset
		}

	},

	isValid: function () {
		var result = true;
		if (this.selectedValues == null)
			this.selectedValues = JSON.parse($("#" + this.hiddenFieldID).val());

		for (dict in this.dictionaries)
			if ((this.reqDictionaries & this.dictionaries[dict]) != 0)
				if (this.selectedValues[dict] == null || this.selectedValues[dict].length == 0) {
					result = false;
					if ($("div#" + this.controlID + " > ul > li > a.md-" + dict).find("span.verificator").length == 0)
						$("div#" + this.controlID + " > ul > li > a.md-" + dict).parent().find("span.star").after('<span class="verificator error"><i></i><span>Необходимо выбрать элемент</span></span>');
				}
				else {
					$("div#" + this.controlID + " > ul > li > a.md-" + dict).parent().find('span.verificator').remove();
				}

		return result;
	},

	search: function (event) {
		var sender = event.data.sender;
		var query = $find(sender.searchTextBoxID).get_value();
		sender.keywords[sender.currentDictionary] = query;
		sender.recreatePager = true;
		sender.performSearch(0);
	},

	performSearch: function (page) {
		$(".overlayLoading").show();
		var proxy = new Finatica.WebServices.HDictionaryService();
		var searchPage;
		if (page == undefined || page == null)
			searchPage = this.searchResultsPage[this.currentDictionary] != null ? this.searchResultsPage[this.currentDictionary] : 0;
		else
			searchPage = page;

		this.searchResultsPage[this.currentDictionary] = searchPage;
		var argument = this.argument[this.currentDictionary] != undefined && this.argument[this.currentDictionary] != null ? this.argument[this.currentDictionary] : "";

		proxy.Search(this.keywords[this.currentDictionary], searchPage, this.currentDictionary, this.controlID, null, this.searchSuccess, this.searchFail, this);
		return false;
	},

	searchSuccess: function (result, userContext, methodName) {
		if (methodName == "Search") {
			if (result.length > 0) {
				$find(userContext.innerRadTabsID).get_tabs().getTab(1).set_selected(true);
				var pageViewDiv = $find(userContext.pageViewID).get_selectedPageView().get_element().id;

				$("#" + pageViewDiv.toString() + " > div.d-content").html(result[0]);

				if (userContext.recreatePager == true) {
					var pager = $find(userContext.pagerClientID);
					pager.set_pagesCount(Math.ceil(result[1] / 20));
					pager.createPager();
				}
				$("#" + userContext.popupDivID + " > table > tr:nth-child(1)").scrollTop(0);
				$("#" + userContext.popupDivID + " > table > tr:nth-child(1)").scrollLeft(0);
			}
		}
		if (methodName == "GetElementDescriptionBySID" || methodName == "GetElementDescriptionByGuid") {
			var control = userContext[0];
			if (methodName == "GetElementDescriptionBySID")
				if (control.filterState[control.currentDictionary] == 'filtered') {
					control.needFiltering = true;
					control.disableFilter();
				}
				else
					control.needFiltering = false;

			if (result[0] != null && control.currentDictionary != "Regions") {
				$find(control.innerRadTabsID).get_tabs().getTab(0).set_selected(true);
				var pageViewDiv = $find(control.pageViewID).get_selectedPageView().get_element().id;
				$("#" + pageViewDiv.toString() + " > div.d-content").html(result[0]);
				$("#" + userContext.popupDivID + " > table > tr:nth-child(1)").scrollTop(0);
				$("#" + userContext.popupDivID + " > table > tr:nth-child(1)").scrollLeft(0);
			}
			if (result.length > 1) {
				var treeView = $find(control.treeViews[control.currentDictionary]);
				while (result.length > 1) {
					var node = treeView.findNodeByValue(result.pop());
					if (node != null)
						if (result.length != 1) {
							if (node.get_nodes().get_count() == 0) {
								control.nodesToExpand = result.slice(1);
								if (node.get_expandMode() == 3)
									node.expand();
								else {
									$(".overlayLoading").hide();
								}
								break;
							}
							node.expand();
						}
						else { node.select(); node.scrollIntoView(); $(".overlayLoading").hide(); }
				}
			}
			if (userContext[1] != null) control.historySaveStep(userContext[1]);
		}
		$(".overlayLoading").hide();
		return false;
	},


	historyStepForward: function (event) {
		var control = event.data.sender;
		if (control.currentHistoryPosition[control.currentDictionary] == control.history[control.currentDictionary].length - 1)
			return false;
		control.currentHistoryPosition[control.currentDictionary] += 1;
		control.showCurrentHistoryItem();
		control.disableArrows();
		return false;
	},

	historyStepBack: function (event) {
		var control = event.data.sender;
		if (control.currentHistoryPosition[control.currentDictionary] < 1)
			return false;
		control.currentHistoryPosition[control.currentDictionary] -= 1;
		control.showCurrentHistoryItem();
		control.disableArrows();
		return false;
	},

	showCurrentHistoryItem: function () {
		var currentHistoryItem = this.history[this.currentDictionary][this.currentHistoryPosition[this.currentDictionary]];
		if (currentHistoryItem.toString().length < 5)
			Finatica.Controls.MD.ShowDictElementInfo(currentHistoryItem, this.controlID);
		else {
			var proxy = new Finatica.WebServices.HDictionaryService();
			proxy.GetElementDescriptionByGuid(currentHistoryItem, this.currentDictionary, this.controlID, this.searchSuccess, this.searchFail, [this, null]);
		}
		return false;
	},

	historySaveStep: function (sid) {
		if (this.currentHistoryPosition[this.currentDictionary] == undefined || this.currentHistoryPosition[this.currentDictionary] == null)
			this.currentHistoryPosition[this.currentDictionary] = -1;

		if (this.history[this.currentDictionary] == undefined || this.history[this.currentDictionary] == null)
			this.history[this.currentDictionary] = new Array();

		if (this.currentHistoryPosition[this.currentDictionary] < this.history[this.currentDictionary].length - 1) {
			this.history[this.currentDictionary].length = this.currentHistoryPosition[this.currentDictionary] + 1;
		}
		this.currentHistoryPosition[this.currentDictionary]++;
		this.history[this.currentDictionary][this.currentHistoryPosition[this.currentDictionary]] = sid;
		this.disableArrows();
	},

	disableArrows: function () {
		if (this.currentHistoryPosition[this.currentDictionary] > 0) {
			$("#" + this.popupDivID).find("div.arrows > a.hdBackArrow").removeClass('a-disabled');

		}
		else {
			$("#" + this.popupDivID).find("div.arrows > a.hdBackArrow").addClass('a-disabled');

		}

		if (this.currentHistoryPosition[this.currentDictionary] == this.history[this.currentDictionary].length - 1) {
			$("#" + this.popupDivID).find("div.arrows > a.hdForwardArrow").addClass('a-disabled');

		}
		else {
			$("#" + this.popupDivID).find("div.arrows > a.hdForwardArrow").removeClass('a-disabled');
		}
	},

	searchFail: function (error, userContext) {
		$(".overlayLoading").hide()
	},

	riseLoaded: function () {
		var handler = this.get_events().getHandler('loaded');
		if (handler) {
			handler(this);
		}
	},

	riseClosed: function (isSaving) {
		var handler = this.get_events().getHandler('closed');
		if (handler) {
			handler(this, isSaving);
		}
	},

	riseClosing: function () {
		var handler = this.get_events().getHandler('closing');
		if (handler) {
			handler(this);
		}
	},

	riseOpening: function () {
		var handler = this.get_events().getHandler('opening');
		if (handler) {
			handler(this);
		}
	},

	riseOpened: function () {
		var handler = this.get_events().getHandler('opened');
		if (handler) {
			handler(this);
		}
	},

	add_closing: function (handler) {
		this.get_events().addHandler('closing', handler);
	},

	remove_closing: function (handler) {
		this.get_events().removeHandler('closing', handler);
	},

	add_opening: function (handler) {
		this.get_events().addHandler('opening', handler);
	},

	remove_opening: function (handler) {
		this.get_events().removeHandler('opening', handler);
	},

	add_closed: function (handler) {
		this.get_events().addHandler('closed', handler);
	},

	remove_closed: function (handler) {
		this.get_events().removeHandler('closed', handler);
	},

	add_opened: function (handler) {
		this.get_events().addHandler('opened', handler);
	},

	remove_opened: function (handler) {
		this.get_events().removeHandler('opened', handler);
	}
}

Finatica.Controls.MultiDictionary.descriptor = {
	properties: [{ name: 'treeViews', type: Object },
				 { name: 'treeViewContainers', type: Object },
				 { name: 'controlID', type: String },
				 { name: 'popupDivID', type: String },
				 { name: 'listBoxID', type: String },
				 { name: 'hiddenFieldID', type: String },
				 { name: 'searchTextBoxID', type: String },
				 { name: 'innerRadTabsID', type: String },
				 { name: 'pageViewID', type: String },
				 { name: 'pagerClientID', type: String },
				 { name: 'searchTextBoxID', type: String },
				 { name: 'innerSplitterID', type: Number },
				 { name: 'btnClearAllID', type: String },
				 { name: 'argument', type: Object },
				 { name: 'sortHelp', type: Object },
				 { name: 'saveIDInResult', type: Boolean },
				 { name: 'selectOnlyIcons', type: Boolean },
				 { name: 'isFilter', type: Boolean}],

	events: [{ name: 'closed' },
			 { name: 'closing' },
			 { name: 'opening' },
			 { name: 'opened' },
			 { name: 'loaded'}]
}

Finatica.Controls.MultiDictionary.registerClass('Finatica.Controls.MultiDictionary', Sys.UI.Control);

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();


/* --------------------------     Telerik event handlers   -------------------------------------------- */

Finatica.Controls.MD.nodePopulating = function(sender, eventArgs) {
	var node = eventArgs.get_node();
	var treeView = node.get_treeView();
	var treeAttributes = treeView.get_attributes();
	var context = eventArgs.get_context();
	context["DictionaryName"] = treeAttributes.getAttribute("DictionaryName");
	context["Language"] = treeAttributes.getAttribute("LCode");
	context["AddArg"] = treeAttributes.getAttribute("AddArg");
	context["restrict"] = treeAttributes.getAttribute("restrict");
}

Finatica.Controls.MD.nodeChecked = function(sender, eventArgs) {
	var node = eventArgs.get_node();
	var tree = node.get_treeView();
	var dictControl = $find(tree.get_attributes().getAttribute('DictionaryClientID'));
	if (dictControl.currentDictionary == "Regions") {
		$find(dictControl.innerRadTabsID).get_allTabs()[2].select();
	}

	if (node.get_checked() == false) {
		dictControl.removeSelectedValue(node);
		if (dictControl.argument[dictControl.currentDictionary] != undefined && dictControl.argument[dictControl.currentDictionary] == "checkSingle") {
			var nodes = $find(dictControl.treeViews[dictControl.currentDictionary]).get_nodes();
			dictControl.enableNodes(nodes);
		}
	}
	else {
		dictControl.addSelectedValue(node);
		
		if (dictControl.argument[dictControl.currentDictionary] != undefined && dictControl.argument[dictControl.currentDictionary] == "checkSingle") {
			dictControl.disableAllExceptOneNode(node, $find(dictControl.treeViews[dictControl.currentDictionary]).get_nodes());
		}

		if (dictControl.currentDictionary == "Regions") {
			$find(dictControl.innerRadTabsID).get_allTabs()[2].select();
			return false;
		}
		$(".overlayLoading").show();
		var proxy = new Finatica.WebServices.HDictionaryService();
		proxy.GetElementDescriptionByGuid(node.get_value(), dictControl.currentDictionary, dictControl.controlID, dictControl.searchSuccess, dictControl.searchFail, [dictControl, node.get_value()]);
	}
	return false;
}

Finatica.Controls.MD.nodePopulated = function(sender, eventArgs) {
	var node = eventArgs.get_node();
	var nodes = node.get_nodes();

	var treeView = node.get_treeView();
	var treeAttributes = treeView.get_attributes();

	for (var i = 0; i < nodes.get_count(); i++) {
		var cuttNode = nodes.getNode(i);
		var nodeAttributes = cuttNode.get_attributes();
		var checkable = nodeAttributes.getAttribute("checkable") == "true";
		cuttNode.set_checkable(checkable);
	}

	//	var node_value = node.get_value();
	//	if (restrict == 'false') {
	//		var checkedNodes = treeView.get_checkedNodes();
	//		for (var i = 0; i < checkedNodes.length; i++) {
	//			if (node_value == checkedNodes[i].get_value()) {
	//				$(node.get_checkBoxElement()).toggleClass("rtChecked");
	//				$(node.get_checkBoxElement()).toggleClass("rtUnchecked");
	//				return false;
	//			}
	//		}
	//	}

	var dictControl = $find(treeAttributes.getAttribute("DictionaryClientID"));
	dictControl.filterNodes(node.get_nodes());
	if (dictControl.nodesToExpand != null && dictControl.nodesToExpand.length > 0) {
		var pop = dictControl.nodesToExpand.pop();
		var node = treeView.findNodeByValue(pop);
		if (node != null) {
			if (node.get_expandMode() == 3 && dictControl.nodesToExpand.length > 0)
				node.expand();
			else {
				node.select();
				node.scrollIntoView();
				if (dictControl.needFiltering == true) {
					var event = new Object();
					event.data = new Object();
					event.data.eventArgs = dictControl;
					event.data.node = node;
					dictControl.filter(event);
				}
				$(".overlayLoading").hide();
			}
		}
		else { $(".overlayLoading").hide(); }
	}
	return false;
}

Finatica.Controls.MD.hasCheckedChildren = function(parent) {
	var children = parent.get_nodes();
	for (var i = 0; i < children.get_count(); i++) {
		if (children.getNode(i).get_checked() == true)
			return true;
	}
	return false;
}

Finatica.Controls.MD.nodeclicked = function(sender, eventArgs) {
	var node = eventArgs.get_node();
	if (node.get_enabled() == false)
		return;
	var treeView = node.get_treeView();
	var treeAttributes = treeView.get_attributes();
	var dictControl = $find(treeAttributes.getAttribute("DictionaryClientID"));
	if (dictControl.currentDictionary == "Regions")
		return false;
	$(".overlayLoading").show();
	var proxy = new Finatica.WebServices.HDictionaryService();
	proxy.GetElementDescriptionByGuid(node.get_value(), dictControl.currentDictionary, dictControl.controlID, dictControl.searchSuccess, dictControl.searchFail, [dictControl, node.get_value()]);
	return false;
}


Finatica.Controls.MD.ListItemsReodered = function(sender, eventArgs) {
	var item = eventArgs.get_item();
	var dictControl = $find($(item.get_listBox().get_element()).attr("DictionaryClientID"));
	dictControl.reoderValues(item.get_value(), eventArgs.get_offset(), item.get_listBox().get_items().indexOf(item) + 1 - eventArgs.get_offset());
}

Finatica.Controls.MD.ListItemDeleted = function(sender, eventArgs) {
	var item = eventArgs.get_item();
	var dictControl = $find($(item.get_listBox().get_element()).attr("DictionaryClientID"));
	var node = $find(dictControl.treeViews[dictControl.currentDictionary]).findNodeByValue(item.get_value());
	node.set_checked(false);
	if (dictControl.argument[dictControl.currentDictionary] != undefined && dictControl.argument[dictControl.currentDictionary] == "checkSingle") {
		var nodes = $find(dictControl.treeViews[dictControl.currentDictionary]).get_nodes();
		dictControl.enableNodes(nodes);
	}
	dictControl.removeSelectedValue(node);
}

Finatica.Controls.MD.ShowDictElementInfo = function(elementID, controlId) {
	var proxy = new Finatica.WebServices.HDictionaryService();
	var dictControl = $find(controlId);
	$(".overlayLoading").show();
	proxy.GetElementDescriptionBySID(elementID, dictControl.currentDictionary, dictControl.controlID, dictControl.searchSuccess, dictControl.searchFail, [dictControl,elementID]);
}

Finatica.Controls.MD.OnPageChanged = function(sender, args) {
	var parentControl = $find(sender.data.eventSender.parentClientID);
	parentControl.searchResultsPage[parentControl.currentDictionary] = ($(sender.target).text() - 1) * 20;
	parentControl.recreatePager = false;
	parentControl.performSearch();
}

