/* *****************************************
            STANDARD HELIX JS FILE 
    This file is updated with new releases.
    Avoid editing this file.
   *****************************************
    Revision: 2.0.0
   ***************************************** */

addEvent(window, 'load', ie6menuFix); // Add the IE6 Menu handler to the onLoad stack
addEvent(window, 'load', winInit);

// Generic AddEvent Function
function addEvent(obj, evType, fn){ 
	if (obj.addEventListener) {
		obj.addEventListener(evType, fn, false); 
		return true;
	} else if (obj.attachEvent) {
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		return false;
	} 
}

/* Progress Bar Functions */
function setupProgBar(id) {
	var bar = document.getElementById(id);
	if (bar) {
		bar.innerHTML = '';
		bar.style.height = '15px';
		bar.style.border = '1px solid red';
		bar.style.padding = '0';
		var meter = document.createElement('div');
		meter.style.height = '100%';
		meter.style.overflow = 'hidden';
		meter.style.backgroundImage = 'url(/images/progBar_bg.gif)';
		meter.style.width = '5%';
		meter.id = id + '_meter';
		bar.appendChild(meter);
		var leftImg = document.createElement('img');
		leftImg.src = '/images/progBar_left.gif';
		leftImg.style.cssFloat = 'left';
		leftImg.style.styleFloat = 'left';
		meter.appendChild(leftImg);
		var rightImg = document.createElement('img');
		rightImg.src = '/images/progBar_right.gif';
		rightImg.style.cssFloat = 'right';
		rightImg.style.styleFloat = 'right';
		meter.appendChild(rightImg);		
		return true;
	} else {
		return false;	
	}	
}

function setProgress(bar, value) {
	var meter = document.getElementById(bar+'_meter');
	if (meter) {
		if (value < 0) value = 0;
		if (value > 100) value = 100;
		meter.style.width = value+'%';
		return true;
	} else {
		return false;	
	}
}

/* Menu fix for IE6 */
function activateMenu(nav) {
	// currentStyle restricts the Javascript to IE only
	var navroot = document.getElementById(nav);  
	if (document.all && navroot && navroot.currentStyle) {          
		// Get all the list items within the menu 
		var lis = navroot.getElementsByTagName("LI");  
		for (i=0; i < lis.length; i++) {		
			// If the LI has another menu level
			if (lis[i].lastChild && (lis[i].lastChild.tagName == "UL")) {
				// assign the function to the LI
				lis[i].onmouseover = function() {					
					this.lastChild.style.display = "block";
				}
				lis[i].onmouseout = function() {                       
					this.lastChild.style.display = "none";
				}
			}
		}	// end for
	}	// end if
}

/* By default, 'dropdownmenu' is a suckerfish menu, needs fixing in IE6 */
function ie6menuFix() {
	// If you want other menus added, add them below or in a seperate JS file add the line
	// addEvent(window, 'load', someFunction);
	// with someFunction being a function like this with a list of menus
    activateMenu('dropdownmenu'); 
}

// Effecient browser detection
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

// Initialises a single thread AJAX object
function initAjax() { 
	var ajax = null;
	if (window.XMLHttpRequest) {
		ajax = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		ajax = new ActiveXObject("Microsoft.XMLHTTP");
	}	
	return ajax;
}

// Make a GET AJAX call. Calling this function again will abort a previous call unless abort is set to false
function ajaxCall(url, callback) {
	//if (typeof(ajax) == "undefined") ajax = initAjax();
	ajax = initAjax();
	if (ajax == null) return;
	
	ajaxCallback = callback;
	ajax.onreadystatechange = callback;
	ajax.open( "GET", url, true );
	ajax.send( null );
}

/* Page Finder */
function showFinder() {
	winList['pfWindow'].open();
	pfSearch();
}

function pfSearch() {
	q = escape(document.getElementById('pfSearch').value);
	pfAjax = initAjax();
	pfAjax.onreadystatechange = pf_callback;
	pfAjax.open( "GET", "/_std.ajax?action=6&search="+q, true );
	pfAjax.send( null );
}

