﻿function CreateDropDownObject(JSdropdownlistName)
{
	var obj = $('#' + JSdropdownlistName);

	DropDownObject(obj, obj.attr('hlpFieldName'), obj.attr('hlpDropDownSelectedTitle'), eval(obj.attr('hlpOnNodeClick')), eval(obj.attr('hlpOnLoadManipulateJSON')), eval(obj.attr('hlpMaxChecked')), obj.attr('hlpMaxCheckedMessage'), eval(obj.attr('hlpIsMultiple')), obj.attr('hlpDataSourceLevel1'), obj.attr('hlpStoryBoardId'), obj.attr('hlpStoryBoardDescId'), obj.attr('hlpJSONselectedValuesLevel0'), obj.attr('hlpJSONselectedValuesLevel1'), obj.attr('hlpJSONselectedValuesLevel2'));
}

function DropDownObject(ddlObject, fieldName, dropDownSelectedTitle, onNodeClick, onLoadManipulateJSON, maxChecked, maxCheckedMessage, isMultiple, dataSourceLevel1, storyBoardId, storyBoardDescId, JSONselectedValuesLevel0, JSONselectedValuesLevel1, JSONselectedValuesLevel2)
{
	var dropdownlist = ddlObject;
	var panel = $('#' + fieldName + '_Panel');
	var content = $('#' + fieldName + '_Content');
	var object = DropDownList.Instance(dropdownlist, panel, content, { "TitleTemplate": "{0} " + dropDownSelectedTitle, "OnToggle": "OnToggle", "OnOk": null, "OnClearAll": "OnClearAll", "OnRemoveSelected": "OnRemoveSelected", "LoadingImage": fieldName + "_LoadingImage", "StoryBoard": storyBoardId, "StoryBoardDesc": storyBoardDescId, "OnNodeClick": onNodeClick, "OnLoadManipulateJSON": onLoadManipulateJSON, "MaxChecked": maxChecked, "MaxCheckedMessage": maxCheckedMessage });

	dropdownlist[0].DropDownList = object;
	panel[0].DropDownList = object;
	content[0].DropDownList = object;
	$('#' + fieldName + '_Ok')[0].DropDownList = object;
	$('#' + fieldName + '_ClearAll')[0].DropDownList = object;
	if ($('#' + fieldName + '_StoryBoard').length == 1)
	{
		$('#' + fieldName + '_RemoveAll')[0].DropDownList = object;
	}	
	$('#' + fieldName + '_PanelContent')[0].appendChild(content[0]);
	

	eval('igtree_' + fieldName + 'Tree2_Tree = ["' + fieldName + '_Tree2", "ig_' + fieldName + '_r9", "TreeNodeHovered", "../Cultures/Images/icons/plus.gif", "../Cultures/Images/icons/minus.gif", ' + ((isMultiple) ? "false" : "true") + ', false, "../Images/", false, true, 0, true, "", "", "ig_54a291b2_r6", "", "", 0, true, "", "", false, false, 20, ' + ((isMultiple) ? "true" : "false") + ', "", "", "", "", "", "", ' + ((dataSourceLevel1 == '') ? "false" : "true") + ', 20061.2, [], ["", "", "", ""], ["", "", "", ""], "TreeNode", \'' + ((dataSourceLevel1 == '') ? "" : "Loading...") + '\', true, true, 0, false, true, false, \'' + ddlObject.selector.replace("#","") + '\'];');
	eval('igtree_' + fieldName + 'Tree2_Levels = [];');
	eval('igtree_' + fieldName + 'Tree2_Events = [["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["WebTree.OnNodeChecked", 0], ["", 0], ["", 0], ["WebTree.OnInitializeTree", 0], ["", 0], ["", 0], ["WebTree.OnNodeClick", 0], ["", 0], ["WebTree.OnNodeExpand", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ["", 0], ];');

	eval('this.igtree_' + fieldName + 'Tree2_cs = [{},{},{}]');
	eval('this.o' + fieldName + 'Tree2 = igtree_initTree(\'' + fieldName + 'Tree2\');');
}

