// LyMultiSelectorScript.js
// Copyright (c) 2000-2009, Lyria-W4.
// All rights reserved.
// @version	$Id: LyMultiSelectorScript.js,v 1.2.4.5 2009/11/27 14:30:17 nha Exp $

// Take the selected options from the first field and add them to
// the second field.
// if ignoreOrder is set to true, field are added at the end of the listbox
function SelectOptions(form, fieldFromName, fieldToName, fieldResultName,
	fieldName, sep, linkCrSep, needChange, ignoreOrder)
{
	var index, value, id, newOption, indexFrom, indexTo;
	var fieldFrom = form.elements[fieldFromName];
	var fieldTo = form.elements[fieldToName];
	var fieldResult = form.elements[fieldResultName];
	var field = form.elements[fieldName];
	var indexToSelected = -1;

	if (typeof ignoreOrder == "undefined")
		ignoreOrder = false;

	index = fieldFrom.options.selectedIndex;

	if (index == -1)
		return;

	if (!ignoreOrder)
		indexToSelected = fieldTo.options.selectedIndex;

	var first_idx = index;
	i = first_idx;

	do
	{
		if (fieldFrom.options[i].selected == true)
		{
			value = fieldFrom.options[i].text;
			id = fieldFrom.options[i].value;
			fieldFrom.options[i]=null;
			newOption = new Option(value);
			newOption.value = id;
			index = fieldTo.options.length;

			if (ignoreOrder)
			{
				for (j = 0; j < fieldTo.length; j++)
				{
					if (value < fieldTo.options[j].text)
					{
						indexToSelected = j;
						break;
					}
				}
			}

			if (indexToSelected > -1)
			{
				TranslateList(fieldTo, indexToSelected);
				fieldTo.options[indexToSelected] = newOption;
				indexToSelected = fieldTo.options.selectedIndex;
			}
			else
				fieldTo.options[index] = newOption;

			i--;
		}

		i++;
	}
	while (i < fieldFrom.length)

	// Update the field value with the selected values
	index = fieldResult.length;
	field.value = "";

	for (i = 0; i < index; i++)
	{
		if (i != 0)
			field.value += sep;

		field.value += ReplaceString(fieldResult.options[i].value, "\\n", linkCrSep);
	}

	UpdateTools(form, fieldName);

	if (needChange != "false")
		FieldChange(form, field, needChange);
	else if (isInPopUp == 'true')
		setTimeout("checkSizePopupView()", 50);
	else
		setTimeout("checkSizeMainView()", 50);
}

// Take all the options from the first field and add them to the second field.
function SelectAllOptions(form, fieldFromName, fieldToName, fieldResultName,
	fieldName, sep, linkCrSep, needChange)
{
	// Select all the options and call the select function
	for (j = 0; j < form.elements[fieldFromName].length; j++)
		form.elements[fieldFromName].options[j].selected = true;

	SelectOptions(form, fieldFromName, fieldToName, fieldResultName,
		fieldName, sep, linkCrSep, needChange);
}

// Translate the options of the list by one line (starting at begin)
function TranslateList(field, begin)
{
	n = field.length;

	for (k = n; k > begin; k--)
	{
		field.options[k] = new Option(field.options[k-1].text);
		field.options[k].value = field.options[k-1].value;
		field.options[k].selected = field.options[k-1].selected;
	}
}

// Take all the selected options from a list and move them up.
function MoveUpOptions(form, listName, fieldName, sep, linkCrSep, needChange)
{
	var list = form.elements[listName];
	var field = form.elements[fieldName];
	var index = list.length;
	var firstSelection = 0;

	// Check if move up is allowed
	for (i = 0; i < index; i++)
	{
		if (list.options[i].selected)
		{
			firstSelection = i;
			break;
		}
	}

	if (i <= 0)
		return;

	for (i = 0; i < index; i++)
	{
		if (list.options[i].selected)
		{
			value = list.options[i].text;
			id = list.options[i].value;
			list.options[i]=null;
			newOption = new Option(value);
			newOption.value = id;
			newOption.selected = true;
			TranslateList(list, i - 1);
			list.options[i - 1] = newOption;
		}
	}

	// Update the field value with the selected values
	field.value = "";
	index = list.length;

	for (i = 0; i < index; i++)
	{
		if (i != 0)
			field.value += sep;

		field.value += ReplaceString(list.options[i].value, "\\n", linkCrSep);
	}

	UpdateTools(form, fieldName);

	if (needChange != "false")
		FieldChange(form, field, needChange);
}

// Take all the selected options from a list and move them down.
function MoveDownOptions(form, listName, fieldName, sep, linkCrSep, needChange)
{
	var list = form.elements[listName];
	var field = form.elements[fieldName];
	var index = list.length;
	var lastSelection = 0;

	// Check if move down is allowed
	for (i = index - 1; i >= 0; i--)
	{
		if (list.options[i].selected)
		{
			lastSelection = i;
			break;
		}
	}

	if (i == index - 1)
		return;

	for (i = index - 1; i >= 0; i--)
	{
		if (list.options[i].selected)
		{
			value = list.options[i].text;
			id = list.options[i].value;
			list.options[i]=null;
			newOption = new Option(value);
			newOption.value = id;
			newOption.selected = true;
			TranslateList(list, i + 1);
			list.options[i + 1] = newOption;
		}
	}

	// Update the field value with the selected values
	field.value = "";
	index = list.length;

	for (i = 0; i < index; i++)
	{
		if (i != 0)
			field.value += sep;

		field.value += ReplaceString(list.options[i].value, "\\n", linkCrSep);
	}

	UpdateTools(form, fieldName);

	if (needChange != "false")
		FieldChange(form, field, needChange);
}

