//=========================================================
// custom scroller developed for 2027.org by aaron boodman
//
// some sections based on ypSimpleScroll.js.
//
// www.youngpup.net
// 3/28/2001 (3 hours before site launch!)
//
// updated 
// - 8/29/02 : fixed performance issues related to using
//   background images
//=========================================================
// code is art!
//=========================================================

var Scroller1 = {
	speed			: 100,
	aniLen			: 1000,
	clipH			: 147-21-21,
	thumbMax		: (147-21-21-21),
	thumbH			: 21,
	scrollbarH		: 147-21-21,
	scrollTop		: 0,
	scrollLeft		: 0,
	minRes			: 10,
	ie4				: navigator.appName == "Microsoft Internet Explorer" && !document.getElementById,
	ns4				: document.layers ? 1 : 0,
	dom				: document.getElementById ? 1 : 0,
	mac				: navigator.platform == "MacPPC",
	mo5				: navigator.userAgent.indexOf("Gecko") != -1,

	imgElevBack1	: ypImage("img/elevator1.png"),
	imgElevBack2	: ypImage("img/elevator2.png"),
	imgElevBack3	: ypImage("img/elevator3.png"),

	imgThumb1		: ypImage("img/thumb1.png"),
	imgThumb2		: ypImage("img/thumb1.png"),

	imgUp1			: ypImage("img/scrollUp1.gif"),
	imgUp2			: ypImage("img/scrollUp2.gif"),
	imgUp3			: ypImage("img/scrollUp3.gif"),
	imgDn1			: ypImage("img/scrollDn1.gif"),
	imgDn2			: ypImage("img/scrollDn2.gif"),
	imgDn3			: ypImage("img/scrollDn3.gif"),

	dir:0,lastTime:0,aniTimer:0,dragActive:0,dragLastY:0,dragStartOffset:0,
	startPos:0,startTime:0,accel:0,endPos:0,dist:0
}

// mod by rob@3st.com

Scroller1.resize = function(w,h) {
thumbsize = 21;
this.lyrFrame.style.width = w+'px';
this.lyrFrame.style.height = h+'px';
this.lyrFrame.style.clip = 'rect(0 '+w+' '+h+' 0)';
this.lyrContainer.style.width = (w-11)+'px';
this.lyrContainer.style.height = (h)+'px';
this.lyrContainer.style.clip = 'rect(0 '+(w-11)+' '+h+' 0)';
this.lyrScrollbar.style.left = (w-7)+'px';
//this.lyrScrollbar.style.height = h;
//this.lyrScrollbar.style.clip = 'rect(0 7 '+h+' 0)';
this.lyrContent.style.width = (w-21)+'px';
this.lyrElevUp.style.clip = 'rect(0 7 '+(h*2)+' 0)';
this.lyrElevDn.style.clip = 'rect(0 7 '+(h*2)+' 0)';
this.clipH = h;
this.thumbMax = (h - thumbsize); 
this.scrollbarH = h;
this.init();
}


