function cleverTagLine()
{
	var tagline = new Array();
	tagline[0]="The inside is larger than the outside"
	tagline[1]="Breathe more deeply"
	tagline[2]="Use an unacceptable color"
	tagline[3]="Design for the hand then for the eye"
	tagline[4]="The interface is the application. Mostly."
	tagline[5]="Listen to the quiet voice"
	tagline[6]="The original is unfaithful to the translation"
	tagline[7]="Question the heroic approach"
	tagline[8]="Repetition is a form of change"
	tagline[9]="Trust in the you of now"
	tagline[10]="What wouldn't you do?"
		
	var randomIndex = Math.floor(Math.random()*tagline.length);
	g_cleverTagline.childNodes[0].data = tagline[randomIndex];
	g_cleverResumeTagline.childNodes[0].data = tagline[randomIndex];
}

function menuItem(type,name,category,isEnabled,branchIndex)
{
	this.type = type;
	this.name = name;
	this.category = category;
	this.isEnabled = isEnabled;
	this.branchIndex = branchIndex;
}

function gallery()
{
	var galleryName = new Array();
	var g_galleryWidth = new Array();
	var g_galleryHeight = new Array();
	var zoomWidth = new Array();
	var zoomHeight = new Array();
	var galleryTitle = new Array();
	var galleryCategory = new Array();
	var galleryMedia = new Array();
	var galleryClient = new Array();
	var galleryDate = new Array();
	var galleryDescription = new Array();
	var galleryItemSize = new Array();
	var galleryMagickFactor = new Array();
	var itemSelected = new Array();
	var galleryDefine = gallery.arguments;
	
	this.type = galleryDefine[0]; // thumbGallery.type definition is expected at index 0

	// sort the flat definition list into indexed properties
	for(i=0;i<galleryDefine.length/13-1;i++)
	{
		galleryName[i]		= galleryDefine[13*i+1];
		g_galleryWidth[i]	= galleryDefine[13*i+2];
		g_galleryHeight[i]	= galleryDefine[13*i+3];
		zoomWidth[i]		= galleryDefine[13*i+4];
		zoomHeight[i]		= galleryDefine[13*i+5];
		galleryTitle[i]		= galleryDefine[13*i+6];
		galleryCategory[i]	= galleryDefine[13*i+7];
		galleryMedia[i]		= galleryDefine[13*i+8];
		galleryClient[i]	= galleryDefine[13*i+9];
		galleryDate[i]		= galleryDefine[13*i+10];
		galleryDescription[i]	= galleryDefine[13*i+11];
		galleryItemSize[i]	= galleryDefine[13*i+12];
		galleryMagickFactor[i]	= galleryDefine[13*i+13];
	}
	
	this.itemName		= galleryName;
	this.itemWidth		= g_galleryWidth;
	this.itemHeight		= g_galleryHeight;
	this.itemZoomWidth	= zoomWidth;
	this.itemZoomHeight	= zoomHeight;
	this.itemTitle		= galleryTitle;
	this.itemCategory	= galleryCategory;
	this.itemMedia		= galleryMedia;
	this.itemClient		= galleryClient;
	this.itemDate		= galleryDate;
	this.itemDescription	= galleryDescription;
	this.itemSize		= galleryItemSize;
	this.magick		= galleryMagickFactor;
		
	for(i=0;i<galleryName.length;i++)
	{
		itemSelected[i]	= (i==0)?true:false; // first item is selected by default	
	}
	
	this.isSelected		= itemSelected;
}

function menuBranch()
{
	var menuItemArray = new Array(); 
	var menuItemDefine = menuBranch.arguments;
	var thumbIndex;

	for(i=0;i<menuItemDefine.length;i++)
	{
		menuItemArray[i] = menuItemDefine[i];
		this.itemName 		= menuItemDefine[i].itemName;
		this.itemWidth 		= menuItemDefine[i].itemWidth;
		this.itemHeight 	= menuItemDefine[i].itemHeight;
		this.itemZoomWidth 	= menuItemDefine[i].itemZoomWidth;
		this.itemZoomHeight 	= menuItemDefine[i].itemZoomHeight;
		this.itemTitle 		= menuItemDefine[i].itemTitle;
		this.itemCategory 	= menuItemDefine[i].itemCategory;
		this.itemMedia		= menuItemDefine[i].itemMedia;
		this.itemClient 	= menuItemDefine[i].itemClient;
		this.itemDate 		= menuItemDefine[i].itemDate;
		this.itemDescription 	= menuItemDefine[i].itemDescription;
		this.itemSize	 	= menuItemDefine[i].itemSize;
		this.magick		= menuItemDefine[i].magick;
		this.isSelected		= menuItemDefine[i].isSelected;
	}
	
	this.menuItem = menuItemArray;
	this.numItems = menuItemArray.length;
	
	// ascending sort = 1;
	// descending sort = -1;
	// no sorting = 0;
	var sortDirectionArray = new Array();
	sortDirectionArray["itemName"]		= 1;
	sortDirectionArray["itemWidth"]		= 1;
	sortDirectionArray["itemHeight"]	= 1;
	sortDirectionArray["itemZoomWidth"]	= 1;
	sortDirectionArray["itemZoomHeight"]	= 1;
	sortDirectionArray["itemTitle"]		= 1;
	sortDirectionArray["itemCategory"]	= 1;
	sortDirectionArray["itemMedia"]		= 1;
	sortDirectionArray["itemClient"]	= 1;
	sortDirectionArray["itemDate"]		= -1;
	sortDirectionArray["itemDescription"]	= 1;
	sortDirectionArray["itemSize"]		= 1;
	sortDirectionArray["magick"]		= 1;
	this.sortDirection = sortDirectionArray;
	
	var sortLinkActiveArray = new Array();
	sortLinkActiveArray["itemName"]		= false;
	sortLinkActiveArray["itemWidth"]	= false;
	sortLinkActiveArray["itemHeight"]	= false;
	sortLinkActiveArray["itemZoomWidth"]	= false;
	sortLinkActiveArray["itemZoomHeight"]	= false;
	sortLinkActiveArray["itemTitle"]	= false;
	sortLinkActiveArray["itemCategory"]	= false;
	sortLinkActiveArray["itemMedia"]	= false;
	sortLinkActiveArray["itemClient"]	= false;
	sortLinkActiveArray["itemDate"]		= false;
	sortLinkActiveArray["itemDescription"]	= false;
	sortLinkActiveArray["itemSize"]		= false;
	sortLinkActiveArray["magick"]		= false;
	this.sortLinkActive = sortLinkActiveArray;
}

