pageLoaded = 0;				// Prevent access to layers until they're loaded
DEBUG_ON = false;

delayedPreloadImages = new Array();
onloadFunctions = new Array();
previewing = false;

// Set the pageLoaded variable to denote that the layers are ready to be used 
function doLoadProc() {
	if (DEBUG_ON) {
		dbg = document.createElement("textarea");
		dbg.id = "debugBox";
		dbg.value = "";
		dbg.cols = 110;
		dbg.rows = 20;
		document.body.appendChild(dbg);
	}
	
	for (var i = 0; i < delayedPreloadImages.length; i++) {
		if (typeof delayedPreloadImages[i] != "function") {
			eval(i + " = preload('" + delayedPreloadImages[i] + "')");
		}
	}
	
	for (var i = 0; i < onloadFunctions.length; i++) {
		onloadFunctions[i]();
	}

	for (x = 1; x <= 15; x++) {
		loaderImages[loaderImages.length] = preload("/common/images/loader/" + x + ".png");
	}
	pageLoaded = 1;
	
	if (previewing) {
		previewObj = document.createElement("div");
		previewObj.id = "previewIndicator";
		previewObj.innerHTML = "Previewing!!!";
		previewObj.className = "previewIndicator";
		previewObj.onmousedown = function() {
			var obj = document.getElementById("previewIndicator");
			if (getX(obj) != 0) {
				moveToXY(obj, 0, 0);
			} else {
				moveToXY(obj, getSize(document.body).width - getSize(obj).width - 20, 0);
			}
			
		}
		document.body.appendChild(previewObj);
	}
}

arrayHasValue = function(array, value) {
	for (var i = 0; i < array.length; i++) {
		if (array[i] == value) {
			return true;
		}
	}
	return false;
}

debug = function(dbgText) {
	if (DEBUG_ON) {
		document.getElementById("debugBox").value += dbgText;
		document.getElementById("debugBox").value += "\n";
		document.getElementById("debugBox").scrollTop = document.getElementById("debugBox").scrollHeight;
	}
}

eWepCustomWindowObj = null;
function eWEPCustomWindow(url, width, height) {
	eWepCustomWindowObj = window.open(url, "eWEPCustomWin", "width=" + width + ",height=" + height + ",scrollbars=1");
	return false;
}

PATH_FETCH_URL = "/applications/fetch-path.cfm";
directJump = function(navid) {
	if (loader.start()) {
		AjaxService.addRequest(
			http(
				"get",
				PATH_FETCH_URL,
				function(obj) {
					skipSlide = true;
					doFade = true;
					doJump(obj.path.split(","));
				},
				{
					navid : navid
				}
			),
			function() {
				loader.stop();
			}
		);
	}
	return false;
}



NAV_INTERVAL = 15;
NAV_STEP = 10;

currentPath = new Array();
expandedPath = new Array();

currentLocation = 1;

var isReady = true;

navClick = function() {

	var args = new Array();
	if (typeof arguments[0] == "object") {
		args = arguments[0];
	} else {
		for (var i = 0; i < arguments.length; i++) {
			args.push(arguments[i]);
		}
	}

	if (isReady) {
		if (currentPath.length > args.length && firstDifference(args, currentPath) > 0 && args.length < 3) {
			slideModifier = -1;
		} else {
			slideModifier = 1;
		}
		
		// debug("args: " + args + " currentPath: " + currentPath + " expandedPath: " + expandedPath + " currentLocation: " + currentLocation + " : " + firstDifference(args, currentPath));
		if ((args == 1 && currentPath != 1) || (args.length > 1 && args[args.length - 1] != currentPath[currentPath.length - 1]) || (firstDifference(args, currentPath) == -1 && args[args.length - 1] != currentLocation)) {
			isReady = false;
			expandNav(
				function() {
					updateNav(
						args,
						function() {
							cmsLoad(args);
						}
					);
				}
			);
		} else {
			expandNav(
				function() {
					updateNav(args);
				}
			);
		}
	} else {
		if (cmsLoading) { // give up waiting on a slow server
			debug("aborting");
			AjaxService.abortAll();
			isReady = true;
			navClick(args);
		}
		debug("navClick(" + args + ") Not Ready");
	}
}

