function DualSelectMove(objFrom, objTo, bolAll, bolKeepAlpha)
{
	var intFromCount = objFrom.options.length;
	var intToCount   = objTo.options.length;

	for (var intCurFrom = intFromCount - 1; intCurFrom >= 0; --intCurFrom)
	{
		var objOption = objFrom.options[intCurFrom];

		if (bolAll == true || objOption.selected == true)
		{
			var bolAdded = false;

			if (bolKeepAlpha == true)
			{
				// Find where we need to add it (to preserve alphabetical ordering)

				for (var intCurTo = 0; intCurTo < intToCount; ++intCurTo)
				{
					var objToChild = objTo.options[intCurTo];

					if (objOption.text < objToChild.text)
					{
						objTo.insertBefore(objOption, objToChild);

						bolAdded = true;

						break;
					}
				}
			}

			if (bolAdded == false)
			{
				// Just goes at the end
				objTo.appendChild(objOption);
			}

			++intToCount;
		}
	}
}

function DualSelectAdd(objButton, bolAll, bolKeepAlpha)
{
	var arrSelects = objButton.parentNode.parentNode.getElementsByTagName('select');
	
	var objFrom = arrSelects[1];
	var objTo   = arrSelects[0];

	DualSelectMove(objFrom, objTo, bolAll, bolKeepAlpha);
}

function DualSelectRemove(objButton, bolAll)
{
	var arrSelects = objButton.parentNode.parentNode.getElementsByTagName('select');
	
	var objFrom = arrSelects[0];
	var objTo   = arrSelects[1];

	DualSelectMove(objFrom, objTo, bolAll, true);
}


function DualSelectChangeOrdering(objButton, bolUp)
{
	var arrSelects = objButton.parentNode.parentNode.getElementsByTagName('select');

	var objSelect = arrSelects[0];

	var intItemCount = objSelect.options.length;

	// When we move items down we need to deselect them so that they don't get picked up again and
	// moved all the way to the bottom. This array stores all the options that we've deselected so
	// we can run through and reselect them again afterwards.
	var arrReselectObjects = new Array();

	for (var intItem = 0; intItem < intItemCount; ++intItem)
	{
		var objOption = objSelect.options[intItem];

		// See if this is a selected items
		if (objOption.selected == true)
		{
			// Move up?
			if (bolUp == true && intItem > 0)
			{
				objSelect.insertBefore(objOption, objSelect.options[intItem - 1]);
			}
			else if (bolUp == false && intItem < intItemCount - 1)
			{
				// Move Down

				// Is the next item the last?
				if (intItem == intItemCount - 2)
				{
					objSelect.appendChild(objOption);
				}
				else
				{
					objSelect.insertBefore(objOption, objSelect.options[intItem + 2]);

					objOption.selected = false;

					arrReselectObjects[arrReselectObjects.length] = objOption;
				}
			}
		}
	}

	// Reselect all options that we deselected because they were moved up
	var intReselectCount = arrReselectObjects.length;

	for (intNum = 0; intNum < intReselectCount; ++intNum)
	{
		arrReselectObjects[intNum].selected = true;
	}
}

function DualSelectMoveUp(objButton)
{
	DualSelectChangeOrdering(objButton, true);
}

function DualSelectMoveDown(objButton)
{
	DualSelectChangeOrdering(objButton, false);
}

function DualSelectOnSubmit()
{
	var intControlCount = arrDualSelectControls.length;

	for (var intCurControl = 0; intCurControl < intControlCount; ++intCurControl)
	{
		var objSelected = document.getElementById(arrDualSelectControls[intCurControl]);

		// Allow for the possibillity that the control was removed from the page.
		if (objSelected != null)
		{
			var intCount = objSelected.options.length;
	
			for (var intCur = 0; intCur < intCount; ++intCur)
			{
				objSelected.options[intCur].selected = true;
			}
		}
	}
}

function DualSelectChange(strSelectId,strMultiSelectId){	
	var objSelect = document.getElementById(strSelectId);
	DualSelectClearList(strMultiSelectId);		
	DualSelectClearList(strMultiSelectId+'Bin');
	var objOption = document.createElement("option");
	var objOptionText = document.createTextNode("Loading...");
	objOption.appendChild(objOptionText);
	objOption.value = 0;
	var objMultiSelect = document.getElementById(strMultiSelectId+'Bin');
	objMultiSelect.appendChild(objOption);	
	var intCatUid = parseInt(objSelect.options[objSelect.selectedIndex].value);
	var objAsyncJSObject = new AsyncJSObject("/shared/categories/AJAXCategories.php");
	objAsyncJSObject.arrRequestVars['action']  = "GetSubCats";
	objAsyncJSObject.arrRequestVars['cat_uid'] = intCatUid;
	objAsyncJSObject.addCallBack(DualSelectCallBack);
	objAsyncJSObject.setCallBackVar(strMultiSelectId+'Bin');
	objAsyncJSObject.sendRequest();
}

function DualSelectCallBack(objXML,strMultiSelectId){
	DualSelectClearList(strMultiSelectId);
	var objSelect  = document.getElementById(strMultiSelectId);
	var objSubCats = objXML.getElementsByTagName('SubCategory');
	for (var i = 0;i < objSubCats.length;i++){				
		var strSubCatUid  = getElementTextXML("", "SubCatUid",  objSubCats[i], 0);
		var strSubCatDesc = getElementTextXML("", "SubCatDesc", objSubCats[i], 0);		
		var objOption = document.createElement("option");
		var objOptionText = document.createTextNode(strSubCatDesc);
		objOption.appendChild(objOptionText);
		objOption.value = strSubCatUid;
		objSelect.appendChild(objOption);
	}	
}

function DualSelectClearList(strSelectId){		
	objSelect = document.getElementById(strSelectId);
	if (typeof(objSelect.innerHTML) == 'string'){
			objSelect.innerHTML = "";
	}else{
		if (typeof(objSelect) == 'object'){
			while(typeof(objSelect.childNodes[0])=='object'){			
				objOption = objSelect.childNodes[0];
				if(objOption == null){
					break;
				}else{
					objSelect.removeChild(objOption);
				}
			}	
		}
	}
}

var arrDualSelectControls     = new Array();
var arrDualSelectUserOrdering = new Array();
