var blnLowPerformance = false;
var blnAutoLogin = false;
var blnAudioNotificaions = true;
var blnHideIntros = false;
var blnImagesLoaded = false;
var debugMode = false;
var keepScrolling = false;
var scrollTimeout;
var blnScrolling = false;
var currentIntro = 1;
var totalNumImages = (2 * menuItems.length);
if(self.subMenuItems) {
	totalNumImages = totalNumImages + (2 * subMenuItems.length)
}
var imagesLoaded = 0;

function goHome() {	
	if(parent.jsPlay) {
		parent.jsPlay("click");
		parent.strNavigateTo = ""
		parent.prepareNavigate();
	}
	else if(self.jsPlay) {
		jsPlay("click");
		strNavigateTo = ""
		prepareNavigate();
	}
}

function encodeMyHtml(strHtml) {
	encodedHtml = strHtml;
	encodedHtml = encodedHtml.replace(/&/g, "&amp;");
	encodedHtml = encodedHtml.replace(/</g, "&lt;");
	encodedHtml = encodedHtml.replace(/>/g, "&gt;");	
	encodedHtml = encodedHtml.replace(/\?/g,"%3F");
	encodedHtml = encodedHtml.replace(/=/g,"%3D");
	encodedHtml = encodedHtml.replace(/&/g,"%26");
	encodedHtml = encodedHtml.replace(/@/g,"%40");
	return encodedHtml;
	
}
		  
function LCase(Value) {
	return Value.toString().toLowerCase();
}

function UCase(Value) {
	return Value.toString().toUpperCase();
}
		
function Len(Expression) {
	return Expression.toString().length;
}
		
function Left(Str, Length) {
	if (Length < 0) {
		alert("Invalid Length argument\n\nLeft function (js2vb.js)"); return "";
	}
	return Str.substring(0, Length);
}

function Right(Str, Length) {
	if (Length < 0) {
		alert("Invalid Length argument\n\nRight function (js2vb.js)"); return "";
	}
	return Str.substring(Len(Str) - Length, Len(Str));
}

function Mid(Str, Start, Length) {
	if (Length < 1) {
		alert("Invalid Length argument\n\nMid function (js2vb.js)"); return "";
	}
	if (Start < 0) {
		alert("Invalid Start argument\n\nMid function (js2vb.js)"); return "";
	}
	return Str.substring(Start, Start + Length);
}

function InStr(Start, String1, String2, Compare) {
	if (Start < 1) {
		alert("Invalid Start argument\n\nInStr function (js2vb.js)"); return "";
	}
	if (Start > Len(String1)) return 0;
	if (Len(String2) == 0) return Start;
	if (Compare == 1) {String1 = LCase(String1); String2 = LCase(String2);}
	if (Start > 1) {
		var index = Right(String1, Len(String1) - Start + 1).indexOf(String2)
		if (index == -1) {return 0;} else {return index + Start;}
	} else {
		return String1.indexOf(String2) + 1
	}
}

function setCookie (name, value, expires) {
	if (!expires) expires = new Date();
	
	document.cookie = name + "=" + escape (value) + "; expires=" + expires.toGMTString() +  "; path=/";
}

function getCookie(name) {
	var dcookie = document.cookie; 
	var cname = name + "=";
	var clen = dcookie.length;
	var cbegin = 0;
	while (cbegin < clen) {
		//alert(cname);
		var vbegin = cbegin + cname.length;
		if (dcookie.substring(cbegin, vbegin) == cname) { 
			var vend = dcookie.indexOf (";", vbegin);
			if (vend == -1) vend = clen;
			return unescape(dcookie.substring(vbegin, vend));
		}
		cbegin = dcookie.indexOf(" ", cbegin) + 1;
		if (cbegin == 0) break;
	}
	return null;
}

	
function toggleOn(soundName) {			
	if(!blnImagesLoaded) {
		return;
	}				
	
	if(InStr(1, document.getElementById(window.event.toElement.id).src, "_sel", 1) > 0){
		return;
	}
			
	if(parent.jsPlay) {
		parent.jsPlay(soundName);
	}
	//alert(window.event.toElement.src);
	window.event.toElement.src = eval(window.event.toElement.id + "_on.src");
	//eval("document.all." + window.event.toElement.id + ".src = " + window.event.toElement.id + "_on.src");
}
	
function toggleOff() {
	if(!blnImagesLoaded) {
		return;
	}
	if(InStr(1, document.getElementById(window.event.fromElement.id).src, "_sel", 1) > 0){
		return;
	}
	window.event.fromElement.src = eval(window.event.fromElement.id + "_off.src");
	//eval("document.all." + window.event.fromElement.id + ".src = " + window.event.fromElement.id + "_off.src");
}

function highlightCharacter() {	
	window.event.toElement.parentNode.style.color = "#660000";
}
		
function deHighlightCharacter() {
	if(window.event.fromElement.parentNode.className == "selectedCharacter") {
		return;
	}
	window.event.fromElement.parentNode.style.color = "#000000";
}
function toggleRadio(radioObj, blnLoad) {
	var newRadioState;
	var oldRadioState;
	var newFormValue;
	var radioArray = radioObj.id.split("_");
	radioName = radioArray[0];
	newRadioState = radioArray[1];
	if(!blnLoad && parent.jsPlay) {
		parent.jsPlay('click');
	}
	if(newRadioState == "y") {
		oldRadioState = "n";
		newFormValue = 1;
	}
	else {
		oldRadioState = "y";
		newFormValue = 0;
	}
	
	document.getElementById(radioName + "_" + oldRadioState).value = "";
	document.getElementById(radioName).value = newFormValue;
			
	radioObj.value = "X";
	radioObj.blur();
}