updateNav = function(navPath, cb) {
	var collapseScene = new Array();
	var expandScene = new Array();
	
	if (navPath == 1) {

		collapseScene = collapseScene.concat(collapseChildren(expandedPath));
		if (firstDifference(expandedPath, currentPath) == 0) {
			collapseScene = collapseScene.concat(collapseChildren(currentPath));
		}

		navOnOff(currentPath, 0);
		currentPath = 1;
		expandedPath = new Array();
	} else {
	
		var loadPage = navPath.length > 1;
		var skipExpand = false;
		
		if (loadPage) {

			skipExpand = (firstDifference(navPath, currentPath) == -1 || firstDifference(navPath, currentPath) >= navPath.length);
	
			if (firstDifference(navPath, currentPath) == 0) {
				collapseScene = collapseScene.concat(collapseChildren(currentPath));
				expandedPath = new Array();
			}
			
			if (firstDifference(currentPath, expandedPath) == 0) {
				collapseScene = collapseScene.concat(collapseChildren(expandedPath));
				expandedPath = new Array();
			}
			
			if (firstDifference(navPath, currentPath) > 0 && navPath.length <= currentPath.length && navPath.length < 3 && !skipExpand) {
				collapseScene = collapseScene.concat(collapseChild(currentPath.slice(0, 2)));
				expandedPath = new Array();
			}
			
			navOnOff(currentPath, 0);

			currentPath = navPath;
			var lastItem = currentPath[currentPath.length - 1];
			if (currentPath.length > 3) {
				lastItem = currentPath[2];
			}
			if (!document.getElementById("navLink_" + lastItem)) {
				lastItem = currentPath[1];
			}
			navOnOff([currentPath[0], lastItem], 1);
		}
		
		var diff = firstDifference(navPath, expandedPath);
		var goingUp = (navPath.length < expandedPath.length);
		var lateral = diff == (navPath.length - 1) && expandedPath.length == navPath.length;
	
		if ((diff == 0 || navPath.length == 1) && firstDifference(expandedPath, currentPath) == 0) {
			collapseScene = collapseScene.concat(collapseChildren(expandedPath));
			expandedPath = new Array();
		}
		if (lateral) {
			collapseScene = collapseScene.concat(collapseChild(expandedPath));
			expandedPath = expandedPath.slice(0, expandedPath.length - 1);
		}

		if ((diff >= 0 && !goingUp && firstDifference(navPath, currentPath) <= 0 && !skipExpand) || (diff == 0 && goingUp)) {
			expandScene = expandChildren(navPath);
		}
	}
	
	AnimationService.runScene(collapseScene, function() {
			AnimationService.runScene(expandScene, function() {
					if (cb) {
						cb(navPath);
					}
				}
			);
		}
	);


	// debug("navPath: " + navPath + " expandedPath: " + expandedPath + " currentPath: " + currentPath + " diff: " + diff + " goingUp: " + goingUp + " lateral: " + lateral + " loadPage: " + loadPage);
	// debug("");
}

jumpNav = function() {
	var args = new Array();
	for (var i = 0; i < arguments.length; i++) {
		args.push(arguments[i]);
	}

	if (isReady) {
		doJump(args);
	} else {
		debug("jumpNav(" + args + ") Not Ready");
	}
}

