// -----------------------------------
// BUSINESS ACTIVATION POPUP FUNCTIONS
// -----------------------------------
// Copyright (c) 2003 The Salamander Organization Ltd.  All Rights Reserved.
//
// THIS WORK IS SUBJECT TO U.K. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
//
// DISCLAIMER:
//
// The Salamander Organization Ltd. (hereto referred as "Salamander") makes no representations or warranties
// with respect to the contents or use of this code, and specifically disclaims any express or implied
// warranties of merchantability or fitness for any particular purpose.  Further, Salamander reserves the right
// to revise this publication and to make changes to its content, at any time, without obligation to notify any
// person or entity of such revisions or changes.
//
// Further, Salamander makes no representations or warranties with respect to any software, and specifically
// disclaims any express or implied warranties of merchantability or fitness for any particular purpose.  Salamander
// reserves the right to make changes to any and all parts of the software, at any time, without obligation to notify
// any person or entity of such changes.
//
// Inclusion of the above notice does not necessarily imply publication.



//=============================================================================
// Determine browser and version.
//=============================================================================
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");

	// Find matching button image map.
	//mapName = this.titleBarButtons.useMap.substr(1);
	//mapList = document.getElementsByTagName("MAP");

	//for (i = 0; i < mapList.length; i++)
	//{
	//	if (mapList[i].name == mapName)
	//	{
	//		this.titleBarMap = mapList[i];
	//	}
	//}

	// 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.getAttribute("lowsrc");

	// 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;

	//for (i = 0; i < this.titleBarMap.childNodes.length; i++)
	//{
	//	if (this.titleBarMap.childNodes[i].tagName == "AREA")
	//	{
	//		this.titleBarMap.childNodes[i].parentWindow = this;
	//	}
	//}

	// 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();
	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()
{
	// 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;
		}
		else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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.resizeDirectio 	+= "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";
	}
	else 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 = "";
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else if (winCtrl.resizeDirection.charAt(0) == "s")
	{
		south = true;
	}
	else if ((winCtrl.resizeDirection.charAt(0) == "e") || (winCtrl.resizeDirection.charAt(1) == "e"))
	{
		east = true;
	}
	else 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;
	}
	else 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;
	}
	else 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;
	}
	else 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 = "#ffffff";
	winCtrl.inactiveFrameBorderColor = "#444444";
	winCtrl.inactiveTitleBarColor = "#ffffff";
	winCtrl.inactiveTitleTextColor = "#444444";
	winCtrl.inactiveClientAreaBorderColor = "#000000";
	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]);
		}
	}
	
	//init_fCatService();
}

// Run initialization code after page loads.
window.onload = winInit;