function navTo(strLocation, strLocation2) {
	if(parent.jsPlay) {
		parent.jsPlay('click');
	}
	parent.strNavigateTo = strLocation
	if(strLocation2 != null) {
		parent.strPostNavigate = strLocation2
	}
	else {
		strPostNavigate = ""
	}
	
	parent.prepareNavigate();	
}

function updateDelta(){
			
	if(event.wheelDelta >= 120) {
		if(document.all.userContainer.contains(event.srcElement)) {
			document.all.userContainer.doScroll("scrollbarUp");
		}
		else {
			document.all.chatContainer.doScroll("scrollbarUp");					
			document.all.browserError.doScroll("scrollbarUp");
		}
	}
	else if(event.wheelDelta <= -120) {
		if(document.all.userContainer.contains(event.srcElement)) {
			document.all.userContainer.doScroll("scrollbarDown");
		}
		else {
			document.all.chatContainer.doScroll("scrollbarDown");
			document.all.browserError.doScroll("scrollbarDown");
		}
	}
}

function updateDelta2(obj){
	if(event.wheelDelta >= 120) {
		dw_scrollObj.initScroll(obj.id,'up',200,true)
		
	}
	else if(event.wheelDelta <= -120) {	
		dw_scrollObj.initScroll(obj.id,'down',200,true)
		
	}
	
}

function isNetscape() {		
	if(InStr(1, navigator.userAgent, "gecko", 1) > 0)  {
		return true;
	}
	else {
		return false;
	}
}
function compareValues(v1, v2) {

	var f1, f2;

	// If the values are numeric, convert them to floats.

	f1 = parseFloat(v1);
	f2 = parseFloat(v2);
	if (!isNaN(f1) && !isNaN(f2)) {
		v1 = f1;
		v2 = f2;
	}

	// Compare the two values.
	if (v1 == v2) {
		return 0;
	}
	//alert(v1 + ">" + v2 + "?");
	if (v1 > v2) {
		//alert("Yes");
		return 1
	}
	return -1;
}
function loadImages() {		
	
	if(isNetscape()) {
		return;
	}
	if(self.getPerformance) {
		blnLowPerformance = getPerformance();
	}
	
	if(self.setUserID && blnAutoLogin) {
		setUserID(getCookie("UserID"));
	}
	
	if(document.all.content_logo) {
		document.all.content_logo.onclick = goHome;
		document.all.content_logo.alt = "Click here to return to the start screen";
		//onclick="goHome();"
	}
	
	for(var i=0; i < menuItems.length; i++) {
		eval("menu_" + menuItems[i] + "_off.src = 'images/menu_" + menuItems[i] + "_off.gif'");
		eval("menu_" + menuItems[i] + "_on.src = 'images/menu_" + menuItems[i] + "_on.gif'");
	}
	
	if(self.subMenuItems) {
		for(var i=0; i < subMenuItems.length; i++) {
			eval("menu_" + subMenuItems[i] + "_off.src = 'images/menu_" + subMenuItems[i] + "_off.gif'");
			eval("menu_" + subMenuItems[i] + "_on.src = 'images/menu_" + subMenuItems[i] + "_on.gif'");
		}
	}
	
}

function fadeInIntro() {
	//if(blnHideIntros) {
		//return;
	//}
	//Fade in intro
	if(introCount == 0) {
		fadeInLogo();
		return;
	}
	if(document.getElementById("content_intro_" + currentIntro).filters.alpha.opacity < 100) {
		document.getElementById("content_intro_" + currentIntro).filters.alpha.opacity = document.getElementById("content_intro_" + currentIntro).filters.alpha.opacity + 5;
		setTimeout("fadeInIntro()", 30)
	}
	else {
		setTimeout("fadeOutIntro()", 4000)
	}
}
		
function fadeOutIntro() {
	//Fade out intro
	if(document.getElementById("content_intro_" + currentIntro).filters.alpha.opacity > 0) {
		document.getElementById("content_intro_" + currentIntro).filters.alpha.opacity = document.getElementById("content_intro_" + currentIntro).filters.alpha.opacity - 5;
		setTimeout("fadeOutIntro()", 30)
	}
	else {
		document.getElementById("content_intro_" + currentIntro).style.display = 'none';
		document.getElementById("content_intro_" + currentIntro).filters(0).enabled = false;
		if(currentIntro < introCount) {
			currentIntro = currentIntro + 1
			setTimeout("fadeInIntro()", 1000)
		}
		else {
			setTimeout("fadeInLogo()", 1000)
		}
	}
}
		
function fadeInLogo() {
	//Fade in intro
	if(document.all.content_logo.filters.alpha.opacity < 100) {
		document.all.content_logo.filters.alpha.opacity = document.all.content_logo.filters.alpha.opacity + 10;
		setTimeout("fadeInLogo()", 40)
	}
	else {
		document.all.content_logo.filters(0).enabled = false;
		if(!parent.currentSubMenuSeen && !debugMode) {
			setTimeout("fadeInParchment();", 1000);
		}
	}
}