function createMenu(branchIndex)
{
	g_currentBranchIndex = branchIndex;
	
	var menuBranch = document.createElement("div");
	menuBranch.setAttribute("id","menuBranch"+g_currentBranchIndex);
	menuBranch.className = "menuBranchNode";
	g_menuNode.appendChild(menuBranch);
	
	createMenuBranch(g_currentBranchIndex);
	defineMenuBehavior();
}

function createMenuBranch()
{
	var itemType, itemNodeID, itemImageID, thumbNodeID, menuItemimageSrc;
	var menuBranchNode = document.getElementById("menuBranch"+g_currentBranchIndex);
	var menu = g_menuSystem[g_currentBranchIndex];
	var numMenuItems = menu.numItems;
	
	for(i=0; i<numMenuItems; i++)
	{
		menuItem = menu.menuItem[i];
		itemType = menuItem.type;
		itemNodeID = "itemNode" + i;
		itemImageID = "itemImage" + i;
		thumbNodeID = "thumbNode" + i;
		
		if(itemType=="item"||itemType=="header")
		{
			imageSrc = g_navImageDir;
			imageSrc += menuItem.name;
			imageSrc += "_" + menuItem.category;
			if(menuItem.category != "grey")
			{
				if(itemType=="header"){imageSrc += "_header";}
				else{imageSrc += "_out";}
			}
			imageSrc += ".gif";
			
			var menuItemNode = createNode("div",itemNodeID,itemType,menuBranchNode);
			var menuImageNode = createNode("img",itemImageID,"menuItemImage",menuItemNode,"src",imageSrc);
		}
		else if(itemType=="thumbs")
		{
			createThumbs();
		}
	}
}

function createThumbs()
{
	var thumbItem, thumbImage, thumbHilite, thumbImageSrc;
	var menu = g_menuSystem[g_currentBranchIndex];
	var imageName = menu.itemName;
	
	var menuLevelNode = document.getElementById("menuBranch"+g_currentBranchIndex);
	
	var thumbcontentNode = createNode("div","thumbGallery","thumbGallery",menuLevelNode);
	
	for(i=0;i<imageName.length;i++)
	{
		var thumbItem = createNode("div","thumbItem"+i,"thumbItem",thumbcontentNode);
		var thumbImageSrc = g_thumbImageDir + imageName[i];
		var thumbImage = createNode("img","thumbImage"+i,"thumbImage",thumbItem,"src",thumbImageSrc);
		thumbImage.onmouseover = thumbEventHandler;
		thumbImage.onmouseout = thumbEventHandler;
		thumbImage.onmouseup = thumbEventHandler;	
		thumbImage.onmousedown = thumbEventHandler;	
	}

	var thumbFooterFrame = createNode("div","thumbFooterFrame","",menuLevelNode);

	initGallery();
	
	var selectionIndex = getSelected();
	updateGallery(selectionIndex);
}

function createNode()
{
	var newNode, parentNode;
	if(arguments[0]!="text")
	{
		newNode = document.createElement(arguments[0]);
		newNode.setAttribute("id",arguments[1]);
		newNode.className = arguments[2];
		parentNodeObj = arguments[3];
		
		if(arguments.length>4)
		{
			// define additional attributes
			for(var i=4;i<arguments.length;i+=2)
			{
				newNode.setAttribute(arguments[i],arguments[i+1]);
			}
		}
	}
	else
	{
		newNode = document.createTextNode(arguments[1]);
		parentNodeObj = arguments[2];
	}
	
	parentNodeObj.appendChild(newNode);
	return newNode;
}

function clearContent()
{
	clearChildNodes(g_sidebarNode);
	clearChildNodes(g_contentNode);
	clearChildNodes(g_dockImg2Node);
	
	var dockNavFrame = document.getElementById("dockNavFrame");
	if(dockNavFrame)
	{
		removeNode(dockNavFrame);
	}
}

function clearChildNodes(parentNode)
{
	var obj = parentNode;

	while(obj.hasChildNodes() == true)
	{
		obj.removeChild(obj.childNodes[0]);
	}
}

function removeNode(node)
{
	var parentNode = node.parentNode;
	parentNode.removeChild(node);
}

