function openHelpWindow(inHandler, inLanguage, inType, inID, inPermGroup)
{
	var type = inType;

	if(type.length == 0)
	{
		type = 'page';
	}

	var url = '/help?destination=Help:Main:' + inHandler + ':' + type + ':' + inLanguage + ':' + inID + '&permgroup=' + inPermGroup;

	helpWindow = window.open(url, inHandler + 'help', 'left=20,top=20,height=560,width=680,toolbar=0,location=no,menubar=0,status=0,scrollbars=0,resizable=1');

	helpWindow.focus();
}

var pickerElementID;

var pickerChangeAction;

function openPicker(inURL, inElementID, inChangeAction)
{
	pickerElementID = inElementID;

	pickerChangeAction = inChangeAction;

	open(inURL, 'picker', 'width=440,height=440,menubar=no,resizable=yes,scrollbars=yes,status=no,toolbar=no');
}

function getPickerElement()
{
	if(pickerElementID)
	{
		var element = document.getElementById(pickerElementID);

		if(element)
		{
			return element.value;
		}
	}

	return null;
}

function updatePickerElement(inValue, inHTML)
{
	if(pickerElementID)
	{
		var fireChange = false;

		var element = document.getElementById(pickerElementID);

		if(element)
		{
			element.value = inValue;
		}

		var elementHTML = document.getElementById(pickerElementID + "_html");

		if(elementHTML)
		{
			elementHTML.innerHTML = inHTML;
		}

		if(pickerChangeAction)
		{
			eval(pickerChangeAction);
		}
	}

	pickerElementID = null;
}

var colorElementID;

function openColorPicker(inElementID)
{
	colorElementID = inElementID;

	var url = "/server/colorpicker/picker.html";

	open(url, 'picker', 'width=300,height=300,menubar=no,resizable=yes,scrollbars=no,status=no,toolbar=no');
}

function getColor()
{
	var colorElement = getColorPicker();

	if(colorElement)
	{
		return colorElement.value;
	}

	return "ffffff";
}

function setColor(inColor)
{
	var colorElement = getColorPicker();

	if(colorElement)
	{
		colorElement.value = inColor;

		updateColorPicker(colorElementID);
	}

	self.focus();
}

function getColorPicker()
{
	if(colorElementID)
	{
		return document.getElementById(colorElementID);
	}

	return null;
}

function updateColorPicker(inElementID)
{
	var colorElement = document.getElementById(inElementID);

	if(colorElement)
	{
		var color = "ffffff";

		var defaultColorElement = document.getElementById(inElementID + "_default");

		var swatchElement = document.getElementById(inElementID + "_swatch");

		if(swatchElement)
		{
			if(colorElement.value.length == 6)
			{
				color = colorElement.value;
			}
			else if(defaultColorElement.value.length == 6)
			{
				color = defaultColorElment.value;
			}

			swatchElement.style.backgroundColor = color;
		}
		
		var footnote = document.getElementById(inElementID + "_footnote");
			
		if(footnote)
		{
			var recommendedColorElement = document.getElementById(inElementID + "_footnote");

			if(recommendedColorElement.value == color)
			{
				footnote.style.visibility = "hidden"	
			}
			else
			{
				footnote.style.visibility = "visible"	
			}
		}
	}
}

var dateElementID;

function openDatePicker(inElementID, inLocale)
{
	dateElementID = inElementID;

	var url = "/server/calendar/calendar.html";

	if(inLocale)
	{
		url += "?locale=" + inLocale;
	}

	open(url, 'picker', 'width=220,height=220,menubar=no,resizable=yes,scrollbars=no,status=no,toolbar=no');
}

function getDatePicker()
{
	if(dateElementID)
	{
		return document.getElementById(dateElementID);
	}

	return null;
}

function setDatePicker(inYear, inMonth, inDay)
{
	var dateElement = getDatePicker();

	if(dateElement)
	{
		dateElement.value = "" + inYear + "-" + inMonth + "-" + inDay;

		updateDateControls(dateElementID);
	}

	self.focus();
}

