function toggleMultipleHighlightItem(evt, row) {
	var tbody = row.parentNode;
	if(typeof tbody.selectedItems == 'undefined') tbody.selectedItems = new Array();
	var rows = tbody.getElementsByTagName("tr");
	if(evt.ctrlKey) {
		for(var i=rows.length-1; i>=0; i--) {
			if(rows[i] == row) tbody.selectedIndex = i;
		}
		if(typeof row.selected == 'undefined' || row.selected == false) highlightRow(row);
		else unhighlightRow(row);
	}
	else if(evt.shiftKey && typeof tbody.selectedIndex != 'undefined' && tbody.selectedIndex != null) {
		var lowLimit = null;
		var highLimit = null;
		var newSelectedIndex = null;
		for(var i=0; i<rows.length; i++) {
			if(lowLimit == null && (i == tbody.selectedIndex || rows[i] == row)) {
				lowLimit = i; // on low row
				if(!rows[i].selected) highlightRow(rows[i]);
			}
			else if(lowLimit != null && (rows[i] == row || i == tbody.selectedIndex)) {
				highLimit = i; // on high row
				if(!rows[i].selected) highlightRow(rows[i]);
			}
			else if(lowLimit != null && highLimit == null) {
				if(!rows[i].selected) highlightRow(rows[i]); // between high and low
			}
			else {
				if(rows[i].selected) unhighlightRow(rows[i]); // after hight or before low
			}
			if(rows[i] == row) newSelectedIndex = i;
		}
		tbody.selectedIndex = newSelectedIndex;
	}
	else {
		var multipleSelected = (tbody.selectedItems.length > 1) ? true : false;
		for(var i=rows.length-1; i>=0; i--) {
			if(row.id == rows[i].id) {
				if(typeof row.selected == 'undefined' || row.selected == false) {
					highlightRow(rows[i]);
					tbody.selectedIndex = i;
				}
				else if(!(multipleSelected && row.selected == true)) {
					unhighlightRow(rows[i]);
					tbody.selectedIndex == null;
				}
			}
			else {
				unhighlightRow(rows[i]);
				tbody.selectedIndex == null;
			}
		}
	}
	deselectAllText();
}

function toggleExpandItem(evt, row) {
	var targ = null;
	if(evt.target) targ = evt.target;
	else if(evt.srcElement) targ = evt.srcElement;
	if(!targ || targ.nodeName == "A") return;
	if(row.className.indexOf("expanded") >= 0) row.className = row.className.replace(" expanded","");
	else row.className += " expanded";
}

function toggleExpandAllItems(btn) {
	var rows = btn.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("tr");
	var isFullExpanded = true;
	for(var i=rows.length-1; i>=0; i--) {
		if(rows[i].className.indexOf("expanded") < 0) isFullExpanded = false;
	}
	if(!isFullExpanded) {
		for(var i=rows.length-1; i>=0; i--) {
			if(rows[i].className.indexOf("expanded") < 0) rows[i].className += " expanded";
		}
	}
	else {
		for(var i=rows.length-1; i>=0; i--) {
			rows[i].className = rows[i].className.replace(" expanded","");
		}
	}
}

function toggleExpandItemSublist(evt, row) {
	var subtable = row.nextSibling;
	while(subtable.nodeType == 3) {
		subtable = subtable.nextSibling;
	}
	if(row.className.indexOf("expandedparent") >= 0) {
		row.className = row.className.replace(" expandedparent","");
		subtable.className = subtable.className.replace(" visiblesublist","");
		subtable.className += " hiddensublist";
	}
	else {
		row.className += " expandedparent";
		subtable.className = subtable.className.replace(" hiddensublist","");
		subtable.className += " visiblesublist";
	}
}

function toggleExpandAllItemSublists(btn) {
	var rows = btn.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("tr");
	var isFullSublistExpanded = true;
	for(var i=rows.length-1; i>=0; i--) {
		if(rows[i].className.indexOf("parentItem") >= 0 && rows[i].className.indexOf("expandedparent") < 0) isFullSublistExpanded = false;
	}
	if(!isFullSublistExpanded) {
		for(var i=rows.length-1; i>=0; i--) {
			if(rows[i].className.indexOf("parentItem") >= 0 && rows[i].className.indexOf("expandedparent") < 0) {
				rows[i].className += " expandedparent";
				var subtable = rows[i].nextSibling;
				while(subtable.nodeType == 3) {
					subtable = subtable.nextSibling;
				}
				if(subtable) {
					subtable.className = subtable.className.replace(" hiddensublist","");
					subtable.className += " visiblesublist";
				}
			}
		}
	}
	else {
		for(var i=rows.length-1; i>=0; i--) {
			rows[i].className = rows[i].className.replace(" expandedparent","");
			var subtable = rows[i].nextSibling;
			while(subtable && subtable.nodeType == 3) {
				subtable = subtable.nextSibling;
			}
			if(subtable) {
				subtable.className = subtable.className.replace(" visiblesublist","");
				subtable.className += " hiddensublist";
			}
		}
	}
}

function highlightRow(row) {
	row.selected = true;
	row.className += (row.className.indexOf('rowEven') >= 0) ? " highlightedEven" : " highlightedOdd";
	addHighlightItemToSelected(row);
	showSelectedItemActions(row);
}

function unhighlightRow(row) {
	row.selected = false;
	row.className = (row.className.indexOf('rowEven') >= 0) ? row.className.replace(" highlightedEven","") : row.className.replace(" highlightedOdd","");
	removeHighlightItemFromSelected(row);
	hideSelectedItemActions(row);
}

