﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("Visiware.JS");

Visiware.JS.Pager = function(element) {
    /// <summary>
    /// A component that acts as a pager for some paged control (like a grid). 
    /// </summary>
    Visiware.JS.Pager.initializeBase(this, [element]);
}

Visiware.JS.Pager.prototype = {
    // Data Members
    m_totalPages: 1,
    m_maxPagesDisplay: 5,
    m_currentPageIndex: 0,
    m_displayFirstLast: false,
    m_isInitialized: false,
    m_pagerNumbers: null,
    m_cssClass: '',
    m_operatorFolder: '',

    get_cssClass: function() { return this.m_cssClass; },
    set_cssClass: function(value) {
        if (value && value !== this.m_cssClass) {
            this.m_cssClass = value;
            this.raisePropertyChanged('cssClass');

            if (this.m_isInitialized && !this.get_isUpdating()) {
                this._render();
            }
        }
    },

    // Properties
    get_totalPages: function() { return this.m_totalPages; },
    set_totalPages: function(value) {
        if (value && value != this.m_totalPages) {
            this.m_totalPages = value;
            this._preparePages();
            this.raisePropertyChanged('totalPages');

            if (this.m_isInitialized && !this.get_isUpdating()) {
                this._render();
            }
        }
    },

    get_operatorFolder: function() { return this.m_operatorFolder; },
    set_operatorFolder: function(value) {
        if (value && value != this.m_operatorFolder) {
            this.m_operatorFolder = value;
            this._preparePages();
            this.raisePropertyChanged('operatorFolder');
        }

        if (this.m_isInitialized && !this.get_isUpdating()) {
            this._render();
        }
    },

    get_maxPagesDisplay: function() { return this.m_maxPagesDisplay; },
    set_maxPagesDisplay: function(value) {
        if (value && value != this.m_maxPagesDisplay) {
            this.m_maxPagesDisplay = value;
            this._preparePages();
            this.raisePropertyChanged('maxPagesDisplay');
        }

        if (this.m_isInitialized && !this.get_isUpdating()) {
            this._render();
        }
    },

    get_currentPageIndex: function() { return this.m_currentPageIndex; },
    set_currentPageIndex: function(value) {
        if (value != null && value != this.m_currentPageIndex) {

            // Check that the index is in bounds
            if (value >= 0 && value < this.m_totalPages) {
                this.m_currentPageIndex = value;
                this._preparePages();
                this.raisePropertyChanged('currentPageIndex');

                var handler = this.get_events().getHandler('pageIndexChanged');
                if (handler) {
                    handler(this, value);
                }

                if (this.m_isInitialized && !this.get_isUpdating()) {
                    this._render();
                }
            }
        }
    },

    get_displayFirstAndLast: function() { return this.m_displayFirstLast; },
    set_displayFirstAndLast: function(value) {
        if (value && value != this.m_displayFirstLast) {
            this.m_displayFirstLast = value;
            this.raisePropertyChanged('displayFirstAndLast');
        }
    },

    // Events
    add_render: function(handler) {
        /// <value>Bind and unbind to the render event.</value>
        this.get_events().addHandler('render', handler);
    },
    remove_render: function(handler) {
        this.get_events().removeHandler('render', handler);
    },

    add_prerender: function(handler) {
        /// <value> Bind and unbind to the prerender event.</value>
        this.get_events().addHandler('prerender', handler);
    },
    remove_prerender: function(handler) {
        this.get_events().removeHandler('prerender', handler);
    },

    add_error: function(handler) {
        /// <value>Bind and unbind to the error event.</value>
        this.get_events().addHandler('error', handler);
    },
    remove_error: function(handler) {
        this.get_events().removeHandler('error', handler);
    },

    add_pageIndexChanged: function(handler) {
        /// <value>Bind and unbind to the on page index changed event.</value>
        this.get_events().addHandler('pageIndexChanged', handler);
    },
    remove_pageIndexChanged: function(handler) {
        this.get_events().removeHandler('pageIndexChanged', handler);
    },

    _preparePages: function() {
        this.m_pagerNumbers = new Array();

        if (this.m_maxPagesDisplay >= this.m_totalPages) {

            // Go through the pages and create their selected and unselected apearances
            for (var pageIndex = 0; pageIndex < this.m_totalPages; pageIndex++) {
                if (pageIndex > 0) {
                    this.m_pagerNumbers[pageIndex] = ' | ';
                }
                else {
                    this.m_pagerNumbers[pageIndex] = '';
                }

                if (pageIndex == this.m_currentPageIndex) {
                    this.m_pagerNumbers[pageIndex] += String.format(
                        '<b class="c5"> {0} </b>', pageIndex + 1);
                }
                else {
                    this.m_pagerNumbers[pageIndex] += String.format(
                        '<a href="javascript:Visiware.JS.Pager.UpdatePageIndex(&#39{0}&#39,{1});"> {2} </a>',
                        this.get_element().id, pageIndex, pageIndex + 1);
                }
            }
        }
        else {
            var pageOfPages;
            if (this.m_currentPageIndex == 0) {
                pageOfPages = 0;
            }
            else {
                pageOfPages = divide(this.m_currentPageIndex, this.m_maxPagesDisplay);
            }
            var numberOfPages = divide(this.m_totalPages, this.m_maxPagesDisplay);
            var startIndex = 0;
            var endIndex = (pageOfPages == numberOfPages ?
                                this.m_totalPages - this.m_maxPagesDisplay * numberOfPages : this.m_maxPagesDisplay);

            if (pageOfPages > 0) {
                startIndex = startIndex++;
                endIndex++
                this.m_pagerNumbers[0] = String.format(
                    '<a href="javascript:Visiware.JS.Pager.UpdatePageIndex(&#39{0}&#39,{1});"> ... </a>',
                    this.get_element().id, pageOfPages * this.m_maxPagesDisplay - 1);
            }

            if (pageOfPages < numberOfPages - 1) {
                this.m_pagerNumbers[endIndex] = String.format(
                    '<a href="javascript:Visiware.JS.Pager.UpdatePageIndex(&#39{0}&#39,{1});"> ... </a>',
                    this.get_element().id, (pageOfPages + 1) * this.m_maxPagesDisplay);
            }

            for (var pageIndex = startIndex; pageIndex < endIndex; pageIndex++) {
                var realIndex = pageIndex - startIndex + pageOfPages * this.m_maxPagesDisplay;


                if (realIndex < this.m_totalPages) {
                    if (realIndex > 0) {
                        this.m_pagerNumbers[pageIndex] = ' | ';
                    }
                    else {
                        this.m_pagerNumbers[pageIndex] = '';
                    }

                    if (realIndex == this.m_currentPageIndex) {
                        this.m_pagerNumbers[pageIndex] += String.format(
                        '<b class="c5"> {0} </b>', realIndex + 1);
                    }
                    else {
                        this.m_pagerNumbers[pageIndex] += String.format(
                        '<a href="javascript:Visiware.JS.Pager.UpdatePageIndex(&#39{0}&#39,{1});"> {2} </a>',
                        this.get_element().id, realIndex, realIndex + 1);
                    }
                }
            }
        }
    },

    // Render
    _render: function() {
        var control = this.get_element();
        if (control == null) {
            return;
        }

        // Raise the Pre-Render event
        var prerenderHandler = this.get_events().getHandler('prerender');
        if (prerenderHandler) {
            prerenderHandler(this, Sys.EventArgs.Empty);
        }

        // Create the table that will hold the pager
        var pagerTable = document.createElement('table');
        setAttribute('class', this.m_cssClass, pagerTable);
        setAttribute('align', 'center', pagerTable);

        // Create the pager's row in the table
        var pagerRow = document.createElement('tr');
        setAttribute('align', 'center', pagerRow);
        
        // Create the previous button cell
        if (this.m_totalPages > 1) {
            var previousCell = document.createElement('td');
            previousCell.innerHTML = String.format(
            '<a title="previous page" href="javascript:Visiware.JS.Pager.MovePageIndex(&#39{0}&#39, {1});">' +
                '<img src="' + this.m_operatorFolder + 'images/t.gif" alt="" class="prev" /></a>',
            control.id, -1);
            pagerRow.appendChild(previousCell);
        }

        // Create the cell for all of the page numbers
        var pagerNumbersCell = document.createElement('td');
        setAttribute('id', control.id + 'pagerNumberCell', pagerNumbersCell);
        var pagerNumbersInnerHTML = '';
        for (var pageIndex = 0; pageIndex < this.m_pagerNumbers.length; pageIndex++) {
            pagerNumbersInnerHTML += this.m_pagerNumbers[pageIndex];
        }
        pagerNumbersCell.innerHTML = 'Page ' + pagerNumbersInnerHTML;
        pagerRow.appendChild(pagerNumbersCell);

        // Create the next button cell
        if (this.m_totalPages > 1) {
            var nextCell = document.createElement('td');
            nextCell.innerHTML = String.format(
            '<a title="next page" href="javascript:Visiware.JS.Pager.MovePageIndex(&#39{0}&#39, {1});">' +
                '<img src="' + this.m_operatorFolder + 'images/t.gif" alt="" class="next" /></a>',
            control.id, 1);
            pagerRow.appendChild(nextCell);
        }
        pagerTable.appendChild(pagerRow);

        // Is this IE
        if (pagerTable.outerHTML) {
            control.innerHTML = pagerTable.outerHTML;
        }
        // The rest of the world
        else {
            if (control.firstChild) {
                control.removeChild(control.firstChild);
            }
            control.appendChild(pagerTable);
        }

        // Mark that this control has finished rendering
        this._rendered = true;

        // Raise the Post-Render event
        var renderHandler = this.get_events().getHandler('render');
        if (renderHandler) {
            renderHandler(this, Sys.EventArgs.Empty);
        }
    },

    initialize: function() {
        Visiware.JS.Pager.callBaseMethod(this, 'initialize');

        this._preparePages();
        //this._render();

        this.m_isInitialized = true;
    },
    dispose: function() {
        //Add custom dispose actions here
        var element = this.get_element();
        if (element) {
            $clearHandlers(element);
        }

        Visiware.JS.Pager.callBaseMethod(this, 'dispose');
    }
}

Visiware.JS.Pager.registerClass('Visiware.JS.Pager', Sys.UI.Control);

Visiware.JS.Pager.UpdatePageIndex = function(elementID, pageIndex) {
    var pagerControl = $find(elementID);
    if (pagerControl != null) {
        pagerControl.set_currentPageIndex(pageIndex);
    }
}

Visiware.JS.Pager.MovePageIndex = function(elementID, deltaPage) {
    var pagerControl = $find(elementID);
    if (pagerControl != null) {
        pagerControl.set_currentPageIndex(pagerControl.get_currentPageIndex() + deltaPage);
    }
}

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
