ThreeOhScroll.ie4mac = navigator.platform == "MacPPC" && navigator.appName == "Microsoft Internet Explorer" && !document.getElementById
ThreeOhScroll.mo5 = navigator.userAgent.indexOf("Gecko") != -1
ThreeOhScroll.aniLen = 1000
function ThreeOhScroll(id, clipH, thumbMax, arrowMax)
{
	this.getMembers(ypGetElementById(id))

	this.PTags		= ypGetDescendantsByTagName(this.content, "P")
	var lastP		= this.PTags[this.PTags.length-1]
	var lastPTop	= lastP.offsetTop - (ThreeOhScroll.mo5 ? 40 : 0)
	this.docH		= lastPTop + Math.max(lastP.offsetHeight, clipH)
	this.scrollH	= this.docH - clipH
	this.clipH		= clipH
	this.markersMax	= parseInt(this.markers.style.height) - 3
	this.thumbMax	= parseInt(this.thumbContainer.style.height) - this.thumbImg.height
	this.arrowMax	= parseInt(this.arrowContainer.style.height) - this.arrowImg.height
	
	this.gRef = "ThreeOhScroll_"+id
	eval(this.gRef+"=this")
	this.thumb.obj	= this
	this.thumb.onmousedown = this.startDrag

	this.initMarkers()
}

ThreeOhScroll.prototype.initMarkers = function() {
	var shtml = "", sTitle, iTop
	for (var i = 0; i < this.PTags.length; i++) {
		sTitle	= this.PTags[i].getAttribute("description")
		pTop	= this.PTags[i].offsetTop - (ThreeOhScroll.mo5 ? 40 : 0)
		iTop	= Math.round(pTop * this.markersMax / this.scrollH)
		if (sTitle && sTitle != "" && sTitle != null) {
			shtml  += "<div style='position:absolute; left:0px; top:" + iTop + "px; "
			shtml  += "cursor:pointer; cursor:hand; width:7px; height:7px;'" 
			shtml  += "onmousedown='" + this.gRef + ".scrollTo(" + pTop + ")' "
			shtml  += "onmouseover='" + this.gRef + ".toggleMarker(this, 1)' "
			shtml  += "onmouseout='" + this.gRef + ".toggleMarker(this, 0)' "
			shtml  += "description='" + sTitle.replace("'", "\'") + "'>"
			shtml  += "<div style='position:absolute; left:1px; top:2px; width:5px; height:3px; clip:rect(0 5 3 0);  background-color:#999999;'></div></div>"
		}
	}
	this.markers.innerHTML += shtml
}

ThreeOhScroll.prototype.getMembers = function(a) {
	var c = a.childNodes ? a.childNodes : a.children, cn
	if (c) {
		for (var i = 0; i < c.length; i++) {
			cn = c[i].className
			if		(cn == "container")			this.container		= c[i]
			else if	(cn == "content")			this.content		= c[i]
			else if (cn == "markers")			this.markers		= c[i]
			else if (cn == "thumb")				this.thumb			= c[i]
			else if (cn == "arrow")				this.arrow			= c[i]
			else if (cn == "skip")				this.skip			= c[i]
			else if (cn == "thumbImg")			this.thumbImg		= c[i]
			else if (cn == "arrowImg")			this.arrowImg		= c[i]
			else if (cn == "thumbContainer")	this.thumbContainer	= c[i]
			else if (cn == "arrowContainer")	this.arrowContainer = c[i]
			else if (cn == "description")		this.description	= c[i]
			else if (cn == "descArrow")			this.descArrow		= c[i]

			if ((c[i].childNodes ? c[i].childNodes : c[i].children).length > 0)
				this.getMembers(c[i])
		}
	}
}

ThreeOhScroll.prototype.startDrag = function(e) {
	if (!e) e = window.event
	var ey = e.pageY ? e.pageY : e.y
	this.dragLastY = ey
	this.dragStartOffset = ey - parseInt(this.style.top)
	ThreeOhScroll.oldMouseMove = document.onmousemove
	ThreeOhScroll.oldMouseUp = document.onmouseup
	ThreeOhScroll.current = this.obj
	document.onmousemove = this.obj.doDrag
	document.onmouseup = this.obj.stopDrag
	if (this.obj.aniTimer) window.clearInterval(this.obj.aniTimer)
	return false;
}