function addHighlightItemToSelected(row) {
	var tbody = row.parentNode;
	tbody.selectedItems[tbody.selectedItems.length] = row;
}

function removeHighlightItemFromSelected(row) {
	var tbody = row.parentNode;
	var selectedCount = tbody.selectedItems.length;
	for(var i = selectedCount-1; i >= 0; i--) {
		if(tbody.selectedItems[i] == row) {
			switch(i) {
				case 0 : 
					tbody.selectedItems = tbody.selectedItems.slice(1);
					break;
				case selectedCount-1 :
					tbody.selectedItems = tbody.selectedItems.slice(0,i);
					break;
				default :
					var before = tbody.selectedItems.slice(0,i);
					var after = tbody.selectedItems.slice(i+1);
					tbody.selectedItems = before.concat(after);
			}
			break;
		}
	}
}

function showSelectedItemActions(row) {
	var taskmenus = row.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("ul");
	var taskmenu = taskmenus[0];
	if(taskmenu && taskmenu.className == "groupTasks" || taskmenu.className == "objectSubListGroupTasks") taskmenu = taskmenus[1];
	if(taskmenu) {
		showActionItems(taskmenu);
		if(row.className.indexOf("rowgrouphead") >= 0) showActionItems(taskmenus[0]);
	}
}

function showActionItems(taskmenu) {
	var liarray = taskmenu.getElementsByTagName("li");
	for(var i = 0; i < liarray.length; i++) {
		if(liarray[i].className.indexOf("applytoselected") >= 0) {
			liarray[i].style.display = "inline";
		}
	}
	if(taskmenu.className != "objectSubListTasks") setupItemActionEdges(liarray);
	taskmenu.itemActionsVisible = true;
}

function hideSelectedItemActions(row) {
	var taskmenus = row.parentNode.parentNode.parentNode.parentNode.getElementsByTagName("ul");
	var taskmenu = taskmenus[0];
	if(taskmenu && taskmenu.className == "groupTasks" || taskmenu.className == "objectSubListGroupTasks") taskmenu = taskmenus[1];
	if(taskmenu) {
		hideActionItems(taskmenu,row);
		if(row.className.indexOf("rowgrouphead") >= 0) hideActionItems(taskmenus[0],row);
	}
}

function hideActionItems(taskmenu, row) {
	var tbody = row.parentNode;
	if(tbody.selectedItems.length == 0) {
		var liarray = taskmenu.getElementsByTagName("li");
		for(var i = liarray.length-1; i >= 0; i--) {
			if(liarray[i].className.indexOf("applytoselected") >= 0) {
				liarray[i].style.display = "none";
			}
		}
		if(taskmenu.className != "objectSubListTasks") setupItemActionEdges(liarray);
		taskmenu.actionsVisible = false;
	}
}

function setupItemActionEdges(liarray) {
	var left = null
	var right = null;
	for(var i = 0; i < liarray.length; i++) {
		if(liarray[i].style.display != "none") {
			if(left == null) {
				left = liarray[i];
				setItemActionAsLeft(liarray[i]);
			} 
			else {
				right = liarray[i];
				setItemActionAsMiddle(liarray[i]);
			}
		}
	}
	if(left != right && right != null) {
		setItemActionAsRight(right);
	}
	else if(left != null) {
		setItemActionAsSingle(left);
	}
}

function setItemActionAsLeft(itm) {
	itm.className = itm.className.replace("objectListBtn-right","");
	itm.className = itm.className.replace("objectListBtn-both","");
	if(itm.className.indexOf("groupButtonCap-left") < 0) itm.className += " objectListBtn-left";
}

function setItemActionAsRight(itm) {
	itm.className = itm.className.replace("objectListBtn-left","");
	itm.className = itm.className.replace("objectListBtn-both","");
	if(itm.className.indexOf("groupButtonCap-right") < 0) itm.className += " objectListBtn-right";
}

function setItemActionAsSingle(itm) {
	itm.className = itm.className.replace("objectListBtn-right","");
	itm.className = itm.className.replace("objectListBtn-left","");
	if(itm.className.indexOf("groupButtonCap-both") < 0) itm.className += " objectListBtn-both";
}

function setItemActionAsMiddle(itm) {
	itm.className = itm.className.replace("objectListBtn-right","");
	itm.className = itm.className.replace("objectListBtn-left","");
	itm.className = itm.className.replace("objectListBtn-both","");
}

function showGroupContents(grp) {
	var grps = grp.parentNode.getElementsByTagName("li");
	for(var i = grps.length-1; i >= 0; i--) {
		grps[i].className = "";
	} 
	grp.className = "selected";
	loadGroup(grp.id.substring(6));
}

function loadGroup() {
	// placeholder function - need to implement own version of load group pertaining to app
}

function toggleGroup(btn) {
	var container = btn.parentNode.parentNode.parentNode;
	if(container.className.indexOf("minimized") >= 0) container.className = container.className.replace(" minimized","");
	else container.className += " minimized";
}

function deselectAllText() {
	var selObj = null;
	try {
		selObj = getSelection();
	}
	catch(e) {
		try {			
			selObj = document.selection;
		}
		catch(e) {
			try {
				selObj = document.getSelection();
			}
			catch(e) {
				selObj = null;
			}
		}
	}
	if(selObj != null) {
		try {
			selObj.removeAllRanges();
		}
		catch(e) {
			try {
				selObj.empty();
			}
			catch(e) {
				selObj = null;
			}
		}
	}
}