/*

DHTML SCROLLER v4.0 RC (c) 2001-2004 Angus Turnbull, http://www.twinhelix.com
Altering this notice or redistributing this file is prohibited.

*/

var isDOM = (document.getElementById)? 1: 0;
var isIE = (document.all)? 1: 0;
var isNS4 = (navigator.appName == 'Netscape' && !isDOM)? 1: 0;
var isIE4 = (isIE && !isDOM)? 1: 0;
var isOp = (self.opera)? 1: 0;
var isDyn = (isDOM||isIE||isNS4);

function getRef(i,p){
	p = (!p)? document: ((p.navigator)? p.document: p);

	return (isIE)? p.all[i]: ((isDOM)? ((p.getElementById)? p: p.ownerDocument).getElementById(i): ((isNS4)? p.layers[i]: null));
}

function getSty(i, p) {
	var r = getRef(i, p);

	return (r)? ((isNS4)? r: r.style): null;
}

if (!self.LayerObj) var LayerObj = new Function('i', 'p', 'this.ref = getRef(i, p); this.sty = getSty(i, p); return this;');

function getLyr(i, p) {
	return new LayerObj(i, p);
}

function LyrFn(n, f) {
	LayerObj.prototype[n] = new Function('var a = arguments, p = a[0], px = isNS4 || (isOp)? 0: "px"; with(this) {' + f + '}');
}

LyrFn('x', 'if (!isNaN(p)) sty.left = p + px; else return parseInt(sty.left);');
LyrFn('y', 'if (!isNaN(p)) sty.top = p + px; else return parseInt(sty.top);');
LyrFn('w', 'if (p) ((isNS4)? sty.clip: sty).width = p + px; else return (isNS4)? ref.document.width: ref.offsetWidth;');
LyrFn('h', 'if (p) ((isNS4)? sty.clip: sty).height = p + px; else return (isNS4)? ref.document.height: ref.offsetHeight;');
LyrFn('vis', 'sty.visibility = p');
LyrFn('clip', 'if (isNS4) with (sty.clip) {left = a[0]; top = a[1]; right = a[2]; bottom = a[3]} else sty.clip = "rect(" + a[1] + "px " + a[2] + "px " + a[3] + "px " + a[0] + "px)";');

if (!self.page) var page = {win:self, minW:0, minH:0, MS:isIE && !isOp};

page.db = function(p) {
	with (this.win.document) {
		return ((isDOM)? documentElement[p]: 0) || body[p] || 0;
	}
}

page.winW = function() {
	with (this) {
		return Math.max(minW, (MS)? db('clientWidth'): win.innerWidth)
	}
}

page.winH=function(){
	with (this) {
		return Math.max(minH, (MS)? db('clientHeight'): win.innerHeight);
	}
}

page.scrollY = function() {
	with (this) {
		return (MS)? db('scrollTop'): win.pageYOffset
	}
}

page.elmPos = function(e, p) {
	var x = 0;
	var y = 0;
	var w = (p)? p: this.win;

	e = (e)? ((e.substr)? ((isNS4)? w.document.anchors[e]: getRef(e, w)): e): p;

	if (isNS4) {
		if (e && (e != p)) {
			x = e.x;
			y = e.y;
		}

		if (p) {
			x += p.pageX;
			y += p.pageY
		}
	} else if (e && e.focus && e.href && this.MS && navigator.platform.indexOf('Mac') >- 1) {
		e.onfocus = new Function('with (event) {self.tmpX = clientX - offsetX; self.tmpY = clientY - offsetY;}');
		e.focus();
		x = tmpX;
		y = tmpY;
		e.blur();
	} else while (e) {
		x += e.offsetLeft;
		y += e.offsetTop;
		e = e.offsetParent
	}

	return {x:x, y:y}
}

function addProps(obj, data, names, addNull) {
	for (var i = 0; i < names.length; i++) {
		if (i < data.length || addNull) obj[names[i]] = data[i];
	}
}

function ScrDiv() {
	addProps(this, arguments, ['id', 'x', 'y', 'w', 'h', 'v', 'par', 'lyr'], true);
}