Scroller1.init = function() {
	with (this) {
		// gather pieces
		this.lyrFrame			= getLyr("scroller1", document)
		this.lyrScrollbar		= getLyr("scrollbar1", lyrFrame)
		this.lyrThumb			= getLyr("thumb1", lyrScrollbar)
		this.lyrMarker			= getLyr("marker1", lyrScrollbar)
		this.lyrElevUp			= getLyr("elevUp1", lyrScrollbar)
		this.lyrElevDn			= getLyr("elevDn1", lyrScrollbar)
		this.lyrScrollUp		= getLyr("scrollUp1", lyrFrame)
		this.lyrScrollDn		= getLyr("scrollDn1", lyrFrame)
		this.lyrThumbArrowUp	= getLyr("thumbArrowUp1", lyrScrollbar)
		this.lyrThumbArrowDn	= getLyr("thumbArrowDn1", lyrScrollbar)
		this.lyrContainer		= getLyr("container1", lyrFrame)
		this.lyrContent			= getLyr("content1", lyrContainer)

		// calculate some values
		this.docH				= Math.max(ns4 ? lyrContent.document.height : lyrContent.offsetHeight, clipH)

		this.scrollH			= docH - clipH

		if (this.docH > clipH) {
			// hook events
			lyrElevUp.onmousedown   = slideTo
			lyrElevDn.onmousedown	= slideTo
			lyrThumb.onmousedown    = startDrag
			lyrThumb.onmouseover    = function() { Scroller1.toggleThumb(true) }
			lyrThumb.onmouseout     = function() { Scroller1.toggleThumb(false) }
			lyrThumb.ondragstart	= function() { return false; }
			lyrElevUp.onmouseover   = function() { Scroller1.toggleElev(Scroller1.lyrElevUp, 2) }
			lyrElevUp.onmouseout    = function() { Scroller1.toggleElev(Scroller1.lyrElevUp, 1) }
			lyrElevDn.onmouseover	= function() { Scroller1.toggleElev(Scroller1.lyrElevDn, 2) }
			lyrElevDn.onmouseout	= function() { Scroller1.toggleElev(Scroller1.lyrElevDn, 1) }
			lyrScrollDn.onmouseover = function() { Scroller1.toggleButton("Dn", 2); Scroller1.startScroll('+'); }
			lyrScrollDn.onmousedown = function() { Scroller1.toggleButton("Dn", 3); Scroller1.speed = 350; return false }
			lyrScrollDn.onmouseup   = function() { Scroller1.toggleButton("Dn", 2); Scroller1.speed = 100 }
			lyrScrollDn.onmouseout  = function() { Scroller1.toggleButton("Dn", 1); Scroller1.endScroll() }
			lyrScrollUp.onmouseover = function() { Scroller1.toggleButton("Up", 2); Scroller1.startScroll('-') }
			lyrScrollUp.onmousedown = function() { Scroller1.toggleButton("Up", 3); Scroller1.speed = 350; return false }
			lyrScrollUp.onmouseup   = function() { Scroller1.toggleButton("Up", 2); Scroller1.speed = 100 }
			lyrScrollUp.onmouseout  = function() { Scroller1.toggleButton("Up", 1); Scroller1.endScroll() }

			// initialize some settings
			lyrThumb.s.top = "0px";
			lyrContent.s.top = "0px";
			this.scrollTop = 0;

			// ns4 bullshit.
			if (document.layers) { 
				lyrThumb.captureEvents(Event.MOUSEDOWN)
				lyrElevDn.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE)
				lyrElevUp.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE)
				lyrScrollUp.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
				lyrScrollDn.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
			}

			// mozilla5 bullshit.
			if (mo5) document.getElementById("scrollerMo5Shim1").style.height = docH+'px';
		} 
		else 
		{
			this.lyrScrollbar.style.visibility = 
				this.lyrScrollUp.style.visibility =
				this.lyrScrollDn.style.visibility = 
				'hidden';
		}

		// all done!
		this.loaded = true
	}
}

Scroller1.startScroll = function(dir) {
	if (this.aniTimer) window.clearTimeout(this.aniTimer)

	this.dir		= dir
	this.lastTime	= (new Date()).getTime() - this.minRes
	this.startPos	= this.scrollTop
	this.aniTimer	= window.setTimeout("Scroller1.scroll()", this.minRes)
}

Scroller1.scroll = function() {
	this.aniTimer	= window.setTimeout("Scroller1.scroll()", this.minRes)
	var now			= (new Date()).getTime()
	var elapsed		= now - this.lastTime
	var ny			= eval(this.scrollTop + this.dir + (elapsed * this.speed / 1000))
	this.lastTime	= now
	if (ny > this.scrollH && this.dir == "+" || ny < 0 && this.dir == "-") {
		this.endScroll()
		this.jumpTo(this.dir == "+" ? this.scrollH : 0)
	}
	else this.jumpTo(ny)
}

Scroller1.endScroll = function() {
	if (this.aniTimer) this.aniTimer = window.clearTimeout(this.aniTimer)
}

Scroller1.startDrag = function(e) {
	if (!e) e = window.event
	with (Scroller1) {
		if (aniTimer) window.clearTimeout(aniTimer)
		var ey = e.pageY ? e.pageY : e.y
		dragLastY = ey
		dragStartOffset = ey - parseInt(lyrThumb.style.top)
		dragActive = true
		if (ns4) window.document.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP)
		window.document.onmousemove = doDrag

		window.document.onmouseup = stopDrag
	}
	return false
}

Scroller1.doDrag = function(e) {
	if (!e) e = window.event
	var s  = Scroller1;
	var ey = (e.pageY ? e.pageY : e.y)
	var dy = ey - s.dragLastY
	var ny = parseInt(Scroller1.lyrThumb.style.top) + dy

	// constrain
	if (ny >= s.thumbMax) s.dragLastY = s.thumbMax + s.dragStartOffset
	else if (ny < 0) s.dragLastY = s.dragStartOffset
	else s.dragLastY = ey
	ny = Math.min(Math.max(ny, 0), s.thumbMax)

	s.jumpTo(ny * s.scrollH / s.thumbMax)
	return false;
}

Scroller1.positionThumbArrows = function(ny) {
	this.lyrThumbArrowUp.style.top = (ny - 6)+'px';
	this.lyrThumbArrowDn.style.top = (ny + 15)+'px';
}

Scroller1.stopDrag = function() {
	Scroller1.dragActive = false
	Scroller1.toggleThumb(false)
	if (Scroller1.ns4) window.document.releaseEvents(Event.MOUSEMOVE | Event.MOUSEUP)
	window.document.onmousemove = null
	window.document.onmouseup   = null
}

