﻿var Pagination = Class.create();

Pagination.prototype = {

	// Initialisation de l'ecart pagine
	initialize: function(el, options) {
		this.setOptions(options);
		this.encartEl		= $(el);	// Identifiant de l'encart
		this.pagerEl		= 'pager_' + this.encartEl.id; //Identifiant du pager
		this.nbItemsTotal	= 0;		// Nombre d'éléments
		this.nbPagesByGroup	= 0;		// Nombre d'indice de page � pr�senter dans la navigation

		this.items = $A(this.encartEl.getElementsByTagName(this.options.itemTag)); // Recheche des elements
		this.nbItemsTotal = this.items.length;
		this.nbPagesByGroup = this.options.nbPagesByGroup;

		// Affichage de la premiere page
		this.initPager();
		this.drawPage(this, 1);
	},

	// Initialise les options si necessaire
	setOptions: function(options) {
		this.options = {
			nbItemsPage:        3,
			itemTag:            'li',
			paginationClass:    'pagination',
			initNumPage:		0
		}
		Object.extend(this.options, options || {});
	},


	// Ajoute une barre de pagination si necessaire
	initPager: function() {
		if(this.nbItemsTotal > this.options.nbItemsPage){
			// si l'element racine de la pagination n'existe pas, on le cr
			if (!$(this.pagerEl)){
				pagination  =	'<ul class="' + this.options.paginationClass + '" id="'+ this.pagerEl +'"></ul>';
				//new Insertion.After(this.encartEl, pagination);
				new Insertion.Bottom(this.encartEl.parentNode, pagination);
			}
		}
	},


	// Affiche les elements d'une page donnee
	drawPage: function(obj, pageNum) {		
		start = (pageNum-1) * this.options.nbItemsPage;
		stop = start + this.options.nbItemsPage
		for(i=0 ; i < this.nbItemsTotal ; i++){
			if(i >= start && i < stop){
				if(this.items[i]){
					this.items[i].style.display = 'inline';
				}
			}else{
				this.items[i].style.display = 'none';
			}
		}

		// Mise à jour de la pagination si necessaire
		if(this.nbItemsTotal > this.options.nbItemsPage){
			this.drawPager(pageNum);
		}	

		// Positionnement en haut de page
		location.href = '#top';
	},


	// Affiche / réactualise une barre de liens vers les autre pages
	drawPager: function(pageNum) {
		var pagination = '';
		nbPages = Math.ceil(this.nbItemsTotal/this.options.nbItemsPage);
		if (this.nbPagesByGroup > 0) {
			//alert(pageNum);
			//calcule des bornes
			group = Math.ceil(pageNum/this.nbPagesByGroup) - 1;
			iInf = group * this.nbPagesByGroup + 1;
			iSup = Math.min( (group + 1) * this.nbPagesByGroup , nbPages);
			
			// on ajoute chaque item de la navigation
			if (iInf > 1) {
				pagination += 	'<li style="margin-left:6px;"><a href="javascript:void(0)" class="off"><<</a></li>';
				pagination += 	'<li style="margin-left:6px;"><a href="javascript:void(0)" class="off"><</a></li>';				
			}
			for(i=iInf  ; i <= iSup ; i++){
				pagination += 	'<li style="margin-left:6px;"><a href="javascript:void(0)" '+ ((i==pageNum)?'class="on"':'class="off"') +'>'+ (i+this.options.initNumPage) +'</a></li>';
			}
			if (iSup < nbPages){
				pagination += 	'<li style="margin-left:6px;"><a href="javascript:void(0)" class="off">></a></li>';
				pagination += 	'<li style="margin-left:6px;"><a href="javascript:void(0)" class="off">>></a></li>';				
			}
			
			$(this.pagerEl).innerHTML = pagination;		
			// On y ajoute les actions
			items = $A($(this.pagerEl).getElementsByTagName('a'));
			i1 = 0
			if (iInf > 1) {
				Event.observe(items[0], "click", this.drawPage.bindAsEventListener(this, 1));
				Event.observe(items[1], "click", this.drawPage.bindAsEventListener(this, iInf - 1));
				i1 = 2;			
			}
			j = 0;
			for(i=i1 ; i <= iSup - iInf +i1 ; i++){
				Event.observe(items[i], "click", this.drawPage.bindAsEventListener(this, j+iInf));
				j++;
			}
			if (iSup < nbPages){
				Event.observe(items[this.nbPagesByGroup+i1], "click", this.drawPage.bindAsEventListener(this, iSup + 1));;
				Event.observe(items[this.nbPagesByGroup+i1+1], "click", this.drawPage.bindAsEventListener(this, nbPages));			
			}
		}
		else {
			for(i=1 ; i <= nbPages ; i++){
				pagination += 	'<li style="margin-left:6px;"><a href="javascript:void(0)" '+ ((i==pageNum)?'class="on"':'class="off"') +'>'+ (i+this.options.initNumPage) +'</a></li>';
			}
			
			//alert("pagination = "+pagination);
			$(this.pagerEl).innerHTML = pagination;		
			//alert("pager = "+$(this.pagerEl).innerHTML );
			// On y ajoute les actions
			items = $A($(this.pagerEl).getElementsByTagName('a'));
			for(i=0 ; i < nbPages ; i++){
				Event.observe(items[i], "click", this.drawPage.bindAsEventListener(this, i+1));
			}
		}
		
		//if ($('previousPage')) new Insertion.First($(this.pagerEl), $('previousPage'));
		//if ($('firstPage')) new Insertion.First($(this.pagerEl), $('firstPage'));
		
		//if ($('nextPage')) new Insertion.Last($(this.pagerEl), $('nextPage'));
		//if ($('lastPage')) new Insertion.Last($(this.pagerEl), $('lastPage'));
	}


}