function DHTMLScroller() {
	var names = ['myName', 'loadingFile', 'loadedFile', 'loadedHTML', 'bookmark', 'buf', 'div', 'bar', 'thm', 'loaded', 'timer', 'loadFix', 'noXFrame', 'divHeight', 'thmHeight', 'barHeight', 'cHeight', 'cWidth', 'dragOffset', 'onbeforeload', 'onload', 'onscroll', 'onsetup', 'onlayout', 'onthumbdown', 'onthumbup'];

	addProps(this, arguments, names, true);

	this.cTop = 0;
	this.history = new Array();
	this.histPos = -1;
	this.divs = new Array();
	this.minThmHeight = 20;
	this.maxThmHeight = 9999;
	this.padTop=this.padBot = 0;
	this.checkBounds = true;
	this.ySpeed=this.stepsLeft = 0;
	this.stick = 1;
	this.stickTop = 0;

	DHTMLScroller.list[this.myName] = this;
}

DHTMLScroller.list = [];

var activeScr = null;
var DsPt = DHTMLScroller.prototype;

DsPt.load = function(fName) {
	with (this) {
		if (!fName || fName == '#' || !loaded || !isDyn) return;

		if (fName.match(/^(.*)#(.*)$/)) {
			var r = RegExp;
			bookmark = r.$2;
			if (!r.$1 || r.$1 == loadedFile) {
				fileLoaded();
				return;
			}

			fName = r.$1;
		} else bookmark = '';

		loadingFile = fName;

		if (onbeforeload) onbeforeload();

		if(fName != history[histPos]) {
			histPos++;
			history[histPos] = fName;
			history.length = histPos + 1;
		} if (isOp && !document.documentElement) {
			fileLoaded();
			return;
		} if (isIE || isDOM) with ((isOp)? getRef(myName + 'Buf').contentDocument: buf.document) {
			if (document.readyState) {
				location.href = fName;
				setTimeout(myName + '.checkState()', 100);
			} else {
				write('<html><body onload="setTimeout(\'parent.' + myName + '.swapContent()\', 100)"><iframe name="nestBuf" src="' + fName + '"></iframe></body></html>');
				close();

				if (!buf.nestBuf) {
					buf.location.href = fName;
					setTimeout (myName + '.swapContent()', 5000);
				}
			}
		} else if(isNS4) {
			if (window.ns4LayerLoading) {
				setTimeout(myName+'.load("'+fName+'")',100);
				return;
			}

			window.ns4LayerLoading = true;

			div.ref.onload = new Function(myName + '.fileLoaded()');
			div.ref.load(fName, eval(divs[0].w));
		}

		return;
	}
}

DsPt.checkState = function() {
	with (this) {
		var b = (isOp)? getRef(myName + 'Buf').contentDocument: buf.document;

		if (b.location.href != 'about:blank' && b.readyState == 'complete') swapContent();
		else setTimeout(myName + '.checkState()', 50);
	}
}

DsPt.swapContent=function(){
	with (this) {
		var bufDoc = (buf.nestBuf)? buf.nestBuf.document: buf.document;
		if (bufDoc && bufDoc.body) {
			loadedHTML = bufDoc.body.innerHTML;
			buf.location.replace('about:blank');
			setTimeout('with(' + myName + ') {div.ref.innerHTML = loadedHTML; setTimeout("' + myName + '.fileLoaded()", 100)}', 1);
		}
	}
}

DsPt.fileLoaded = function() {
	with (this) {
		activeScr = null;
		if (isNS4) {
			window.ns4LayerLoading = false;

			var tags = div.ref.document.links;
			for (var i in tags) {
				tags[i].scrOC = tags[i].onclick;
				tags[i].onclick = new Function('return (!(this.scrOC)? this.scrOC() == false: 0) && ' + myName + '.checkURI(this.href)');
			}
		}

		loadedFile = loadingFile;

		var xfr = '';
		var DSL = DHTMLScroller.list;

		for (var s in DSL) if (!DSL[s].noXFrame && DSL[s].loadedFile) xfr += ',' + DSL[s].myName + '=' + DSL[s].loadedFile;
		if (xfr && isIE && !noXFrame && location.search.indexOf('frames(') < 0) location.hash = 'frames(' + xfr.substring(1) + ')';
		layout();

		var newPos = 0;

		if (isDOM) bookmark = document.getElementsByName(bookmark)[0];

		if (bookmark) {
			newPos = page.elmPos(bookmark, div.ref).y;
			if (newPos) newPos -= page.elmPos(null, div.ref).y;
		}

		scrollTo(newPos);
		if (onload) onload();
	}
}

DsPt.go = function(dir) {
	with (this) {
		histPos += dir;
		if (histPos < 0) {
			histPos = 0;
			return;
		}

		if (histPos >= history.length) {
			histPos = history.length - 1;
			return;
		}

		load (history[histPos]);
	}
}

DsPt.checkURI = function(uri) {
	with (this) {
		if (uri && (uri.indexOf(':') < 0 || uri.match(new RegExp((location.hostname)? '^(file|http.?):\/\/[^\/]*' + location.hostname: '^file:')))) {
			var hashPos = location.href.indexOf('#');
			if (hashPos == -1 ) hashPos = 9999;

			var locPath = location.href.substring(0, hashPos);
			var r = RegExp;

			if (uri.match(/(.*)#(.*)/) && (!r.$1 || locPath == r.$1)) {
				if (r.$2) load('#' + r.$2);
			} else load(uri);

			return false;
		}

		return true;
	}
}

DsPt.scrollTo=function(pos, isStick) {
	with (this) {
		if (!isDyn || !loaded) return;

		cTop = pos;

		if (!isStick) stickTop = cTop;

		divHeight = div.h() + padTop + padBot;

		if (divHeight == 0) divHeight = 1;

		if (checkBounds) {
			if (cTop + cHeight > divHeight) cTop = divHeight - cHeight;
			if (cTop < 0) cTop = 0;
		}

		div.y(0 - cTop + padTop);
		thmHeight = Math.ceil(barHeight*(cHeight/divHeight));
		with (Math) thmHeight = min(barHeight, min(maxThmHeight, max(thmHeight, minThmHeight)));
		thm.h(thmHeight);

		if (onscroll) onscroll();
		if (activeScr || isStick) return;

		var fracDivDown = (cTop/(divHeight - cHeight));

		thm.y(bar.y() + fracDivDown*(barHeight - thmHeight));
	}
}

DsPt.scrollBy = function(amount) {
	with (this) {
		scrollTo(cTop+amount);
	}
}

DsPt.setScroll = function(newSpeed, steps) {
	with (this) {
		if (!loaded) return;

		stepsLeft = steps;
		if (timer) clearInterval(timer);
		timer = setInterval('with(' + myName + ') {if (stepsLeft > 0) {ySpeed += ' + ((newSpeed - ySpeed)/steps) + '; stepsLeft --} else if (parseInt(ySpeed) == 0) {clearInterval(timer); timer = null} scrollBy(ySpeed)}', 50);
	}
}

DsPt.thumbDown=function(evt){
	with (this) {
		var evt = (evt)? evt: window.event;

		activeScr = this;
		dragOffset = ((isNS4)? evt.pageY: page.scrollY() + evt.clientY) - thm.y();

		if (onthumbdown) onthumbdown();
		if (timer) clearInterval(timer);

		timer = null;

		return false;
	}
}

window.scrThumbMove = function(evt) {
	var evt = (evt)? evt: window.event;

	if (!activeScr) return true;
	else with (activeScr) {
		if ((cTop + cHeight > divHeight) || (thmHeight == barHeight)) return true;

		var thmTop = ((isNS4)? evt.pageY: page.scrollY() + evt.clientY) - dragOffset - bar.y();

		if (thmTop < 0) thmTop = 0;
		if (thmTop + thmHeight > barHeight) thmTop = barHeight - thmHeight;

		thm.y(bar.y() + thmTop);
		stickTop = (divHeight - cHeight)*(thmTop/(barHeight - thmHeight));

		if (stick == 1) scrollTo(stickTop);
		else if (!timer) timer = setInterval(myName + '.stickScroll()', 40);

		return false;
	}
}

window.scrThumbUp = function(evt){
	if (activeScr) with (activeScr) if (onthumbup) onthumbup();
	activeScr = null;
}

DsPt.stickScroll = function() {
	with (this) {
		if (Math.abs(cTop - stickTop) > 1) {
			cTop += (stickTop - cTop)*stick;
			scrollTo(cTop, true);
		} else if (cTop!=stickTop) {
			cTop = stickTop;
			scrollTo(cTop, true);
		}
	}
}

DsPt.barClick = function(evt) {
	with (this) {
		var evt = (evt)? evt: window.event;
		clickPos = (isNS4)? evt.pageY: page.scrollY() + evt.clientY;
		var thmY = page.elmPos(null, thm.ref).y;
		if (clickPos < thmY) scrollBy(0 - cHeight);
		if (clickPos > (thmY + thmHeight)) scrollBy(cHeight);
		if (isNS4) return document.routeEvent(evt);
	}
}

DsPt.layout = function() {
	with (this) {
		if (!isDyn || !loaded) return;

		barHeight = eval(divs[1].h);
		cWidth = eval(divs[0].w);
		cHeight = eval(divs[0].h);

		divs[0].lyr.clip(0, 0, cWidth, cHeight);
		div.vis('inherit');
		div.w(cWidth);

		var isSmall = (div.h() < cHeight);

		for (var i = 0; i<divs.length; i++) with (divs[i].lyr) {
			x(eval(divs[i].x));
			w(Math.max(0, eval(divs[i].w)));
			y(eval(divs[i].y));
			h(Math.max(0, eval(divs[i].h)));

			if (divs[i].v) vis(divs[i].v == 1 && (isSmall)?'hidden':'visible')
		}

		if (onlayout) onlayout();
		scrollBy(0);
	}
}

DsPt.setup=function() {
	with (this) {
		if (!isDyn) return;

		for (var i = 0; i < divs.length; i++) with (divs[i]) {
			par = eval(par);
			lyr = getLyr(id, par);
		}

		div = getLyr(myName + 'Inner', (isNS4)? divs[0].lyr.ref: null);
		bar = divs[1].lyr;
		thm = divs[2].lyr;

		if (!isNS4) buf = eval('window.' + myName + 'Buf');
		if (isNS4) {
			bar.ref.captureEvents(Event.CLICK);
			thm.ref.captureEvents(Event.MOUSEDOWN);
		}

		bar.ref.onclick = new Function('evt', 'return ' + myName + '.barClick(evt);');
		thm.ref.onmousedown = new Function('evt', 'return ' + myName + '.thumbDown(evt);');
		thm.ref.ondragstart = new Function('return false;');

		var fileName='';
		if (location.href.match(/frames\(([^)]+)\)/)) {
			var files = RegExp.$1.split(',');
			for (var i = 0; i < files.length; i++) if (files[i].match(/(\w+)\=(.+)/) && myName == RegExp.$1) fileName = RegExp.$2;
		}

		if (onsetup) onsetup();
		loaded = true;

		if (fileName) load(fileName);
		else if (loadingFile) load(loadingFile);
		else fileLoaded();
	}
}

var scrOL = window.onload;
var scrOR = window.onresize;
var nsWinW = window.innerWidth;
var nsWinH = window.innerHeight;

document.scrMM = document.onmousemove;
document.scrMU = document.onmouseup;
document.scrOC = document.onclick;

var DSL = DHTMLScroller.list;

window.onload = function(){
	document.write = new Function();

	if (scrOL) scrOL();
	for (var s in DSL) DSL[s].setup()
}

window.onresize = function(){
	if (scrOR) scrOR();
	if (isNS4 && (nsWinW != innerWidth || nsWinH != innerHeight)) location.reload();
	for (var s in DSL) DSL[s].layout()
}

if (isNS4) document.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP | Event.CLICK);

