//=========================================================
// 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!)
//=========================================================
// code is art!
//=========================================================

//=========================================================
// modified from the original to support IE 5 and NS/Moz
// better. Also change code to allow vertical or horizontal
// scrolling. 
//
// Does not position correctly in mozilla on Win 2000.
//
// www.ideo.com
// 01/14/02
//========================================================

var Scroller = {
	speed			: 100,
	aniLen			: 1000,
	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,

	

	dir:0,lastTime:0,aniTimer:0,dragActive:0,dragLastPos:0,dragStartOffset:0,
	startPos:0,startTime:0,accel:0,endPos:0,dist:0
}

Scroller.init = function(id, orientation) {
	with (this) {
		// which way am I scrolling?
		this.scrolldir = orientation;
		
		// gather pieces
		this.lyrFrame			= getLyr(id, document);
		scrolldir == "Vert"?this.lyrScrollUp = getLyr("scrollUp", lyrFrame):this.lyrScrollLeft = getLyr("scrollLeft", lyrFrame);
		scrolldir == "Vert"?this.lyrScrollDn = getLyr("scrollDn", lyrFrame):this.lyrScrollRight = getLyr("scrollRight", lyrFrame);
		this.lyrContainer		= getLyr("container", lyrFrame);
		this.lyrContent			= getLyr("content", lyrContainer);
		this.lyrScrollbar		= getLyr("scrollbar", lyrFrame);
		this.lyrThumb			= getLyr("thumb", lyrScrollbar);
		this.lyrMarker			= getLyr("marker", lyrScrollbar);
		scrolldir == "Vert"?this.lyrElevUp = getLyr("elevUp", lyrScrollbar):this.lyrElevLeft = getLyr("elevLeft", lyrScrollbar);
		scrolldir == "Vert"?this.lyrElevDn	= getLyr("elevDn", lyrScrollbar):this.lyrElevRight = getLyr("elevRight", lyrScrollbar);
		scrolldir == "Vert"?this.lyrThumbArrowUp = getLyr("thumbArrowUp", lyrScrollbar):this.lyrThumbArrowLeft = getLyr("thumbArrowLeft", lyrScrollbar);
		scrolldir == "Vert"?this.lyrThumbArrowDn = getLyr("thumbArrowDn", lyrScrollbar):this.lyrThumbArrowRight = getLyr("thumbArrowRight", lyrScrollbar);

		scrolldir == "Vert"?this.imgPath = "images/":this.imgPath = "images/";
		
		this.imgElevBack1 = ypImage(imgPath + "elevator1.gif");
		this.imgElevBack2 = ypImage(imgPath + "elevator2.gif");

		this.imgThumb1 = ypImage(imgPath + "thumb1.gif");
		this.imgThumb2 = ypImage(imgPath + "thumb2.gif");
		
		if(scrolldir == "Vert"){
			this.imgUp1 = ypImage(imgPath + "scrollUp1.gif");
			this.imgUp2 = ypImage(imgPath + "scrollUp2.gif");
			this.imgDn1 = ypImage(imgPath + "scrollDn1.gif");
			this.imgDn2 = ypImage(imgPath + "scrollDn2.gif");
			this.imgMark = ypImage(imgPath + "marker.gif");
		}else{
			this.imgLeft1 = ypImage(imgPath + "scrollLeft1.gif");
			this.imgLeft2 = ypImage(imgPath + "scrollLeft2.gif");
			this.imgRight1 = ypImage(imgPath + "scrollRight1.gif");
			this.imgRight2 = ypImage(imgPath + "scrollRight2.gif");
			this.imgMark = ypImage(imgPath + "marker.gif");
		}
		
		// calculate some values
		this.clipL = scrolldir == "Vert"?ns4?this.lyrContainer.clip.height:this.lyrContainer.offsetHeight:ns4?this.lyrContainer.clip.width:this.lyrContainer.offsetWidth;
		this.scrollbarL = scrolldir == "Vert"?ns4?this.lyrScrollbar.clip.height:this.lyrScrollbar.offsetHeight : ns4?this.lyrScrollbar.clip.width:this.lyrScrollbar.offsetWidth;
		this.thumbL = scrolldir == "Vert"? ns4?this.lyrThumb.clip.height:this.lyrThumb.offsetHeight : ns4?this.lyrThumb.clip.width:this.lyrThumb.offsetWidth;
		//this.thumbL = 50;
		this.thumbMax = scrollbarL - thumbL;
		this.scrollTop = this.lyrScrollbar.s.top;
		this.scrollLeft = this.lyrScrollbar.s.left;
		this.docL				= scrolldir == "Vert"?Math.max(ns4 ? lyrContent.document.height : lyrContent.offsetHeight, clipL):Math.max(ns4 ? lyrContent.document.width : lyrContent.offsetWidth, clipL)
		this.scrollL			= docL - clipL

		//dbg(lyrThumb);
		
		if (this.docL > clipL) {
			// hook events
			
			//lyrFrame.onmousewheel   = function() { Scroller.wheelScroll() }
			lyrThumb.onmousedown    = startDrag
			lyrThumb.onmouseover    = function() { Scroller.toggleThumb(true) }
			lyrThumb.onmouseout     = function() { Scroller.toggleThumb(false) }
			lyrThumb.ondragstart	= function() { return false; }
			
			if(scrolldir == "Vert"){
				lyrElevUp.onmousedown = slideTo
				lyrElevDn.onmousedown = slideTo
				lyrElevUp.onmouseover = function() { Scroller.toggleElev(Scroller.lyrElevUp, 2) }
				lyrElevUp.onmouseout = function() { Scroller.toggleElev(Scroller.lyrElevUp, 1) }
				lyrElevDn.onmouseover = function() { Scroller.toggleElev(Scroller.lyrElevDn, 2) }
				lyrElevDn.onmouseout = function() { Scroller.toggleElev(Scroller.lyrElevDn, 1) }
				lyrScrollDn.onmouseover = function() { Scroller.toggleButton("Dn", 2); }
				lyrScrollDn.onmousedown = function() { Scroller.toggleButton("Dn", 2); Scroller.startScroll('+'); Scroller.speed = 100; return false }
				lyrScrollDn.onmouseup = function() { Scroller.toggleButton("Dn", 2); Scroller.endScroll(); }
				lyrScrollDn.onmouseout = function() { Scroller.toggleButton("Dn", 1); }
				lyrScrollUp.onmouseover = function() { Scroller.toggleButton("Up", 2); }
				lyrScrollUp.onmousedown = function() { Scroller.toggleButton("Up", 2); Scroller.startScroll('-');Scroller.speed = 100; return false }
				lyrScrollUp.onmouseup = function() { Scroller.toggleButton("Up", 2); Scroller.endScroll() }
				lyrScrollUp.onmouseout = function() { Scroller.toggleButton("Up", 1);}
			}else{
				lyrElevLeft.onmousedown = slideTo
				lyrElevRight.onmousedown = slideTo
				lyrElevLeft.onmouseover = function() { Scroller.toggleElev(Scroller.lyrElevLeft, 2) }
				lyrElevLeft.onmouseout = function() { Scroller.toggleElev(Scroller.lyrElevLeft, 1) }
				lyrElevRight.onmouseover = function() { Scroller.toggleElev(Scroller.lyrElevRight, 2) }
				lyrElevRight.onmouseout = function() { Scroller.toggleElev(Scroller.lyrElevRight, 1) }
				lyrScrollRight.onmouseover = function() { Scroller.toggleButton("Right", 2); }
				lyrScrollRight.onmousedown = function() { Scroller.toggleButton("Right", 2); Scroller.startScroll('+'); Scroller.speed = 100; return false }
				lyrScrollRight.onmouseup = function() { Scroller.toggleButton("Right", 2); Scroller.endScroll(); }
				lyrScrollRight.onmouseout = function() { Scroller.toggleButton("Right", 1); }
				lyrScrollLeft.onmouseover = function() { Scroller.toggleButton("Left", 2); }
				lyrScrollLeft.onmousedown = function() { Scroller.toggleButton("Left", 2); Scroller.startScroll('-');Scroller.speed = 100; return false }
				lyrScrollLeft.onmouseup = function() { Scroller.toggleButton("Left", 2); Scroller.endScroll() }
				lyrScrollLeft.onmouseout = function() { Scroller.toggleButton("Left", 1);}
			}
			
			// initialize some settings
			scrolldir == "Vert"?lyrThumb.s.top = 0 : lyrThumb.s.left = 0;
			
			// ns4 bullshit.
			if (document.layers) { 
				lyrThumb.captureEvents(Event.MOUSEDOWN)
				
				if(scrolldir == "Vert"){
					lyrElevDn.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE)
					lyrElevUp.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE)
					lyrScrollUp.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
					lyrScrollDn.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
				}else{
					lyrElevRight.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE)
					lyrElevLeft.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE)
					lyrScrollLeft.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
					lyrScrollRight.captureEvents(Event.MOUSEDOWN | Event.MOUSEUP)
				}
			}

		} 
		else 
		{
			this.lyrScrollbar.s.visibility = 'hidden';
			this.scrolldir == "Vert"? this.lyrScrollUp.s.visibility = this.lyrScrollDn.s.visibility = 'hidden': this.lyrScrollLeft.s.visibility = this.lyrScrollRight.s.visibility = 'hidden';
		}
		
		// all done!
		this.loaded = true
		
	}
	
	
	
	//alert(Scroller.clipL + "\n" + Scroller.scrollbarL + "\n" + Scroller.thumbL + "\n" + Scroller.thumbMax + "\n" + Scroller.scrollTop + "\n" + Scroller.scrollLeft);
}

