# Yahoo! UI Library

### paginator 2.6.0

Yahoo! UI Library > paginator > CurrentPageReport.js (source view)

Show Private Show Protected Show Deprecated

    (function () {

    var Paginator = YAHOO.widget.Paginator,
        l         = YAHOO.lang;

    /**
     * ui Component to generate the textual report of current pagination status.
     * E.g. "Now viewing page 1 of 13".
     *
     * @namespace YAHOO.widget.Paginator.ui
     * @class CurrentPageReport
     * @for YAHOO.widget.Paginator
     *
     * @constructor
     * @param p {Pagintor} Paginator instance to attach to
     */
    Paginator.ui.CurrentPageReport = function (p) {
        this.paginator = p;

        p.createEvent('pageReportClassChange');
        p.createEvent('pageReportTemplateChange');

        p.subscribe('recordOffsetChange', this.update,this,true);
        p.subscribe('rowsPerPageChange', this.update,this,true);
        p.subscribe('totalRecordsChange',this.update,this,true);
        p.subscribe('pageReportTemplateChange', this.update,this,true);
        p.subscribe('destroy',this.destroy,this,true);

        //TODO: make this work
        p.subscribe('pageReportClassChange', this.update,this,true);
    };

    /**
     * Decorates Paginator instances with new attributes. Called during
     * Paginator instantiation.
     * @method init
     * @param p {Paginator} Paginator instance to decorate
     * @static
     */
    Paginator.ui.CurrentPageReport.init = function (p) {

        /**
         * CSS class assigned to the span containing the info.
         * @attribute pageReportClass
         * @default 'yui-pg-current'
         */
        p.setAttributeConfig('pageReportClass', {
            value : 'yui-pg-current',
            validator : l.isString
        });

        /**
         * Used as innerHTML for the span.  Place holders in the form of {name}
         * will be replaced with the so named value from the key:value map
         * generated by the function held in the pageReportValueGenerator attribute.
         * @attribute pageReportTemplate
         * @default '({currentPage} of {totalPages})'
         * @see pageReportValueGenerator attribute
         */
        p.setAttributeConfig('pageReportTemplate', {
            value : '({currentPage} of {totalPages})',
            validator : l.isString
        });

        /**
         * Function to generate the value map used to populate the
         * pageReportTemplate.  The function is passed the Paginator instance as a
         * parameter.  The default function returns a map with the following keys:
         * <ul>
         * <li>currentPage</li>
         * <li>totalPages</li>
         * <li>startIndex</li>
         * <li>endIndex</li>
         * <li>startRecord</li>
         * <li>endRecord</li>
         * <li>totalRecords</li>
         * </ul>
         * @attribute pageReportValueGenarator
         */
        p.setAttributeConfig('pageReportValueGenerator', {
            value : function (paginator) {
                var curPage = paginator.getCurrentPage(),
                    records = paginator.getPageRecords();

                return {
                    'currentPage' : records ? curPage : 0,
                    'totalPages'  : paginator.getTotalPages(),
                    'startIndex'  : records ? records[0] : 0,
                    'endIndex'    : records ? records[1] : 0,
                    'startRecord' : records ? records[0] + 1 : 0,
                    'endRecord'   : records ? records[1] + 1 : 0,
                    'totalRecords': paginator.get('totalRecords')
                };
            },
            validator : l.isFunction
        });
    };

    /**
     * Replace place holders in a string with the named values found in an
     * object literal.
     * @static
     * @method sprintf
     * @param template {string} The content string containing place holders
     * @param values {object} The key:value pairs used to replace the place holders
     * @return {string}
     */
    Paginator.ui.CurrentPageReport.sprintf = function (template, values) {
        return template.replace(/\{([\w\s\-]+)\}/g, function (x,key) {
                return (key in values) ? values[key] : '';
            });
    };

    Paginator.ui.CurrentPageReport.prototype = {

        /**
         * Span node containing the formatted info
         * @property span
         * @type HTMLElement
         * @private
         */
        span : null,

        /**
         * Generate the span containing info formatted per the pageReportTemplate
         * attribute.
         * @method render
         * @param id_base {string} used to create unique ids for generated nodes
         * @return {HTMLElement}
         */
        render : function (id_base) {
            this.span = document.createElement('span');
            this.span.id        = id_base + '-page-report';
            this.span.className = this.paginator.get('pageReportClass');
            this.update();

            return this.span;
        },

        /**
         * Regenerate the content of the span if appropriate. Calls
         * CurrentPageReport.sprintf with the value of the pageReportTemplate
         * attribute and the value map returned from pageReportValueGenerator
         * function.
         * @method update
         * @param e {CustomEvent} The calling change event
         */
        update : function (e) {
            if (e && e.prevValue === e.newValue) {
                return;
            }

            this.span.innerHTML = Paginator.ui.CurrentPageReport.sprintf(
                this.paginator.get('pageReportTemplate'),
                this.paginator.get('pageReportValueGenerator')(this.paginator));
        },

        /**
         * Removes the link/span node and clears event listeners
         * removal.
         * @method destroy
         * @private
         */
        destroy : function () {
            this.span.parentNode.removeChild(this.span);
            this.span = null;
        }

    };

    })();

Copyright © 2008 Yahoo! Inc. All rights reserved.