/*
	Returns:
	- A negative value if the first argument passed is less than the second argument. 
	- Zero if the two arguments are equivalent. 
	- A positive value if the first argument is greater than the second argument.
	- Treats null options as the highest.
*/
function compareOptions(opt1, opt2) {
	if(opt1 == null) {
		if(opt2 == null) return 0;
		return 1;
	} else if(opt2 == null) {
		return -1;
	}

	var txt1 = opt1.text;
	var txt2 = opt2.text;
	if(txt1 < txt2) {
		return -1;
	} else if(txt1 > txt2) {
		return 1;
	} else {
		return 0;
	}
}

		
// Returns index of first selected option.
function getFirstSelectionIndex(lbx) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intOptionCount = arrOptions.length;

	for(var intOption = 0; intOption < intOptionCount; intOption++) {
		if(arrOptions[intOption].selected) return intOption;
	}
	return -1;
}
			
// Returns index of last selected option.
function getLastSelectionIndex(lbx) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intLastOption = arrOptions.length - 1;

	for(var intOption = intLastOption; intOption >= 0; intOption--) {
		if(arrOptions[intOption].selected) return intOption;
	}
	return -1;
}


// Selects option(s) with value 'strValue'.  If 'blnFirstOnly' is true, only
// selects the first matching option.
function selectValue(lbx, strValue, blnFirstOnly) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intOptionCount = arrOptions.length;

	var opt;
	for(var intOption = 0; intOption < intOptionCount; intOption++) {
		opt = arrOptions[intOption];
		if(opt.value == strValue) {
			opt.selected = true;
			if(blnFirstOnly) return;
		}
	}
}


function getAlphabeticalInsertionIndex(lbxTo, opt) {
	if(lbxTo == null || opt == null) return;
	var arrToOptions = lbxTo.options;
	if(arrToOptions == null) return;
	var intToOptionCount = arrToOptions.length;
	for(var intToOption = 0; intToOption < intToOptionCount; intToOption++) {
		if(arrToOptions[intToOption].text > opt.text) return intToOption;
	}
	return intToOptionCount + 1;
}


// If intInsertionIndex < 0, add options alphabetically.
// 'lbxFrom' and 'lbxTo' cannot be the same listbox.
function moveSelectedOptions(lbxFrom, lbxTo, intInsertionIndex) {
	if(lbxFrom == lbxTo || lbxFrom == null || lbxTo == null) return;
	var arrFromOptions = lbxFrom.options;
	var arrToOptions = lbxTo.options;
	if(arrFromOptions == null || arrToOptions == null) return;

	for(var intFromOption = arrFromOptions.length - 1; intFromOption >= 0; intFromOption--) {
		var objFromOption = arrFromOptions[intFromOption];
		if(objFromOption.selected) {
			insertOption(lbxTo, objFromOption, intInsertionIndex);
			arrFromOptions[intFromOption] = null;
		}
	}
}


function moveSelectedOptionsUp(lbx) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intOptionCount = arrOptions.length;
	if(intOptionCount <= 0) return;

	if(arrOptions[0].selected) return;
	for(var intOption = 1; intOption < intOptionCount; intOption++) {
		if(arrOptions[intOption].selected) {
			insertOption(lbx, arrOptions[intOption - 1], intOption + 1);
			arrOptions[intOption - 1] = null;
		}
	}
}
			

function moveSelectedOptionsDown(lbx) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intOptionCount = arrOptions.length;
	if(intOptionCount <= 0) return;
	var intLastOption = intOptionCount - 1;

	if(arrOptions[intLastOption].selected) return;
	for(var intOption = intLastOption - 1; intOption >= 0; intOption--) {
		if(arrOptions[intOption].selected) {
			insertOption(lbx, arrOptions[intOption + 1], intOption);
			arrOptions[intOption + 2] = null;
		}
	}
}


function createOption(doc, text, value) {
	if(doc.createElement == null) {
		return new Option(text, value);
	} else {
		var opt = doc.createElement("OPTION");
		opt.text = text;
		opt.value = value;
		return opt;
	}
}


function sortOptions(lbx) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intOptionCount = arrOptions.length;
	if(intOptionCount <= 0) return;
										
	// Put arrOptions into an array
	var arr = new Array(intOptionCount);
	var opt;
	for(var intOption = 0; intOption < intOptionCount; intOption++) {
		opt = arrOptions[intOption];
		arr[intOption] = createOption(document, opt.text, opt.value);
	}
										
	// Sort array
	arr.sort(compareOptions);

	// Repopulate options
	for(intOption = 0; intOption < intOptionCount; intOption++) {
		arrOptions[intOption] = arr[intOption];
	}
}
					
					
// Insert 'optInsert' into 'lbx' at index 'intIndex'.
// If intIndex < 0, add options alphabetically.
function insertOption(lbx, optInsert, intIndex) {
	if(lbx == null) return;
	var arrOptions = lbx.options;
	if(arrOptions == null) return;
	var intOptionCount = arrOptions.length;

	if(intIndex < 0) intIndex = getAlphabeticalInsertionIndex(lbx, optInsert);
	if(intIndex < 0 || intIndex > intOptionCount) intIndex = intOptionCount;

	var optNew = createOption(document, optInsert.text, optInsert.value);
	var opt;
	for(var intOption = intOptionCount; intOption > intIndex; intOption--) {
		opt = arrOptions[intOption - 1];
		arrOptions[intOption] = createOption(document, opt.text, opt.value);
		arrOptions[intOption].selected = opt.selected;
	}
	arrOptions[intIndex] = optNew;
}



function refreshListBoxes() {
	with (navigator) {
		if((appName == "Netscape") && (parseInt(appVersion) == 4)) {
			history.go(0);
		}
	}			
}


// Select first option of each listbox in aElements that has no selection.
function selectFirstOptionByDefault(aElements) {
	var oElement;
	for(var nElement = 0; nElement < aElements.length; nElement++) {
		oElement = aElements[nElement];
		if(oElement.selectedIndex != null && oElement.options != null && oElement.options[0] != null) {
			if(oElement.selectedIndex < 0) oElement.options[0].selected = true;
		}
	}
}