previousInterval = NAV_INTERVAL;
previousDistance = NAV_STEP;
forceJump = function(args) {
	if (navCollapsed) {
		var element = document.getElementById("nav");

		moveToXY(element, getX(element), 0);

		show(document.getElementById("collapseNavOpen"));
		show(document.getElementById("navItems"));
		hide(document.getElementById("collapseNavClosed"));

		navCollapsed = false;
	}
	
	NAV_INTERVAL = 1;
	NAV_STEP = 10000;

	if (args.length > 1 && firstDifference(args, currentPath) >= 0) {
		updateNav(
			1,
			function() {
				updateNav(
					args.slice(0, 1),
					function() {
						updateNav(
							args.slice(0, 2),
							function() {
								updateNav(
									args,
									function() {
										skipSlide = true;
										doFade = false;
										loader = defaultLoader;
										cmsLoad(
											args,
											function() {
												NAV_INTERVAL = previousInterval;
												NAV_STEP = previousDistance;
											}
										);
									}
								);
							}
						);
					}
				);
			}
		);
	} else {
		updateNav(
			args,
			function() {
				skipSlide = true;
				doFade = false;
				loader = defaultLoader;
				cmsLoad(
					args,
					function() {
						NAV_INTERVAL = previousInterval;
						NAV_STEP = previousDistance;
					}
				);
			}
		);
	}
}

doJump = function(args, cb) {
	if (isReady) {
		expandNav(
			function() {
				if (args.length > 1 && firstDifference(args, currentPath) >= 0) {
					if (currentPath.length > 1 && args.length > currentPath.length && firstDifference(args, currentPath) >= currentPath.length) {
						navClick(args);
						if (cb) {
							cb();
						}
					} else {
						updateNav(1, function() {
								updateNav(args.slice(0, 1), function() {
										updateNav(args.slice(0, 2), function() {
												navClick(args);
												if (cb) {
													cb();
												}
											}
										);
									}
								);
							}
						);
					}
				} else {
					navClick(args);
					if (cb) {
						cb();
					}
				}
			}
		);
	} else {
		debug("doJump(" + args + ") Not Ready");
	}
}


navOnOff = function(path, onOff) {
	for (var j = 0; j < path.length; j++) {
		var navObj = document.getElementById("navLink_" + path[j]);
		
		if (navObj) {
			var className = navObj.className;
			var lastChar = className.charAt(className.length - 1);
			if (lastChar == 0 || lastChar == 1) {
				navObj.className = className.substr(0, className.length - 1).concat(onOff);
			}
		}
	}
}


expandChildren = function(parentIds) {
	var seq = new Array();
	var slider = document.getElementById("childrenOf_" + parentIds[parentIds.length - 1] + "_slider");
	if (slider) {
		var resizeHeight = getSize(slider).height;

		var hasChildren = false;
		for (var i = 0; i < parentIds.length; i++) {

			var children = document.getElementById("childrenOf_" + parentIds[i]);
			if (children) {
				var childAnim = AnimationService.addAnimation("childAnim" + parentIds.join("_"), new resizeByAnimation(children));
				childAnim.interval = NAV_INTERVAL;
				childAnim.step = NAV_STEP;
				childAnim.byY = resizeHeight;

				seq[seq.length] = childAnim;

				hasChildren = true;
			}
		}
		if (hasChildren) {
			expandedPath = parentIds;
		}
	}
	return seq;
}

collapseChildren = function(parentIds) {

	var seq = new Array();

	for (var i = 0; i < parentIds.length; i++) {

		var children = document.getElementById("childrenOf_" + parentIds[i]);
		if (children) {
			var childAnim = AnimationService.addAnimation("childAnim" + parentIds.join("_"), new resizeByAnimation(children));
			childAnim.interval = NAV_INTERVAL;
			childAnim.step = NAV_STEP;
			childAnim.byY = -getSize(children).height;

			seq[seq.length] = childAnim;
		}
	}
	return seq;
}

collapseChild = function(parentIds) {
	var slider = document.getElementById("childrenOf_" + parentIds[parentIds.length - 1] + "_slider");
	var seq = new Array();
	
	if (slider) {

		var resizeHeight = -getSize(slider).height;

		for (var i = 0; i < parentIds.length; i++) {

			var children = document.getElementById("childrenOf_" + parentIds[i]);
			if (children) {
				var childAnim = AnimationService.addAnimation("childAnim" + parentIds.join("_"), new resizeByAnimation(children));
				childAnim.interval = NAV_INTERVAL;
				childAnim.step = NAV_STEP;
				childAnim.byY = resizeHeight;

				seq[seq.length] = childAnim;
			}
		}
	}
	return seq;
}