function updateDatePicker(inElementID)
{
	var dateElement = document.getElementById(inElementID);

	if(dateElement)
	{
		var yearElement = document.getElementById(inElementID + "_year");
		var monthElement = document.getElementById(inElementID + "_month");
		var dayElement = document.getElementById(inElementID + "_day");

		var year = parseInt(yearElement.value);
		var month = parseInt(monthElement.value);
		var day = parseInt(dayElement.value);

		dateElement.value = year + "-" + month + "-" + day;

		updateDateControls(inElementID);
	}
}

function updateDateControls(inElementID)
{
	var dateElement = document.getElementById(inElementID);
	var yearElement = document.getElementById(inElementID + "_year");
	var monthElement = document.getElementById(inElementID + "_month");
	var dayElement = document.getElementById(inElementID + "_day");

	var parts = dateElement.value.split("-");
	var year = parseInt(parts[0]);
	var month = parseInt(parts[1]);
	var day = parseInt(parts[2]);

	var i;
	
	if(yearElement)
	{
		yearElement.value = year;
	}

	if(monthElement)
	{
		for(i = 0; i < monthElement.options.length; i++)
		{
			if(monthElement.options[i].value == month)
			{
				monthElement.options[i].selected = true;
			}
			else
			{
				monthElement.options[i].selected = false;
			}
		}

		var daysInMonth = new Date(year, month, 0).getDate();

		if(day > daysInMonth)
		{
			day = daysInMonth;

			dateElement.value = year + "-" + month + "-" + day;
		}
	}

	if(dayElement)
	{
		var count = 0;

		for(i = 1; i <= 31; i++)
		{
			if(i <= daysInMonth)
			{
				var name = new String(i);

				dayElement.options[count] = new Option(name, name);

				if(i == day)
				{
					dayElement.options[count].selected = true;
				}

				count++;
			}
			else
			{
				dayElement.options[count] = null;
			}
		}
	}
}

function checkCookies()
{
	var cookietest = getCookie("cookietest");

	var cookies = false;

	if(cookietest)
	{
		cookies = cookietest == "ok";
	}

	var detector = document.getElementById("cookiedetector");

	if(!cookies)
	{
		detector.style.display = "";
	}
	else
	{
		detector.style.display = "none";
	}
}

function checkCapsLock(e)
{
	var myKeyCode = 0;
	var myShiftKey = false;
	var myCapsLock = false;

	if(document.all) // Internet Explorer
	{
		e = window.event;
		myKeyCode = e.keyCode;
		myShiftKey = e.shiftKey;
	}
	else if(document.layers) // Netscape 4
	{
		myKeyCode = e.which;
		myShiftKey = (myKeyCode == 16) ? true : false;
	}
	else if(document.getElementById) // Netscape 6
	{
		myKeyCode = e.which;
		myShiftKey = e.shiftKey || ( e.modifiers && ( e.modifiers & 4 ) );
	}

	if((myKeyCode >= 65 && myKeyCode <= 90) && !myShiftKey)
	{
		myCapsLock = true;
	}
	else if((myKeyCode >= 97 && myKeyCode <= 122) && myShiftKey)
	{
		myCapsLock = true;
	}

	var detector = document.getElementById("capslockdetector");

	if(myCapsLock)
	{
		detector.style.display = "";
	}
	else
	{
		detector.style.display = "none";
	}
}

function displayElement(inId)
{
	var element = document.getElementById(inId);

	if(element)
	{
		element.style.display = '';
	}
}

var trees = new Array();

function Tree(inName, inExpandedURL, inCollapsedURL, inStopRedraw)
{
	this.name = inName;
	this.expandedURL = inExpandedURL;
	this.collapsedURL = inCollapsedURL;
	this.stopRedraw = inStopRedraw;
}

function addTree(inName, inExpandedURL, inCollapsedURL, inStopRedraw)
{
	trees[trees.length] = new Tree(inName, inExpandedURL, inCollapsedURL, inStopRedraw);
}

function getTree(inName)
{
	for(i = 0; i < trees.length; i++)
	{
		if(trees[i].name == inName)
		{
			return trees[i];
		}
	}
}

