function ltrim(str) {
	var whitespace = new String(" \t\n\r");
	var s = new String(str);
	if (whitespace.indexOf(s.charAt(0)) != -1) {
		var j=0, i = s.length;
		while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
			j++;
		s = s.substring(j, i);
	}
	return s;
}

function rtrim(str) {
	var whitespace = new String(" \t\n\r");
	var s = new String(str);
	if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {
		var i = s.length - 1;
		while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
			i--;
		s = s.substring(0, i+1);
	}
	return s;
}

function trim(str) {
	return ltrim(rtrim(str));
}

function stripSemicolons(str) {
	var s = "";
	for (var iChar = 0; iChar < str.length; iChar++) {
		if (str.charAt(iChar) != ';')
			s += str.charAt(iChar);
	}
	return s;
}

function removeEmptyRows(object) {
	var iCount = object.options.length ;
	var iOffset= 0;
	var iTotal = 0;
	for (var iNext  = 0; (iNext + iOffset) < (iCount); iNext++) {
		while(object.options[iNext + iOffset].value == "") {
			iOffset++;
			if ((iNext + iOffset) >= iCount) break;
		}
		if ((iNext + iOffset) >= iCount) break;
		object.options[iTotal].value = object.options[iNext + iOffset].value;
		object.options[iTotal].text  = object.options[iNext + iOffset].text;
		iTotal++;
	}
	object.options.length = (iCount - iOffset);
}

function removeSelectedItems(selectObject) {
	for (var iOption = 0; iOption < selectObject.options.length; iOption++) {
		if (selectObject.options[iOption].selected && selectObject.options[iOption].value != ""
				&& selectObject.options[iOption].value != "#") {
			selectObject.options[iOption].value = "";
			selectObject.options[iOption].text = "";
		}
	}
	removeEmptyRows(selectObject);
}

function moveItems(sourceObject, destObject) {
	if (sourceObject.options.length > 0 && sourceObject.selectedIndex >= 0) {
		for (var iOption = 0; iOption < sourceObject.options.length; iOption++) {
			if (sourceObject.options[iOption].selected && sourceObject.options[iOption].value != ""
				&& sourceObject.options[iOption].value != "#") {
				var destOption = new Option();
				destOption.value = sourceObject.options[iOption].value;
				destOption.text  = sourceObject.options[iOption].text;
				destObject.options[destObject.options.length] = destOption;
				sourceObject.options[iOption].value = "";
				sourceObject.options[iOption].text  = "";
			}
		}
		removeEmptyRows(sourceObject);
		removeEmptyRows(destObject);
		var tempOption = new Option();
		tempOption.text = destOption.text;
		tempOption.value = destOption.value;
		var isReplaced = false;
		for (iOption = 0; iOption < destObject.options.length; iOption++) {
			if (destObject.options[iOption].text > tempOption.text || isReplaced) {
				var tempOption2 = new Option();
				tempOption2.text = destObject.options[iOption].text;
				tempOption2.value = destObject.options[iOption].value;
				destObject.options[iOption].text = tempOption.text;
				destObject.options[iOption].value = tempOption.value;
				tempOption.text = tempOption2.text;
				tempOption.value = tempOption2.value;
				isReplaced = true;
			}
		}
		destObject.selectedIndex = -1;
		sourceObject.selectedIndex = -1;
	}
}
