window.Toolkit = {
	$selectIndices: {},
	$deselectActions: {},
	$selectActions: {},
	$popups: -1,
	$toggleIndex: {},
	$toggleStates: {},
	$toggleCount: {},
	$treeListIds: {},
	$treeBulletIds: {},
	$treeDisabledNodes: {},

	doSelect: function(id) {
		var oldIdx = Toolkit.$selectIndices[id];
		var newIdx = document.getElementById(id).selectedIndex;
		var deselActFunc = Toolkit.$deselectActions[id];
		var selActFunc = Toolkit.$selectActions[id];
		if(deselActFunc)
			deselActFunc(oldIdx);
		if(selActFunc)
			selActFunc(newIdx);
		Toolkit.$selectIndices[id] = newIdx;
	},

	changeStyle: function(targetObj, styleArray) {
		var tgt = document.getElementById(targetObj);
		for(var attr in styleArray) {
			var val = styleArray[attr];
			tgt.style[attr] = val;
		}
	},

	doHide: function(compId, type) {
		var comp = document.getElementById(compId);
		if(type == "display")
			comp.style.display = "none";
		else if(type == "visibility");
			comp.style.visibility = "hidden";
	},

	doShow: function(compId, type) {
		var comp = document.getElementById(compId);
		if(type == "display") {
			comp.style.display = "";
			comp.style.visibility = "visible";
		}
		else if(type == "visibility")
			comp.style.visibility = "visible";
	},

	doPost: function(formName) {
		var myForm = document.getElementById(formName);
		myForm.submit();
	},

	doSubmit: function(compId) {
		var myForm = document.getElementById(compId);
		myForm.submit();
	},

	doLink: function(link) {
		window.location = link;
	},

	addRow: function(compId, newRowHTMLidx) {
		compId = compId + "_inner";
		var myTable = document.getElementById(compId);
		myTable.insertRow(myTable.rows.length);
		myTable.rows[myTable.rows.length-1].innerHTML = Toolkit.$addrow_html[newRowHTMLidx];
	},

	removeRow: function(compId, rowIdx) {
		compId = compId + "_inner";
		var myTable = document.getElementById(compId);
		if(rowIdx == -1) {	// remove last row
			myTable.deleteRow(myTable.rows.length-1);
		}
		else {
			myTable.deleteRow(rowIdx);
		}
	},

	setSrc: function(compId, src) {
		var myIframe = document.getElementById(compId);
		myIframe.src = src;
	},

	doSWATPost: function(formName) {
		var myForm = document.getElementById(formName);
		myForm.submit();
	},

	doChangeText: function(compId, newText) {
		var comp = document.getElementById(compId + "_obj");
		if(comp == null) {
			comp = document.getElementById(compId);
		}
		comp.innerHTML = newText;
	},

	doToggleNext: function(toggleId) {
		var cur = Toolkit.$toggleIndex[toggleId];
		Toolkit.$toggleStates[toggleId](cur);
		if(Toolkit.$toggleIndex[toggleId] == Toolkit.$toggleCount[toggleId] - 1) {
			Toolkit.$toggleIndex[toggleId] = 0;
		}
		else {
			Toolkit.$toggleIndex[toggleId] = Toolkit.$toggleIndex[toggleId] + 1;
		}
	},

	toggleDisplay: function(itemId, nodeId, collapseClass, expandClass) {
		var item = document.getElementById(itemId);
		var node = document.getElementById(nodeId);
		if(item.style.display == 'none') {
			item.style.display = '';
			node.className = collapseClass;
		}
		else {
			item.style.display= 'none';
			node.className = expandClass;
		}
	},

	collapseTree: function(treeId, expandClass) {
		for(var i = 0; i < Toolkit.$treeListIds[treeId].length; i++) {
			var node = document.getElementById(Toolkit.$treeListIds[treeId][i]);
			node.style.display = 'none';
		}
		for(var i = 0; i < Toolkit.$treeBulletIds[treeId].length; i++) {
			var bullet = document.getElementById(Toolkit.$treeBulletIds[treeId][i]);
			bullet.className = expandClass;
		}
	},

	expandTree: function(treeId, collapseClass) {
		for(var i = 0; i < Toolkit.$treeListIds[treeId].length; i++) {
			var node = document.getElementById(Toolkit.$treeListIds[treeId][i]);
			node.style.display = '';
		}
		for(var i = 0; i < Toolkit.$treeBulletIds[treeId].length; i++) {
			var bullet = document.getElementById(Toolkit.$treeBulletIds[treeId][i]);
			bullet.className = collapseClass;
		}
	},

	collapseNode: function(treeId, nodeId, expandClass) {
		var node = document.getElementById("list_" + nodeId);
		var bullet = document.getElementById("bullet_" + nodeId);
		node.style.display = 'none';
		bullet.className = expandClass;
	},

	expandNode: function(treeId, nodeId, collapseClass) {
		var node = document.getElementById("list_" + nodeId);
		var bullet = document.getElementById("bullet_" + nodeId);
		for(var i = 0; i < Toolkit.$treeDisabledNodes[treeId].length; i++) {
			if(Toolkit.$treeDisabledNodes[treeId][i] == nodeId)
				return;
		}
		node.style.display = '';
		bullet.className = collapseClass;
	},

	disableNode: function(treeId, nodeId, expandClass) {
		Toolkit.toggleDisplay(treeId, nodeId, expandClass);
		Toolkit.$treeDisabledNodes[treeId].push(nodeId);
	},

	enableNode: function(treeId, nodeId) {
		for(var i = 0; i < Toolkit.$treeDisabledNodes[treeId].length; i++) {
			if(Toolkit.$treeDisabledNodes[treeId][i] == nodeId) {
				Toolkit.$treeDisabledNodes[treeId].splice(i, 1);
				return;
			}
		}
	},

	toggleNode: function(tableId, nodeArrayId, nodeStatusArrayId, nodeId) {
		var show = 0;
		if(Toolkit.$nodeStatus[nodeStatusArrayId][nodeId] == 0)
			show = 1;
		Toolkit._changeNode(tableId, nodeArrayId, nodeStatusArrayId, nodeId, show);
	},

	_changeNode: function(tableId, nodeArrayId, nodeStatusArrayId, nodeId, show) {
		var table = document.getElementById(tableId);
		var tArray = Toolkit.$nodes[nodeArrayId];
		// we want to hide this node, and change its status to hidden,
		//   and hide its children, but not change their status
		Toolkit.$nodeStatus[nodeStatusArrayId][nodeId] = show;
		var nd = document.getElementById("node" + nodeId + "_bullet");
		if(show == 0)
			nd.className = "plus";
		else
			nd.className = "minus";
		Toolkit._changeSubtree(table, tArray, Toolkit.$nodeStatus[nodeStatusArrayId], nodeId, show,
					Toolkit._showNode, Toolkit._hideNode);
		Toolkit._fixColors(tableId, nodeStatusArrayId, 'oddRow', 'evenRow');
	},

	_changeSubtree: function(table, nodeArray, nodeStatusArray, nodeId, show,
								showAction, hideAction) {
		var i = 0;

		for(i = nodeId + 1; i < nodeArray.length; i++) {
			if(nodeArray[i] != nodeId)
				continue;
			if(show == 1) showAction(table, i + 1);
			else hideAction(table, i + 1);
			if(show == 0 || nodeStatusArray[i] == 1)
				Toolkit._changeSubtree(table, nodeArray, nodeStatusArray, i, show,
							showAction, hideAction);
		}
	},

	_hideNode: function(table, node) {
		table.rows[node].style.display = 'none';
	},

	_showNode: function(table, node) {
		table.rows[node].style.display = '';
	},

	_fixColors: function(tableId, stateArray, oddClass, evenClass) {
		var table = document.getElementById(tableId);
		var i;
		var isOdd = 1;
		for(i = 1; i < table.rows.length; i++) {
			if(Toolkit.$stateArray[stateArray][i-1] == 1) {
				if(isOdd == 1) {
					table.rows[i].className = oddClass;
					isOdd = 0;
				}
				else {
					table.rows[i].className = evenClass;
					isOdd = 1;
				}
			}
		}
	},

	hidePopup: function(popupId) {
		if(popupId == -1)
			return;
		Toolkit.$popups = -1;
		var popup = document.getElementById(popupId);
		popup.style.display = 'none';
	},

	showPopup: function(popupId) {
		Toolkit.hidePopup(Toolkit.$popups);
		Toolkit.$popups = popupId;
		var popup = document.getElementById(popupId);
		popup.style.display = '';
	},

	togglePopup: function(popupId) {
		if(Toolkit.$popups == popupId)
			Toolkit.hidePopup(popupId);
		else
			Toolkit.showPopup(popupId);
	}
};