function updateDisplayConfig(branchIndex)
{
	var dynamicContentState;
	var presentationMode = getPresentationMode(branchIndex);
	var resumeNode = document.getElementById("resume");
	var aboutNode = document.getElementById("about");
	var storageNode = document.getElementById("storage");
	
	clearContent();

	switch(presentationMode)
	{
		case "home":
			resumeNode.style.color="#FFCC00";
			aboutNode.style.color="#FFCC00";
			storageNode.style.color="#FFCC00";
			clearTimeout(g_sortTimer); // make sure this timer is stopped
			config_Home();
			importXML("updates.xml","displayUpdates"); // async read site updates data from XML
			break;

		case "images":
			resumeNode.style.color="#000000";
			aboutNode.style.color="#000000";
			storageNode.style.color="#000000";
			config_Gallery();
			clearChildNodes(g_updates);
			initDock(branchIndex);
			break;
			
		case "design":
			resumeNode.style.color="#000000";
			aboutNode.style.color="#000000";
			storageNode.style.color="#000000";
			config_Gallery();
			clearChildNodes(g_updates);
			initDock(branchIndex);
			break;
			
		case "motion":
			resumeNode.style.color="#000000";
			aboutNode.style.color="#000000";
			storageNode.style.color="#000000";
			config_Gallery();
			clearChildNodes(g_updates);
			initDock(branchIndex);
			break;
	}
	cleverTagLine();
}

function imageSwap(EventType, EventTarget)
{
	var newEventState;
	var newImagePath;
	var oldImagePath = EventTarget.getAttribute("src");
		
	if(EventType=="mouseover") newEventState = "over";
	if(EventType=="mouseout") newEventState = "out";	
	if(EventType=="mousedown") newEventState = "down";	
	if(EventType=="mouseup") newEventState = "over";	

	newImagePath = getSwapImageSrc(oldImagePath,newEventState);
	EventTarget.setAttribute("src",newImagePath);
}

function getSwapImageSrc(oldImagePath,newEventState)
{
	var newImagePath = "";
	var pathName = oldImagePath.split("_");
	var suffix = pathName[pathName.length - 1].split(".");
	
	for(i=0;i<pathName.length - 1;i++)
	{
		newImagePath += pathName[i]+"_";
	}
	
	newImagePath += newEventState;
	newImagePath += "." + suffix[1];
	
	return newImagePath;
}

function getThumbImageSrc(imageArray,itemIndex)
{
	var selectionIndex = getSelected();
	var thumbImageSrc = g_thumbImageDir + imageArray[itemIndex];
	if(itemIndex == selectionIndex)
	{
		thumbImageSrc = g_thumbImageDir + "selected.jpg";
	}
	return thumbImageSrc;
}

function itemSelect(EventType, EventTarget)
{
	var menu = g_menuSystem[g_currentBranchIndex];
	var targetIndex = getEventTargetIndex(EventType, EventTarget);
	var newBranchIndex = menu.menuItem[targetIndex].branchIndex;
	var menuLevel = document.getElementById("menuBranch"+g_currentBranchIndex);
	var deletedNode = g_menuNode.removeChild(menuLevel);
	
	updateDisplayConfig(newBranchIndex); 
	createMenu(newBranchIndex);
}

function getEventTargetIndex(EventType, EventTarget)
{
	var EventTargetContainerID = EventTarget.parentNode.id;
	var allPossibleEventTargets = EventTarget.parentNode.parentNode;
	var numPossibleEvents = allPossibleEventTargets.childNodes.length;
	var index = 0;
	var nodeId;
	var isMatchFound = false; 
	
		while(index < numPossibleEvents)
		{
			nodeId = allPossibleEventTargets.childNodes[index].id;
			
			if(nodeId == EventTargetContainerID)
			{
				isMatchFound = true;	
				break;
			} 
			
			index ++;
		}
		
		if(isMatchFound) return index;
		return false;
}

function getPresentationMode(branchIndex)
{
	switch(branchIndex)
	{
		case 0:
			return "home";
			break;
		case 1:
			return "images";
			break;
		case 2:
			return "design";
			break;
		case 3:
			return "motion";
			break;
	}
}

function getPresentationIndex(branchMode)
{
	switch(branchMode)
	{
		case "home":
			return 0;
			break;
		case "images":
			return 1;
			break;
		case "design":
			return 2;
			break;
		case "motion":
			return 3;
			break;
	}
}

function getEventType(Event)
{
	var EventType;

	if (!Event) var Event = window.event;
	EventType = Event.type;
	return EventType;
}

function getEventTarget(Event)
{
	var EventTarget;

	if (!Event) var Event = window.event;
	if (Event.target) EventTarget = Event.target;
	else if (Event.srcElement) EventTarget = Event.srcElement;
	if (EventTarget.nodeType == 3) EventTarget = EventTarget.parentNode; // defeat Safari bug
	
	return EventTarget;
}

function defineMenuBehavior()
{
	var menuItemImage, menuItem;
	var menu = g_menuSystem[g_currentBranchIndex];
	var numItems = menu.numItems;
	
	for(i=0;i<numItems;i++)
	{
		menuItem = menu.menuItem[i];
		menuItemImage=document.getElementById("itemImage"+i);

		if(menuItem.isEnabled && menuItem.category != "grey") 
		{
			menuItemImage.onmouseover = menuEventHandler;
			menuItemImage.onmouseout = menuEventHandler;
			menuItemImage.onmouseup = menuEventHandler;	
			menuItemImage.onmousedown = menuEventHandler;	
		}	
	}
}

function menuEventHandler(Event)
{
	var EventType = getEventType(Event);
	var EventTarget = getEventTarget(Event);

	switch(EventType)
	{
		case "mouseover":
			imageSwap(EventType,EventTarget);
			break;
			
		case "mouseout":
			imageSwap(EventType,EventTarget);
			break;
			
		case "mouseup":
			itemSelect(EventType,EventTarget);
			break;
			
		case "mousedown":
			imageSwap(EventType,EventTarget);
			break;
	}
}

