if (!itdr) var itdr = new Object();
if (!itdr.classes) itdr.classes = new Object();
if (!itdr.classes.ScrollPane) itdr.classes.ScrollPane = new function () {
	// private members
	var zeno_id = -1;
	var zeno_table = new Object();
	var zeno_player;
	var active_scroll;
	var active;
	var active_offset;
	var active_cursor;
	var self = this;
	// private functions
	function zeno (obj, prop, val, units) {
		if (!obj.id) {
			++zeno_id;
			obj.id = "zeno-object-"+zeno_id;
		}
		var key = obj.id + "-" + prop;
		if (!zeno_table[key]) zeno_table[key] = new Object();
		zeno_table[key].obj = obj;
		zeno_table[key].prop = prop;
		zeno_table[key].proxy = parseFloat(obj.style[prop]);
		zeno_table[key].units = units;
		zeno_table[key].end = Math.round(val);
		clearInterval(zeno_player);
		zeno_player = setInterval(zeno_exec, 33);
		zeno_exec();
	};
	function zeno_exec () {
		var items = 0;
		for (var prop in zeno_table) {
			++items;
			var obj = zeno_table[prop];
			obj.proxy += (obj.end-obj.proxy)/3;
			obj.obj.style[obj.prop] = obj.proxy + obj.units;
			if (Math.round(obj.proxy)==obj.end) {
				obj.obj.style[obj.prop] = obj.end + obj.units;
				delete zeno_table[prop];
			}
		}
		if (items==0) clearInterval(zeno_player);
	};
	function getCursorCoord (ev) {
		if (ev.pageX || ev.pageY){
			return {
				x:ev.pageX,
				y:ev.pageY
			};
		}
		return {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	};
	function getElementCoord (e) {
		var left = 0;
		var top  = 0;
		while (e.offsetParent){
			left += e.offsetLeft;
			top  += e.offsetTop;
			e     = e.offsetParent;
		}
		left += e.offsetLeft;
		top  += e.offsetTop;
		return {
			x:left,
			y:top
		};
	};
	function getElementSize (e) {
		var arr = [];
		var obj = new Object();
		obj.element = e;
		obj.display = e.style.display;
		//alert(obj.display);
		while (e.offsetParent){
			arr.push(e);
			e = e.offsetParent;
		}
		//alert(arr);
	};
	function getMouseOffset (target, ev) {
		ev = ev || window.event;
		var docPos = getElementCoord(target);
		var mousePos = getCursorCoord(ev);
		return {
			x:mousePos.x - docPos.x,
			y:mousePos.y - docPos.y
		};
	};
	function onMouseWheel (ev) {
		var delta = 0;
		var e = ev || window.event;
		if (e.wheelDelta) {
			delta = e.wheelDelta/120;
		} else if (e.detail) {
			delta = -e.detail/3;
		}
		if (delta>0) decrement();
		else increment();
		if (!active_scroll) return true;
		return cancelEvent(ev);
	};
	function updateContentPosition (scrollbar, animate) {
		if (!scrollbar) return;
		if (!scrollbar.scrollable) return;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var wrapper = scrollbar.parentNode;
		var ratio = scrollbar.options.horizontal ? button.offsetLeft / (track.offsetWidth - button.offsetWidth) : button.offsetTop / (track.offsetHeight - button.offsetHeight);
		if (isNaN(ratio)) ratio = 0;
		var position = scrollbar.options.horizontal ? ratio * (scrollbar.owner.offsetWidth - wrapper.offsetWidth) * -1 : ratio * (scrollbar.owner.offsetHeight - wrapper.offsetHeight) * -1;
		var property = scrollbar.options.horizontal ? "left" : "top";
		if (animate) zeno(scrollbar.owner, property, position, "px");
		else scrollbar.owner.style[property] = position + "px";
	};
	function updateScrollPosition (scrollbar, animate) {
		if (!scrollbar) return;
		if (!scrollbar.scrollable) return;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var wrapper = scrollbar.parentNode;
		var position = scrollbar.options.horizontal ? (track.offsetWidth-button.offsetWidth)*((scrollbar.owner.offsetLeft*-1)/(scrollbar.owner.offsetWidth-wrapper.offsetWidth)) : (track.offsetHeight-button.offsetHeight)*((scrollbar.owner.offsetTop*-1)/(scrollbar.owner.offsetHeight-wrapper.offsetHeight));
		var property = scrollbar.options.horizontal ? "left" : "top";
		if (animate) zeno(button, property, position, "px");
		else button.style[property] = position + "px";
	};
	function setContentPosition (scrollbar, position, animate) {
		if (!scrollbar) return;
		if (!scrollbar.scrollable) return;
		if (!position&&position!==0) position = scrollbar.options.horizontal ? scrollbar.owner.offsetLeft : scrollbar.owner.offsetTop;
		var wrapper = scrollbar.parentNode;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var max = scrollbar.options.horizontal ? track.offsetWidth - scrollbar.owner.offsetWidth : track.offsetHeight - scrollbar.owner.offsetHeight;
		if (position<max) position = max;
		if (position>0) position = 0;
		var property = scrollbar.options.horizontal ? "left" : "top";
		if (animate) zeno(scrollbar.owner, property, position, "px");
		else scrollbar.owner.style[property] = position + "px";
	};
	function setScrollPosition (scrollbar, position, animate) {
		if (!scrollbar) return;
		if (!scrollbar.scrollable) return;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		if (!position&&position!==0) position = scrollbar.options.horizontal ? button.offsetLeft : button.offsetTop;
		var max = scrollbar.options.horizontal ? track.offsetWidth - button.offsetWidth : track.offsetHeight - button.offsetHeight;
		if (position<0) position = 0;
		if (position>max) position = max;
		var property = scrollbar.options.horizontal ? "left" : "top";
		if (animate) zeno(button, property, position, "px");
		else button.style[property] = position + "px";
	};
	function increment () {
		var scrollbar = active_scroll;
		if (!scrollbar) return;
		if (!scrollbar.scrollable) return;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var position = scrollbar.options.horizontal ? button.offsetLeft + 10 : button.offsetTop + 10;
		setScrollPosition(scrollbar, position);
		updateContentPosition(scrollbar);
	};
	function decrement () {
		var scrollbar = active_scroll;
		if (!scrollbar) return;
		if (!scrollbar.scrollable) return;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var position = scrollbar.options.horizontal ? button.offsetLeft - 10 : button.offsetTop - 10;
		setScrollPosition(scrollbar, position);
		updateContentPosition(scrollbar);
	};
	function cancelEvent(e) {
		e = e ? e : window.event;
		if (e.stopPropagation) e.stopPropagation();
		if (e.preventDefault) e.preventDefault();
		e.cancelBubble = true;
		e.cancel = true;
		e.returnValue = false;
		return false;
	};
	// public methods
	this.scrollTo = function (obj, position, animate) {
		if (!obj) return;
		if (!position) position = 0;
		if (!animate) animate = false;
		var scrollbar = obj.nextSibling;
		setContentPosition(scrollbar, position, animate);
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var wrapper = scrollbar.parentNode;
		var scroll_position = scrollbar.options.horizontal ? (track.offsetWidth-button.offsetWidth)*((position*-1)/(scrollbar.owner.offsetWidth-wrapper.offsetWidth)) : (track.offsetHeight-button.offsetHeight)*((position*-1)/(scrollbar.owner.offsetHeight-wrapper.offsetHeight));
		setScrollPosition(scrollbar, scroll_position, animate);
	};
	this.resize = function (obj, w, h) {
		if (!obj) return;
		var wrapper = obj.parentNode;
		var scrollbar = obj.nextSibling;
		var track = scrollbar.firstChild;
		var button = track.nextSibling;
		var hidden = scrollbar.owner.style.display=="none";
		if (hidden) scrollbar.owner.style.display = "block";
		if (!w) w = parseFloat(wrapper.style.width);
		if (!h) h = parseFloat(wrapper.style.height);
		wrapper.style.width = w + "px";
		wrapper.style.height = h + "px";
		scrollbar.style.visibility = "visible";
		scrollbar.scrollable = true;
		getElementSize(scrollbar.owner);
		if (scrollbar.options.horizontal) {
			track.style.width = w + "px";
			track.style.height = scrollbar.options.thickness + "px";
			var dim_computed = Math.min(w, w*(w/scrollbar.owner.offsetWidth));
			var dim = dim_computed;
			if (scrollbar.options.minimum&&dim<scrollbar.options.minimum) dim = scrollbar.options.minimum;
			if (scrollbar.options.maximum&&dim>scrollbar.options.maximum) dim = scrollbar.options.maximum;
			if (dim_computed==w) scrollbar.scrollable = false;
			if (dim_computed==w&&scrollbar.options.autohide) scrollbar.style.visibility = "hidden";
			button.style.width = dim + "px";
			button.style.height = scrollbar.options.thickness + "px";
			setContentPosition(scrollbar);
			updateScrollPosition(scrollbar);
		} else {
			track.style.width = scrollbar.options.thickness + "px";
			track.style.height = h + "px";
			var dim_computed = Math.min(h, h*(h/scrollbar.owner.offsetHeight));
			var dim = dim_computed;
			if (scrollbar.options.minimum&&dim<scrollbar.options.minimum) dim = scrollbar.options.minimum;
			if (scrollbar.options.maximum&&dim>scrollbar.options.maximum) dim = scrollbar.options.maximum;
			if (dim_computed==h) scrollbar.scrollable = false;
			if (dim_computed==h&&scrollbar.options.autohide) scrollbar.style.visibility = "hidden";
			button.style.width = scrollbar.options.thickness + "px";
			button.style.height = dim + "px";
			setContentPosition(scrollbar);
			updateScrollPosition(scrollbar);
		}
		if (hidden) scrollbar.owner.style.display = "none";
	};
	this.initialize = function (owner, options) {
		if (!owner) return;
		if (!options) options = new Object();
		owner.style.overflow = "visible";
		owner.style.position = "absolute";
		owner.style.top = "0px";
		owner.style.left = "0px";
		var wrapper = document.createElement('div');
		wrapper.style.position = "relative";
		wrapper.style.width = "0px";
		wrapper.style.height = "0px";
		wrapper.style.overflow = "hidden";
		owner.parentNode.insertBefore(wrapper, owner);
		wrapper.appendChild(owner);
		var scrollbar = document.createElement('div');
		scrollbar.className = "ITDRScrollPane";
		if (options.className) scrollbar.className += " " + options.className;
		if (options.id) scrollbar.id = options.id;
		scrollbar.owner = owner;
		scrollbar.options = options;
		wrapper.onmouseover = function (e) {
			if (this.lastChild.scrollable) active_scroll = this.lastChild;
			return cancelEvent(e);
		};
		wrapper.onmouseout = function (e) {
			if (active_scroll==this.lastChild) active_scroll = null;
			return cancelEvent(e);
		};
		var scrolltrack = document.createElement('div');
		scrolltrack.className = "ITDRScrollPaneTrack";
		scrolltrack.style.position = "absolute";
		scrolltrack.onmousedown = function (ev) {
			var coords = getMouseOffset(this, ev);
			var scrollbar = this.parentNode;
			var track = scrollbar.firstChild;
			var button = track.nextSibling;
			var position = scrollbar.options.horizontal ? coords.x - (button.offsetWidth/2) : coords.y - (button.offsetHeight/2);
			setScrollPosition(scrollbar, position);
			updateContentPosition(scrollbar);
			return false;
		};
		scrollbar.appendChild(scrolltrack);
		var scrollbutton = document.createElement('div');
		scrollbutton.className = "ITDRScrollPaneButton";
		scrollbutton.style.position = "absolute";
		scrollbutton.onmousedown = function (ev) {
			active = this.parentNode;
			active_offset = getMouseOffset(this, ev);
			return false;
		};
		scrollbutton.innerHTML = '<div class="ITDRScrollPaneButton1"></div><div class="ITDRScrollPaneButton2"><div class="ITDRScrollPaneButton3"></div>';
		if (scrollbar.options.horizontal) {
			scrolltrack.style.left = "0px";
			scrolltrack.style.bottom = "0px";
			scrollbutton.style.left = "0px";
			scrollbutton.style.bottom = "0px";
		} else {
			scrolltrack.style.right = "0px";
			scrolltrack.style.top = "0px";
			scrollbutton.style.right = "0px";
			scrollbutton.style.top = "0px";
		}
		scrollbar.appendChild(scrollbutton);
		wrapper.appendChild(scrollbar);
	};
	document.onmousemove = function (ev) {
		ev = ev || window.event;
		active_cursor = getCursorCoord(ev);
		if (active) {
			active_cursor = getMouseOffset(active, ev);
			var position = active.options.horizontal ? active_cursor.x - active_offset.x : active_cursor.y - active_offset.y;
			setScrollPosition(active, position);
			updateContentPosition(active);
		}
	};
	document.onmouseup = function (ev) {
		active = null;
	};
	if (window.addEventListener) window.addEventListener('DOMMouseScroll', onMouseWheel, false);
	window.onmousewheel = document.onmousewheel = onMouseWheel;
};