// Made by geeeet@ghtml.com
// Keep these two lines and you're free to use this code
/*
	Modified: 2002-08-19 by David Lidström <david.lidstrom@home.se>
		> Added the possibility to have two scrolls on the same site.
*/

// Browser detection
var dom = document.getElementById ? true:false;
var nn4 = document.layers ? true:false;
var ie4 = document.all ? true:false;

var mouseY; // Mouse Y position onclick
var mouseX; // Mouse X position onclick

var clickUp = false; // If click on up-arrow
var clickDown = false; // If click on down-arrow
var clickDrag = false; // If click on scrollbar
var clickAbove = false; // If click above scrollbar
var clickBelow = false; // If click below scrollbar

var timer = setTimeout("",500); // Repeat variable
var upL = new Array(); // Up-arrow X
var upT= new Array(); ; // Up-arrow Y
var downL= new Array(); ; // Down-arrow X
var downT= new Array(); ; // Down-arrow Y
var dragL= new Array(); ; // Scrollbar X
var dragT= new Array(); ; // Scrollbar Y
var rulerL= new Array(); ; // Ruler X
var rulerT= new Array(); ; // Ruler Y
var contentT= new Array(); ; // Content layer Y;
var contentH= new Array(); ; // Content height
var contentClipH= new Array(); ; // Content clip height
var scrollLength = new Array(); // Number of pixels scrollbar should move
var startY; // Keeps track of offset between mouse and span

var scrollbars = new Array();
var CurrentUID = new String();

// Mousedown
function down(e){
	if((document.layers && e.which!=1) || (document.all && event.button!=1)) return true; // Enables the right mousebutton
	getMouse(e);
	
	for( var n = 0; n<scrollbars.length; n++) {
		startY = (mouseY - dragT[scrollbars[n]]);
		// If click on up-arrow
		if(mouseX >= upL[scrollbars[n]] && (mouseX <= (upL[scrollbars[n]] + upW)) && mouseY >= upT[scrollbars[n]] && (mouseY <= (upT[scrollbars[n]] + upH))){
			clickUp = true;
			return scrollUp(scrollbars[n]);
		}	
		// Else if click on down-arrow
		else if(mouseX >= downL[scrollbars[n]] && (mouseX <= (downL[scrollbars[n]] + downW)) && mouseY >= downT[scrollbars[n]] && (mouseY <= (downT[scrollbars[n]] + downH))){
			clickDown = true;
			CurrentUID = scrollbars[n];
			return scrollDown(scrollbars[n]);
		}
		// Else if click on scrollbar
		else if(mouseX >= dragL[scrollbars[n]] && (mouseX <= (dragL[scrollbars[n]] + dragW)) && mouseY >= dragT[scrollbars[n]] && (mouseY <= (dragT[scrollbars[n]] + dragH))){
			CurrentUID = scrollbars[n];
			clickDrag = true;
			return false;
		}
		else if(mouseX >= dragL[scrollbars[n]] && (mouseX <= (dragL[scrollbars[n]] + dragW)) && mouseY >= rulerT[scrollbars[n]] && (mouseY <= (rulerT[scrollbars[n]] + scrollH[scrollbars[n]]))){
			// If click above drag
			if(mouseY < dragT[scrollbars[n]]){
				clickAbove = true;
				clickUp = true;
				return scrollUp(scrollbars[n]);
			}
			// Else click below drag
			else{
				clickBelow = true;
				clickDown = true;
				return scrollDown(scrollbars[n]);
			}
		}
	}
	// If no scrolling is to take place
	return true;

}

// Drag function
function move(e){
	if(clickDrag && contentH[CurrentUID] > contentClipH[CurrentUID]){
		getMouse(e);
		dragT[CurrentUID] = (mouseY - startY);
		
		if(dragT[CurrentUID] < (rulerT[CurrentUID]))
			dragT[CurrentUID] = rulerT[CurrentUID];		
		if(dragT[CurrentUID] > (rulerT[CurrentUID] + scrollH[CurrentUID] - dragH))
			dragT[CurrentUID] = (rulerT[CurrentUID] + scrollH[CurrentUID] - dragH);
		
		contentT[CurrentUID] = ((dragT[CurrentUID] - rulerT[CurrentUID])*(1/scrollLength[CurrentUID]));
		contentT[CurrentUID] = eval('-' + contentT[CurrentUID]);

		moveTo(CurrentUID);
		
		// So ie-pc doesn't select gifs
		if(ie4)
			return false;
	}
}

function up(){
	clearTimeout(timer);
	// Resetting variables
	clickUp = false;
	clickDown = false;
	clickDrag = false;
	clickAbove = false;
	clickBelow = false;
	return true;
}

// Reads content layer top
function getT(uid){
	if(ie4) {
		u = eval("document.all.content" + uid)
		contentT[uid] = u.style.pixelTop;
	} else if(nn4) {
		u = eval("document.contentClip" + uid + ".document.content" + uid);
		contentT[uid] = u.top;
	} else if(dom) {
		contentT[uid] = parseInt(document.getElementById("content" + uid ).style.top);
	}
}

// Reads mouse X and Y coordinates
function getMouse(e){
	if(ie4){
		mouseY = event.clientY + document.body.scrollTop;
		mouseX = event.clientX + document.body.scrollLeft;
	}
	else if(nn4 || dom){
		mouseY = e.pageY;
		mouseX = e.pageX;
	}
}