function thumbEventHandler(Event)
{
	var EventType = getEventType(Event);
	var EventTarget = getEventTarget(Event);
	var targetIndex = getEventTargetIndex(EventType, EventTarget);
	var selectionIndex = getSelected();
	var isSelected = (targetIndex == selectionIndex);
	
	var menu = g_menuSystem[g_currentBranchIndex];
	var thumbImage = getThumbImageSrc(menu.itemName,targetIndex);
	var emptyImage = g_thumbImageDir + "empty.jpg";
	
	switch(EventType)
	{
		case "mousedown":
			if(!isSelected)
			{
				EventTarget.setAttribute("src",emptyImage);
				EventTarget.parentNode.style.border = "1px solid #333333";
			}
			
			break;
		
		case "mouseover":
			document.onmousemove = tooltipHandler;
			g_tipTimer = setTimeout("showTip()", 100);
			g_tipEnabled = true;
			
			if(!isSelected)
			{
				EventTarget.setAttribute("src",thumbImage );
				EventTarget.parentNode.style.backgroundColor = "#FFFFFF";
				EventTarget.parentNode.style.border = "1px solid #CB4F0C";

				g_tip.className = "tipItemActive";
			}
			else
			{
				g_tip.className = "tipItemSelected";
			}
			
			setTipText(1, menu.itemTitle[targetIndex]);
			setTipText(2, menu.itemClient[targetIndex]);
			setTipText(3, "");
			
			setTipText(1, menu.itemTitle[targetIndex]);
			setTipText(2, menu.itemClient[targetIndex] + " | " + menu.itemDate[targetIndex]);
			setTipText(3, "");
			
			break;
		
		case "mouseout":

			if(g_tipEnabled)
			{
				document.onmousemove = null;
				clearTimeout(g_tipTimer);
				hideTip();
				g_tipEnabled = false;
				g_tip.style.left = "-1000px";
				g_tip.style.top = "-1000px";
			}

			if(!isSelected)
			{
				EventTarget.setAttribute("src",thumbImage);
				EventTarget.parentNode.style.backgroundColor = "";
				EventTarget.parentNode.style.border = "1px solid #CCCCCC";
				refreshThumbnails();
			}				

			break;
		
		case "mouseup":
			if(!isSelected)
			{
				EventTarget.setAttribute("src",thumbImage);
				changeSelected(targetIndex);
				updateGallery(targetIndex);
				g_tip.className = "tipItemSelected";
			}	

			break;
	}
}

function showTip()
{
	g_tip.style.visibility="visible";	
}

function hideTip()
{
	g_tip.style.visibility="hidden";
}

function setTipText(lineNumber, message)
{
	switch(lineNumber)
	{
		case 1:
			g_tipTitle.childNodes[0].data = message;
			break;
		case 2:
			g_tipSubtitle1.childNodes[0].data = message;
			break;
		case 3:
			g_tipSubtitle2.childNodes[0].data = message;
			break;
	}
}

function navEventHandler(Event)
{
	var EventType = getEventType(Event);
	var EventTarget = getEventTarget(Event);
	var EventTargetContainerID = EventTarget.parentNode.id;
	var menu = g_menuSystem[g_currentBranchIndex];
	var selectionIndex = getSelected();

	if(EventTargetContainerID == document.getElementById("prev").id)
	{
		previewPrevNavIndex()
	}
	else
	{
		previewNextNavIndex();
	}	

	switch(EventType)
	{
		case "mouseover":
			imageSwap(EventType,EventTarget);
			
			document.onmousemove = tooltipHandler;
			g_tipTimer = setTimeout("showTip()", 100);
			g_tipEnabled = true;
			g_tip.className = "tipItemActive";
			break;
			
		case "mouseout":
			imageSwap(EventType,EventTarget);
			
			if(g_tipEnabled)
			{
				document.onmousemove = null;
				clearTimeout(g_tipTimer);
				hideTip();
				g_tipEnabled = false;
				g_tip.style.left = "-1000px";
				g_tip.style.top = "-1000px";
			}
			
			break;
			
		case "mouseup":
			imageSwap(EventType,EventTarget);
			
			if(EventTargetContainerID == document.getElementById("prev").id)
			{
				navPrev();
			}
			else
			{
				navNext();
			}
			
			break;
			
		case "mousedown":
			imageSwap(EventType,EventTarget);
			break;
	}
}

function navPrev()
{
	var menu = g_menuSystem[g_currentBranchIndex];
	var numItems = menu.itemName.length;
	var presentationMode = getPresentationMode(g_currentBranchIndex);
	var selectionIndex = getSelected(g_currentBranchIndex); // currently selected item

	selectionIndex -= 1;
	if(selectionIndex < 0) selectionIndex = numItems-1;
	
	changeSelected(selectionIndex);
	updateGallery(selectionIndex);
	previewPrevNavIndex();
}

function navNext()
{
	var menu = g_menuSystem[g_currentBranchIndex];
	var numItems = menu.itemName.length;
	var presentationMode = getPresentationMode(g_currentBranchIndex);
	var selectionIndex = getSelected(); // currently selected item

	selectionIndex += 1;
	if(selectionIndex > numItems-1) selectionIndex = 0;

	changeSelected(selectionIndex);
	updateGallery(selectionIndex);
	previewNextNavIndex();
}

function previewNextNavIndex()
{
	var menu = g_menuSystem[g_currentBranchIndex];
	var selectionIndex = getSelected();	
	var nextItemIndex = ((selectionIndex+1) == menu.itemName.length)?0:selectionIndex+1;
	setTipText(1, menu.itemTitle[nextItemIndex]);
	setTipText(2, menu.itemClient[nextItemIndex] + " | " + menu.itemDate[nextItemIndex]);
	setTipText(3, "");
}