currentContent = 1;
slideModifier = 1;
sliding = false;
slideIn = function(cmsResponse) {
	if (!sliding) {
		sliding = true;
		
		var newContent = AnimationService.animations["content" + hiddenContent()];
		newContent.byX = 960 * -slideModifier;
		newContent.complete = function() {};
		var oldContent = AnimationService.animations["content" + currentContent];
		oldContent.byX = 960 * -slideModifier;
		oldContent.complete = function() {
			newContent.stop();
			sliding = false;
			
			oldContent.element.innerHTML = "";
			
			setTimeout(
				function() {
					if (currentWebPage.onload) {
						currentWebPage.onload();
					}
					isReady = true;
				},
				100
			);
			// debug(new Date().getTime() - oldContent.startTime);
		}
	
		// Change the hidden content element
		replaceContent(newContent.element, cmsResponse);

		// move it to the start position
		moveToXY(newContent.element, 960 * slideModifier, 0);
	
		setOpacity(newContent.element, 100);
		setOpacity(oldContent.element, 100);

		newContent.start();
		oldContent.start();
		
		currentContent = hiddenContent();
	}
}

fading = false;
fadeIn = function(cmsResponse) {
	if (!fading) {
		fading = true;
		
		var hiddenElement = document.getElementById("content" + hiddenContent());
		var visibleElement = document.getElementById("content" + currentContent);
		
		replaceContent(hiddenElement, cmsResponse);

		visibleElement.style.zIndex = 2;
		hiddenElement.style.zIndex = 1;

		moveToXY(hiddenElement, 0, 0);
		

		var fader = new fadeAnimation(visibleElement);
		fader.toOpacity = 0;
		fader.interval = 50;
		fader.step = 30;

		fader.complete = function() {
			fading = false;
			
			visibleElement.innerHTML = "";
			hiddenElement.style.zIndex = 2;
			visibleElement.style.zIndex = 1;
			setOpacity(visibleElement, 100);
			setOpacity(hiddenElement, 100);

			setTimeout(
				function() {
					if (currentWebPage.onload) {
						currentWebPage.onload();
					}
					isReady = true;
				},
				100
			);
			// debug(new Date().getTime() - visibleElement.startTime);
		}
		

		fader.start();
		
		currentContent = hiddenContent();
	}
}