function toggleTree(event, inToggle, inName, inToggleID, inID)
{
	var tree = getTree(inName);

	if(tree)
	{
		var element = document.getElementById(inToggleID);

		if(element)
		{
			if(element.style.display == 'none')
			{
				element.style.display = '';

				inToggle.src = tree.expandedURL;

				toggle(inName, inID, true)
			}
			else
			{
				element.style.display = 'none';

				inToggle.src = tree.collapsedURL;

				toggle(inName, inID, false)
			}
		}

		if(tree.stopRedraw && browser.ie)
		{
			window.ie.needs.help = true;
		}
	}
}

function toggleTreeTable(event, inToggle, inName, inID, parentNum, startNum, endNum)
{
	var tree = getTree(inName);

	if(tree)
	{
		var parentClassName = inName + parentNum;

		for(i = startNum; i <= endNum; i++)
		{
			var row = document.getElementById(inName + i);

			if(row)
			{
				if(row.className == parentClassName)
				{
					row.className = '';
					row.style.display = '';
				}
				else if(row.className == '')
				{
					row.className = parentClassName;
					row.style.display = 'none';
				}
			}
		}

		if(inToggle)
		{
			var source = inToggle.src;

			if(source.substring(source.length - tree.collapsedURL.length) == tree.collapsedURL)
			{
				inToggle.src = tree.expandedURL;

				toggle(inName, inID, true);
			}
			else
			{
				inToggle.src = tree.collapsedURL;

				toggle(inName, inID, false);
			}

			cancelEvent(event);
		}
	}
}

function toggle(inName, inID, inExpanded)
{
	var expanded = document.getElementById(inName + "_expanded");

	if(expanded)
	{
		var expansions = expanded.value.split(",");

		for(i = 0; i < expansions.length; i++)
		{
			if(expansions[i] == inID)
			{
				expansions[i] = null;

				break;
			}
		}

		if(inExpanded)
		{
			expansions[expansions.length] = inID;
		}

		expanded.value = '';

		for(i = 0; i < expansions.length; i++)
		{
			if(expansions[i])
			{
				if(expanded.value.length > 0)
				{
					expanded.value += ',';
				}

				expanded.value += expansions[i];
			}
		}

		var persistent = document.getElementById(inName + "_persistent");

		if(persistent)
		{
			setCookie(persistent.value, expanded.value, 0, "/");
		}
	}
}

var selectGroups = new Array();

function SelectGroup(inName, inColor, isTree)
{
	this.name = inName;
	this.color = inColor;
	this.selectors = new Array();
	this.listeners = new Array();
	this.singleListeners = new Array();
	this.lastSelection = 0;
	this.positions = new Array();
	this.positionAction = null;
	this.positionPrefix = null;
	this.isTree = isTree;
}

function Selector(inNumber, inID, inSelected)
{
	this.number = inNumber;
	this.id = inID;
	this.selected = inSelected;
}

function addSelectGroup(inName, inColor, isTree)
{
	selectGroups[selectGroups.length] = new SelectGroup(inName, inColor, isTree);
}

function getSelectGroup(inName)
{
	for(i = 0; i < selectGroups.length; i++)
	{
		if(selectGroups[i].name == inName)
		{
			return selectGroups[i];
		}
	}
}

function addSelector(inName, inNumber, inID, inSelected)
{
	if(inID)
	{
		var selectGroup = getSelectGroup(inName);

		if(selectGroup)
		{
			selectGroup.selectors[selectGroup.selectors.length] = new Selector(inNumber, inID, inSelected);
		}
	}
}

function addSelectListener(inName, inListener)
{
	if(inListener)
	{
		var selectGroup = getSelectGroup(inName);

		if(selectGroup)
		{
			selectGroup.listeners[selectGroup.listeners.length] = inListener;
		}
	}
}

function addSingleSelectListener(inName, inListener)
{
	if(inListener)
	{
		var selectGroup = getSelectGroup(inName);

		if(selectGroup)
		{
			selectGroup.singleListeners[selectGroup.singleListeners.length] = inListener;
		}
	}
}