Scroller.wheelScroll = function() {
//	if (!e) e = window.event
//		var dir = e.wheelDelta;
		
//		alert(dir);
}

Scroller.startScroll = function(dir) {
	if (this.aniTimer) window.clearTimeout(this.aniTimer)

	this.dir		= dir
	this.lastTime	= (new Date()).getTime() - this.minRes
	this.startPos	= Scroller.scrolldir == "Vert"?this.scrollTop : this.scrollLeft;
	this.aniTimer	= window.setTimeout("Scroller.scroll()", this.minRes)
}

Scroller.scroll = function() {
	this.aniTimer	= window.setTimeout("Scroller.scroll()", this.minRes)
	var now			= (new Date()).getTime()
	var elapsed		= now - this.lastTime
	var ny			= Scroller.scrolldir == "Vert"?eval(this.scrollTop + this.dir + (elapsed * this.speed / 1000)):eval(this.scrollLeft + this.dir + (elapsed * this.speed / 1000));
	this.lastTime	= now

	if (ny > this.scrollL && this.dir == "+" || ny < 0 && this.dir == "-") {
		this.endScroll()
		this.jumpTo(this.dir == "+" ? this.scrollL : 0)
	}
	else this.jumpTo(ny)
}

Scroller.endScroll = function() {
	if (this.aniTimer) this.aniTimer = window.clearTimeout(this.aniTimer)
}