function pf_callback() {
	if (!(pfAjax.readyState==4 || pfAjax.readyState=="complete")) return;
	if (pfAjax.responseXML) {
		var root = pfAjax.responseXML.getElementsByTagName('pagedata')[0];
		var code = root.getAttribute("code");
		if (code == "ok") {
			// Show results
			var itemRoot = pfAjax.responseXML.getElementsByTagName('searchItems')[0];
			var items = itemRoot.getElementsByTagName("item");
			document.getElementById("pfResults").innerHTML = "";
			for (var i = 0 ; i < items.length ; i++) {
				var currentItem = items[i];
				var toc;
				var title;
				var url;
				var id = currentItem.getElementsByTagName("id")[0].firstChild.nodeValue;
				if (currentItem.getElementsByTagName("toc")[0].firstChild) {
					toc = currentItem.getElementsByTagName("toc")[0].firstChild.nodeValue;	
				} else {
					toc = "[No TOC]"
				}
				title = currentItem.getElementsByTagName("title")[0].firstChild.nodeValue;
				url = currentItem.getElementsByTagName("url")[0].firstChild.nodeValue;
				document.getElementById("pfResults").innerHTML += '\
				<div class="pfItem" onClick="pfClick('+id+')">\
					<div class="pfID">'+id+' - <span class="pfTOC" id="pfToc'+id+'">'+toc+'</span></div>\
					<div class="pfTitle">'+title+'</div>\
					<div class="pfURL" id="pfURL'+id+'">'+url+'</div>\
				</div>';
			}
		} else {
			// No access
				document.getElementById("pfResults").innerHTML = '\
				<div class="pfItem">\
					<div class="pfID">No Access</div>\
					<div class="pfURL">Content level access is required to access page information.</div>\
				</div>';			
		}
	}	// end if (pfAjax.responseXML)	
}

function pfClick(id) {
	toc = document.getElementById('pfToc'+id);
	link = document.getElementById('pfLink');
	if (toc.innerHTML == "[No TOC]") {
		link.innerHTML = document.getElementById('pfURL'+id).innerHTML;
	} else {
		link.innerHTML = '{LINK='+toc.innerHTML+'}';
	}
	autoSelect(link);
}

// Selects an object
function autoSelect(el) {
	if (el && (el.tagName == "TEXTAREA" || (el.tagName == "INPUT" && el.type == "text"))) {
		el.select();
	} else if (el && window.getSelection) { // FF, Safari, Opera
		var sel = window.getSelection();
		var range = document.createRange();
		range.selectNodeContents(el);
		sel.removeAllRanges();
		sel.addRange(range);
	} else if (el) { // IE
		document.selection.empty();
		var range = document.body.createTextRange();
		range.moveToElementText(el);
		range.select();
	}
}

// WYSIWYG Controls
/* Page Finder */
function showWC() {
	winList['wcWindow'].open();
	wcCheck();
}

// Check the WC status and return it to the page, AJAX
function wcCheck() {
	wcAjax = initAjax();
	wcAjax.onreadystatechange = wc_callback;
	wcAjax.open( "GET", "/_std.ajax?action=7", true );
	wcAjax.send( null );	
}

function wcSetStatus(status) {
	wcAjax = initAjax();
	wcAjax.onreadystatechange = wc_callback;
	wcAjax.open( "GET", "/_std.ajax?action=7&wc="+status, true );
	wcAjax.send( null );	
	btn = document.getElementById('wcSetBtn');
	btn.value = "Standby";
	btn.disabled = true;
}