function updateSelection(inName)
{
	var selectGroup = getSelectGroup(inName);

	if(selectGroup)
	{
		var selectors = selectGroup.selectors;

		var hidden = document.getElementById(selectGroup.name + "selected");

		var totalSelected = 0;

		hidden.value = "";

		for(i = 0; i < selectors.length; i++)
		{
			if(selectors[i])
			{
				var element = document.getElementById(selectGroup.name + selectors[i].number);

				if(element)
				{
					if(selectors[i].selected)
					{
						if(hidden.value.length > 0)
						{
							hidden.value += ",";
						}

						hidden.value += selectors[i].id;

						totalSelected++;

						element.style.backgroundColor = selectGroup.color;
					}
					else
					{
						element.style.backgroundColor = '';
					}
				}
			}
		}

		var listener;
		var listeners = selectGroup.listeners;

		for(i = 0; i < listeners.length; i++)
		{
			listener = document.getElementById(listeners[i]);

			if(listener)
			{
				listener.disabled = (totalSelected < 1);
			}
		}

		listeners = selectGroup.singleListeners;

		for(i = 0; i < listeners.length; i++)
		{
			listener = document.getElementById(listeners[i]);

			if(listener)
			{
				listener.disabled = (totalSelected != 1);
			}
		}

		updatePositionMask();
	}
}

function selectElement(inEvent, inName, inNumber)
{
	if(inEvent.shiftKey || inEvent.ctrlKey || inEvent.altKey || inEvent.metaKey)
	{
		selectMultiple(inEvent, inName, inNumber);
	}
	else
	{
		selectSingle(inEvent, inName, inNumber);
	}
}

function selectSingle(inEvent, inName, inNumber)
{
	var selectGroup = getSelectGroup(inName);

	if(selectGroup)
	{
		for(i = 0; i < selectGroup.selectors.length; i++)
		{
			if(selectGroup.selectors[i].number == inNumber)
			{
				selectGroup.selectors[i].selected = true;
			}
			else
			{
				selectGroup.selectors[i].selected = false;
			}
		}
	}

	updateSelection(inName);
}

function selectMultiple(inEvent, inName, inNumber)
{
	var selectGroup = getSelectGroup(inName);

	if(selectGroup)
	{
		for(i = 0; i < selectGroup.selectors.length; i++)
		{
			if(selectGroup.selectors[i].number == inNumber)
			{
				selectGroup.selectors[i].selected = !selectGroup.selectors[i].selected;
			}
		}
	}

	updateSelection(inName);
}

var positionStartX;
var positionStartY;
var positionBegin = false;
var positionGroup;
var positionSource;
var positionTarget;
var positionType;

function setPositionable(inName, inAction, inPrefix)
{
	var selectGroup = getSelectGroup(inName);

	if(selectGroup)
	{
		selectGroup.positionAction		= inAction;
		selectGroup.positionPrefix		= inPrefix;
	}
}

function resetPositioning()
{
	positionStartX  = -1;
	positionStartY	= -1;
	positionBegin	= false;
	positionGroup	= null;
	positionSource	= null;
	positionTarget	= null;
	positionType	= null;

	document.getElementById("positionmask").style.display = 'none';

	document.getElementById("positionarrow").style.display = 'none';
}

function startPositioning(event, inName)
{
	clearPositioning();

	resetPositioning();

	positionGroup = getSelectGroup(inName);

	if(positionGroup)
	{
		updatePositions();

		positionSource	= getPosition(event);
	}
}

function movePositioning(event)
{
	if(positionBegin)
	{
		if(positionSource)
		{
			var position = getPosition(event);

			if(position)
			{
				positionTarget	= position;

				var x = getX(event);

				var y = getY(event);

				if(positionGroup.isTree)
				{
					var topQuarter = position.top + (position.bottom - position.top) / 4;

					var bottomQuarter = position.top + (position.bottom - position.top) * 3 / 4;

					if(y < topQuarter)
					{
						positionType = "before";
					}
					else if(y >= bottomQuarter)
					{
						positionType = "after";
					}
					else
					{
						positionType = "in";
					}
				}
				else
				{
					var middle = (position.top + position.bottom) / 2;

					if(y < middle)
					{
						positionType = "before";
					}
					else
					{
						positionType = "after";
					}
				}

				clearPositioning();

				hilitePosition(positionType, position);
			}
		}
		else
		{
			resetPositioning();
		}
	}
	else
	{
		if(positionSource)
		{
			if(Math.abs(getX(event) - positionStartX) > 1 || Math.abs(getY(event) - positionStartY) > 5)
			{
				positionBegin = true;

				document.getElementById("positionmask").style.display = '';
			}
		}
	}
}