function fadeInParchment() {

	if(document.all.content_parchment.filters.alpha.opacity < 100) {
		
		document.all.content_text.filters.alpha.opacity = document.all.content_text.filters.alpha.opacity + 10;
		document.all.content_parchment.filters.alpha.opacity = document.all.content_parchment.filters.alpha.opacity + 10;
		
		if(document.all.content_title) {
			document.all.content_title.filters.alpha.opacity = document.all.content_text.filters.alpha.opacity
		}
		setTimeout("fadeInParchment()", 40)
	}
	else {
		document.all.content_parchment.filters(0).enabled = false;
		document.all.content_text.filters(0).enabled = false;
		
		if(document.all.content_title) {
			document.all.content_title.filters(0).enabled = false;
		}
		if(document.all.scrollui) {
			document.all.scrollui.style.visibility = "visible";
		}
		if(document.all.index_scrollui) {
			document.all.index_scrollui.style.visibility = "visible";
		}
		finishParent();
	}

}

function tellParent() {
	if(parent.initializeContent) {
		parent.initializeContent();
	}
	else {
		initializeInterface();
	}
}

function finishParent() {
	
	if(parent.finishContent) {
		parent.finishContent();
	}
	
	if(self.checkBrowser) {
		if(strUsername != "") {
			setTimeout("checkBrowser();", 10);
			document.all.chatInput.focus();
		}
		//setTimeout("checkBrowser();", 1000);
	}
	
	if(document.all.introAudio && parent.blnAudio) {
		var e = eval('document.introAudio');
		try {
			e.play();
		}
		catch(er) {
			alert("Your system is not configured to play\nMP3 audio in Internet Explorer.")
		}
	}
	if(self.postFadeActions) {
		postFadeActions();
	}
	
	if(self.initScrollbar) {
		
		setTimeout("initScrollbar();", 50);
	}
}
	
function scrollDown(objId) {
	if(keepScrolling) {
		document.getElementById(objId).doScroll("scrollbarDown");
		scrollTimeout = setTimeout("scrollDown('" + objId + "')", 100)
	}
}
		
function scrollUp(objId) {
	if(keepScrolling) {
		document.getElementById(objId).doScroll("scrollbarUp");
		scrollTimeout = setTimeout("scrollUp('" + objId + "')", 100)
	}
}
		
function stopScrolling() {
	clearTimeout(scrollTimeout);
	keepScrolling = false;
}

function prepareSeenState(){ 
	document.all.content_logo.filters(0).enabled = false;
	document.all.content_text.filters(0).enabled = false;
	document.all.content_parchment.filters(0).enabled = false;	
	document.all.content_logo.style.display = '';
	document.all.content_parchment.style.display = '';
	
	//If a login check exists, show only the art, parchment and title
	if(self.checkLogin) {
		if(!checkLogin()) {		
			showLoginMessage()
			return;
		}
	}
	
	if(document.all.content_title) {
		document.all.content_title.filters(0).enabled = false;
		document.all.content_title.style.display = "";
	}
	document.all.content_text.style.display = '';
	
	if(document.all.scrollui) {
		document.all.scrollui.style.visibility = "visible";
	}
	
	tellParent();
}

function rollbackInterface() {
	if(!document.all.content_parchment) {
		return;
	}
	document.all.content_parchment.style.display = 'none';
	document.all.content_text.style.display = 'none';
	if(document.all.scrollui) {
		document.all.scrollui.style.visibility = "hidden";
	}
	if(document.all.content_title) {
		document.all.content_title.style.display = 'none';
	}
	if(document.all.loginContainer) {
		document.all.loginContainer.style.display = 'none';
	}
	if(document.all.welcomeMessage) {
		document.all.welcomeMessage.style.display = 'none';
	}
	if(document.all.saveMessage) {
		document.all.saveMessage.style.display = 'none';
	}
	if(document.all.welcomeAdamar) {
		document.all.welcomeAdamar.style.display = 'none';
	}
	if(document.all.mode_edit) {
		document.all.mode_edit.style.display = 'none';
	}
	if(document.all.mode_index) {
		document.all.mode_index.style.display = 'none';
	}
	if(document.all.mode_search) {
		document.all.mode_search.style.display = 'none';
	}
	if(document.all.mode_summary) {
		document.all.mode_summary.style.display = 'none';
	}
	if(document.all.mode_details) {
		document.all.mode_details.style.display = 'none';
	}
	if(document.all.connection_container) {
		document.all.connection_container.style.display = 'none';
	}
	
	if(self.preFadeActions) {
		preFadeActions();
	}
}

function openProfile(intUserID) {
	var theURL = "forum/forumProfile.aspx?author_id=" + intUserID;
	var winName ="profile";
	var winLeft = 10;
	var winTop = 10;
	
	if(parent.jsPlay) {
		parent.jsPlay('click');
	}
	
	if(screen.availHeight > 426) {
		winTop = (parseInt(screen.availHeight) - 426) / 2
	}
	
	if(screen.availWidth > 600) {
		winLeft = (parseInt(screen.availWidth) - 600) / 2
	}
			
	var features = "toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=1,width=600,height=426,top=" + winTop + ",left=" + winLeft;
	window.open(theURL,winName,features);
  	//var profileWindow = window.open(theURL,winName,features);
  	//profileWindow.focus();
}