ThreeOhScroll.prototype.doDrag = function(e) {
	if (!e) e = window.event
	var obj = ThreeOhScroll.current
	var ey = (e.pageY ? e.pageY : e.y)
	var dy = ey - obj.thumb.dragLastY
	var ny = parseInt(obj.thumb.style.top) + dy
	if (ny >= obj.thumbMax) obj.thumb.dragLastY = obj.thumbMax + obj.thumb.dragStartOffset

	else if (ny < 0) obj.thumb.dragLastY = obj.thumb.dragStartOffset
	else obj.thumb.dragLastY = ey
	ny = Math.min(Math.max(ny, 0), obj.thumbMax)
	obj.jumpTo(ny * obj.scrollH / obj.thumbMax)
	return false;
}

ThreeOhScroll.prototype.stopDrag = function() {
	this.onmousemove = ThreeOhScroll.oldMouseMove ? this.oldMouseMove : null
	this.onmouseup   = ThreeOhScroll.oldMouseUp   ? this.oldMouseUp   : null
}

ThreeOhScroll.prototype.scrollTo = function(ny) {
	this.endArrow = Math.round(ny * this.markersMax / this.scrollH)
	this.startTime = (new Date()).getTime()
	this.startPos = parseInt(this.content.style.top) * -1
	this.endPos = ny
	this.dist = this.endPos - this.startPos
	this.accel = this.dist / ThreeOhScroll.aniLen / ThreeOhScroll.aniLen
	if (this.aniTimer) this.aniTimer = window.clearInterval(this.aniTimer)
	this.aniTimer = window.setInterval(this.gRef + ".scroll()", 10)
}

ThreeOhScroll.prototype.scroll = function() {
	var now = (new Date()).getTime()
	var elapsed = now - this.startTime
	if (elapsed > ThreeOhScroll.aniLen) this.endScroll()
	else {
		var t = ThreeOhScroll.aniLen - elapsed
		var ny = this.endPos - t * t * this.accel
		this.jumpTo(ny)
	}
}

ThreeOhScroll.prototype.endScroll = function() {
	this.jumpTo(this.endPos)
	this.arrow.style.top = this.endArrow
	this.aniTimer = window.clearInterval(this.aniTimer)
}

ThreeOhScroll.prototype.jumpTo = function(ny) {
	this.thumb.style.top	= Math.round(ny * this.thumbMax / this.scrollH)
	this.arrow.style.top	= Math.round(ny * this.arrowMax / this.scrollH)
	this.content.style.top	= -ny
}

ThreeOhScroll.prototype.toggleMarker = function(oMarker, bOn) {
	if (bOn) {
		ypGetChildNodes(oMarker)[0].style.backgroundColor = "#000000" 
		if (this.curMarker) this.toggleMarker(this.curMarker, 0)
		this.curMarker = oMarker
		this.description.style.left = "-400px"
		this.description.style.top = "-400px"
		this.descArrow.style.top = parseInt(oMarker.style.top) + 2 + "px"
		this.description.innerHTML = oMarker.getAttribute("description").replace("\'", "'")
		var w = this.description.offsetWidth
		this.description.style.left = (ThreeOhScroll.ie4mac ? 222 : 225) - w + "px"
		this.description.style.top = parseInt(oMarker.style.top) - 1 + "px"
		this.description.style.visibility = "visible"
		this.descArrow.style.visibility = "visible"
	} else {
		ypGetChildNodes(oMarker)[0].style.backgroundColor = "#999999" 
		this.curMarker = 0
		this.description.style.visibility = "hidden"
		this.descArrow.style.visibility = "hidden"
	}
}



function ypGetElementById(s) {
	return (document.getElementById ? document.getElementById(s) : document.all[s])
}
function ypGetDescendantsByTagName(a, s) {
	return (a.getElementsByTagName ? a.getElementsByTagName(s) : a.all.tags(s))
}
function ypGetChildNodes(objParent) {
	return (objParent.childNodes ? objParent.childNodes : objParent.children)
}


function dbgListObjProps(obj) {
	var w = window.open("","","width=610,height=360,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()
}
function MM_preloadImages() { //v3.0
 		var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
  	 	var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
   	if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