replaceContent = function(element, cmsResponse) {
	var c = cmsResponse.content;
	document.title = cmsResponse.title;
	element.innerHTML = c;
	
	// First do scripts
	var ph = String.fromCharCode(255);
	var tmp = c.replace(/<\/script>/mgi, ph);
	var re = new RegExp("(<script[^>]+>)([^" + ph + "]*)" + ph + "", "gi");
	var m = re.exec(tmp);
	
	var addedNodes = new Array();
	
	while (m != null) {
		
		if (m[2]) {	// Found a script block
			var scriptObj = document.createElement("SCRIPT");
			scriptObj.type = "text/javascript";
			
			if (navigator.appVersion.toLowerCase().indexOf("safari") != -1 || navigator.appVersion.indexOf("MSIE") != -1) {
				scriptObj.text = m[2];
			} else {
				scriptObj.innerHTML = m[2];
			}
			addedNodes[addedNodes.length] = document.getElementsByTagName("head")[0].appendChild(scriptObj);
		} else {	// Might be a script src.
			var result = m[1].match(/src=['"]?([^'" ]+)['" ]/);
			if (result[1]) {
				var scriptObj = document.createElement("SCRIPT");
				scriptObj.type = "text/javascript";
				scriptObj.src = result[1];

				addedNodes[addedNodes.length] = document.getElementsByTagName("head")[0].appendChild(scriptObj);
			}
		}
		
		m = re.exec(tmp);
	}
	
	// Now do styles if need be
	if (document.createStyleSheet || navigator.appVersion.toLowerCase().indexOf("safari") != -1) {
		var ph = String.fromCharCode(255);
		var tmp = c.replace(/<\/style>/mgi, ph);
		var re = new RegExp("(<style[^>]+>)([^" + ph + "]*)" + ph + "", "gi");
		var m = re.exec(tmp);
		while (m != null) {
			
			if (m[2]) {	// Found a style block
			
				if (document.createStyleSheet) {
					var styleObj = document.createStyleSheet();
					styleObj.cssText = m[2];
				} else if (navigator.appVersion.toLowerCase().indexOf("safari") != -1) {
					var styleObj = document.createElement("STYLE");
					styleObj.textContent = m[2];
					addedNodes[addedNodes.length] = document.getElementsByTagName("head")[0].appendChild(styleObj);
					
				}
				
			}
			
			m = re.exec(tmp);
		}
	}
	
	var currentUnload = currentWebPage.onunload;
	currentWebPage.onunload = function() {
		for (var i = 0; i < addedNodes.length; i++) {
			try {
				if (addedNodes[i] != null) {
					document.getElementsByTagName("head")[0].removeChild(addedNodes[i]);
					addedNodes[i] = null;
				}
				delete addedNodes[i];
			} catch(e) {
				debug("Caught an error removing a child node.");
			}
		}
		delete addedNodes;
		currentUnload();
	}


	currentWebPage.onbeforeload();
	try {
		pageTracker._trackPageview();
	} catch (err) {}
}

hiddenContent = function() {
	return (currentContent == 1) ? 2 : 1;
}

moveToXY = function(element, x, y) {
	element.style.left = x;
	element.style.top = y;
}

moveByX = function(element, x) {
	element.style.left = getX(element) + x;
}
moveByY = function(element, y) {
	element.style.top = getY(element) + y;
}

resizeToX = function(element, x) {
	element.style.width = x;
}
resizeToY = function(element, y) {
	element.style.height = y;
}

getX = function(element) {
	return isNaN(parseInt(element.style.left)) ? 0 : parseInt(element.style.left);
}
getY = function(element) {
	return isNaN(parseInt(element.style.top)) ? 0 : parseInt(element.style.top);
}
getSize = function(element) {
	var display = element.style.display;
	if (display != "none" && display != null) {									// Safari bug
		return new Size(element.offsetWidth, element.offsetHeight);
	}
	
	// All *Width and *Height properties give 0 on elements with display none,
	// so enable the element temporarily
	var els = element.style;
	var originalVisibility = els.visibility;
	var originalPosition = els.position;
	var originalDisplay = els.display;
	els.visibility = 'hidden';
	els.position = 'absolute';
	els.display = 'block';
	var originalWidth = element.clientWidth;
	var originalHeight = element.clientHeight;
	els.display = originalDisplay;
	els.position = originalPosition;
	els.visibility = originalVisibility;
	
	return new Size(originalWidth, originalHeight);
}

Size = function(w, h) {
	this.width = isNaN(w) ? 0 : w;
	this.height = isNaN(h) ? 0 : h;
	this.toString = function() {
		return this.width + "," + this.height;
	}

}


show = function(element) {
	if (element) {
		element.style.display = "block";
		element.style.visibility = "visible";
	}
}

hide = function(element) {
	if (element) {
		element.style.display = "none";
		element.style.visibility = "hidden";
	}
}

// -1 if equal
// index of the first difference found.
firstDifference = function(a1, a2) {
	var ret = -1;
	var longest = (a1.length > a2.length) ? a1.length : a2.length;
	var shortest = (a1.length > a2.length) ? a2.length : a1.length;
	
	for (var i = 0; i < shortest; i++) {
		if (a1[i] != a2[i]) {
			ret = i;
			i = shortest;
		}
	}
	
	if (ret == -1 && longest != shortest) {
		ret = (shortest == 0) ? 0 : shortest;
	}
	// debug("a1: " + a1 + " a2: " + a2 + " ret: " + ret);
	return ret;
}