function loginUser() {
	var objHTTP;
	var strURL = "";
	var strLoginResponse;
	var arrLoginResponse;
		
	if(document.all.username && document.all.password) {
		if(parent.jsPlay) {
			parent.jsPlay('click');
		}
		strUsername = document.all.username.value;
		strPassword = document.all.password.value;
		if(!validateLogin(strUsername, strPassword)) {
			//Do some stuff
			return;
		}
		showProgressBar();
		strURL = "loginUser.aspx?u=" + strUsername  + "&p=" + strPassword + "&t=" + new Date();
		document.all.username.value = "";
		document.all.password.value = "";
		self.focus()
	}
	else {
		strURL = "loginUser.aspx?id=" + strUserID
	}
	
	objHTTP = new ActiveXObject("Msxml2.XMLHTTP")
	objHTTP.Open("GET", strURL, true);
	objHTTP.onreadystatechange = doHttpReadyStateChange;
	objHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	objHTTP.Send()

	function doHttpReadyStateChange() {
	
		if(objHTTP.readyState == 4) {
			blnLoginSuccess = false;
			if(document.all.errorMessage) {
				document.all.errorMessage.innerText = "";
			}
			if(objHTTP.Status == 200) {
				//Successful script execution
				strLoginResponse = new String(objHTTP.ResponseText);
				arrLoginResponse = strLoginResponse.split("|")
				
				if(arrLoginResponse.length < 2) {
					setError("An error occured while logging you in. Please try again.")
				}
				
				if(arrLoginResponse[0] == "1") {
					//Successful script execution, bad login.
					setError(arrLoginResponse[1]);
					if(self.setLogin) {
						setLogin("", "", "", "", "", "", "");
						finishLogin();						
					}
				}
				else {
					//Successful script execution, good login.
					blnLoginSuccess = true;
					arrLoginResponse = arrLoginResponse.slice(1,2)
					arrLoginResponse = arrLoginResponse[0].split("^")
					if(self.setLogin) {
						setLogin(arrLoginResponse[3], arrLoginResponse[4], arrLoginResponse[0], arrLoginResponse[1], arrLoginResponse[2], arrLoginResponse[5], arrLoginResponse[6]);
						finishLogin();						
					}
					else {
						parent.setLogin(arrLoginResponse[3], arrLoginResponse[4], arrLoginResponse[0], arrLoginResponse[1], arrLoginResponse[2], arrLoginResponse[5], arrLoginResponse[6]);
					}
				}
				
			}
			else {
				//Script problem
				//alert(objHTTP.ResponseText)
				setError("An error occured while logging you in. Please try again.");
			}
			//alert(objHTTP.ResponseText + ' ' +  objHTTP.Status)
			objHTTP = null;
			if(self.animateProgessBar) {
				setTimeout("animateProgessBar();", 10);
			}
		}
	}
}

for(var i = 0; i < menuItems.length; i++) {
	eval("var menu_" + menuItems[i] + "_off = new Image()");
	eval("menu_" + menuItems[i] + "_off.onload = loadImage");
	eval("menu_" + menuItems[i] + "_off.onerror = loadImage");
	eval("var menu_" + menuItems[i] + "_on = new Image()");
	eval("menu_" + menuItems[i] + "_on.onload = loadImage");
	eval("menu_" + menuItems[i] + "_on.onerror = loadImage");
}

if(getCookie("UserID") == "" || getCookie("UserID") == null) {
		blnHideIntros = false;;
}
else {
	if(getCookie("PlayIntros") == "0"){
		blnHideIntros = true;
	}
}

if(getCookie("UserID") == "" || getCookie("UserID") == null) {
	blnAudioNotificaions = false;
}
else {
	if(getCookie("AudioNotification") == "0"){
		blnAudioNotificaions = false;
	}
}

if(getCookie("AutoLogin") == "0") {
	blnAutoLogin = false;
}
else {
	blnAutoLogin = true;
}

//if(getCookie("UserID") == "" || getCookie("UserID") == null) {
	//blnLowPerformance = false;
//}
//else {
	if(getCookie("LowPerformance") == "1") {
		blnLowPerformance = true;
	}
	else {
		blnLowPerformance = false;
	}
//}


/*
	SCROLL BAR CODE FOLLOWS
*/

dw_scrollObjs = {};
dw_scrollObj.speed = 400; // default speed for mouseover scrolling
function dw_scrollObj(wnId, lyrId, cntId) {
	
  this.id = wnId; dw_scrollObjs[this.id] = this;
  this.animString = "dw_scrollObjs." + this.id;
  this.load(lyrId, cntId);
}

dw_scrollObj.loadLayer = function(wnId, id, cntId) {
  if ( dw_scrollObjs[wnId] ) dw_scrollObjs[wnId].load(id, cntId);
}

dw_scrollObj.prototype.load = function(lyrId, cntId) {
	
  if (!document.getElementById) return;
  var wndo, lyr;
  if (this.lyrId) {
    lyr = document.getElementById(this.lyrId);
    //lyr.style.visibility = "hidden";
  }
  lyr = document.getElementById(lyrId);
  wndo = document.getElementById(this.id);
  lyr.style.top = this.y = 0; lyr.style.left = this.x = 0;
  this.maxY = (lyr.offsetHeight - wndo.offsetHeight > 0)? lyr.offsetHeight - wndo.offsetHeight: 0;
  this.wd = cntId? document.getElementById(cntId).offsetWidth: lyr.offsetWidth;
  this.maxX = (this.wd - wndo.offsetWidth > 0)? this.wd - wndo.offsetWidth: 0;
  this.lyrId = lyrId; // hold id of currently visible layer
  lyr.style.visibility = "visible";
  this.on_load(); this.ready = true;
}

dw_scrollObj.prototype.on_load = function() {}  

dw_scrollObj.prototype.shiftTo = function(lyr, x, y) {
	if(lyr) {
	lyr.style.left = (this.x = x) + "px"; 
	lyr.style.top = (this.y = y) + "px";
	}
}


/* dw_hoverscroll.js  version date: June 2004 
   mouseover scrolling for dw_scrollObj (in dw_scrollObj.js)  */

dw_scrollObj.stopScroll = function(wnId) {
  if ( dw_scrollObjs[wnId] ) dw_scrollObjs[wnId].endScroll();
}