function wc_callback() {
	if (!(wcAjax.readyState==4 || wcAjax.readyState=="complete")) return;
	btn = document.getElementById('wcSetBtn');
	btn.disabled = false;
	if (wcAjax.responseText == 'true') {
		document.getElementById('wcSettings').innerHTML = 'Disallow';
		btn.value = 'Allow';
		btn.onclick = function() { wcSetStatus('0'); }
	} else {
		document.getElementById('wcSettings').innerHTML = 'Permit';
		btn.value = 'Disallow';
		btn.onclick = function() { wcSetStatus('1'); }
	}
}

//=============================================================================
// Window API
//=============================================================================
//*****************************************************************************
// Copyright 2001 by Mike Hall.
// See http://www.brainjar.com for terms of use.
//*****************************************************************************

// Determine browser and version for use with the Window API
function Browser() {
	var ua, s, i;
	
	this.isIE    = false;  // Internet Explorer
	this.isNS    = false;  // Netscape
	this.version = null;
	
	ua = navigator.userAgent;
	
	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0) {
	this.isIE = true;
	this.version = parseFloat(ua.substr(i + s.length));
	return;
	}
	
	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0) {
	this.isNS = true;
	this.version = parseFloat(ua.substr(i + s.length));
	return;
	}
	
	// Treat any other "Gecko" browser as NS 6.1.
	
	s = "Gecko";
	if ((i = ua.indexOf(s)) >= 0) {
	this.isNS = true;
	this.version = 6.1;
	return;
	}
}

var browser = new Browser();

//=============================================================================
// Window Object
//=============================================================================

function Window(el) {
	var i, mapList, mapName;
	
	// Get window components.
	this.frame           = el;
	this.titleBar        = winFindByClassName(el, "titleBar");
	this.titleBarText    = winFindByClassName(el, "titleBarText");
	this.titleBarButtons = winFindByClassName(el, "titleBarButtons");
	this.clientArea      = winFindByClassName(el, "clientArea");
	
	this.titleBarButtons.parentWindow = this;
	
	// Save colors.
	this.activeFrameBackgroundColor  = this.frame.style.backgroundColor;
	this.activeFrameBorderColor      = this.frame.style.borderColor;
	this.activeTitleBarColor         = this.titleBar.style.backgroundColor;
	this.activeTitleTextColor        = this.titleBar.style.color;
	this.activeClientAreaBorderColor = this.clientArea.style.borderColor;
	if (browser.isIE)
	this.activeClientAreaScrollbarColor = this.clientArea.style.scrollbarBaseColor;
	
	// Save images.
	this.activeButtonsImage   = this.titleBarButtons.src;
	this.inactiveButtonsImage = this.titleBarButtons.longDesc;
	
	// Set flags.
	this.isOpen      = false;
	this.isMinimized = false;
	
	// Set methods.
	this.open       = winOpen;
	this.close      = winClose;
	this.minimize   = winMinimize;
	this.restore    = winRestore;
	this.makeActive = winMakeActive;
	
	// Set up event handling.
	this.frame.parentWindow = this;
	this.frame.onmousemove  = winResizeCursorSet;
	this.frame.onmouseout   = winResizeCursorRestore;
	this.frame.onmousedown  = winResizeDragStart;
	
	this.titleBar.parentWindow = this;
	this.titleBar.onmousedown  = winMoveDragStart;
	
	this.clientArea.parentWindow = this;
	this.clientArea.onclick      = winClientAreaClick;
		
	// Calculate the minimum width and height values for resizing
	// and fix any initial display problems.
	var initLt, initWd, w, dw;
	
	// Save the inital frame width and position, then reposition
	// the window.
	initLt = this.frame.style.left;
	initWd = parseInt(this.frame.style.width);
	this.frame.style.left = -this.titleBarText.offsetWidth + "px";
	
	// For IE, start calculating the value to use when setting
	// the client area width based on the frame width.
	if (browser.isIE) {
		this.titleBarText.style.display = "none";
		w = this.clientArea.offsetWidth;
		this.widthDiff = this.frame.offsetWidth - w;
		this.clientArea.style.width = w + "px";
		dw = this.clientArea.offsetWidth - w;
		w -= dw;     
		this.widthDiff += dw;
		this.titleBarText.style.display = "";
	}
	
	// Find the difference between the frame's style and offset
	// widths. For IE, adjust the client area/frame width
	// difference accordingly.
	w = this.frame.offsetWidth;
	this.frame.style.width = w + "px";
	dw = this.frame.offsetWidth - w;
	w -= dw;     
	this.frame.style.width = w + "px";
	if (browser.isIE)
	this.widthDiff -= dw;
	
	// Find the minimum width for resize.
	this.isOpen = true;  // Flag as open so minimize call will work.
	this.minimize();
	// Get the minimum width.
	if (browser.isNS && browser.version >= 1.2)
	// For later versions of Gecko.
	this.minimumWidth = this.frame.offsetWidth;
	else
	// For all others.
	this.minimumWidth = this.frame.offsetWidth - dw;
	
	// Find the frame width at which or below the title bar text will
	// need to be clipped.
	this.titleBarText.style.width = "";
	this.clipTextMinimumWidth = this.frame.offsetWidth - dw;
	
	// Set the minimum height.
	this.minimumHeight = 1;
	
	// Restore window. For IE, set client area width.
	this.restore();
	this.isOpen = false;  // Reset flag.
	initWd = Math.max(initWd, this.minimumWidth);
	this.frame.style.width = initWd + "px";
	if (browser.isIE)
	this.clientArea.style.width = (initWd - this.widthDiff) + "px";
	
	// Clip the title bar text if needed.
	
	if (this.clipTextMinimumWidth >= this.minimumWidth)
	this.titleBarText.style.width = (winCtrl.minimizedTextWidth + initWd - this.minimumWidth) + "px";
	
	// Restore the window to its original position.
	
	this.frame.style.left = initLt;
}