Scroller.startDrag = function(e) {
	if (!e) e = window.event
	with (Scroller) {
		if (aniTimer) window.clearTimeout(aniTimer)
		var ey = scrolldir == "Vert"?e.pageY ? e.pageY : e.y:e.pageX ? e.pageX : e.x;
		dragLastPos = ey
		dragStartOffset = scrolldir == "Vert"?ey - parseInt(lyrThumb.s.top):ey - parseInt(lyrThumb.s.left);
		dragActive = true
		if (ns4) window.document.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP)
		window.document.onmousemove = doDrag
		window.document.onmouseup = stopDrag
	}
	return false
}

Scroller.doDrag = function(e) {
	if (!e) e = window.event
	var s  = Scroller
	var ey = s.scrolldir == "Vert"?(e.pageY ? e.pageY : e.y):(e.pageX ? e.pageX : e.x);
	var dy = ey - s.dragLastPos
	var ny = s.scrolldir == "Vert"?parseInt(Scroller.lyrThumb.s.top) + dy : parseInt(Scroller.lyrThumb.s.left) + dy;

	// constrain
	if (ny >= s.thumbMax) s.dragLastPos = s.thumbMax + s.dragStartOffset
	else if (ny < 0) s.dragLastPos = s.dragStartOffset
	else s.dragLastPos = ey
	ny = Math.min(Math.max(ny, 0), s.thumbMax)

	s.jumpTo(ny * s.scrollL / s.thumbMax)
	return false;
}

Scroller.positionThumbArrows = function(ny) {
	this.scrolldir == "Vert"?this.lyrThumbArrowUp.s.top = ny - 6 :this.lyrThumbArrowLeft.s.left = ny - 5
	this.scrolldir == "Vert"?this.lyrThumbArrowDn.s.top = ny + 51 : this.lyrThumbArrowRight.s.left = ny + 51
}

Scroller.stopDrag = function() {
	Scroller.dragActive = false
	Scroller.toggleThumb(false)
	if (Scroller.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
Scroller.slideTo = function(e) {
	if (!e) e = window.event
	var ey = Scroller.scrolldir == "Vert"?e.offsetY ? e.offsetY : e.layerY : e.offsetX ? e.offsetX : e.layerX;
	if (typeof ey == "undefined") ey = 0;
	
	var ny = Scroller.scrolldir == "Vert"?(this.id == "elevDn") ? ey - Scroller.thumbL : ey : (this.id == "elevRight") ? ey - Scroller.thumbL : ey;
	ny += Scroller.scrolldir == "Vert"?this.s.top == "" ? 0 : parseInt(this.s.top) : this.s.left == "" ? 0 : parseInt(this.s.left);
	ny *= Scroller.scrollL / Scroller.thumbMax;
	ny = Math.min(ny, Scroller.scrollL);

	with (Scroller) {
		if (aniTimer) aniTimer = window.clearInterval(aniTimer)
		startTime = (new Date()).getTime()
		startPos = scrolldir == "Vert"? scrollTop : scrollLeft;
		endPos = ny
		dist = endPos - startPos
		accel = dist / 1000 / 1000
		
		aniTimer = window.setInterval("Scroller.slide()", 10)
	}
}

Scroller.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)
		}
	}
}