function endPositioning(event)
{
	var action;

	if(positionGroup)
	{
		if(positionTarget && positionTarget != positionSource)
		{
			var reposition = document.getElementById(positionGroup.name + "reposition");

			reposition.value = positionSource.id + " " + positionType + " " + positionTarget.id;

			action = positionGroup.positionAction;
		}
	}

	clearPositioning();

	resetPositioning();

	if(action)
	{
		eval(action);
	}
}

function hilitePosition(inType, inPosition)
{
	var arrow = document.getElementById("positionarrow");

	var hoffset = 11;
	var voffset = 5;

	arrow.style.display = '';

	if(inPosition.node.nodeName == "TR")
	{
		for(var j = 0; j < inPosition.node.cells.length; j++)
		{
			if(inType == "before")
			{
				inPosition.node.cells[j].style.borderTopWidth = '2';
				inPosition.node.cells[j].style.borderTopStyle = 'solid';
				inPosition.node.cells[j].style.borderTopColor = positionGroup.color;

				arrow.style.left = inPosition.left - hoffset;
				arrow.style.top = inPosition.top - voffset;
			}
			else if(inType == "after")
			{
				inPosition.node.cells[j].style.borderBottomWidth = '2';
				inPosition.node.cells[j].style.borderBottomStyle = 'solid';
				inPosition.node.cells[j].style.borderBottomColor = positionGroup.color;

				arrow.style.left = inPosition.left - hoffset;
				arrow.style.top = inPosition.bottom - voffset;
			}
		}
	}
	else
	{
		if(inType == "before")
		{
			inPosition.node.style.borderTopWidth = '2';
			inPosition.node.style.borderTopStyle = 'solid';
			inPosition.node.style.borderTopColor = positionGroup.color;

			arrow.style.left = inPosition.left - hoffset;
			arrow.style.top = inPosition.top - voffset;
		}
		else if(inType == "after")
		{
			inPosition.node.style.borderBottomWidth = '2';
			inPosition.node.style.borderBottomStyle = 'solid';
			inPosition.node.style.borderBottomColor = positionGroup.color;

			arrow.style.left = inPosition.left - hoffset;
			arrow.style.top = inPosition.bottom - voffset;
		}
		else if(inType == "in")
		{
			inPosition.node.style.backgroundColor = positionGroup.color;

			arrow.style.left = inPosition.left - hoffset;
			arrow.style.top = ((inPosition.top + inPosition.bottom) / 2) - voffset;
		}
	}
}

function clearPositioning()
{
	if(positionGroup)
	{
		var positions = positionGroup.positions;

		for(var i = 0; i < positions.length; i++)
		{
			if(positions[i].node.nodeName == "TR")
			{
				for(var j = 0; j < positions[i].node.cells.length; j++)
				{
					if(positions[i].node.cells[j].style)
					{
						positions[i].node.cells[j].style.borderTopWidth = '';
						positions[i].node.cells[j].style.borderTopStyle = '';
						positions[i].node.cells[j].style.borderTopColor = '';

						positions[i].node.cells[j].style.borderBottomWidth = '';
						positions[i].node.cells[j].style.borderBottomStyle = '';
						positions[i].node.cells[j].style.borderBottomColor = '';
					}
				}
			}
			else
			{
				if(positions[i].node.style)
				{
					positions[i].node.style.borderTopWidth = '';
					positions[i].node.style.borderTopStyle = '';
					positions[i].node.style.borderTopColor = '';

					positions[i].node.style.borderBottomWidth = '';
					positions[i].node.style.borderBottomStyle = '';
					positions[i].node.style.borderBottomColor = '';

					if(positionGroup.isTree)
					{
						positions[i].node.style.backgroundColor = '';
					}
				}
			}
		}
	}
}