function previewPrevNavIndex()
{
	var menu = g_menuSystem[g_currentBranchIndex];
	var selectionIndex = getSelected();	
	var prevItemIndex = ((selectionIndex-1) < 0)?menu.itemName.length-1:selectionIndex-1;
	setTipText(1, menu.itemTitle[prevItemIndex]);
	setTipText(2, menu.itemClient[prevItemIndex] + " | " + menu.itemDate[prevItemIndex]);
	setTipText(3, "");
}

function initContent()
{
	var i = 0;
	while(g_panelToggle[i]==false&&i<g_panelToggle.length) i++;
	if(g_panelToggle[i]) toggleContentLayer(i);
}

function defineContentPanelBehavior()
{
	var panel0 = document.getElementById("panelHeader0");
	panel0.onmouseover = contentPanelEventHandler;
	panel0.onmouseout = contentPanelEventHandler;
	panel0.onclick = contentPanelEventHandler;
	
	var panel1 = document.getElementById("panelHeader1");
	panel1.onmouseover = contentPanelEventHandler;
	panel1.onmouseout = contentPanelEventHandler;
	panel1.onclick = contentPanelEventHandler;

	var panel2 = document.getElementById("panelHeader2");
	panel2.onmouseover = contentPanelEventHandler;
	panel2.onmouseout = contentPanelEventHandler;
	panel2.onclick = contentPanelEventHandler;
}

function contentPanelEventHandler(Event)
{
	var EventType = getEventType(Event);
	var EventTarget = getEventTarget(Event);
	var panelID = EventTarget.id;
	var panelIndex = parseInt(panelID.charAt(panelID.length-1));
	var caretImage;

	switch(EventType)
	{
		case "mouseover":
			caretImage = getCaretImage(panelIndex,true);
			EventTarget.style.backgroundImage = caretImage;
			EventTarget.style.color = "#FFFFFF";
			break;
			
		case "mouseout":
			caretImage = getCaretImage(panelIndex,false);
			EventTarget.style.backgroundImage = caretImage;
			EventTarget.style.backgroundColor = "";
			EventTarget.style.color = "#FF3300";
			break;
		
		case "click":
			togglePanelState(panelIndex);
			break;
	}
}

function getCaretImage(index,state)
{
	var caretImage;
	g_panelHilite[index] = state;

	if(g_panelToggle[index])
	{
		caretImage = (state)?g_caretUpOver:g_caretUp;
	}
	else
	{
		caretImage = (state)?g_caretDownOver:g_caretDown;
	}

	return caretImage;
}

function togglePanelState(panelIndex)
{
	var oldPanelToggle = g_panelToggle[panelIndex];
	
	for(i=0;i<g_panelToggle.length;i++)
	{
		g_panelToggle[i] = false;
	}

	g_panelToggle[panelIndex] = !(oldPanelToggle);
	toggleContentLayer(panelIndex);
}

function toggleContentLayer(panelIndex)
{
	var oldDisplayState = g_panelNode[panelIndex].style.display;
	var panelsCollapsed = true;
	var scrollDistance = 50;
	var scrollDirection;
	var resetScroll = true;

	for(i=0;i<g_panelNode.length;i++)
	{
		g_panelNode[i].style.display = "";
	}
	
	g_panelNode[panelIndex].style.display = (oldDisplayState)?"":"block";
	
	g_fontSizeWidget.className = g_contentHeaderStyle[panelIndex];
	debugPrint(g_contentHeaderStyle[panelIndex]);
	g_fontSizeWidget.style.display = (oldDisplayState)?"":"block"; // show content header if a panel is open
	g_dynamicContent.style.visibility = (oldDisplayState)?"hidden":"visible"; 
	
	for(i=0;i<g_panelToggle.length;i++)
	{
		if(g_panelToggle[i]==true)
		{
			panelsCollapsed = false;
		}
	}

	g_scrollEnable = !panelsCollapsed;
	
	checkScroll();
	updateCarets();
	updateWindowHeight();
}

function updateWindowHeight()
{
	//sets window height so that vscroll bars are always visible regardless of content
	var windowYOffset = getWindowY()+40;
	g_bodyNode.style.height = windowYOffset+"px";
}

function checkScroll()
{
	//for conditional scrolling behavior to become active:
	//windowY < 635 and 509 < windowY + ScrollY < 635
	var windowY = getWindowY();
	var scrollY = getScrollY();
	var minY = 509;
	var maxY = 680;
	
	var isWindowHeightValid	= (windowY < maxY);
	var isScrollMinValid	= (windowY + scrollY > minY);
	var isScrollMaxValid	= (windowY + scrollY < maxY);
	
	if(isWindowHeightValid && isScrollMinValid && isScrollMaxValid) updateScroll();
}

function updateScroll()
{
	// for small monitors: scroll++ enough so that the page content at featureY is in viewport
	var windowY = getWindowY();
	var scrollY = getScrollY();
	var featureY = 680; // y value of page feature
	var scrollOffset = featureY-(scrollY+windowY); 

	if(g_scrollEnable)
	{
		window.scrollBy(0,scrollOffset);
		g_scrollEnable = false;
	}
}

function updateCarets()
{
	var caretImage;
	for(i=0;i<g_panelToggle.length;i++)
	{
		if(g_panelToggle[i])
		{
			caretImage = (g_panelHilite[i])?g_caretUpOver:g_caretUp;
		}
		else
		{
			caretImage = (g_panelHilite[i])?g_caretDownOver:g_caretDown;
		}
		
		g_panelHeaderNode[i].style.backgroundImage = caretImage;
	}
}