// swapImg - swaps an image for another that has already been preloaded.
function swapImg(imgName, preloadedImgName) {
	if (document[imgName]) {
		document[imgName].src = eval(preloadedImgName).src;
	}
}

function preload(imgSrc) {
	img = new Image();
	img.src = imgSrc;
	return img;
}

function delayedPreload(imgName, imgSrc) {
	if (!pageLoaded) {
		eval(imgName + " = new Image()");
		delayedPreloadImages[imgName] = imgSrc;
	} else {
		eval(imgName + " = preload('" + imgSrc + "')");
	}
}

function addOnLoad(func) {
	onloadFunctions[onloadFunctions.length] = func;
}

CMS_LOADING_URL = "/index.cfm";
PORTFOLIO_LOADING_URL = "/applications/portfolio.cfm";
cmsLoading = false;
blockHistory = false;
skipSlide = false;
doFade = false;

webPage = function(navid) {
	this.navid = navid;
	this.onload = function() {};
	this.onbeforeload = function() {};
	this.onunload = function() {};
}

var currentWebPage = new webPage(0);

cmsLoad = function(navidPath, cb) {
	if (!cmsLoading) {

		if (!blockHistory) {
			dhtmlHistory.add(navidPath.join("_"));
		}
		blockHistory = false;
		
		currentWebPage.onunload();
		
		cmsLoading = true;
		loader.start();

		var cmsUrl = CMS_LOADING_URL;
		var navid = navidPath[navidPath.length - 1];
		if (navidPath[navidPath.length - 1].toString().match(/^[spt]/i)) {		// This is a portfolio page
			cmsUrl = PORTFOLIO_LOADING_URL;
			navid = navidPath[0];
		}

		AjaxService.addRequest(
			http(
				"get",
				cmsUrl,
				function(obj) {
	
					loader.stop();
					loader = defaultLoader;
					
					cmsLoading = false;
					currentLocation = navidPath[navidPath.length - 1];
					currentWebPage = new webPage(currentLocation);
					if (obj.onload != "") {
						currentWebPage.onload = function() {
							eval(obj.onload + "()");
						}
					}
					if (obj.onbeforeload != "") {
						currentWebPage.onbeforeload = function() {
							eval(obj.onbeforeload + "()");
						}
					}
					if (obj.onunload != "") {
						currentWebPage.onunload = function() {
							eval(obj.onunload + "()");
						}
					}
					
					if (!skipSlide) {
						slideIn(obj);
					} else {
						skipSlide = false;
						if (doFade) {
							fadeIn(obj);
							doFade = false;
						} else {
							AnimationService.animations["content" + hiddenContent()].element.innerHTML = "";
							replaceContent(AnimationService.animations["content" + currentContent].element, obj);
							setTimeout(
								function() {
									if (currentWebPage.onload) {
										currentWebPage.onload();
									}
									isReady = true;
								},
								100
							);
						}
					}
					
					if (cb) {
						cb(navidPath);
					}
	
				},
				{
					async : true,
					navid : navid,
					path : navidPath
				}
			),
			function() {
				loader.stop();
				loader = defaultLoader;
				cmsLoading = false;
				isReady = true;
			}
		);
	
	} else {
		AjaxService.abortAll();
		cmsLoading = false;
		cmsLoad(navidPath, cb);
		// debug("Interrupting previous load...");
	}
}

LOADER_DELAY = 40;
loaderCurrent = 0;
loaderImages = new Array();
loaderInterval = null;
startLoader = function() {
	if (loaderInterval == null) {
		var loaderElement = document.getElementById("loader");
		show(loaderElement);
		
		loaderInterval = setInterval(function() {
				loaderCurrent++;
				if (loaderCurrent < loaderImages.length) {
					loaderElement.src = loaderImages[loaderCurrent].src;
				} else {
					loaderElement.src = loaderImages[0].src;
					loaderCurrent = 0;
				}
			},
			LOADER_DELAY
		);
		return true;
	} else {
		return false;
	}
}