function Position(inNode, inID, inLeft, inTop)
{
	this.node = inNode;
	this.id = inID;

	this.originalLeft = inLeft;
	this.originalTop = inTop;

	this.width = inNode.offsetWidth;
	this.height = inNode.offsetHeight;

	if(inNode.nodeName == "TR")
	{
		this.width = 0;

		for(var i = 0; i < inNode.cells.length; i++)
		{
			this.width += inNode.cells[i].offsetWidth;
		}

		this.height = inNode.cells[0].offsetHeight;
	}

	this.left = inLeft;
	this.top = inTop;
	this.right = inLeft + this.width;
	this.bottom = inTop + this.height;
}

function getPosition(event)
{
	if(positionGroup)
	{
		var x = getX(event);

		var y = getY(event);

		var positions = positionGroup.positions;

		for(var i = 0; i < positions.length; i++)
		{
			if(x >= positions[i].left && x < positions[i].right && y >= positions[i].top && y < positions[i].bottom)
			{
				return positions[i];
			}
		}
	}
}

function updatePositions()
{
	if(positionGroup)
	{
		var prefix = positionGroup.positionPrefix;

		if(prefix)
		{
			positionGroup.positions = new Array();

			var selectors = positionGroup.selectors;

			for(var i = 0; i < selectors.length; i++)
			{
				var positionNode = document.getElementById(prefix + selectors[i].number);

				if(positionNode)
				{
					var left = 0;
					var top = 0;

					var node = positionNode;

					while(node)
					{
						if(node.nodeName == "TR")
						{
							left += node.cells[0].offsetLeft;
							top += node.cells[0].offsetTop;
						}
						else
						{
							left += node.offsetLeft;
							top  += node.offsetTop;
						}

						node = node.offsetParent;
					}

					positionGroup.positions[positionGroup.positions.length] = new Position(positionNode, selectors[i].id, left, top);
				}
			}
		}
	}
}

var lastX;
var lastY;

function getX(event)
{
	if(browser.ie)
	{
		if(window.event)
		{
			lastX = window.event.x + document.body.scrollLeft;
		}
	}
	else
	{
		if(event)
		{
			lastX = event.pageX;
		}
	}

	return lastX;
}

function getY(event)
{
	if(browser.ie)
	{
		if(window.event)
		{
			lastY = window.event.y + document.body.scrollTop;
		}
	}
	else
	{
		if(event)
		{
			lastY = event.pageY;
		}
	}

	return lastY;
}

function disableSelect()
{
	if(positionSource)
	{
		return false;
	}
}

function restoreSelect()
{
	return true;
}

function verify(msg)
{
	if (!confirm(msg))
	{
		if(browser.ie)
		{
			event.cancelBubble = true;
		}

		return false;
	}
	return true;
}

function updateProgress(inElementName, inIdentifier)
{
	var progress = document.getElementById(inElementName);
	
	progress.value = inIdentifier;
	
	document.forms[0].submit();
}

document.onselectstart = disableSelect;

document.onmousedown = disableSelect;

document.onclick = restoreSelect;

document.write("<div id='positionmask' onmouseup='endPositioning(event)' onmousemove='movePositioning(event)' style='cursor:pointer;display:none;background-image:url(\"/server/images/spacer.gif\");z-index:100;position:absolute;left:0;top:0;width:100%;height:100%'></div>");

document.write("<img id='positionarrow' src='/server/images/arrow.gif' style='display:none;z-index:99;position:absolute;'>");

function updatePositionMask()
{
	var mask = document.getElementById("positionmask");

	mask.style.width = document.body.scrollWidth;

	mask.style.height = document.body.scrollHeight;
}

function toggleRadioCheckBoxes(current)
{
	var isChecked = current.checked;

	for(i=0 ; i < eval('current.form.' + current.name + '.length'); i++)
	{
		eval('current.form.' + current.name + '[' + i + ']').checked = false;
	}

	if(isChecked)
	{
		current.checked = true;
	}
}

window.onresize = updatePositionMask;


var submitButtons = new Array();

function testSubmitButton(inButton)
{
	for(i = 0; i < submitButtons.length; i++)
	{
		if(submitButtons[i] == inButton.name)
		{
			return false;
		}
	}
	
	submitButtons[submitButtons.length] = inButton.name;
	
	return true;
}