function resizeHandler()
{
	var windowX = getWindowX();
	var windowY = getWindowY();
      
	// spurious event - do nothing!
	if ((windowX==g_origWidth) && (windowY==g_origHeight))
	{
		return;   
	}

	g_origWidth = windowX;
	g_origHeight = windowY;
	
	// reposition bkg image at bottom of window
	var bodyNodeBkgY = g_origHeight-396;
	g_bodyNode.style.backgroundPosition = "50% "+bodyNodeBkgY+"px";
	updateWindowHeight();
}

function scrollHandler()
{
	var scrollX = getScrollX();
	var scrollY = getScrollY();
	var windowX = getWindowX();
	var windowY = getWindowY();
	
	var debugString = "window: ";
	debugString += windowX;
	debugString += ",";
	debugString += windowY;
	debugString += " : ";
	debugString += scrollX;
	debugString += ",";
	debugString += scrollY;
	
	window.status = debugString;
}

function getWindowX()
{
	var myWidth = 0;
	if(typeof(window.innerWidth)=='number')
	{
		//Non-IE
		myWidth = window.innerWidth;
	}
	else if(document.documentElement && document.documentElement.clientWidth)
	{
		//IE 6+ in 'standards compliant mode'
		myWidth = document.documentElement.clientWidth;
	}
	else if(document.body && document.body.clientWidth)
	{
		//IE 4 compatible
		myWidth = document.body.clientWidth;
	}
	
	return myWidth;
}

function getWindowY()
{
	var myHeight = 0;
	if(typeof(window.innerWidth)=='number')
	{
		//Non-IE
		myHeight = window.innerHeight;
	}
	else if(document.documentElement && document.documentElement.clientHeight)
	{
		//IE 6+ in 'standards compliant mode'
		myHeight = document.documentElement.clientHeight;
	}
	else if(document.body && document.body.clientHeight)
	{
		//IE 4 compatible
		myHeight = document.body.clientHeight;
	}
	
	return myHeight;
}

function getScrollX()
{
	var scrOfX = 0;
	if(typeof(window.pageXOffset) == 'number')
	{
		//Netscape compliant
		scrOfX = window.pageXOffset;
	}
	else if(document.body && document.body.scrollLeft)
	{
		//DOM compliant
		scrOfX = document.body.scrollLeft;
	}
	else if(document.documentElement && document.documentElement.scrollLeft)
	{
		//IE6 standards compliant mode
		scrOfX = document.documentElement.scrollLeft;
	}
	return scrOfX;
}

function getScrollY()
{
	var scrOfY = 0;
	if(typeof(window.pageYOffset) == 'number')
	{
		//Netscape compliant
		scrOfY = window.pageYOffset;
	}
	else if(document.body && document.body.scrollTop)
	{
		//DOM compliant
		scrOfY = document.body.scrollTop;
	}
	else if(document.documentElement && document.documentElement.scrollTop)
	{
		//IE6 standards compliant mode
		scrOfY = document.documentElement.scrollTop;
	}
	return scrOfY;
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) curleft += obj.x;
	return curleft;
}

function tooltipHandler(e)
{
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY)
	{
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY)
	{
		posx = e.clientX + document.body.scrollLeft;
		posy = e.clientY + document.body.scrollTop;
	}
	
	if(g_tipEnabled)
	{
		g_tip.style.left = posx+8+"px";
		g_tip.style.top = (posy-g_tip.offsetHeight)+"px";
	}
}




function displayUpdates(xmlDoc)
{
	// error handling
	if(xmlDoc.documentElement && xmlDoc.documentElement.tagName && xmlDoc.documentElement.tagName.toUpperCase() == 'HTML')
	{
		setTimeout('alert(\'For no apparent reason, your browser has turned the clean XML into HTML based garbage.\\nScript aborted.\');',50); return;
	}
	
	var updateArray = new Array();
	updateArray["item"] = xmlDoc.getElementsByTagName("item");
	
	treewalker(xmlDoc.firstChild);
	itemNode(updateArray);
	
	function treewalker(pointer)
	{
		switch(pointer.nodeType)
		{
			case 1:
				// element node
				var key = pointer.nodeName;
				var validKey = (key!="item")&&(key!="asset")&&(key!="updates")
				if(validKey)
				{
					// don't duplicate existing array associations
					var isDuplicate = false;
					for(i in updateArray)
					{
						if(i==key)
						{
							isDuplicate = true;
							break;
						}
					}
					if(!isDuplicate) updateArray[key] = new Array();

				}
				break;
			case 3:
				// text node
				var key = pointer.parentNode.nodeName;
				var content = pointer.nodeValue;
				var filter = /\w/; // filter out non-alphanumerics
				if(filter.test(content)) updateArray[key].push(content);
				break;
		}

		if(pointer.firstChild) treewalker(pointer.firstChild);
		if(pointer.nextSibling) treewalker(pointer.nextSibling);
		return;
	}
}