//=============================================================================
// Window Methods
//=============================================================================
function winOpen() {
	if (this.isOpen) return;
	
	// Restore the window and make it visible.
	this.makeActive();
	this.isOpen = true;
	if (this.isMinimized)
	this.restore();
	this.frame.style.visibility = "visible";
}

function winClose(id) {
	// Hide the window.
	this.frame.style.visibility = "hidden";
	this.isOpen = false;
}

function winMinimize() {
	if (!this.isOpen || this.isMinimized) return;
	
	this.makeActive();
	
	// Save current frame and title bar text widths.
	this.restoreFrameWidth = this.frame.style.width;
	this.restoreTextWidth = this.titleBarText.style.width;
	
	// Disable client area display.
	this.clientArea.style.display = "none";
	
	// Minimize frame and title bar text widths.
	if (this.minimumWidth)
		this.frame.style.width = this.minimumWidth + "px";
	else
		this.frame.style.width = "";
	this.titleBarText.style.width = winCtrl.minimizedTextWidth + "px";
	
	this.isMinimized = true;
}

function winRestore() {
	if (!this.isOpen || !this.isMinimized) return;
	
	this.makeActive();
	
	// Enable client area display.
	this.clientArea.style.display = "";
	
	// Restore frame and title bar text widths.
	this.frame.style.width = this.restoreFrameWidth;
	this.titleBarText.style.width = this.restoreTextWidth;
	
	this.isMinimized = false;
}

