/* *****************************************

            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();

}

