﻿//Javascript
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;
		return true;
		} else {return false;}
		
	}
	
	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)
			}
		return true;
		} else {return false;}
	}
	
	document.goScroll = null;
	var vscroll = tDiv.createVScroll();
	var hscroll = tDiv.createHScroll();
	if (!hscroll && !vscroll) {tDiv.style.zIndex='-1'; return false;};
	
	
	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);
		
		sBar.style.cursor = "pointer";

		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;
}