function winMakeActive() {
	if (winCtrl.active == this)	return;
	
	// Inactivate the currently active window.
	
	if (winCtrl.active) {
		winCtrl.active.frame.style.backgroundColor    = winCtrl.inactiveFrameBackgroundColor;
		winCtrl.active.frame.style.borderColor        = winCtrl.inactiveFrameBorderColor;
		winCtrl.active.titleBar.style.backgroundColor = winCtrl.inactiveTitleBarColor;
		winCtrl.active.titleBar.style.color           = winCtrl.inactiveTitleTextColor;
		winCtrl.active.clientArea.style.borderColor   = winCtrl.inactiveClientAreaBorderColor;
		if (browser.isIE)
			winCtrl.active.clientArea.style.scrollbarBaseColor = winCtrl.inactiveClientAreaScrollbarColor;
		if (browser.isNS && browser.version < 6.1)
			winCtrl.active.clientArea.style.overflow = "hidden";
		if (winCtrl.active.inactiveButtonsImage)
			winCtrl.active.titleBarButtons.src = winCtrl.active.inactiveButtonsImage;
	}
	
	// Activate this window.
	this.frame.style.backgroundColor    = this.activeFrameBackgroundColor;
	this.frame.style.borderColor        = this.activeFrameBorderColor;
	this.titleBar.style.backgroundColor = this.activeTitleBarColor;
	this.titleBar.style.color           = this.activeTitleTextColor;
	this.clientArea.style.borderColor   = this.activeClientAreaBorderColor;
	if (browser.isIE) this.clientArea.style.scrollbarBaseColor = this.activeClientAreaScrollbarColor;
	if (browser.isNS && browser.version < 6.1) this.clientArea.style.overflow = "auto";
	if (this.inactiveButtonsImage) this.titleBarButtons.src = this.activeButtonsImage;
	this.frame.style.zIndex = ++winCtrl.maxzIndex;
	winCtrl.active = this;
}

//=============================================================================
// Event handlers.
//=============================================================================
function winClientAreaClick(event) {
	// Make this window the active one.
	this.parentWindow.makeActive();
}

//-----------------------------------------------------------------------------
// Window dragging.
//-----------------------------------------------------------------------------
function winMoveDragStart(event) {
	var target;
	var x, y;
	
	if (browser.isIE)
	target = window.event.srcElement.tagName;
	if (browser.isNS)
	target = event.target.tagName;
	
	if (target == "AREA") return;
	
	this.parentWindow.makeActive();
	
	// Get cursor offset from window frame.
	
	if (browser.isIE) {
		x = window.event.x;
		y = window.event.y;
	}
	if (browser.isNS) {
		x = event.pageX;
		y = event.pageY;
	}
	winCtrl.xOffset = winCtrl.active.frame.offsetLeft - x;
	winCtrl.yOffset = winCtrl.active.frame.offsetTop  - y;
	
	// Set document to capture mousemove and mouseup events.	
	if (browser.isIE) {
		document.onmousemove = winMoveDragGo;
		document.onmouseup   = winMoveDragStop;
	}
	if (browser.isNS) {
		document.addEventListener("mousemove", winMoveDragGo,   true);
		document.addEventListener("mouseup",   winMoveDragStop, true);
		event.preventDefault();
	}
	
	winCtrl.inMoveDrag = true;
}

function winMoveDragGo(event) {
	var x, y;
	
	if (!winCtrl.inMoveDrag) return;
	
	// Get cursor position.
	if (browser.isIE) {
		x = window.event.x;
		y = window.event.y;
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS) {
		x = event.pageX;
		y = event.pageY;
		event.preventDefault();
	}
	
	// Move window frame based on offset from cursor.
	
	winCtrl.active.frame.style.left = (x + winCtrl.xOffset) + "px";
	winCtrl.active.frame.style.top  = (y + winCtrl.yOffset) + "px";
}

function winMoveDragStop(event) {
	winCtrl.inMoveDrag = false;
	
	// Remove mousemove and mouseup event captures on document.
	
	if (browser.isIE) {
		document.onmousemove = null;
		document.onmouseup   = null;
	}
	if (browser.isNS) {
		document.removeEventListener("mousemove", winMoveDragGo,   true);
		document.removeEventListener("mouseup",   winMoveDragStop, true);
	}
}