// increase speed onmousedown of scroll links
dw_scrollObj.doubleSpeed = function(wnId) {
  if ( dw_scrollObjs[wnId] ) dw_scrollObjs[wnId].speed *= 2;
}

dw_scrollObj.resetSpeed = function(wnId) {
  if ( dw_scrollObjs[wnId] ) dw_scrollObjs[wnId].speed /= 2;
}

// algorithms for time-based scrolling and scrolling onmouseover at any angle adapted from youngpup.net
dw_scrollObj.initScroll = function(wnId, deg, sp, blnMousewheel) {
	
	if ( dw_scrollObjs[wnId] ) {
		var cosine, sine;
		if (typeof deg == "string") {
			switch (deg) {
				case "up"    : deg = 90;  break;
				case "down"  : deg = 270; break;
				case "left"  : deg = 180; break;
				case "right" : deg = 0;   break;
				default: 
				alert("Direction of scroll in mouseover scroll links should be 'up', 'down', 'left', 'right' or number: 0 to 360.");
			}
		} 
		deg = deg % 360;
		if (deg % 90 == 0) {
			cosine = (deg == 0)? -1: (deg == 180)? 1: 0;
			sine = (deg == 90)? 1: (deg == 270)? -1: 0;
		} else {
			var angle = deg * Math.PI/180;
			cosine = -Math.cos(angle); sine = Math.sin(angle);
		}
		dw_scrollObjs[wnId].fx = cosine / ( Math.abs(cosine) + Math.abs(sine) );
		dw_scrollObjs[wnId].fy = sine / ( Math.abs(cosine) + Math.abs(sine) );
		
		dw_scrollObjs[wnId].endX = (deg == 90 || deg == 270)? dw_scrollObjs[wnId].x:
		(deg < 90 || deg > 270)? -dw_scrollObjs[wnId].maxX: 0; 
		
		dw_scrollObjs[wnId].endY = (deg == 0 || deg == 180)? dw_scrollObjs[wnId].y: 
		(deg < 180)? 0: -dw_scrollObjs[wnId].maxY;
		
		dw_scrollObjs[wnId].startScroll(sp, blnMousewheel);
	}
}

// speed (optional) to override default speed (set in dw_scrollObj.speed)
dw_scrollObj.prototype.startScroll = function(speed, blnMousewheel) {
	if (!this.ready) {
		return;
	}
	if (this.timerId){
		clearInterval(this.timerId);
	}
	
	//alert('OK');
	this.speed = speed || dw_scrollObj.speed;
	this.lyr = document.getElementById(this.lyrId);
	this.lastTime = ( new Date() ).getTime();
	this.on_scroll_start();  
	
	if(blnMousewheel) {
		this.speed = 2000;
		setTimeout(this.animString + ".scroll()", 10)
	}
	else {
		this.timerId = setInterval(this.animString + ".scroll()", 10); 
	}
}

dw_scrollObj.prototype.scroll = function() {
  var now = ( new Date() ).getTime();
  var d = (now - this.lastTime)/1000 * this.speed;
  if (d > 0) {
    var x = this.x + this.fx * d; var y = this.y + this.fy * d;
    if (this.fx == 0 || this.fy == 0) { // for horizontal or vertical scrolling
      if ( ( this.fx == -1 && x > -this.maxX ) || ( this.fx == 1 && x < 0 ) || 
        ( this.fy == -1 && y > -this.maxY ) || ( this.fy == 1 && y < 0 ) ) {
        this.lastTime = now;
        this.shiftTo(this.lyr, x, y);
        this.on_scroll(x, y);
      } else {
        clearInterval(this.timerId); this.timerId = 0;
        this.shiftTo(this.lyr, this.endX, this.endY);
        this.on_scroll_end(this.endX, this.endY);
      }
    } else { // for scrolling at an angle (stop when reach end on one axis)
      if ( ( this.fx < 0 && x >= -this.maxX && this.fy < 0 && y >= -this.maxY ) ||
        ( this.fx > 0 && x <= 0 && this.fy > 0 && y <= 0 ) ||
        ( this.fx < 0 && x >= -this.maxX && this.fy > 0 && y <= 0 ) ||
        ( this.fx > 0 && x <= 0 && this.fy < 0 && y >= -this.maxY ) ) {
        this.lastTime = now;
        this.shiftTo(this.lyr, x, y);
        this.on_scroll(x, y);
      } else {
        clearInterval(this.timerId); this.timerId = 0;
        this.on_scroll_end(this.x, this.y);
      }
    }
  }
}

dw_scrollObj.prototype.endScroll = function() {
  if (!this.ready) return;
  if (this.timerId) clearInterval(this.timerId);
  this.timerId = 0;  this.lyr = null;
}

dw_scrollObj.prototype.on_scroll = function() {}
dw_scrollObj.prototype.on_scroll_start = function() {}
dw_scrollObj.prototype.on_scroll_end = function() {}

/*************************************************************************
    dw_event.js (version date Feb 2004)
        
    This code is from Dynamic Web Coding at http://www.dyn-web.com/
    See Terms of Use at http://www.dyn-web.com/bus/terms.html
    regarding conditions under which you may use this code.
    This notice must be retained in the code as is!
*************************************************************************/