function UpdateTools(form, fieldName)
{
	if (form == null)
		return;

	var fieldFrom = form.elements[fieldName + "_from"];
	var fieldTo = form.elements[fieldName + "_to"];

	if ((fieldFrom == null) || (fieldTo == null))
		return;

	var imgSelect = this.document.getElementById(fieldName + "_select");
	var imgSelectAll = this.document.getElementById(fieldName + "_selectAll");
	var imgUnselect = this.document.getElementById(fieldName + "_unselect");
	var imgUnselectAll = this.document.getElementById(fieldName + "_unselectAll");
	var imgUp = this.document.getElementById(fieldName + "_up");
	var imgDown= this.document.getElementById(fieldName + "_down");
	var indexFrom = fieldFrom.options.selectedIndex;
	var indexTo = fieldTo.options.selectedIndex;

	// Check if move down is allowed
	var i, index = fieldTo.length;

	for (i = index - 1; i >= 0; i--)
	{
		if (fieldTo.options[i].selected)
		{
			lastSelection = i;
			break;
		}
	}

	SetMultiSelectorButtonEnabled(imgSelect, (indexFrom >= 0));
	SetMultiSelectorButtonEnabled(imgSelectAll, (fieldFrom.length > 0));
	SetMultiSelectorButtonEnabled(imgUnselect, (indexTo >= 0));
	SetMultiSelectorButtonEnabled(imgUnselectAll, (fieldTo.length > 0));
	SetMultiSelectorButtonEnabled(imgUp, (indexTo > 0));
	SetMultiSelectorButtonEnabled(imgDown, (indexTo >= 0) && (i != index - 1));
}

function SetMultiSelectorButtonEnabled(image, enabled)
{
	if (image == null)
		return;

	if (enabled)
	{
		image.className = "";
		image.style.cursor = "";
	}
	else
	{
		image.className = "disabledTool";
		image.style.cursor = "default";
	}
}

// Select an option in an auto-completion multi-selector
function AutoCompletionSelectOption(formName, textHiddenFieldName, textFieldName, listFieldName, fieldName, completionName, values, sep, controller)
{
	var form = findForm(null, formName, textHiddenFieldName);

	if (form == null)
		return;

	var textHiddenField = form.elements[textHiddenFieldName];
	var listField = form.elements[listFieldName];
	var field = form.elements[fieldName];
	var i, j;

	for (i = 0; i < values.length; i++)
	{
		valueId = values[i][0];

		if (valueId == textHiddenField.value)
		{
			var newOption = new Option(values[i][1]);

			newOption.value = values[i][0];
			listField.options[listField.options.length] = newOption;
			values[i][2] = false;

			// Select the first selectable item in the auto-completion list
			for (j = 0; j < values.length; j++)
			{
				if (values[j][2])
				{
					setCompletionValue(formName, completionName, textHiddenFieldName, values[j][0], values[j][1], null);
					break;
				}
			}

			// If no item was selected, empty the auto-completion list
			if (j == values.length)
				setCompletionValue(formName, completionName, textHiddenFieldName, "", "", null);

			break;
		}
	}

	// Update the field value with the selected values
	field.value = "";

	for (i = 0; i < listField.length; i++)
	{
		if (i != 0)
			field.value += sep;

		field.value += listField.options[i].value;
	}

	hideAutoCompletion(formName, completionName, fieldName, controller);
}

// Unselect an option in an auto-completion multi-selector
function AutoCompletionUnselectOption(formName, textHiddenFieldName, textFieldName, listFieldName, fieldName, completionName, values, sep, controller)
{
	var form = findForm(null, formName, textHiddenFieldName);

	if (form == null)
		return;

	var textHiddenField = form.elements[textHiddenFieldName];
	var listField = form.elements[listFieldName];
	var field = form.elements[fieldName];
	var i = 0, j;

	for (i = listField.length - 1; i >= 0 ; i--)
	{
		if (listField.options[i].selected)
		{
			for (j = 0; j < values.length; j++)
			{
				valueId = values[j][0];

				if (valueId == listField.options[i].value)
				{
					listField.options[i] = null;
					values[j][2] = true;

					if (textHiddenField.value == "")
						setCompletionValue(formName, completionName, textHiddenFieldName, values[j][0], values[j][1], null);

					break;
				}
			}
		}
	}

	// Update the field value with the selected values
	field.value = "";

	for (i = 0; i < listField.length; i++)
	{
		if (i != 0)
			field.value += sep;

		field.value += listField.options[i].value;
	}

	hideAutoCompletion(formName, completionName, fieldName, controller);
}