function itemNode(updateArray)
{
	var updateLimit = g_updateLimit;
	if (g_updateLimit > updateArray["item"].length) updateLimit = updateArray["item"].length;
	
	var counter = 0;
	var bValidIndex = true; // we start off assuming the random index is valid
	var visibleUpdateArray = new Array();	
	
	clearChildNodes(g_updates); // remove contents prior to update
	
	while (counter < updateLimit)
	{
		// get new random index
		var theIndex = Math.floor( Math.random() * updateArray["item"].length ); 
		
		// is index already selected for display?
		for (i in visibleUpdateArray){	
			if (visibleUpdateArray[i] == theIndex) bValidIndex = false;
		}		
		
		// add item to list if valid index, otherwise get new random index
		if (bValidIndex){
			visibleUpdateArray.push(theIndex);
			displayItemNode(updateArray,counter);
			counter++;
		}
		
		bValidIndex = true; // reset for next search for valid index
	}
	
	function displayItemNode()
	{
			var itemNode = createNode("div", "updateItem"+counter, "calloutItem calloutWide", g_updates);
			var descriptionValue = updateArray["description"][theIndex];
			var descriptionValue2 = updateArray["name"][theIndex] +", " + updateArray["category"][theIndex];
			var descriptionValue3 = updateArray["client"][theIndex];
			
			fade("updateItem"+counter,1);
			if(descriptionValue!="0")
			{
				var itemNode = document.getElementById("updateItem"+counter);
				var descriptionNode = createNode("p","","calloutDesc",itemNode);
				var descriptionText = createNode("text",descriptionValue,descriptionNode);
				
				var descriptionNode2 = createNode("p","","calloutDescSubhead",itemNode);
				var descriptionText2 = createNode("text",descriptionValue2,descriptionNode2);
				
				var descriptionNode3 = createNode("p","","calloutDescSubhead",itemNode);
				var descriptionText3 = createNode("text",descriptionValue3,descriptionNode3);
			}			
	}	
	
}




var TimeToFade = 1000.0;

function fade(eid,direction)
{
  var element = document.getElementById(eid);
  if(element == null) return;
    if(direction == 1)
    {
      element.FadeState = -2;
    }
    else
    {
      element.FadeState = 2;
    }   
//  if(element.FadeState == null)
//  {
//
//  }
    
  if(element.FadeState == 1 || element.FadeState == -1)
  {
    //element.FadeState = element.FadeState == 1 ? -1 : 1;
    //element.FadeTimeLeft = TimeToFade - element.FadeTimeLeft;
  }
  else
  {
    element.FadeState = element.FadeState == 2 ? -1 : 1;
    element.FadeTimeLeft = TimeToFade;
    
    var doAnimate = function(){
    	animateFade(new Date().getTime(),eid)
    	};
    
    setTimeout(doAnimate, 33);
  }  
}


function animateFade(lastTick, eid)
{  
  var curTick = new Date().getTime();
  var elapsedTicks = curTick - lastTick;
  
  var element = document.getElementById(eid);
 
  if(element.FadeTimeLeft <= elapsedTicks)
  {
    element.style.opacity = element.FadeState == 1 ? '1' : '0';
    element.style.filter = 'alpha(opacity = ' 
        + (element.FadeState == 1 ? '100' : '0') + ')';
    element.FadeState = element.FadeState == 1 ? 2 : -2;
    
    //callback upon complete goes here
    return;
  }
 
  element.FadeTimeLeft -= elapsedTicks;
  var newOpVal = element.FadeTimeLeft/TimeToFade;
  if(element.FadeState == 1)
    newOpVal = 1 - newOpVal;

  element.style.opacity = newOpVal;
  element.style.filter = 
      'alpha(opacity = ' + (newOpVal*100) + ')';
  
  setTimeout("animateFade(" + curTick 
      + ",'" + eid + "')", 33);
}		



function descriptionNode(updateArray)
{
	for(i=0;i<updateArray["item"].length;i++)
	
	//for(i=0;i<g_updateLimit;i++)
	{
		var descriptionValue = updateArray["description"][i];
		if(descriptionValue!="0")
		{
			var itemNode = document.getElementById("updateItem"+i);
			var descriptionNode = createNode("p","","calloutDesc",itemNode);
			var descriptionText = createNode("text",descriptionValue,descriptionNode);
		}
	}	
}

function identifierNode(updateArray)
{
	for(i=0;i<updateArray["item"].length;i++)
	{
		var itemNode = document.getElementById("updateItem"+i);
		var labelValue = "  :: " + updateArray["label"][i];
		var dateValue = updateArray["date"][i];
		//var dateValue = "\u00AB";
		var updateIdentifier = createNode("p","","calloutIdentifier",itemNode);
		var dateText = createNode("text",dateValue,updateIdentifier);
		var strongNode = createNode("strong","","",updateIdentifier);
		var labelText = createNode("text",labelValue,strongNode);
		
	}
}

function imageNode(updateArray)
{
	for(var i=0;i<updateArray["item"].length;i++)
	{
		var imageName = updateArray["name"][i];
		if(imageName!=0)
		{
			var itemNode = document.getElementById("updateItem"+i);

			//find index of corresponding image in gallery
			var labelValue = updateArray["label"][i]; // get gallery name
			var branchIndex = getPresentationIndex(labelValue);
			var menuBranch = g_menuSystem[branchIndex];
			for(j=0;j<menuBranch.itemTitle.length;j++)
			{
				if(imageName==menuBranch.itemTitle[j])
				{
					var imageIndex=j;
					break;
				}
			}
			
			var command = "javascript:openWindow("+branchIndex+","+imageIndex+")";
			
			var imageSrc = g_thumbImageDir + menuBranch.itemName[imageIndex];
			var imageFrame = createNode("div","updateImageFrame"+i,"calloutImageFrame",itemNode);
			var imageLink = createNode("a","","",imageFrame,"href",command);
			var imageNode = createNode("img","","calloutImageOutlined",imageLink,"src",imageSrc);
		}
	}
}