var dw_event = {
  
  add: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.addEventListener) obj.addEventListener(etype, fp, cap);
    else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);
  }, 

  remove: function(obj, etype, fp, cap) {
    cap = cap || false;
    if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap);
    else if (obj.detachEvent) obj.detachEvent("on" + etype, fp);
  }, 

  DOMit: function(e) { 
    e = e? e: window.event;
    e.tgt = e.srcElement? e.srcElement: e.target;
    
    if (!e.preventDefault) e.preventDefault = function () { return false; }
    if (!e.stopPropagation) e.stopPropagation = function () { if (window.event) window.event.cancelBubble = true; }
        
    return e;
  }
  
}

/*   dw_slidebar.js */

// model: Aaron Boodman's dom drag at www.youngpup.net
var dw_slidebar = {
  obj: null,
  slideDur: 500,  // duration of glide onclick of track  
  init: function (bar, track, axis, x, y) {
    x = x || 0; y = y || 0;
    bar.style.left = x + "px"; bar.style.top = y + "px";
    bar.axis = axis; track.bar = bar;
    if (axis == "h") {
      bar.trkWd = track.offsetWidth; // hold for setBarSize
      bar.maxX = bar.trkWd - bar.offsetWidth - x; 
      bar.minX = x; bar.maxY = y; bar.minY = y;
    } else {
      bar.trkHt = track.offsetHeight;
      bar.maxY = bar.trkHt - bar.offsetHeight - y; 
      bar.maxX = x; bar.minX = x; bar.minY = y;
    }
    bar.on_drag_start =  bar.on_drag =   bar.on_drag_end = 
    bar.on_slide_start = bar.on_slide =  bar.on_slide_end = function() {}
    bar.onmousedown = this.startDrag;
    //track.onmousedown = this.startSlide;
  },
  
  startSlide: function(e) { // called onmousedown of track 
	
    if ( dw_slidebar.aniTimer ) clearInterval(dw_slidebar.aniTimer);
    e = e? e: window.event;
    var bar = dw_slidebar.obj = this.bar; // i.e., track's bar
    e.offX = (typeof e.layerX != "undefined")? e.layerX: e.offsetX;
    e.offY = (typeof e.layerY != "undefined")? e.layerY: e.offsetY;
    bar.startX = parseInt(bar.style.left); bar.startY = parseInt(bar.style.top);
    if (bar.axis == "v") {
      bar.destX = bar.startX;
      bar.destY = (e.offY < bar.startY)? e.offY: e.offY - bar.offsetHeight;
      bar.destY = Math.min( Math.max(bar.destY, bar.minY), bar.maxY );
    } else {
      bar.destX = (e.offX < bar.startX)? e.offX: e.offX - bar.offsetWidth;
      bar.destX = Math.min( Math.max(bar.destX, bar.minX), bar.maxX );
      bar.destY = bar.startY;
    }
    bar.distX = bar.destX - bar.startX; bar.distY = bar.destY - bar.startY;
    dw_slidebar.per = Math.PI/(2 * dw_slidebar.slideDur);
  	dw_slidebar.slideStart = (new Date()).getTime();
    bar.on_slide_start(bar.startX, bar.startY);
  	dw_slidebar.aniTimer = setInterval("dw_slidebar.doSlide()",10);
  },
  
  doSlide: function() {
    if ( !dw_slidebar.obj ) { clearInterval(dw_slidebar.aniTimer); return; }    
    var bar = dw_slidebar.obj;     
    var elapsed = (new Date()).getTime() - this.slideStart;
  	if (elapsed < this.slideDur) {
  		var x = bar.startX + bar.distX * Math.sin(this.per*elapsed);
  		var y = bar.startY + bar.distY * Math.sin(this.per*elapsed);
      bar.style.left = x + "px"; bar.style.top = y + "px";
      bar.on_slide(x, y);
  	} else {	// if time's up
      clearInterval(this.aniTimer);
      bar.style.left = bar.destX + "px"; bar.style.top = bar.destY + "px";
      bar.on_slide_end(bar.destX, bar.destY);
      this.obj = null;
  	}
  },
  
  startDrag: function (e) { // called onmousedown of bar 
    e = dw_event.DOMit(e);
        
    //If the layer is not larger than the viewing area, do nothing.
    if(document.all.connected_container) {	
		if(document.all.connected_container.scrollHeight <= document.all.connected_container.offsetHeight && e.tgt.id == "connected_dragBarImage") {
			return;
		}
	}
	
	if(document.all.details_container) {	
		if(document.all.details_container.scrollHeight < document.all.details_container.offsetHeight && e.tgt.id == "details_dragBarImage") {
			
			return;
		}
	}
	
	if(document.all.index_container) {	
		if(document.all.index_container.scrollHeight <= document.all.index_container.offsetHeight && e.tgt.id == "index_dragBarImage") {
			return;
		}
	}
	
    if(document.all.roster_container) {
		if(document.all.roster_container.scrollHeight < document.all.roster_container.offsetHeight) {
			return;
		}
	}
    else if(document.all.content_text) {
		if(document.all.content_text.scrollHeight < document.all.content_text.offsetHeight && e.tgt.id == "dragBar") {
			return;
		}
	}
	else if(document.all.event_holder) {	
		if(document.all.event_holder.scrollHeight <= document.all.event_holder.offsetHeight && e.tgt.id == "detailsBar") {
			return;
		}
	}
	
	else if(document.all.characters_holder) {	
		if(document.all.characters_holder.scrollHeight <= document.all.characters_holder.offsetHeight && e.tgt.id == "charactersBar") {
			return;
		}
	}
	
	
    if ( dw_slidebar.aniTimer ) clearInterval(dw_slidebar.aniTimer);
    var bar = dw_slidebar.obj = this;
    bar.downX = e.clientX; bar.downY = e.clientY;
    bar.startX = parseInt(bar.style.left);
    bar.startY = parseInt(bar.style.top);
    bar.on_drag_start(bar.startX, bar.startY);
    dw_event.add( document, "mousemove", dw_slidebar.doDrag, true );
    dw_event.add( document, "mouseup",   dw_slidebar.endDrag,  true );
    e.stopPropagation();
  },

  doDrag: function (e) {
    e = e? e: window.event;
    if (!dw_slidebar.obj) return;
    var bar = dw_slidebar.obj; 
    var nx = bar.startX + e.clientX - bar.downX;
    var ny = bar.startY + e.clientY - bar.downY;
    nx = Math.min( Math.max( bar.minX, nx ), bar.maxX);
    ny = Math.min( Math.max( bar.minY, ny ), bar.maxY);
    bar.style.left = nx + "px"; bar.style.top  = ny + "px";
    bar.on_drag(nx,ny);
    return false;  
  },
  
  endDrag: function () {
    dw_event.remove( document, "mousemove", dw_slidebar.doDrag, true );
    dw_event.remove( document, "mouseup",   dw_slidebar.endDrag,  true );
    if ( !dw_slidebar.obj ) return; // avoid errors in ie if inappropriate selections
    dw_slidebar.obj.on_drag_end( parseInt(dw_slidebar.obj.style.left), parseInt(dw_slidebar.obj.style.top) );
    dw_slidebar.obj = null;  
  }
  
}