// Moves the layer
function moveTo(uid){
	if(ie4){
		
		var cont = eval("document.all.content" + uid);
		rulr = eval("document.all.ruler" + uid);
		drg = eval("document.all.drag" + uid);
		cont.style.top =  contentT[uid];
		rulr.style.top =  dragT[uid];
		drg.style.top =  dragT[uid];
	}
	else if(nn4){
		cont = eval("document.contentClip" + uid + ".document.content" + uid);
		rulr = eval("document.ruler" + uid);
		drg = eval("document.drag" + uid);
		cont.top = contentT[uid];
		rulr.top = dragT[uid];
		drg.top = dragT[uid];
	}
	else if(dom){
		document.getElementById("content" + uid).style.top = contentT[uid] + "px";
		document.getElementById("drag" + uid).style.top = dragT[uid] + "px";
		document.getElementById("ruler"+ uid).style.top = dragT[uid] + "px";
	}
}

// Scrolls up
function scrollUp(uid){
	getT(uid);
	
	if(clickAbove){
		if(dragT[uid] <= (mouseY-(dragH/2)))
			return up();
	}
	
	if(clickUp){
		if(contentT[uid] < 0){		
			dragT[uid] = dragT[uid] - (speed*scrollLength[uid]);
			
			if(dragT[uid] < (rulerT[uid]))
				dragT[uid] = rulerT[uid];
				
			contentT[uid] = contentT[uid] + speed;
			if(contentT[uid] > 0)
				contentT[uid] = 0;
			
			moveTo(uid);
			timer = setTimeout("scrollUp('" + uid + "')",25);
		}
	}
	return false;
}

// Scrolls down
function scrollDown(uid){
	getT(uid);

	if(clickBelow){
		if(dragT[uid] >= (mouseY-(dragH/2)))
			return up();
	}
	
	if(clickDown){	
		if(contentT[uid] > -(contentH[uid] - contentClipH[uid]) ){			
			dragT[uid] = dragT[uid] + (speed*scrollLength[uid]);
			if(dragT[uid] > (rulerT[uid] + scrollH[uid] - dragH)) {
				dragT[uid] = (rulerT[uid] + scrollH[uid] - dragH);
			}
			
			contentT[uid] = contentT[uid] - speed;
			
			if( contentT[uid] < -(contentH[uid] - contentClipH[uid])) {
				contentT[uid] = -(contentH[uid] - contentClipH[uid]);
			}
			
			moveTo(uid);
			timer = setTimeout("scrollDown('" + uid + "')",25);
		}
	}
	return false;
}

// reloads page to position the layers again
function reloadPage(){
	location.reload();
}

// Preload
function eventLoader(uid){	// Added: A unique identifier för all scrolls
	var ScrollIndex;
	// Create an index of all uid:s
	scrollbars[scrollbars.length] = uid
	//contentT[uid] = 0;

	if(ie4){
		// Up-arrow X and Y variables
		
		u = eval("document.all.up" + uid)
		upL[uid] = u.style.pixelLeft;
		upT[uid] = u.style.pixelTop;		
		// Down-arrow X and Y variables
		u = eval("document.all.down" + uid)
		downL[uid] = u.style.pixelLeft;
		downT[uid] = u.style.pixelTop;
		
		// Scrollbar X and Y variables
		u = eval("document.all.drag" + uid)
		dragL[uid] = u.style.pixelLeft;
		dragT[uid] = u.style.pixelTop;
		
		// Ruler Y variable
		u = eval("document.all.ruler" + uid)
		rulerT[uid] = u.style.pixelTop;		
		
		// Height of content layer and clip layer
		u = eval("document.all.content" + uid)
		contentH[uid] = parseInt(u.scrollHeight);
		
		u = eval("document.all.contentClip" + uid)
		contentClipH[uid] = parseInt(u.style.height);
	}
	else if(nn4){
		// Up-arrow X and Y variables
		u = eval("document.up" + uid)

		upL[uid] = u.left;
		upT[uid] = u.top;		
		
		// Down-arrow X and Y variables
		u = eval("document.down" + uid)
		downL[uid] = u.left;
		downT[uid] = u.top;		
		
		// Scrollbar X and Y variables
		u = eval("document.drag" + uid)
		dragL[uid] = u.left;
		dragT[uid] = u.top;
		
		// Ruler Y variable
		u = eval("document.ruler" + uid)
		rulerT[uid] = u.top;
		
		// Height of content layer and clip layer
		u = eval("document.contentClip" + uid + ".document.content" + uid)
		contentH[uid] = u.clip.bottom;
		u = eval("document.contentClip" + uid )
		contentClipH[uid] = u.clip.bottom;
		
	}
	else if(dom){
		// Up-arrow X and Y variables
		upL[uid] = parseInt(document.getElementById("up"+ uid).style.left);
		upT[uid] = parseInt(document.getElementById("up"+ uid).style.top);
		// Down-arrow X and Y variables
		downL[uid] = parseInt(document.getElementById("down"+ uid).style.left);
		downT[uid] = parseInt(document.getElementById("down"+ uid).style.top);
		// Scrollbar X and Y variables
		dragL[uid] = parseInt(document.getElementById("drag"+ uid).style.left);
		dragT[uid] = parseInt(document.getElementById("drag"+ uid).style.top);
		// Ruler Y variable
		rulerT[uid] = parseInt(document.getElementById("ruler"+ uid).style.top);
		// Height of content layer and clip layer
		contentH[uid] = parseInt(document.getElementById("content"+ uid).offsetHeight);
		contentClipH[uid] = parseInt(document.getElementById("contentClip"+ uid).offsetHeight);
		document.getElementById("content"+ uid).style.top = 0 + "px";
	
	}
	// Number of pixels scrollbar should move
	scrollLength[uid] = ((scrollH[uid]-dragH)/(contentH[uid]-contentClipH[uid]));
	
	// Initializes event capturing
	if(nn4){
		document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP);
		window.onresize = reloadPage;
	}
	document.onmousedown = down;
	document.onmousemove = move;
	document.onmouseup = up;
}