function Slider (obj_id, pager_id, pInstanceName, perPageNumber, pSteps, pStepspeed, _nav) {
	var obj			= (document.getElementById(obj_id)) ? document.getElementById(obj_id):obj_id;
	var pager		= (document.getElementById(pager_id)) ? document.getElementById(pager_id):pager_id;
	var innerObj	= document.createElement("div");
	var instanceName= pInstanceName;
	var maxWidth	= 0;
	var maxHeight	= 0;
	var spaceSize	= 0;
	var objWidth	= 0;
	var objHeight	= 0;
	var current		= 0;
	var perPage		= perPageNumber || 3;
	var self		= this;
	var elements	= null;
	var ani			= false;
	var speed		= pStepspeed || 15;
	var steps		= pSteps || 30;
	var nav			= (_nav) ? _nav:Slider.NAV_PAGER;
	var scrollbar	= null;
	var cbQueue		= new Array();
	
	
	if (!obj || !pager) {
		alert("Slider: no object given");
		return false;
	}
	
	switch (nav) {
		case Slider.NAV_PAGER:
		case Slider.NAV_SCROLLBAR:
			break;
			
		default:
			nav	= Slider.NAV_PAGER;
			break;
	}
	
	
	this.addItem	= function (content) {
		var el			= document.createElement("div");
		el.innerHTML	= content;
		innerObj.appendChild(el);
	}
	
	
	
	this.previous	= function () {
		if (current*perPage > 0)
			self.switchTo(current-1);
	}
	
	this.next		= function () {
		if (current*perPage < elements.length - 1)
			self.switchTo(current+1);
	}
	
	
	this.switchTo	= function (number) {
		if (ani)
			return;
		ani = true;
		if (number*perPage < 0 || number*perPage >= elements.length || number == current) {
			ani = false;
			return false;
		}
		var dir		= (current - number > 0) ? 1:-1;
		var old		= (current*perPage*(maxWidth+spaceSize));
		current		= number;
		var n		= (current*perPage*(maxWidth+spaceSize));
		var stepsize= parseInt((old-n)/steps);
		
		var target	= -1*(current*perPage*(maxWidth+spaceSize));
		//document.helper.fadeOut(innerObj, false, function() {self.slide(target, stepsize, 0);}, 5);
		self.slide(target, stepsize, 0);
	}	
	
	
	
	this.slide		= function (target, stepsize, step) {
		if (step < steps) {
			var pos	= document.helper.getRealCoordinates(innerObj);
			var n	= pos[0] + (stepsize);
			if (!((stepsize < 0 && n >= target) || (stepsize > 0 && n <= target))) {
				n	= target;
			}
			
			document.helper.moveTo(innerObj, n, null);
			step++;
			window.setTimeout(function() { self.slide(target, stepsize, step); }, speed);
		} else {
			innerObj.style.left	= target+"px";
			//document.helper.fadeIn(innerObj, function() { document.helper.setOpacity(innerObj, 1); }, 5);
			ani = false;
		}
	}
	
	
	this.draw		= function () {
		if (!document.helper.isBodyLoaded()) {
			return document.helper.waitForBody(self.draw);
		}
		obj.style.position	= "relative";
		obj.style.overflow	= "hidden";
						
		innerObj.style.position		= "relative";
		innerObj.style.opacity		= "1";
		innerObj.style.MozOpacitty	= "1";

		obj.appendChild(innerObj);
		
		/*if (document.helper.isIE() || document.helper.isIE7())
			document.helper.setOpacity(innerObj, 1);*///innerObj.style.filters.alpha.opacity = "100";

		var pDim			= document.helper.getRealDimension(obj);
		elements			= innerObj.getElementsByTagName("div");
		
		/* find out the biggest element */
		for (var i=0; i < elements.length; i++) {
			elements[i].style.position	= "absolute";
			elements[i].style.top		= "0px";
			var dim	= document.helper.getRealDimension(elements[i]);			
			if (dim[0] > maxWidth)
				maxWidth = dim[0];
			if (dim[1] > maxHeight)
				maxHeight = dim[1];
			
		}
		
		
		/* check if parent container is big enough - else correct it */
		if (pDim[0] < maxWidth*perPage) {
			obj.style.width	= (maxWidth*perPage)+"px";
			objWidth		= maxWidth*perPage;
		} else {
			objWidth		= pDim[0];
		}
		obj.style.height	= maxHeight+"px";
		objHeight			= maxHeight;

		spaceSize	= (objWidth - maxWidth*perPage)/(perPage+1);
		if (spaceSize < 0)
			spaceSize	= 0;

		/* resize all elements to equal size and move them to correct position*/
		var i;
		for (i=0; i < elements.length; i++) {
			document.helper.resizeTo(elements[i], maxWidth, maxHeight);
			elements[i].style.left		= ((i+1)*spaceSize+(i*maxWidth))+"px";
			/*elements[i].style.top		= "-"+(i*maxHeight)+"px";*/
		}
		
		var full_width					= (((i)*spaceSize+(i*maxWidth))+spaceSize);
		innerObj.style.width			= full_width+"px";
		
		/* draw pager */
		if (nav == Slider.NAV_PAGER) {
			var inner	= "<span class=\"Slider_pager_item Slider_pager_first\" onclick=\""+instanceName+".switchTo(0);\">&lt;&lt;</span>";
			inner		+= "<span class=\"Slider_pager_item Slider_pager_previous\" onclick=\""+instanceName+".previous();\">&lt;</span>";
			var c		= 0;
			for (var i=0; i < elements.length;) {
				inner	+= "<span class=\"Slider_pager_item\" onclick=\""+instanceName+".switchTo("+c+");\">"+(c+1)+"</span>";
				c++;
				i	+= perPage;
			}
			inner		+= "<span class=\"Slider_pager_item Slider_pager_next\" onclick=\""+instanceName+".next();\">&gt;</span>";
			inner		+= "<span class=\"Slider_pager_item Slider_pager_last\" onclick=\""+instanceName+".switchTo("+(c-1)+");\">&gt;&gt;</span>";
			pager.innerHTML	= inner;
		}
		
		if (nav == Slider.NAV_SCROLLBAR) {
			scrollbar	= new Scrollbar(pager, self.scrollbarCallback, 1, full_width/500);
		}
	}
	
	
	this.scrollbarCallback			= function (percent, type) {
		cbQueue.push(function() { self.scrollbarCallbackFunc(percent, type); });
	}
	
	
	this.scrollbarCallbackInterval	= function () {
		if (!ani && cbQueue.length > 0) {
		
			/* follow every scrollbar action in order */
			/*var func	= cbQueue[0];
			cbQueue.shift();
			func();*/
			
			/* only last scrollbar action is relevant */
			var func	= cbQueue[cbQueue.length-1];
			cbQueue		= new Array();
			func();
		}
	}
	
	this.scrollbarCallbackFunc		= function (percent, type) {
		if (ani) {
			window.setTimeout(function() { self.scrollbarCallback(percent, type); }, 50);
			return;
		}
		ani			= true;
		var	dim_obj	= document.helper.getRealDimension(obj);
		var	dim_in	= document.helper.getRealScrollDimension(innerObj);
		var	pos_in	= document.helper.getRealCoordinates(innerObj);

		var pos		= parseInt((dim_in[0] - dim_obj[0])/100*percent);
		
		if (Scrollbar.CB_DRAGGED == type) {
			document.helper.moveTo(innerObj, -1*pos, null);
			ani		= false;
		}
		
		if (Scrollbar.CB_ABSCLICK == type) {
			var old		= pos_in[0];
			old			= (old < 0) ? -1*old:old;
			var dir		= (old - pos > 0) ? 1:-1;
			var stepsize= parseInt((old-pos)/steps)*2;
			//document.helper.fadeOut(innerObj, false, function() {self.slide(-1*pos, stepsize, 0);}, 5);
			self.slide(-1*pos, stepsize, 0);
		}
		
		if (Scrollbar.CB_LEFTCLICK == type || Scrollbar.CB_RIGHTCLICK == type) {
			pos_in[0]	= (pos_in[0] < 0) ? -1*pos_in[0]:pos_in[0];
			perPage		= 1;
			var pos		= (Scrollbar.CB_LEFTCLICK == type) ? pos_in[0]-perPage*(maxWidth+spaceSize):pos_in[0]+perPage*(maxWidth+spaceSize);
			pos			= parseInt(pos);
			var old		= pos_in[0];
			old			= (old < 0) ? -1*old:old;
			var dir		= (old - pos > 0) ? 1:-1;
			var stepsize= parseInt((old-pos)/steps)*2;
			var percent	= parseInt(pos*100/(dim_in[0] - dim_obj[0]));
			if (percent > 100) {
				ani = false;
				self.scrollbarCallback(100, Scrollbar.CB_ABSCLICK);
			}
			else if (percent < 0) {
				ani = false;
				self.scrollbarCallback(0, Scrollbar.CB_ABSCLICK);
			} else {			
				self.slide(-1*pos, stepsize, 0);
			}
			percent		= (percent < 0) ? 0:percent;
			percent		= (percent > 100) ? 100:percent;
			scrollbar.setPosition(percent);
		}
	}
	
	window.setInterval(self.scrollbarCallbackInterval, 10);
}

Slider.NAV_SCROLLBAR	= 1;
Slider.NAV_PAGER		= 2;