/***************************************************************************
  This code is from Dynamic Web Coding at www.dyn-web.com
  Copyright 2004 by Sharon Paine 
  See Terms of Use at www.dyn-web.com/bus/terms.html
  regarding conditions under which you may use this code.
  This notice must be retained in the code as is!
****************************************************************************/

/*
  dw_scroll_aux.js    version date: May 2004  
  integrates scrolling layers code with scrollbar code (dw_scrollbar.js)
*/

// Size dragBar according to layer size?  
dw_scrollObj.prototype.bSizeDragBar = false;

dw_scrollObj.prototype.setUpScrollbar = function(id, trkId, axis, offx, offy) {
  if (!document.getElementById) return;
  var bar = document.getElementById(id);
  var trk = document.getElementById(trkId);
  dw_slidebar.init(bar, trk, axis, offx, offy);
  // connect dw_slidebar with dw_scrollObj
  bar.wn = dw_scrollObjs[this.id]; // scroll area object this bar connected to
  if (axis == "v") this.vBarId = id; else this.hBarId = id;
  // also called on_load (i.e., when layer loaded), but in case h and v scrollbars, need to call here too
  if (this.bSizeDragBar) this.setBarSize();
  bar.on_drag_start = bar.on_slide_start = dw_scrollObj.getWndoLyrRef;
  bar.on_drag_end =   bar.on_slide_end =   dw_scrollObj.tossWndoLyrRef;
  bar.on_drag =       bar.on_slide =       dw_scrollObj.UpdateWndoLyrPos;
}

// for these 3 functions (assigned to bar.on_drag/slide...) "this" refers to bar
// get/discard ref to layer visible in scroll area
dw_scrollObj.getWndoLyrRef = function()  { this.wnLyr = document.getElementById(this.wn.lyrId); }
dw_scrollObj.tossWndoLyrRef = function() { this.wnLyr = null; }
// keep position of scrolling layer in synch with slide/drag of bar
dw_scrollObj.UpdateWndoLyrPos = function(x, y) {
  var nx, ny;
  if (this.axis == "v") {
    nx = this.wn.x; // floating point values for loaded layer's position held in shiftTo method
    ny = -(y - this.minY) * ( this.wn.maxY / (this.maxY - this.minY) ) || 0;
  } else {
    ny = this.wn.y;
    nx = -(x - this.minX) * ( this.wn.maxX / (this.maxX - this.minX) ) || 0;
  }
  this.wn.shiftTo(this.wnLyr, nx, ny);
}

// Keep position of dragBar in sync with position of layer onscroll
dw_scrollObj.prototype.updateScrollbar = function(x, y) {
	var nx, ny;
	if ( this.vBarId ) {
		if (!this.vbar) {
			this.vbar = document.getElementById(this.vBarId);
			this.vbar.trkHt =  this.vbar.parentNode.offsetHeight;
			//alert(this.vbar.maxY);
			//this.vbar.maxY = this.maxY;
			
		}
		if (!this.maxY) return;
		ny = -( y * ( (this.vbar.maxY - this.vbar.minY) / this.maxY ) - this.vbar.minY );		
		ny = Math.min( Math.max(ny, this.vbar.minY), this.vbar.maxY);  
		nx = parseInt(this.vbar.style.left);
		this.vbar.style.left = nx + "px"; this.vbar.style.top = ny + "px";
	}
	if ( this.hBarId ) {
		if (!this.maxX) return;
		nx = -( x * ( (this.hbar.maxX - this.hbar.minX) / this.maxX ) - this.hbar.minX );
		nx = Math.min( Math.max(nx, this.hbar.minX), this.hbar.maxX);
		ny = parseInt(this.hbar.style.top);
		this.hbar.style.left = nx + "px"; this.hbar.style.top = ny + "px";
	} 
  
}

// Restore dragBar to start position when loading new layer
dw_scrollObj.prototype.restoreScrollbars = function() {
  var bar;
  if (this.vBarId) {
    bar = document.getElementById(this.vBarId);
    bar.style.left = bar.minX + "px"; bar.style.top = bar.minY + "px";
  }
  if (this.hBarId) {
    bar = document.getElementById(this.hBarId);
    bar.style.left = bar.minX + "px"; bar.style.top = bar.minY + "px";
  }
}
  