Scroller.jumpTo = function(ny) {
	var thumbPos = ny * this.thumbMax / this.scrollL
	
	if(this.scrolldir == "Vert"){
		this.lyrElevUp[document.layers ? "clip" : "style"].height = thumbPos;
		this.lyrElevDn[document.layers ? "clip" : "style"].height = this.scrollbarL - thumbPos + 1;
		this.lyrElevDn.s.top = thumbPos;
		this.lyrThumb.s.top = thumbPos
		this.lyrContent.s.top = -ny
		this.positionThumbArrows(ny * this.thumbMax / this.scrollL);
		this.scrollTop = ny;
	}else{
		this.lyrElevLeft[document.layers ? "clip" : "style"].width = thumbPos;
		this.lyrElevRight[document.layers ? "clip" : "style"].width = this.scrollbarL - thumbPos + 1;
		this.lyrElevRight.s.left = thumbPos;
		this.lyrThumb.s.left = thumbPos;
		this.lyrContent.s.left = -ny;
		this.positionThumbArrows(ny * this.thumbMax / this.scrollL);
		this.scrollLeft = ny;
	}
}

Scroller.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 {
		Scroller.scrolldir == "Vert"?this.positionThumbArrows(parseInt(this.lyrThumb.s.top)) : this.positionThumbArrows(parseInt(this.lyrThumb.s.left));
		this.toggleThumbArrows(true)
	}
}

Scroller.toggleThumbArrows = function(bOn) {
	Scroller.scrolldir == "Vert"?this.lyrThumbArrowUp.s.visibility = bOn ? "visible" : "hidden" : this.lyrThumbArrowLeft.s.visibility = bOn ? "visible" : "hidden"
	Scroller.scrolldir == "Vert"?this.lyrThumbArrowDn.s.visibility = bOn ? "visible" : "hidden" : this.lyrThumbArrowRight.s.visibility = bOn ? "visible" : "hidden"
}

Scroller.toggleElev = function(lyr, iState) {
	with (this) {
		var img = eval("imgElevBack" + iState)
		if (!dragActive && !ns4) lyr.s.backgroundImage = "url("+img.src+")"
		lyr.onmousemove = iState == 2 ? moveMarker : null
		if (iState == 1) lyrMarker.s.visibility = "hidden"
	}
}

Scroller.moveMarker = function(e) {
	with (Scroller) {	
		if (!lyrThumb.active) {
			if (!e) e = window.event
			var ey = scrolldir == "Vert"?e.layerY ? e.layerY : e.offsetY : e.layerX ? e.layerX : e.offsetX
			if (isNaN(ey)) ey = 0
			var ny = Math.round(ey / 2) * 2
			ny += scrolldir == "Vert"?(this.s.top == "" ? 0 : parseInt(this.s.top)) : (this.s.left == "" ? 0 : parseInt(this.s.left))
			ny -= 2
			scrolldir == "Vert"?lyrMarker.s.top = ny:lyrMarker.s.left = ny
			lyrMarker.s.visibility = "visible"
		}
	}
}

Scroller.toggleButton = function(suffix, iState) {
	var lyr = eval("Scroller.lyrScroll" + suffix)
	var img = this.getFirstImage(lyr)
	img.src = Scroller.imgPath+"scroll"+suffix+iState+".gif"
}

Scroller.getLyr = function(sLyrId, oNestRef) {
	var o
	
	if(document.getElementById) o = document.getElementById(sLyrId);
	else if (document.all) o = oNestRef.all[sLyrId];
	else if (document.layers) o = oNestRef.layers[sLyrId];
		
	//alert(sLyrId);
	
	document.layers ? o.s = o : o.s = o.style
	
	//alert(sLyrId);
	
	return o
}

Scroller.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 w = window.open("","","width=400,height=300,resizable");
		w.document.open();
		w.document.write("<textarea style='position:absolute; width:90%; height:90%;'>");
		for (prop in obj) w.document.write(prop + " : " + obj[prop] + "\n");
		w.document.write("<\/textarea>");
		w.document.close();
		w.focus();
}