stopLoader = function() {
	if (loaderInterval != null) {
		clearInterval(loaderInterval);

		var loaderElement = document.getElementById("loader");
		loaderElement.src = loaderImages[0].src;
		loaderCurrent = 0;
		hide(loaderElement);
		loaderInterval = null;
	}
}

defaultLoader = {
	start : startLoader,
	stop : stopLoader
}
loader = defaultLoader;


collapsedNavHeight = 0;
navCollapsed = false;
collapseNav = function() {
	var navAnim = AnimationService.addAnimation("navAnim", new moveByAnimation(document.getElementById("nav")));

	collapsedNavHeight = getSize(navAnim.element).height
	navAnim.byY = -collapsedNavHeight;
	navAnim.interval = NAV_INTERVAL;
	navAnim.step = NAV_STEP;
	navAnim.complete = function() {
		hide(document.getElementById("collapseNavOpen"));
		hide(document.getElementById("navItems"));
		show(document.getElementById("collapseNavClosed"));
		
		var newHeight = getSize(navAnim.element).height;
		moveToXY(navAnim.element, getX(navAnim.element), -newHeight);
		navAnim.byY = newHeight;

		navAnim.complete = function() {};
		navAnim.start();
		navCollapsed = true;
	}
	navAnim.start();
}
expandNav = function(cb) {
	if (navCollapsed) {
		var navAnim = AnimationService.addAnimation("navAnim", new moveByAnimation(document.getElementById("nav")));
	
		navAnim.byY = -getSize(navAnim.element).height;
		navAnim.interval = NAV_INTERVAL;
		navAnim.step = NAV_STEP;
		navAnim.complete = function() {
			show(document.getElementById("collapseNavOpen"));
			show(document.getElementById("navItems"));
			hide(document.getElementById("collapseNavClosed"));
			
			moveToXY(navAnim.element, getX(navAnim.element), -collapsedNavHeight);
			navAnim.byY = collapsedNavHeight;
	
			navAnim.complete = function() {
				if (cb) {
					cb();
				}
			}
			navAnim.start();
			navCollapsed = false;
		}
		navAnim.start();
	} else if (cb) {
		cb();
	}
}

trim = function(str) {
	return str.replace(/^\s*((?:[\S\s]*\S)?)\s*$/, '$1');
}


getOpacity = function(element) {
	if (element.currentStyle) {
		if (element.currentStyle.filter) {
			if (value = (element.currentStyle.filter || '').match(/alpha\(opacity=(.*)\)/))
			if (value[1]) return parseFloat(value[1]);
		} else {
			return 100;
		}
	} else if (element.style.opacity) {
		return element.style.opacity * 100;
	} else if (element.style.MozOpacity) {
		return element.style.MozOpacity * 100;
	} else {
		var css = document.defaultView.getComputedStyle(element, null);
		return css ? css["opacity"] * 100 : null;
	}
}

setOpacity = function(element, value) {
	function stripAlpha(filter){
		return filter.replace(/alpha\([^\)]*\)/gi,'');
	}
	
	var filter = null;
	if (element.currentStyle) {
		var currentStyle = element.currentStyle;
		filter = (currentStyle.filter) ? currentStyle.filter : "";
	}
	var style = element.style;

	if (value == 100 || value === '') {
		if (filter != null) {
			(filter = stripAlpha(filter)) ? style.filter = filter : style.removeAttribute('filter');
		}
		element.style.opacity = 1;
		element.style.MozOpacity = 1;
		return element;
	} else if (value < 0.00001) value = 0;
	
	if (filter != null) {
		style.filter = stripAlpha(filter) + 'alpha(opacity=' + value + ')';
	}
	element.style.opacity = value / 100;
	element.style.MozOpacity = value / 100;

	return element;
}