// Size dragBar in proportion to size of content in layer
// called on_load of layer if bSizeDragBar prop true
dw_scrollObj.prototype.setBarSize = function() {
  var bar;
  var lyr = document.getElementById(this.lyrId);
  var wn = document.getElementById(this.id);
  if (this.vBarId) {
    bar = document.getElementById(this.vBarId);
    bar.style.height = (lyr.offsetHeight > wn.offsetHeight)? bar.trkHt / ( lyr.offsetHeight / wn.offsetHeight ) + "px": bar.trkHt - 2*bar.minY + "px";
    bar.maxY = bar.trkHt - bar.offsetHeight - bar.minY; 
  }
  if (this.hBarId) {
    bar = document.getElementById(this.hBarId);
    bar.style.width = (this.wd > wn.offsetWidth)? bar.trkWd / ( this.wd / wn.offsetWidth ) + "px": bar.trkWd - 2*bar.minX + "px";
    bar.maxX = bar.trkWd - bar.offsetWidth - bar.minX; 
  }
}

// called from load method
dw_scrollObj.prototype.on_load = function() { 
  this.restoreScrollbars();
  if (this.bSizeDragBar) this.setBarSize();
}

dw_scrollObj.prototype.on_scroll = dw_scrollObj.prototype.on_slide = function(x,y) { this.updateScrollbar(x,y); }

// obtain and discard references to relevant dragBar
dw_scrollObj.prototype.on_scroll_start = dw_scrollObj.prototype.on_slide_start = function() {
  if ( this.vBarId ) this.vbar = document.getElementById(this.vBarId);
  if ( this.hBarId ) this.hbar = document.getElementById(this.hBarId);
}

dw_scrollObj.prototype.on_scroll_end = dw_scrollObj.prototype.on_slide_end = function(x, y) { 
  this.updateScrollbar(x,y);
  this.lyr = null; this.bar = null; 
}

//Glide Scrolling
dw_scrollObj.slideDur = 500; // duration of glide

// intermediary functions needed to prevent errors before page loaded 
dw_scrollObj.scrollBy = function(wnId, x, y, dur) {
  if ( dw_scrollObjs[wnId] ) dw_scrollObjs[wnId].glideBy(x, y, dur);
}

dw_scrollObj.scrollTo = function(wnId, x, y, dur) {
  if ( dw_scrollObjs[wnId] ) dw_scrollObjs[wnId].glideTo(x, y, dur);
}

// Resources for time-based slide algorithm: 
//  DHTML chaser tutorial at DHTML Lab - www.webreference.com/dhtml	
//  and cbe_slide.js from	www.cross-browser.com by Mike Foster
dw_scrollObj.prototype.glideBy = function(dx, dy, dur) {
  if ( !document.getElementById || this.sliding ) return;
  this.slideDur = dur || dw_scrollObj.slideDur;
  this.destX = this.destY = this.distX = this.distY = 0;
  this.lyr = document.getElementById(this.lyrId);
  this.startX = this.x; this.startY = this.y;
  if (dy < 0) this.distY = (this.startY + dy >= -this.maxY)? dy: -(this.startY  + this.maxY);
  else if (dy > 0) this.distY = (this.startY + dy <= 0)? dy: -this.startY;
  if (dx < 0) this.distX = (this.startX + dx >= -this.maxX)? dx: -(this.startX + this.maxX);
  else if (dx > 0) this.distX = (this.startX + dx <= 0)? dx: -this.startX;
  this.destX = this.startX + this.distX; this.destY = this.startY + this.distY;
  this.slideTo(this.destX, this.destY);
}

dw_scrollObj.prototype.glideTo = function(destX, destY, dur) {
  if ( !document.getElementById || this.sliding) return;
  this.slideDur = dur || dw_scrollObj.slideDur;
  this.lyr = document.getElementById(this.lyrId); 
  this.startX = this.x; this.startY = this.y;
  this.destX = -Math.max( Math.min(destX, this.maxX), 0);
  this.destY = -Math.max( Math.min(destY, this.maxY), 0);
  this.distY = this.destY - this.startY;
  this.distX =  this.destX - this.startX;
  this.slideTo(this.destX, this.destY);
}

dw_scrollObj.prototype.slideTo = function(destX, destY) {
	this.per = Math.PI/(2 * this.slideDur); this.sliding = true;
	this.slideStart = (new Date()).getTime();
	this.aniTimer = setInterval(this.animString + ".doSlide()",10);
	this.on_slide_start(this.startX, this.startY);
}

dw_scrollObj.prototype.doSlide = function() {
	var elapsed = (new Date()).getTime() - this.slideStart;
	if (elapsed < this.slideDur) {
		var x = this.startX + this.distX * Math.sin(this.per*elapsed);
		var y = this.startY + this.distY * Math.sin(this.per*elapsed);
		this.shiftTo(this.lyr, x, y); this.on_slide(x, y);
	} else {	// if time's up
		clearInterval(this.aniTimer); this.sliding = false;
		this.shiftTo(this.lyr, this.destX, this.destY);
		this.lyr = null; this.on_slide_end(this.destX, this.destY);
	}
}


dw_scrollObj.prototype.on_slide_start = function() {}
//dw_scrollObj.prototype.on_slide = function() {}
dw_scrollObj.prototype.on_slide = function() {}
dw_scrollObj.prototype.on_slide_end = function(x,y) {this.updateScrollbar(x,y);}
//dw_scrollObj.prototype.on_slide_end = function() {}