//-----------------------------------------------------------------------------
// Window resizing.
//-----------------------------------------------------------------------------
function winResizeCursorSet(event) {
	var target;
	var xOff, yOff;
	
	if (this.parentWindow.isMinimized || winCtrl.inResizeDrag) return;
	
	// If not on window frame, restore cursor and exit.
	
	if (browser.isIE) target = window.event.srcElement;
	if (browser.isNS) target = event.target;
	if (target != this.parentWindow.frame) return;
	
	// Find resize direction.
	if (browser.isIE) {
		xOff = window.event.offsetX;
		yOff = window.event.offsetY;
	}
	if (browser.isNS) {
		xOff = event.layerX;
		yOff = event.layerY;
	}
	winCtrl.resizeDirection = ""
	if (yOff <= winCtrl.resizeCornerSize) winCtrl.resizeDirection += "n";
	else if (yOff >= this.parentWindow.frame.offsetHeight - winCtrl.resizeCornerSize)
	winCtrl.resizeDirection += "s";
	if (xOff <= winCtrl.resizeCornerSize) winCtrl.resizeDirection += "w";
	else if (xOff >= this.parentWindow.frame.offsetWidth - winCtrl.resizeCornerSize)
	winCtrl.resizeDirection += "e";
	
	// If not on window edge, restore cursor and exit.
	if (winCtrl.resizeDirection == "") {
		this.onmouseout(event);
		return;
	}
	
	// Change cursor
	if (browser.isIE) document.body.style.cursor = winCtrl.resizeDirection + "-resize";
	if (browser.isNS) this.parentWindow.frame.style.cursor = winCtrl.resizeDirection + "-resize";
}

function winResizeCursorRestore(event) {
	if (winCtrl.inResizeDrag) return;
	// Restore cursor.
	if (browser.isIE) document.body.style.cursor = "";
	if (browser.isNS) this.parentWindow.frame.style.cursor = "";
}

function winResizeDragStart(event) {
	var target;
	
	// Make sure the event is on the window frame.
	if (browser.isIE) target = window.event.srcElement;
	if (browser.isNS) target = event.target;
	if (target != this.parentWindow.frame) return;
	
	this.parentWindow.makeActive();
	
	if (this.parentWindow.isMinimized) return;
	
	// Save cursor position.
	if (browser.isIE) {
		winCtrl.xPosition = window.event.x;
		winCtrl.yPosition = window.event.y;
	}
	if (browser.isNS) {
		winCtrl.xPosition = event.pageX;
		winCtrl.yPosition = event.pageY;
	}
	
	// Save window frame position and current window size.	
	winCtrl.oldLeft   = parseInt(this.parentWindow.frame.style.left,  10);
	winCtrl.oldTop    = parseInt(this.parentWindow.frame.style.top,   10);
	winCtrl.oldWidth  = parseInt(this.parentWindow.frame.style.width, 10);
	winCtrl.oldHeight = parseInt(this.parentWindow.clientArea.style.height, 10);
	
	// Set document to capture mousemove and mouseup events.
	
	if (browser.isIE) {
		document.onmousemove = winResizeDragGo;
		document.onmouseup   = winResizeDragStop;
	}
	if (browser.isNS) {
		document.addEventListener("mousemove", winResizeDragGo,   true);
		document.addEventListener("mouseup"  , winResizeDragStop, true);
		event.preventDefault();
	}
	
	winCtrl.inResizeDrag = true;
}