function headerNode(updateArray)
{
	for(i=0;i<updateArray["item"].length;i++)
	{
		var nameValue = updateArray["name"][i];
		if(nameValue!="0")
		{
			var imageFrame = document.getElementById("updateImageFrame"+i);
			var itemNode = document.getElementById("updateItem"+i);
			
			//find index of corresponding image in gallery
			var imageName = updateArray["name"][i];
			var labelValue = updateArray["label"][i];
			var branchIndex = getPresentationIndex(labelValue);
			var menuBranch = g_menuSystem[branchIndex];
			for(j=0;j<menuBranch.itemTitle.length;j++)
			{
				if(imageName==menuBranch.itemTitle[j])
				{
					var imageIndex=j;
					break;
				}
			}
			
			var command = "javascript:openWindow("+branchIndex+","+imageIndex+")";
			
			// create text frame for all asset metadata
			var textFrameNode = createNode("div","updateTextFrame"+i,"calloutTextFrame col157px",imageFrame);
		
			var nameNode = createNode("a","","calloutHeader",textFrameNode,"href",command);
			var nameText = createNode("text",nameValue,nameNode);
		}
	}
}

function detailNode(updateArray)
{
	for(i=0;i<updateArray["item"].length;i++)
	{
		var categoryValue = updateArray["category"][i];
		var clientValue = updateArray["client"][i];
		if(categoryValue!="0")
		{
			var textFrameNode = document.getElementById("updateTextFrame"+i);
			var categoryNode = createNode("p","","calloutCategory",textFrameNode);
			var categoryText = createNode("text",categoryValue,categoryNode);
			var clientNode = createNode("p","","calloutBody",textFrameNode);
			var clientText = createNode("text",clientValue,clientNode);
		}
	}
}

function headlineNode(updateArray)
{
	for(i=0;i<updateArray["item"].length;i++)
	{
		var headlineValue = updateArray["headline"][i];
		if(headlineValue!="0")
		{
			var itemNode = document.getElementById("updateItem"+i);
			var headlineNode = createNode("p","","calloutHeadline",itemNode);
			var headlineText = createNode("text",headlineValue,headlineNode);
		}
	}
}




/*
import XML data files
v2.0.3 written by Mark Wilton-Jones, 13/04/2004
http://www.howtocreate.co.uk/tutorials/jsexamples/importingXML.html
*/
var MWJ_ldD = [];
function importXML( oURL, oFunct, oNoRand, oDelay ) {
	//note: in XML importing event handlers, 'this' refers to window
	if( !oNoRand ) { oURL += ( ( oURL.indexOf('?') + 1 ) ? '&' : '?' ) + ( new Date() ).getTime(); } //prevent cache
	if( window.XMLHttpRequest ) {
		//alternate XMLHTTP request - Gecko, Safari 1.2+ and Opera 7.6+
		MWJ_ldD[MWJ_ldD.length] = new XMLHttpRequest();
		MWJ_ldD[MWJ_ldD.length-1].onreadystatechange = new Function( 'if( MWJ_ldD['+(MWJ_ldD.length-1)+'].readyState == 4 && MWJ_ldD['+(MWJ_ldD.length-1)+'].status < 300 ) { '+oFunct+'(MWJ_ldD['+(MWJ_ldD.length-1)+'].responseXML); }' );
		MWJ_ldD[MWJ_ldD.length-1].open("GET", oURL, true);
		MWJ_ldD[MWJ_ldD.length-1].send(null);
		return true;
	}
	if( !navigator.__ice_version && window.ActiveXObject ) {
		//the Microsoft way - IE 5+/Win (ICE produces errors and fails to use try-catch correctly)
		try { //IE Mac has the property window.ActiveXObject but produces errors if you try and use it
			try { var tho = new ActiveXObject( 'Microsoft.XMLDOM' ); //newer
			} catch(e) { var tho = new ActiveXObject( 'Msxml2.XMLHTTP' ); } //older
			MWJ_ldD[MWJ_ldD.length] = tho;
			MWJ_ldD[MWJ_ldD.length-1].onreadystatechange = new Function( 'if( MWJ_ldD['+(MWJ_ldD.length-1)+'].readyState == 4 ) { '+oFunct+'(MWJ_ldD['+(MWJ_ldD.length-1)+']); }' );
			MWJ_ldD[MWJ_ldD.length-1].load(oURL);
			return true;
		} catch(e) {}
	}
	if( document.createElement && document.childNodes ) {
		//load the XML in an iframe
		var ifr = document.createElement('DIV');
		ifr.style.visibility = 'hidden'; ifr.style.position = 'absolute'; ifr.style.top = '0px'; ifr.style.left = '0px';
		//onload only fires in Opera so I use a timer for all
		if( !window.MWJ_XML_timer ) { window.MWJ_XML_timer = window.setInterval('MWJ_checkXMLLoad();',100); }
		ifr.innerHTML = '<iframe src="'+oURL+'" name="MWJ_XML_loader_'+MWJ_ldD.length+'" height="0" width="0"><\/iframe>';
		MWJ_ldD[MWJ_ldD.length] = oFunct+'MWJ_SPLIT'+(oDelay?oDelay:1)+'';
		document.body.appendChild(ifr);
		return true;
	}
	return false;
}

function MWJ_checkXMLLoad() {
	//check if each imported file is available (huge files may not have loaded completely - nothing I can do - use the delay to help)
	for( var x = 0; x < MWJ_ldD.length; x++ ) { if( MWJ_ldD[x] && window.frames['MWJ_XML_loader_'+x] ) {
		setTimeout( MWJ_ldD[x].split('MWJ_SPLIT')[0] + '(window.frames.MWJ_XML_loader_'+x+'.window.document);', parseInt(MWJ_ldD[x].split('MWJ_SPLIT')[1]) );
		MWJ_ldD[x] = false;
	} }
}