function pagination(pagescontainer, itemsperpage, instancename, itemclass ){
	this.itemsperpage = itemsperpage; 
	this.curpic = 0; 
	this.curpageid = 'page_1'; 
	this.curleftpos = 1;
	this.pagerleftpage = 1;
	this.pagerlen = 4;
	this.pagescontainer = pagescontainer;
	this.pages = $("#"+this.pagescontainer+" .page");
	this.items = $("#"+this.pagescontainer+" ."+itemclass);
	this.pagesnum = this.pages.length;
	this.instancename = instancename;
	this.pageitems = new Array();
	this.itemspage = new Array();

	// einzelne elemente einer 'page' ermitteln und entsprechend gruppieren 
	pageitems = this.pageitems;
	$(this.pages).each(
		function(i){
			pageitems[i] = $(this).find("."+itemclass);
		}
	);
	this.pageitems = pageitems;

	// pfeil nach links bei start ausblenden - es wird immer auf der ersten seite/bild gestartet
	$("#neighbourpagesnav .before").removeClass('show').addClass('hide');

	// zu jedem 'page' element die enstprechende page finden  
	itemspage = this.itemspage;	
	$(this.items).each(
		function(i){
			//alert($(this).parent(".page").attr('id'));
			itemspage[itemspage.length] = $(this).parent(".page").attr('id');
		}
	);
	this.itemspage = itemspage;
//	for(index in this.itemspage) {
//		alert(index+'='+this.itemspage[index]);
//	}
	// heandler die von aussen gesetzt werden
	this.haendlerextern = new Array('pageopener');		

	this.addhaendlerfunc = function (haendler, funcname){
		if(haendler == 'pageopener'){
			this.haendlerextern[haendler] = new Array(funcname);
		}
		else{
			// fehlerfall			
		}
	};

	this.buildPagerselection = function (newleftpage){//alert("buildPagerselection("+newleftpage+")");
		pagerleftpage = newleftpage?newleftpage:this.pagerleftpage;
		pagesnum = this.pagesnum;
		pagecounter = this.pagerlen;
		pagerlen = this.pagerlen;
		haendlerextern = this.haendlerextern;		

		// zueruechsetzten (links und trenner)
		$(".pagerinnerlinks").remove();
		$("a[id^='pagerlink']").remove();
		$(".pagerblanks").remove();
		
		// pfeile 'berechen'
		(pagerleftpage+this.pagerlen-1) == pagesnum || this.pagerlen-1 > this.pages.length?$("#arrow_right").removeClass('show').addClass('hide'):$("#arrow_right").removeClass('hide').addClass('show');
		pagerleftpage == 1?$("#arrow_left").removeClass('show').addClass('hide'):$("#arrow_left").removeClass('hide').addClass('show');

		$(this.pages).each(
			function(i){
				if (pagerleftpage <= (i+1) && pagecounter-- > 0 ){
					$('#pager #arrow_right').before('<li><div class="pagerinnerlinks"><a onfocus="this.blur()" id="pagerlinkpage_'+(i+1)+'" href="javascript:'+haendlerextern['pageopener']+'(\'page_'+(i+1)+'\')">'+(i+1)+'</a></div></li>');
					if(pagesnum >(i+1) && (pagerleftpage+pagerlen-1)>(i+1)){
						$('#pager #arrow_right').before('<li class="pagerblanks">|</li>');
					}
				}	
			}
		);
		this.setpagerhighlight();
	}

	/* passt den internen positionsmarker entsprechend an.
	*/
	this.pageradjust = function (step){//alert('pageradjust');
		var newpic;

		// naechstes item errechnen
		newpic = parseInt(step)+parseInt(this.curpic);

/*
		if(newpic <= 0){
			$("#neighbourpagesnav .before").removeClass('show').addClass('hide');
		}
		else {
			$("#neighbourpagesnav .before").removeClass('hide').addClass('show');
		}

		if(newpic >= (this.itemspage.length-1)){
			$("#neighbourpagesnav .next").removeClass('show').addClass('hide');
		}
		else {
			$("#neighbourpagesnav .next").removeClass('hide').addClass('show');
		}

		if(newpic < 0 || newpic >= this.itemspage.length){
			return;
		}
*/

		// entsprechende page errechnen
		pageid = this.itemspage[newpic];

		// falls sicht die seite geändert hat, diese öffnen 
		if (this.curpageid != pageid){
			this.setcurpageid(pageid);
			this.showneigbpage(0);  
		}

		this.setcurpic(newpic);

		curpagenum = parseInt(pageid.substr(pageid.lastIndexOf('_')+1));
// 		alert(newpic  +" - "+(parseInt(this.curleftpos)+this.pagerlen)-1);

		// pager jetzt noch anpassen
 		if (curpagenum > (this.curleftpos+this.pagerlen-1)){
			this.pagerarrow('right');
		}
		if (curpagenum < (this.curleftpos)){
			this.pagerarrow('left');
		}
	}
	
	this.getcurpagenum =  function (){
		return parseInt(this.curpageid.substr(this.curpageid.lastIndexOf('_')+1));
	}
	
	
	/*  bewegt die aktive seite im pager entsprechend der ausgewaehlten richtung eine stelle weiter  
		    
	*/
	this.pagerarrow = function (direction){
		if(direction == 'left' && this.curleftpos > 1){
			this.buildPagerselection(--this.curleftpos);
		}
		if(direction == 'right' && this.curleftpos < this.pagesnum){
			this.buildPagerselection(++this.curleftpos);
		}
	}
	
	/* bei aktivierter zoomansicht werden die in-zoom vor-/zurück aktionen überwacht um 
		bei einen onmousedown event den internen positionsmarker entsprechend anzupassen.    
	*/
	var iszoomactiv = false; 
	this.check_pager = function (){
		var thisObject = this;
		if (!iszoomactiv){
			iszoomactiv = $('#fancy_right').length || $('#fancy_left').length;
			if(iszoomactiv){
				$('#fancy_right').mousedown(function (){
					eval(thisObject.instancename+".pageradjust(1)");
				});
				$('#fancy_left').mousedown(function (){
					eval(thisObject.instancename+".pageradjust(-1)");
				});
			}
		}
		else{
			iszoomactiv = $('#fancy_right').length || $('#fancy_left').length;
		}	
		pagercheck = setTimeout(function (){thisObject.check_pager()}, 200);
	}

	// setzt den index des aktuellen bildes
	this.setcurpic = function (picindex){
		this.curpic = picindex;
	}

	// setzt die id der aktuellen seite
	this.setcurpageid = function (pageid){
		this.curpageid = pageid;
	}

	this.setpagerhighlight = function (){//alert("setpagerhighlight()");
		$("a[id^='pagerlink']").removeClass('active');
		$("#pagerlink"+this.curpageid).addClass('active');
	}

	this.setneigbarrows = function (){
		// naechste seite errechnen
		curpagenum = parseInt(this.getcurpagenum());

		if(curpagenum <= 1){
			$("#neighbourpagesnav .before").removeClass('show').addClass('hide');
		}
		else {
			$("#neighbourpagesnav .before").removeClass('hide').addClass('show');
		}

		if(curpagenum >= (this.pagesnum)){
			$("#neighbourpagesnav .next").removeClass('show').addClass('hide');
		}
		else {
			$("#neighbourpagesnav .next").removeClass('hide').addClass('show');
		}
	}

	
	this.showneigbpage = function(step){
		var neigbpage;

		// naechste seite errechnen
		neigbpage = parseInt(step)+parseInt(this.getcurpagenum());

		if(neigbpage < 1 || neigbpage > this.pagesnum){
			return;
		}
			
		this.setcurpageid('page_'+neigbpage);
		
		this.setneigbarrows();

		eval(this.haendlerextern['pageopener']+"('"+this.curpageid+"')");

		// pager jetzt noch anpassen
 		if (neigbpage > (this.curleftpos+this.pagerlen-1)){
			this.pagerarrow('right');
		}
		if (neigbpage < (this.curleftpos)){
			this.pagerarrow('left');
		}
	}
}