function winResizeDragGo(event) {
	var north, south, east, west;
	var dx, dy;
	var w, h;
	
	if (!winCtrl.inResizeDrag) return;
	
	// Set direction flags based on original resize direction.
	north = false;
	south = false;
	east  = false;
	west  = false;
	if (winCtrl.resizeDirection.charAt(0) == "n") north = true;
	if (winCtrl.resizeDirection.charAt(0) == "s") south = true;
	if (winCtrl.resizeDirection.charAt(0) == "e" || winCtrl.resizeDirection.charAt(1) == "e") east = true;
	if (winCtrl.resizeDirection.charAt(0) == "w" || winCtrl.resizeDirection.charAt(1) == "w") west = true;
	
	// Find change in cursor position.
	if (browser.isIE) {
		dx = window.event.x - winCtrl.xPosition;
		dy = window.event.y - winCtrl.yPosition;
	}
	if (browser.isNS) {
		dx = event.pageX - winCtrl.xPosition;
		dy = event.pageY - winCtrl.yPosition;
	}
	
	// If resizing north or west, reverse corresponding amount.
	if (west) dx = -dx;
	if (north) dy = -dy;
	
	// Check new size.
	w = winCtrl.oldWidth  + dx;
	h = winCtrl.oldHeight + dy;
	if (w <= winCtrl.active.minimumWidth) {
		w = winCtrl.active.minimumWidth;
		dx = w - winCtrl.oldWidth;
	}
	if (h <= winCtrl.active.minimumHeight) {
		h = winCtrl.active.minimumHeight;
		dy = h - winCtrl.oldHeight;
	}
	
	// Resize the window. For IE, keep client area and frame widths in synch.
	if (east || west) {
		winCtrl.active.frame.style.width = w + "px";
		if (browser.isIE) winCtrl.active.clientArea.style.width = (w - winCtrl.active.widthDiff) + "px";
	}
	if (north || south) winCtrl.active.clientArea.style.height = h + "px";
	
	// Clip the title bar text, if necessary.
	if (east || west) {
		if (w < winCtrl.active.clipTextMinimumWidth)
			winCtrl.active.titleBarText.style.width = (winCtrl.minimizedTextWidth + w - winCtrl.active.minimumWidth) + "px";
		else
		  winCtrl.active.titleBarText.style.width = "";
	}
	
	// For a north or west resize, move the window.
	if (west) winCtrl.active.frame.style.left = (winCtrl.oldLeft - dx) + "px";
	if (north) winCtrl.active.frame.style.top  = (winCtrl.oldTop  - dy) + "px";
	
	if (browser.isIE) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if (browser.isNS)
		event.preventDefault();
}

function winResizeDragStop(event) {
	winCtrl.inResizeDrag = false;
	
	// Remove mousemove and mouseup event captures on document.
	if (browser.isIE) {
		document.onmousemove = null;
		document.onmouseup   = null;
	}
	if (browser.isNS) {
		document.removeEventListener("mousemove", winResizeDragGo,   true);
		document.removeEventListener("mouseup"  , winResizeDragStop, true);
	}
}

//=============================================================================
// Utility functions.
//=============================================================================
function winFindByClassName(el, className) {
	var i, tmp;

	if (el.className == className) return el;
	
	// Search for a descendant element assigned the given class.
	for (i = 0; i < el.childNodes.length; i++) {
		tmp = winFindByClassName(el.childNodes[i], className);
		if (tmp != null) return tmp;
	}
	
	return null;
}

//=============================================================================
// Initialization code.
//=============================================================================
var winList = new Array();
var winCtrl = new Object();

function winInit() {
	var elList;
	// Initialize window control object.
	winCtrl.maxzIndex                        =   0;
	winCtrl.resizeCornerSize                 =  16;
	winCtrl.minimizedTextWidth               = 100;
	winCtrl.inactiveFrameBackgroundColor     = "#c0c0c0";
	winCtrl.inactiveFrameBorderColor         = "#f0f0f0 #505050 #404040 #e0e0e0";
	winCtrl.inactiveTitleBarColor            = "#808080";
	winCtrl.inactiveTitleTextColor           = "#c0c0c0";
	winCtrl.inactiveClientAreaBorderColor    = "#404040 #e0e0e0 #f0f0f0 #505050";
	winCtrl.inactiveClientAreaScrollbarColor = "";
	winCtrl.inMoveDrag                       = false;
	winCtrl.inResizeDrag                     = false;
	
	// Initialize windows and build list.
	elList = document.getElementsByTagName("DIV");
	for (var i = 0; i < elList.length; i++)
		if (elList[i].className == "window") winList[elList[i].id] = new Window(elList[i]);
}

//=============================================================================
// Helix Compatible Functions
//=============================================================================
function closeWindow(id){
	winList[id].close();
}