window.DropDownList = window.DropDownList || new (function()
{
	var allInstances = [];

	Init();

	this.Instance = function(dropdownlist, panel, content, settings)
	{
		return new _Instance(dropdownlist, panel, content, settings);
	}

	// Static methods
	this.CloseAll = function()
	{
		$(allInstances).each(function(index, item) { item.Close(); });
	}

	function Init()
	{
		document.body.onmousedown = function()
		{
			DropDownList.CloseAll();
		}
	}

	function _Instance(dropdownlist, panel, content, settings)
	{
		this.checkedNodesIds = new Array();
		this.checkedNodesTexts = new Array();

		Init(this);

		//Initizalization
		function Init(instance)
		{
			allInstances.push(instance);

			settings.LoadingImage = $("#" + settings.LoadingImage);
			settings.StoryBoard = $("#" + settings.StoryBoard);
			settings.StoryBoardDesc = $("#" + settings.StoryBoardDesc);

			settings.OnToggle = window[settings.OnToggle];
			settings.OnOk = window[settings.OnOk];
			settings.OnClearAll = window[settings.OnClearAll];
			settings.OnRemoveSelected = window[settings.OnRemoveSelected];

			panel.hide();
		}

		// Instance fields and methods
		this.OnToggle = function(evt)
		{
			var isOpened = panel.css("display") != "none";
			dropdownlist[0].disabled = true;
			setTimeout(function() { dropdownlist[0].disabled = false }, 10);

			CancelEvent(evt);
			DropDownList.CloseAll();

			if (isOpened)
				this.Close();
			else
				this.Open(false);

			settings.OnToggle && settings.OnToggle(this, content, !isOpened);
		}

		this.Populate = function()
		{
			settings.OnToggle && settings.OnToggle(this, content, true);
		}

		this.OnOk = function(evt)
		{
			if (settings.OnOk)
				settings.OnOk(this, content);
			else
				this.Close();
		}

		this.OnClearAll = function(evt)
		{
			settings.OnClearAll && settings.OnClearAll(this, content);
		}

		this.OnRemoveSelected = function(nodeId)
		{
			settings.OnRemoveSelected && settings.OnRemoveSelected(content, nodeId);
		}

		this.UpdateTitleValue = function(value, text)
		{
			// template format: "{0} word(s)" or "cr(y|ies)"
			// if the {0} is 1, the result will be: word and cry, otherwise: words and cries

			var option = dropdownlist[0].options[0];
			option.value = value;

			if (value == 0)
			{
				option.text = dropdownlist[0].getAttribute('defaultSelect');
				option.value = -1;
			}
			else if (text == null)
			{
				option.text = settings.TitleTemplate.replace(/\((.+)\|(.+)\)|\(()(.+)\)/, value == 1 ? "$1$3" : "$2$4").replace("{0}", "(" + value + ")");
			}
			else
			{
				option.text = text;

				this.Close();
			}
		}

		this.GetContent = function()
		{
			return content;
		}

		this.GetTitle = function()
		{
			return dropdownlist[0].options[0].text;
		}

		this.Close = function()
		{
			if (panel[0].style.display == "none") return;

			panel.hide();
			panel[0].IE6_iframe && panel[0].IE6_iframe.hide().remove();
		}

		this.Open = function(flag)
		{
			if (panel.css("display") != "none") return;

			if ($.browser.msie)
			{
				// fix for IE6 bug, to cover select elements
				if ($.browser.version == "6.0")
					panel[0].IE6_iframe = $("<iframe>").insertAfter(panel).addClass(panel.attr("class")).css({ "position": "absolute", "zIndex": "1" }).css("top", dropdownlist[0].offsetTop + dropdownlist[0].offsetHeight).css("left", dropdownlist[0].offsetLeft);

				panel.css("top", dropdownlist[0].offsetTop + dropdownlist[0].offsetHeight).css("left", dropdownlist[0].offsetLeft);
			}
			else
			{
				panel.css("left", dropdownlist[0].offsetLeft);
			}

			panel.show();

			if (flag != false)
			{
				dropdownlist[0].disabled = false; // if control is opening while it's the toggle method, remove disabled attribute
				dropdownlist[0].focus();
			}
		}

		this.OnMouseDown = function(evt)
		{
			CancelEvent(evt);
		}

		this.StartWaiting = function()
		{
			settings.LoadingImage.show();
		}

		this.StopWaiting = function()
		{
			settings.LoadingImage.hide();
		}

		this.BuildStoryBoard = function(checkedChildNodes, hasChildsLevel)
		{
			if (settings.StoryBoardDesc.length == 1)
			{
				var HTML = '';
				var levels = new Array(0, 0);

				if (checkedChildNodes.length > 0)
				{
					HTML = ' <span class="nobreak"><img src="../Cultures/Images/bullet_orange.gif" alt="" width="5" height="4" style="vertical-align:0.2em; margin:0 5px 0 5px;" />';
					for (var n = 0; n < checkedChildNodes.length; n++)
					{
						if (hasChildsLevel && checkedChildNodes[n].getLevel() == 0)
							HTML += '<b>' + checkedChildNodes[n].getText() + '</b>';
						else
							HTML += checkedChildNodes[n].getText();

						HTML += '<a href="#"><img src="../Cultures/Images/StoryBoardDelete.gif" alt="Borrar" width="10" height="10" onclick="$(\'' + dropdownlist.selector + '\')[0].DropDownList.OnRemoveSelected(\'' + checkedChildNodes[n].Id + '\'); return false;"/></a></span>';

						if (n < checkedChildNodes.length - 1)
							HTML += ' <span class="nobreak"><img src="../Cultures/Images/bullet_orange.gif" alt="" width="5" height="4" class="OrangeBullet" />';
					}

					settings.StoryBoardDesc.html(HTML);
					settings.StoryBoard.show();
				}
				else
				{
					settings.StoryBoard.hide();
				}
			}
		}

		this.OnNodeClick = function(node)
		{
			settings.OnNodeClick && settings.OnNodeClick(node);
		}

		this.AddToVirtualFieldSelect = function(checkedChildNodes)
		{
			this.checkedNodesIds = new Array();
			this.checkedNodesTexts = new Array();

			for (var n = 0; n < checkedChildNodes.length; n++)
			{
				this.checkedNodesIds[this.checkedNodesIds.length] = checkedChildNodes[n].getLevel().toString() + '-' + checkedChildNodes[n].getTag().toString();
				this.checkedNodesTexts[this.checkedNodesTexts.length] = checkedChildNodes[n].getText();
			}
		}

		this.GetCheckedNodes = function()
		{
			return [this.checkedNodesIds, this.checkedNodesTexts];
		}

		this.OnLoadManipulateJSON = function(tree, node, data)
		{
			return (settings.OnLoadManipulateJSON && settings.OnLoadManipulateJSON(tree, node, data));
		}

		this.ControlMaxChecked = function(node, countCheckedNodes)
		{
			if (settings.MaxChecked && settings.MaxCheckedMessage && countCheckedNodes > settings.MaxChecked)
			{
				node.setChecked(false, null, false, true);

				alert(settings.MaxCheckedMessage);

				return false;
			}

			return true;
		}

		function CancelEvent(evt)
		{
			evt.stopPropagation && evt.stopPropagation();
			evt.cancelBubble = true;
		}
	}
})();