document.onmousemove = function(evt) {
	var ret = scrThumbMove(evt);

	if (document.scrMM) return document.scrMM(evt) && ret;
	else return (ret)? ((isNS4)? document.routeEvent(evt): true): false;
}

document.onmouseup = function(evt) {
	scrThumbUp(evt);
	return (document.scrMU)? document.scrMU(evt): ((isNS4)? document.routeEvent(evt): true);
}

document.onclick = function(evt) {
	evt = evt || window.event;

	var e = evt.target || evt.srcElement;
	var DSL = DHTMLScroller.list;
	var uri = '';
	var ret = 1;

	if (e.nodeType == 3) e = e.parentNode;

	L:while(e) {
		for (var s in DSL) {
			if (e.tagName == 'A') {
				if (!e.target) uri = e.href;
				if (e.target == DSL[s].myName) {
					ret = DSL[s].checkURI(e.href);
					break L;
				}
			}

			if (uri && e == DSL[s].div.ref) ret = DSL[s].checkURI(uri);
		}

		e = e.parentNode || e.parentElement;
	} if (!ret) {
		evt.cancelBubble = true;
		evt.returnValue = false;
	}

	if (document.scrOC) return document.scrOC(evt) && ret;
	else return (ret)? ((isNS4)?document.routeEvent(evt): true): false;
}

document.onselectstart = document.onselect = function() {
	if (activeScr) return false;
}