/**
* module dependences
*/
if(typeof WBSJSBASE == 'undefined')
throw('WBSPAGER requires the WBSJSBASE JavaScript Class');

/**
* WBSPAGER Class
*/
var WBSPAGER = Class.create();
WBSPAGER.prototype = Object.extend(WBSPAGER.prototype, WBSJSBASE);
WBSPAGER.prototype = Object.extend(WBSPAGER.prototype, {
    initialize: function(options) {
        /* setting module's name */
        this.moduleName = 'WBSPAGER';

        /* event references */
        this.events = {
            click: this.onClick.bindAsEventListener(this)
        };

        /* default options */
        this.options = {
            classToDraw: 'wbspager',
            classContainer: 'wbspager_container',
            pagesPeerView: 10,
            goPageCallBack: null,
            disableOpacity: 0.5,
            currentPageClass: 'wbspager_current_page',
            noCurrentPageClass: 'wbspager_no_current_page',
            imgFirst: 'first.gif',
            imgFirstClass: 'wbspager_first',
            imgLast: 'last.gif',
            imgLastClass: 'wbspager_last',
            imgPrev: 'prev.gif',
            imgPrevClass: 'wbspager_prev',
            imgNext: 'next.gif',
            imgNextClass: 'wbspager_next',
            gotoLabel: 'ir a',
            nextLabel: 'siguiente',
            prevLavel: 'anterior',
            pageLabel: 'pagina'
        };

        this.setOptions(options);
    },

    makePager: function(){

        this.first = document.createElement('img');
        this.first.src = this.getBasePath() + this.options.imgFirst;
        Element.addClassName(this.first,this.options.imgFirstClass);

        this.prev  = document.createElement('img');
        this.prev.src = this.getBasePath() + this.options.imgPrev;
        Element.addClassName(this.prev,this.options.imgPrevClass);

        this.next  = document.createElement('img');
        this.next.src = this.getBasePath() + this.options.imgNext;
        Element.addClassName(this.next,this.options.imgNextClass);

        this.last  = document.createElement('img');
        this.last.src = this.getBasePath() + this.options.imgLast;
        Element.addClassName(this.last,this.options.imgLastClass);

        this.pages = new Array();
        for(i=0;i<this.options.pagesPeerView;i++)
        {
            this.pages.push(document.createElement('span'));
        }

        this.pager = document.createElement('div');
        Element.addClassName(this.pager,this.options.classContainer);

        this.pager.appendChild(this.first);
        this.pager.appendChild(this.prev);
        this.pages.each(function(page){
            this.pager.appendChild(page);
        }.bind(this));
        this.pager.appendChild(this.next);
        this.pager.appendChild(this.last);
    },

    maked: function(){
        if(!this.isMaked && $A(document.getElementsByClassName(this.options.classToDraw)).length)
        {
            this.addCSS();
            this.makePager()
            $A(document.getElementsByClassName(this.options.classToDraw)).first().appendChild(this.pager);
            this.hiddenPager();
            this.isMaked = true;
        }
        return (this.isMaked);
    },

    hiddenPager: function(){
        Try.these(Element.hide(this.pager));
    },

    showPager: function(oJson){
        if(typeof oJson != 'undefined' && oJson.pages > 1 && this.maked())
        {
            this.setPages(oJson);
            this.relabelPages(oJson);
            this.enableElements(oJson);
            Element.show(this.pager);
        }
        else
        {
            this.hiddenPager();
        }
    },

    setPages: function(oJson){
        this.currentPage	= parseInt(oJson.page);
        this.lastPage 		= parseInt(oJson.pages);
    },

    enableElements: function(oJson){
        if(oJson.page > 1)
        {
            this.setEnableElement(this.first);
            this.setEnableElement(this.prev);
        }
        else
        {
            this.setDisableElement(this.first);
            this.setDisableElement(this.prev);
        }

        if(oJson.page < oJson.pages)
        {
            this.setEnableElement(this.next);
            this.setEnableElement(this.last);
        }
        else
        {
            this.setDisableElement(this.next);
            this.setDisableElement(this.last);
        }

        this.pages.each(function(page){
            if(parseInt(oJson.page) == parseInt(this.pages.indexOf(page)+1))
            {
                if(Element.hasClassName(page,this.options.noCurrentPageClass))
                Element.removeClassName(page,this.options.noCurrentPageClass);

                if(!Element.hasClassName(page,this.options.currentPageClass))
                Element.addClassName(page,this.options.currentPageClass);
            }
            else
            {
                if(Element.hasClassName(page,this.options.currentPageClass))
                Element.removeClassName(page,this.options.currentPageClass);

                if(!Element.hasClassName(page,this.options.noCurrentPageClass))
                Element.addClassName(page,this.options.noCurrentPageClass);
            }


            if(parseInt(page.innerHTML) <= oJson.pages)
            {
                this.setEnableElement(page);
            }
            else
            {
                this.setDisableElement(page);
            }
        }.bind(this));
    },

    setEnableElement: function(ele){
        Element.setOpacity(ele,1);
        ele.style.cursor = 'pointer';
        ele.onclick = this.events.click;
        //Event.observe(ele, 'click', this.events.click, false);

        this.setEnableLabel(ele);
    },

    setDisableElement: function(ele){
        Element.setOpacity(ele,0.5);
        ele.style.cursor = 'default';
		ele.style.color = '#777777';
        ele.onclick = null;
        //Event.stopObserving(ele, 'click', this.events.click, false);
        this.setDisableLabel(ele);
    },

    setEnableLabel: function(ele){
        var msg = ' ';
        msg = this.options.gotoLabel+' '+ this.options.pageLabel;
        if(ele == this.prev) msg += ' '+ this.options.prevLavel +' ('+(this.currentPage-1)+')';
        if(ele == this.next) msg += ' '+ this.options.nextLabel +' ('+(this.currentPage+1)+')';
        if(ele == this.first) msg += ' 1';
        if(ele == this.last) msg += ' '+this.lastPage;
        this.pages.each(function(page){
            if(ele == page) msg += ' '+page.innerHTML;
        }.bind(this));

        ele.setAttribute('title',msg);
    },

    setDisableLabel: function(ele){
        ele.removeAttribute('title');
    },

    relabelPages: function(oJson){
        for(i=0;i<this.pages.length;i++)
        {
            this.pages[i].innerHTML = (parseInt(oJson.page/parseInt(this.options.pagesPeerView))*parseInt(this.options.pagesPeerView))+i+1;
        }
    },

    onClick: function(evt){

        var page2go = false;
        var ele = Event.element(evt);

        if (isNaN(this.currentPage)) this.currentPage = 1;
        if (isNaN(this.lastPage)) this.lastPage=this.currentPage;

        if(!page2go && ele == this.first) page2go = 1;
        if(!page2go && ele == this.next) page2go = this.currentPage+1;
        if(!page2go && ele == this.prev) page2go = this.currentPage-1;
        if(!page2go && ele == this.last) page2go = this.lastPage;

        if(!page2go)
        {
            var foundPage=this.pages.find(function(page){
                return(ele == page);
            });
            if(foundPage != null) page2go = parseInt(foundPage.innerHTML);
        }

        if(page2go)
        this.options.goPageCallBack(page2go);

        Event.stop(evt);
    }
});