function OnNodeChecked(node, tree, hasChildsLevel)
{
	var checkedNodes = tree.WebTree.GetAllCheckedNodes(tree, hasChildsLevel); //It'll return [OBJECT, COUNT]

	var allCheckeddNodes = checkedNodes[0];
	var countCheckedNodes = checkedNodes[1];

	if (tree.WebTree.DropDownList().ControlMaxChecked(node, countCheckedNodes))
	{
		tree.WebTree.DropDownList().BuildStoryBoard(allCheckeddNodes, hasChildsLevel);
		tree.WebTree.DropDownList().AddToVirtualFieldSelect(allCheckeddNodes);
		tree.WebTree.DropDownList().UpdateTitleValue(countCheckedNodes, null);
	}
}

function OnNodeClick(tree, node)
{
	tree.WebTree.DropDownList().UpdateTitleValue(node.getTag(), node.getText());

	tree.WebTree.DropDownList().OnNodeClick(node);
	
	$('#'+tree.dropDownServerId+'').focus();
}

function OnEngagementTypeChecked(checkboxList, checkbox, data, isChecked)
{
	checkboxList[0].DropDownList.UpdateTitleValue(checkboxList[0].CheckBoxList.GetCheckedItems().length, null);
}

function OnToggle(ddl, control, ifOpened)
{
	if (ifOpened)
	{
		ddl.StartWaiting();
		control[0].WebTree.LoadTreeFromServer(ddl.StopWaiting);
	}
}

function OnClearAll(ddl, control)
{
	control[0].WebTree.ClearAll();
}

function OnRemoveSelected(control, nodeId)
{
	control[0].WebTree.RemoveSelected(nodeId);
}

function OnLoadManipulateJSON(tree, node, data)
{
	return (tree.WebTree.DropDownList().OnLoadManipulateJSON(tree, node, data));
}