/**
 * Pager class, to page items without reloading.
 *
 * Extend this class to implement the following behaviour / methods:
 * display ( item )
 * hide ( item )
 * isIncluded ( item )
 * initLinks ( pageCount )
 * setActivePage ( pageNr )
 *
 * @author Gerard van Helden
 * @copyright Zicht nieuwe media ontwerpers
 */

AbstractPager = new Class({
    initialize: function ( itemsPerPage, items ) {
        this.itemsPerPage = itemsPerPage;
        this.items = items;
        
        ['display','hide','isIncluded','initLinks','setActivePage'].each ( function ( t ) {
            if ( typeof this[t] != 'function' ) {
                throw "Missing " + t + "() method";
            }
        }.bind(this) );
        this.reload( true );
    },
    
    getIncludedItems:function () {
        return this.items.filter ( this.isIncluded.bind(this) );
    },
    
    page:function ( pageIndex ) {
        var items = this.getIncludedItems();
        
        for ( var i = 0; i < items.length; i ++ ) {
            var display = 
                i >= pageIndex * this.itemsPerPage 
             && i < (pageIndex+1) * this.itemsPerPage;
            
            if (display){
                this.display ( items[i] );
            } else {
                this.hide ( items[i] );
            } 
        }
        this.setActivePage(pageIndex);
    },
    
    getPageCount:function () {
        return Math.floor ( (this.getIncludedItems().length -1) / this.itemsPerPage )
    },
    
    reload:function ( first ) {
        this.initLinks( this.getPageCount(), first );
        this.page(0);
    }
});

/**
 * TDH base implementation used for news and projects, extended as News.Pager and ProjectFilter.Pager respectively
 * @author Gerard van Helden
 * @copyright Zicht nieuwe media ontwerpers. 
 */
 
TdhPager = AbstractPager.extend ( {
    isIncluded:function () {
        return true;
    },
    
    hide:function ( item ) {
        item.addClass('paging-hidden');
    },
    
    nextPage:function () {
        this.page(this.activePage+1);
    },
    
    previousPage:function () {
        this.page(this.activePage-1);
    },
    
    setActivePage:function ( nr ) {
        var showNext = ( nr < this.getPageCount() );
        var showPrevious = ( nr > 0 );
        $E('a.link_page_previous', this.getPagingElement ()).setStyle('visibility', showPrevious ? 'visible' : 'hidden' );
        $E('a.link_page_next', this.getPagingElement ()).setStyle('visibility', showNext ? 'visible' : 'hidden' );
        var o;
        if ( o = $E('span.pageCount', this.getPagingElement()) ) {
            o.setText(this.getPageCount() +1);
        }
        if ( o = $E('span.pageNr') ) {
            o.setText(nr +1);
        }
        
        $ES('a.page',this.getPagingElement()).each ( function ( pageLink ) {
            pageLink[
                pageLink.hasClass('page-' + nr)
                ? 'addClass'
                : 'removeClass'
            ] (
                'active'
            );
        } ); 
        this.activePage = nr;
    },
    
    
    initLinks:function ( pageCount, firstInit ) {
        var container = this.getPagingElement();
        if ( pageCount > 0 ) {
            container.setStyle('display', 'block');
            var pages = $E('.page_numbers',this.getPagingElement());
            if ( pages ) {
                pages.setHTML('');
	            for ( var i = 0; i <= pageCount; i ++ ) {
	                var link = new Element('a', {'class':'page page-' + i, 'href':'javascript:{}'});
	                link.appendChild ( document.createTextNode(''+(i+1)) );
	                link.addEvent('click', function (nr) {
	                    this.page(nr)
	                }.bind(this,[i]) );
	                pages.appendChild ( link );
	            }
            }
        } else {
            container.setStyle('display', 'none');
        }
        
        if ( firstInit ) {
            $E('a.link_page_previous', this.getPagingElement ()).addEvent('click',function(e){
                new Event(e).stop();
                this.previousPage();
            }.bind(this) );
            $E('a.link_page_next', this.getPagingElement ()).addEvent('click',function(e){
                new Event(e).stop();
                this.nextPage();
            }.bind(this) );
        }
    }
} );