﻿/* 
This license text has to stay intact at all times:
fleXcroll v1.0.7 Public Version
Cross Browser Custom Scroll Bar Script by Hesido.
Public version - Free for non-commercial uses.

This script cannot be used in any commercially built
web sites, or in sites that relates to commercial
activities. 

Derivative works are only allowed for personal uses,
and they cannot be redistributed.
For licensing options:
Contact Emrah BASKAYA @ www.hesido.com

FleXcroll Public Key Code: 20050907122003339
MD5 hash for this license: 9ada3be4d7496200ab2665160807745d

End of license text---
*/

window.onload = function() {
	// hid fleXcroll from Safari
	
	if (navigator.userAgent.toLowerCase().indexOf('safari') == -1) {
		CSBfleXcroll('canvas');
	} else {
		if (document.getElementById('canvas'))
			document.getElementById('canvas').className = 'noxcroll';
	}
}

function CSBfleXcroll(targetId) {
	if (!document.getElementById || document.getElementById(targetId) == null || !document.createElement) return;
	var dDiv = document.getElementById(targetId);
	var cDiv = createDiv('contentwrapper',true)
	var mDiv = createDiv('mcontentwrapper',true)
	var tDiv = createDiv('scrollwrapper',true)
	var pDiv = createDiv('copyholder',true)
	
	pDiv.style.border = '1px solid transparent';
	pDiv.style.visibility = 'hidden';
	copyStyles(
	'dDiv','pDiv',false,true,'0px',
	['border-left-width','border-right-width','border-top-width','border-bottom-width'],
	['borderLeftWidth','borderRightWidth','borderTopWidth','borderBottomWidth']
	);
	var intlHeight = dDiv.offsetHeight, intlWidth = dDiv.offsetWidth;
	
	copyStyles(
	'dDiv','mDiv',false,true,'0px',
	['padding-left','padding-right','padding-top','padding-bottom'],
	['paddingLeft','paddingRight','paddingTop','paddingBottom']
	);
	
	var postWidth = dDiv.offsetWidth, postHeight = dDiv.offsetHeight, heightLoss = intlHeight - postHeight, widthLoss = intlWidth - postWidth;
	dDiv.style.width = intlWidth + 'px'; dDiv.style.height = intlHeight + 'px';
	tDiv.style.width = dDiv.offsetWidth+'px'; tDiv.style.height = dDiv.offsetHeight+'px';
	mDiv.style.width = postWidth+'px';	mDiv.style.height = postHeight+'px';
	tDiv.style.position = 'absolute'; tDiv.style.top = '0px'; tDiv.style.left = '0px';
	cDiv.innerHTML = dDiv.innerHTML; dDiv.innerHTML = '';
	dDiv.appendChild(tDiv); dDiv.appendChild(mDiv); dDiv.appendChild(pDiv); mDiv.appendChild(cDiv)
	cDiv.style.position = 'relative'; mDiv.style.position = 'relative'; cDiv.style.padding = '1px';

	dDiv.style.overflow = 'hidden'; mDiv.style.overflow = 'hidden';
	mDiv.style.top = "0"; cDiv.style.top = "0";
	tDiv.hVspace = 0, tDiv.vHspace = 0

	cDiv.getContentWidth = function() {
		var cChilds = cDiv.childNodes, maxCWidth = 0, compPad = 0;
		for (var i=0;i<cChilds.length;i++) {
			if (cChilds[i].offsetWidth) {maxCWidth = Math.max(cChilds[i].offsetWidth,maxCWidth)}
			}
		cDiv.contentWidth = maxCWidth+widthLoss;
		return cDiv.contentWidth;
		}
	
	cDiv.getContentHeight = function () {
		cDiv.contentHeight = cDiv.offsetHeight + heightLoss;
		return cDiv.contentHeight;
		}
	
	tDiv.createVScroll = function() {
	if (cDiv.getContentHeight() > dDiv.offsetHeight && !dDiv.vScroll) {
		vrt = new Array();
		createScrollBars(vrt,'vscroller');
		tDiv.barPadding = parseInt(getActiveStyle(vrt.sBar,'padding-top','paddingTop'));
		vrt.sBar.style.padding = '0px';
		vrt.sBar.vertical = true;
		
		prepareScroll(vrt.sDiv,vrt.sBar,vrt.sFDiv,vrt.sFBar,vrt.sSDiv,vrt.sSBar, tDiv.vHspace)
		tDiv.hVspace = vrt.sDiv.offsetWidth;
		mDiv.style.width = postWidth - tDiv.hVspace + 'px'
		cDiv.getContentWidth();
		cDiv.getContentHeight();
		prepareScroll(vrt.sDiv,vrt.sBar,vrt.sFDiv,vrt.sFBar,vrt.sSDiv,vrt.sSBar, tDiv.vHspace)
		dDiv.vScroll = true;
		}
	}
	
	tDiv.createHScroll = function() {
	if (cDiv.getContentWidth() > dDiv.offsetWidth && !dDiv.hScroll) {
		var hrz = new Array();
		createScrollBars(hrz,'hscroller');
		tDiv.barPadding = parseInt(getActiveStyle(hrz.sBar,'padding-left','paddingLeft'));
		hrz.sBar.style.padding = '0px';

		//Blatant Opera detection for a PITA display bug of Opera.
		if (window.opera) hrz.sBar.style.position = 'relative';

		hrz.sBar.vertical = false;
		prepareScroll(hrz.sDiv,hrz.sBar,hrz.sFDiv,hrz.sFBar,hrz.sSDiv,hrz.sSBar,tDiv.hVspace)
		tDiv.vHspace = hrz.sDiv.offsetHeight;
		mDiv.style.height = postHeight - tDiv.vHspace + 'px';
		dDiv.hScroll = true;
		if (dDiv.vScroll) {
			cDiv.getContentWidth();
			cDiv.getContentHeight();
			prepareScroll(vrt.sDiv,vrt.sBar,vrt.sFDiv,vrt.sFBar,vrt.sSDiv,vrt.sSBar,tDiv.vHspace)
			hrz.jBox = createDiv('scrollerjogbox');
			hrz.jBox.prnt = tDiv;
			tDiv.appendChild(hrz.jBox);
			hrz.jBox.onmousedown = function() {
					hrz.sBar.scrollBoth = true; document.goScroll = hrz.sBar; hrz.sBar.clicked = true;
					hrz.sBar.moved = false; hrz.sBar.scrlTrgt.vBar.moved = false;
					addTrigger(document,'selectstart', CSBpreventTselect);
					addTrigger(document,'mousemove',CSBMoveBar);
					addTrigger(document,'mouseup',CSBMouseUp);
					return false;
				}
		}
		if (!dDiv.vScroll && cDiv.offsetHeight > dDiv.offsetHeight) {
			tDiv.createVScroll();
			cDiv.getContentWidth();
			prepareScroll(hrz.sDiv,hrz.sBar,hrz.sFDiv,hrz.sFBar,hrz.sSDiv,hrz.sSBar,tDiv.hVspace)
			}
		}
	}
	
	document.goScroll = null;
	tDiv.createVScroll();
	tDiv.createHScroll();
	
	copyStyles(
	'pDiv','dDiv',false,true,'0px',
	['border-left-width','border-right-width','border-top-width','border-bottom-width'],
	['borderLeftWidth','borderRightWidth','borderTopWidth','borderBottomWidth']
	);
	cDiv.style.padding = '0px';
	
	dDiv.removeChild(pDiv);
	
	function getActiveStyle(elem,style,stylecc) {
	if (window.getComputedStyle) return window.getComputedStyle(elem,null).getPropertyValue(style);
	if (elem.currentStyle) return eval("elem.currentStyle."+stylecc);
	return '';
	}
	
	function copyStyles(src,dest,store,replace,replaceStr,sList,camelList) {
		for (var i=0;i<sList.length;i++) {
			eval(dest+'.style.'+camelList[i]+' = getActiveStyle('+src+',"'+sList[i]+'","'+camelList[i]+'")');
			if (replace) eval(src+'.style.'+camelList[i]+' = "'+replaceStr+'"');
		}
	}
	
	function createDiv(typeName,noGenericClass) {
	var newDiv = document.createElement('div');
	newDiv.id = targetId+'_'+typeName;
	newDiv.className = (noGenericClass) ? typeName : typeName+' scrollgeneric';
	return newDiv;
	}
	
	
	function createScrollBars(ary,bse) {
	ary.sDiv = createDiv(bse+'base');
	ary.sFDiv = createDiv(bse+'basebeg')
	ary.sSDiv = createDiv(bse+'baseend')
	ary.sBar = createDiv(bse+'bar');
	ary.sFBar = createDiv(bse+'barbeg')
	ary.sSBar = createDiv(bse+'barend')
	tDiv.appendChild(ary.sDiv); ary.sDiv.appendChild(ary.sBar);
	ary.sDiv.appendChild(ary.sFDiv); ary.sDiv.appendChild(ary.sSDiv);
	ary.sBar.appendChild(ary.sFBar); ary.sBar.appendChild(ary.sSBar);
	}
	
	function prepareScroll(sDiv,sBar,sFDiv,sFBar,sSDiv,sSBar, reqSpace) {
	sBar.minPos = tDiv.barPadding;
	sBar.curPos = 0;
	sBar.ofstParent = sDiv;
	sBar.mDiv = mDiv;
	sBar.scrlTrgt = cDiv;

	if (sBar.vertical) {
		sDiv.style.height = (tDiv.offsetHeight-reqSpace)+'px';
		sDiv.style.left = tDiv.offsetWidth-sDiv.offsetWidth+'px';
		sBar.style.height = parseInt(dDiv.offsetHeight / cDiv.contentHeight * sDiv.offsetHeight)+'px';
		sBar.style.top = sBar.minPos+'px';
		sBar.maxPos = sDiv.offsetHeight - sBar.offsetHeight - tDiv.barPadding;
		sBar.mxScroll = mDiv.offsetHeight - cDiv.contentHeight;
		sBar.pageScroll = parseInt(sBar.offsetHeight * 0.96);

		cDiv.vBar = sBar;
		sFDiv.style.height = sDiv.offsetHeight-sSDiv.offsetHeight+'px';
		sFBar.style.height = sBar.offsetHeight-sSBar.offsetHeight+'px';
		sSBar.style.top = sFBar.offsetHeight+'px';
		sSDiv.style.top = sFDiv.offsetHeight+'px';
		} else {
		sDiv.style.width = (tDiv.offsetWidth - reqSpace)+'px';
		sDiv.style.top = tDiv.offsetHeight-sDiv.offsetHeight+'px';
		sBar.style.width = parseInt(dDiv.offsetWidth / cDiv.contentWidth * sDiv.offsetWidth)+'px';
		sBar.style.left = sBar.minPos+'px';
		sBar.maxPos = sDiv.offsetWidth - sBar.offsetWidth - tDiv.barPadding;
		sBar.mxScroll = mDiv.offsetWidth - cDiv.contentWidth;
		sBar.pageScroll = parseInt(sBar.offsetWidth * 0.96);
		
		cDiv.hBar = sBar;
		sFDiv.style.width = sDiv.offsetWidth-sSDiv.offsetWidth+'px';
		sFBar.style.width = sBar.offsetWidth-sSBar.offsetWidth+'px';
		sSBar.style.left = sFBar.offsetWidth+'px';
		sSDiv.style.left = sFDiv.offsetWidth+'px';
		
		}

	mDiv.style.zIndex = getActiveStyle(sBar,'z-index','zIndex');
	sBar.sRange = sBar.maxPos - sBar.minPos;
	sBar.onmousedown = function() {
		this.clicked = true; document.goScroll = this; this.scrollBoth = false; this.moved = false;
		addTrigger(document,'selectstart', CSBpreventTselect);
		addTrigger(document,'mousemove',CSBMoveBar);
		addTrigger(document,'mouseup',CSBMouseUp);
		return false;
		}
		
	sDiv.onmousedown = function(e)  {
		if (!e) {var e = window.event;}
		if (e.target && (e.target == sFBar || e.target == sSBar )) return;
		if (e.srcElement && (e.srcElement == sFBar || e.srcElement == sSBar)) return;
		var newCurPos, relPos;
		var xScrolled = (window.pageXOffset) ? window.pageXOffset : (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : 0;	
		var yScrolled = (window.pageYOffset) ? window.pageYOffset : (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : 0;	
		sBar.mDiv.scrollTop = 0; sBar.mDiv.scrollLeft = 0;
		CSBFindPos(sBar);
		relPos = (sBar.vertical) ? e.clientY + yScrolled - sBar.yPos : e.clientX + xScrolled - sBar.xPos;
		newCurPos = (relPos>0) ? sBar.curPos+sBar.pageScroll : sBar.curPos-sBar.pageScroll;
		sBar.curPos = (Math.min(Math.max(newCurPos,sBar.minPos),sBar.maxPos))
		sBar.targetScroll = parseInt(((sBar.curPos - sBar.minPos) / sBar.sRange) * sBar.mxScroll);
		if (sBar.vertical) {
			sBar.style.top = sBar.curPos + "px";
			sBar.scrlTrgt.style.top = sBar.targetScroll + 'px';
			} else {
			sBar.style.left = sBar.curPos + "px";
			sBar.scrlTrgt.style.left = sBar.targetScroll + 'px';
			}
		return false;
		}

	}

}

function CSBpreventTselect() {
		return false;
}



function CSBMoveBar(e) {

if (!e) {var e = window.event;}
var FCBar = document.goScroll, moveBar, maxx;
if (FCBar == null) return;
maxx = (FCBar.scrollBoth) ? 2 : 1;
for (var i=0; i<maxx; i++) {
	moveBar = (i == 1) ? FCBar.scrlTrgt.vBar : FCBar;
	if (FCBar.clicked) {
		if (!moveBar.moved) {
			moveBar.mDiv.scrollTop = 0;	
			moveBar.mDiv.scrollLeft = 0;
			CSBFindPos(moveBar);
			CSBFindPos(moveBar.ofstParent);
			moveBar.pointerOffsetY= e.clientY - moveBar.yPos;
			moveBar.pointerOffsetX= e.clientX - moveBar.xPos;
			moveBar.inCurPos = moveBar.curPos;
			moveBar.moved = true;
		}
		
		moveBar.curPos = (moveBar.vertical) ? e.clientY-moveBar.pointerOffsetY-moveBar.ofstParent.yPos : e.clientX-moveBar.pointerOffsetX-moveBar.ofstParent.xPos;
		if (FCBar.scrollBoth) moveBar.curPos = moveBar.curPos + (moveBar.curPos - moveBar.inCurPos) ;
		moveBar.curPos = (Math.min(Math.max(moveBar.curPos,moveBar.minPos),moveBar.maxPos))

		if (moveBar.vertical) {
			moveBar.style.top = moveBar.curPos + "px";
			moveBar.targetScroll = parseInt(((moveBar.curPos - moveBar.minPos) / moveBar.sRange) * moveBar.mxScroll);
			moveBar.scrlTrgt.style.top = moveBar.targetScroll + 'px';
			} else {
			moveBar.style.left = moveBar.curPos + "px";
			moveBar.targetScroll = parseInt(((moveBar.curPos - moveBar.minPos) / moveBar.sRange) * moveBar.mxScroll);
			moveBar.scrlTrgt.style.left = moveBar.targetScroll + 'px';
			}
		} else moveBar.moved = false;
	}
}

function CSBMouseUp() {
	if (document.goScroll != null) {document.goScroll.clicked = false;}
	document.goScroll = null;
	removeTrigger(document,'selectstart', CSBpreventTselect);
	removeTrigger(document,'mousemove',CSBMoveBar)
	removeTrigger(document,'mouseup',CSBMouseUp)
	}

function addTrigger(elm,eventname,func) {
if (!addCheckTrigger(elm,eventname,func) && elm.attachEvent) elm.attachEvent('on'+eventname, func);
}
function addCheckTrigger(elm,eventname,func) {
if (elm.addEventListener) {elm.addEventListener(eventname, func, false); return true;}
else return false;
}
function removeTrigger(elm,eventname,func) {
if (!removeCheckTrigger(elm,eventname,func) && elm.detachEvent) elm.detachEvent('on'+eventname, func);
}
function removeCheckTrigger(elm,eventname,func) {
if (elm.removeEventListener) {elm.removeEventListener(eventname, func, false); return true;}
else return false;
}


function CSBFindPos(elem) {
var obj = elem;
var curleft = 0;
var curtop = 0;
if (obj.offsetParent) {
	while (obj.offsetParent){
		curleft += obj.offsetLeft
		curtop += obj.offsetTop
		obj = obj.offsetParent;
	}
} else if (obj.x && obj.y) {curleft += obj.x; curtop += obj.y;}
elem.xPos = curleft; elem.yPos = curtop;
}