// slideTo gets called in the scope of lyrElevUp or lyrElevDn
Scroller1.slideTo = function(e) {
	if (!e) e = window.event
	var ey = e.offsetY ? e.offsetY : e.layerY
	if (typeof ey == "undefined") ey = 0
	var ny = (this.id == "elevDn") ? ey-14 : ey
	ny += this.style.top == "" ? 0 : parseInt(this.style.top);
	ny *= Scroller1.scrollH / Scroller1.thumbMax
	ny = Math.min(ny, Scroller1.scrollH)

	with (Scroller1) {
		startTime = (new Date()).getTime()
		startPos = scrollTop
		endPos = ny
		dist = endPos - startPos
		accel = dist / 1000 / 1000
		if (aniTimer) aniTimer = window.clearInterval(aniTimer)
		aniTimer = window.setInterval("Scroller1.slide()", 10)
	}
}

Scroller1.slide = function() {
	with (this) {
		var now = (new Date()).getTime()
		var elapsed = now - startTime
		if (elapsed > 1000) endScroll()
		else {
			var t = 1000 - elapsed
			var ny = endPos - t * t * accel
			jumpTo(ny)
		}
	}
}

Scroller1.jumpTo = function(ny) {
	var thumbTop = ny * this.thumbMax / this.scrollH
	this.lyrElevUp[document.layers ? "clip" : "style"].height = thumbTop+'px';
	this.lyrElevDn[document.layers ? "clip" : "style"].height = (this.scrollbarH - thumbTop)+'px';
	this.lyrElevDn.style.top = thumbTop+'px';
	this.lyrThumb.style.top = thumbTop+'px';
	this.lyrContent.style.top = -ny+'px';
	this.positionThumbArrows(ny * this.thumbMax / this.scrollH)
	this.scrollTop = ny
}

Scroller1.toggleThumb = function(bOn) {
	var img = this.getFirstImage(this.lyrThumb)
	img.src = !bOn && !this.dragActive ? this.imgThumb1.src : this.imgThumb2.src
	if (!bOn && !this.dragActive) this.toggleThumbArrows(false)
	else {
		this.positionThumbArrows(parseInt(this.lyrThumb.style.top))
		this.toggleThumbArrows(true)
	}
}

Scroller1.toggleThumbArrows = function(bOn) {
	//this.lyrThumbArrowUp.style.visibility = bOn ? "visible" : "hidden"
	//this.lyrThumbArrowDn.style.visibility = bOn ? "visible" : "hidden"
}

Scroller1.toggleElev = function(lyr, iState) {
	var img = this["imgElevBack" + iState];
	with (this) {
		if (document.layers) lyr.document.images[0].src = img.src;
		else lyr.firstChild.src = img.src;
		lyr.onmousemove = iState == 2 ? moveMarker : null
		lyrMarker.style.visibility = "hidden"
//		if (iState == 1) lyrMarker.style.visibility = "hidden"

	}
}

Scroller1.moveMarker = function(e) {
	with (Scroller1) {	
		if (!lyrThumb.active) {
			if (!e) e = window.event
			var ey = e.layerY ? e.layerY : e.offsetY
			if (isNaN(ey)) ey = 0
			var ny = Math.round(ey / 2) * 2
			ny += (this.style.top == "" ? '0px' : (parseInt(this.style.top))+'px')
			ny -= 1
			lyrMarker.style.top = ny+'px';
			//lyrMarker.style.visibility = "visible"
		}
	}
}

Scroller1.toggleButton = function(suffix, iState) {
	var lyr = eval("Scroller1.lyrScroll" + suffix)
	var img = this.getFirstImage(lyr)
	img.src = "img/scroll"+suffix+iState+".gif"
}

Scroller1.getLyr = function(sLyrId, oNestRef) {
	var o
	if (document.all) o = oNestRef.all[sLyrId]
	else if (document.layers) o = oNestRef.layers[sLyrId]
	else o = this.recursiveNs6Get(sLyrId, oNestRef)
	o.s = document.layers ? o : o.style
	return o
}

// this is kinda slow for ns6 -> 
// but best way I could think of w/o totally bloating the code.
Scroller1.recursiveNs6Get = function(id, p) {
	if (p.childNodes) {
		for (var i = 0; i < p.childNodes.length; i++) {
			if (p.childNodes[i].id == id) return p.childNodes[i]
			else if (p.childNodes[i].childNodes.length > 0) {
				var obj = Scroller1.recursiveNs6Get(id, p.childNodes[i])
				if (obj && obj != null) return obj
			}
		}
	}
	return false
}

Scroller1.getFirstImage = function(lyr) {
	return document.layers ? lyr.document.images[0] : document.all ? lyr.all.tags("IMG")[0] : lyr.getElementsByTagName("IMG")[0]
}

function ypImage(s) {
	var oImg  = new Image()
	oImg.src = s
	return oImg
}

function dbg(obj) {
	var s = ""
	for (prop in obj) s += prop + ":" + obj[prop] + "\n"
	alert(s)
}
