var mooVirtualPages = new Class({
    initialize: function( blocksPerPage, blocksPath, options ) {
        this.blocksPerPage = blocksPerPage.toInt();
        this.blocksPath    = blocksPath;
        this.options       = options;
    },
    
    installPagesCountNavigator: function() {
    	this.pagesCountNavigatior = $( this.options.get( 'pagesCountBlockNavigationID' ) )
    	
    	var pagesCountLinks = this.pagesCountNavigatior.getChildren();
        pagesCountLinks.each( function( pagesCountLink ) {
            pagesCountLink.addEvent( 'click', function() {
            	this.blocksPerPage = pagesCountLink.get( 'id' ).replace( 'rowsPerVirtualPage', '' ).toInt();
            	
            	pagesCountLinks.each( function( pagesCountLinkTMP ) {
            		pagesCountLinkTMP.addClass( this.othersLinkCSSClass );
            		pagesCountLinkTMP.removeClass( this.currentLinkCSSClass );            		
            	}.bind( this ) );
            	pagesCountLink.removeClass( this.othersLinkCSSClass );
            	pagesCountLink.addClass( this.currentLinkCSSClass );
				
				this.buildNavigator();	
            }.bind( this ) );
        }.bind( this ) );
    },
    
    buildNavigator: function() {
    	this.navigationBlockID    = this.options.get( 'navigationBlockID' );
    	this.currentLinkCSSClass  = this.options.get( 'currentLinkCSSClass' );
    	this.othersLinkCSSClass   = this.options.get( 'othersLinkCSSClass' );    	
    	this.backLinkTitle        = this.options.get( 'backLinkTitle' );
    	this.forwardLinkTitle     = this.options.get( 'forwardLinkTitle' );
        
        $( this.navigationBlockID ).empty();
        this.calculatePagesCount();
        
        if ( this.pagesCount > 1 ) {
        	this.buildForwardLink();
			this.buildBackLink();        
        	this.buildPagesLinks();
        }

        this.currentPage = 1;
        this.showPage();
    },
    
    calculatePagesCount: function() {
        var vBlocksCount = $$( this.blocksPath ).length;
        var pagesCount   = ( vBlocksCount / this.blocksPerPage );
        this.pagesCount  = ( pagesCount > pagesCount.round() ) ? pagesCount.round() + 1 : pagesCount.round();    	
    },
    
    buildForwardLink: function() {
        this.forwardLink = new Element( 'span', {            
            'class' : 'next text'
        } );
        this.forwardLink.injectInside( this.navigationBlockID );
        this.forwardLink.set( 'html', this.forwardLinkTitle );
        this.forwardLink.addEvent('click', function( e ) {
        	if( this.currentPage == this.pagesCount ) {
        		return false;
        	}
        	
            this.currentPage++;
            this.showPage();
            this.scrollToTop( e );
        }.bind( this ) );	  	
    },    
    
    buildBackLink: function() {
        this.backLink = new Element( 'span', {            
            'class' : 'previous text'
        } );
        this.backLink.injectInside( this.navigationBlockID );
        this.backLink.set( 'html', this.backLinkTitle );
        this.backLink.addEvent('click', function( e ) {
        	if( this.currentPage == 1 ) {
        		return false;
        	}
			        	
            this.currentPage--;
            this.showPage();
            this.scrollToTop( e );
        }.bind( this ) );    	
    },
    
    buildPagesLinks: function() {
    	this.pagesLinksContainer = new Element( 'span', {            
            'class' : 'pages'
        } );
        this.pagesLinksContainer.injectInside( this.navigationBlockID );
        
        var mooVirtualPagesInstance = this;
        var pageNumber = 1;
        while ( pageNumber <= this.pagesCount ) {
            var pageLink = new Element( 'span', {
            	'rel':   pageNumber,
            	'id':    'virtualPageLink' + pageNumber
            } );

            pageLink.injectInside( this.pagesLinksContainer );
            pageLink.set( 'html', pageNumber );
            pageLink.addEvent( 'click', function( e ) {                    	
                mooVirtualPagesInstance.currentPage = this.get( 'id' ).replace( 'virtualPageLink', '' );
                mooVirtualPagesInstance.showPage();
                mooVirtualPagesInstance.scrollToTop( e );
            } );
            pageNumber++;
        }    	
    },
    
    showPage: function () { 
    	if( this.pagesCount > 1 ) {
	        this.pagesLinksContainer.getChildren().each( function( pageLink ) {
	            pageLink.addClass( this.othersLinkCSSClass );
	            pageLink.removeClass( this.currentLinkCSSClass );
	        }.bind( this ) );
	        var currnetPageLink = $( 'virtualPageLink' + this.currentPage );
	        currnetPageLink.addClass( this.currentLinkCSSClass );
	        currnetPageLink.removeClass( this.othersLinkCSSClass );
	
	        if( this.currentPage == 1 ) {
	        	this.backLink.addClass( 'disabled' );
				this.forwardLink.removeClass( 'disabled' );
	        }else if( this.currentPage == this.pagesCount ) {
	        	this.forwardLink.addClass( 'disabled' );
	        	this.backLink.removeClass( 'disabled' );        	
	        } else {
	            this.backLink.removeClass( 'disabled' );
	            this.forwardLink.removeClass( 'disabled' );
	        }
    	}


        this.currentPage    = this.currentPage.toInt();
        var minBlock = ( this.currentPage - 1 ) * this.blocksPerPage;
        var maxBlock = this.currentPage * this.blocksPerPage;

        var displayStyle = ( Browser.Engine.trident ) ? 'block' : 'table-row';
        $$( this.blocksPath ).each( function( vBlock, index ) {
            if( index >= minBlock && index < maxBlock ) {
                vBlock.setStyle( 'display', displayStyle );
            } else {
                vBlock.setStyle( 'display', 'none' );
            }
        } );
    },

    scrollToTop: function (e) {        
        window.scroll( 0, 385 );
        //e.stop();
    }
});