﻿/// <reference name="{agingControl.js"/>
Type.registerNamespace('InstantASP.Common.UI.WebControls');

InstantASP.Common.UI.WebControls.AjaxPager = function(element) {

    InstantASP.Common.UI.WebControls.AjaxPager.initializeBase(this, [element]);
       
    this._element = element; 
    this._pageIndex = null;
    this._pageSize = null;
    this._totalRecords = null;
    this._totalPages = null;
    this._jumpPageDiv = null;
    this._enablePagesLabel = true;
    this._enablePrevNextButtons = true;
    this,_enableEndPages = false;
    this._linkClass = "pc_Text";
    this._linkSelectedClass = "pc_TextSelected";
    this._enableDelimiter = false;
    this._navigateURL = null;


    this._commonUI = null;
  
    this.__isInitialized = false;   
    
}

InstantASP.Common.UI.WebControls.AjaxPager.prototype = {

    // ------------------------------------ properties   

    // Properties
    get_element: function() {
        return this._element;
    },

    set_element: function(value) {
        this._element = value;
    },


    // page index
    get_pageIndex: function() {
        return this._pageIndex;
    },

    set_pageIndex: function(value) {
        this._pageIndex = value;
    },

    // page size
    get_pageSize: function() {
        return this._pageSize;
    },

    set_pageSize: function(value) {
        this._pageSize = value;
    },

    // total records
    get_totalRecords: function() {
        return this._totalRecords;
    },

    set_totalRecords: function(value) {
        this._totalRecords = value;
    },

    // jump to page menu layer
    get_jumpPageDiv: function() {
        return this._jumpPageDiv;
    },

    set_jumpPageDiv: function(value) {
        this._jumpPageDiv = value;
    },


    // display Pages X or X label?
    get_enablePagesLabel: function() {
        return this._enablePagesLabel;
    },

    set_enablePagesLabel: function(value) {
        this._enablePagesLabel = value;
    },


    // display Pages X or X label?
    get_enablePrevNextButtons: function() {
        return this._enablePrevNextButtons;
    },

    set_enablePrevNextButtons: function(value) {
        this._enablePrevNextButtons = value;
    },


    // display the last couple of pages?
    get_enableEndPages: function() {
        return this._enableEndPages;
    },

    set_enableEndPages: function(value) {
        this._enableEndPages = value;
    },

    // link css class
    get_linkClass: function() {
        return this._linkClass;
    },

    set_linkClass: function(value) {
        this._linkClass = value;
    },

    // link css class
    get_linkSelectedClass: function() {
        return this._linkSelectedClass;
    },

    set_linkSelectedClass: function(value) {
        this._linkSelectedClass = value;
    },

    // link css class
    get_enableDelimiter: function() {
        return this._enableDelimiter;
    },

    set_enableDelimiter: function(value) {
        this._enableDelimiter = value;
    },

    // link css class
    get_navigateURL: function() {
        return this._navigateURL;
    },

    set_navigateURL: function(value) {
        this._navigateURL = value;
    },

    // ------------------------------------ methods   

    renderAjaxPager: function() {

        this.clearElement();

        // add total pages to local var
        this._totalPages = this.calculateTotalPages();

        var element = this.get_element();
        var pageIndex = this.get_pageIndex();

        var pageLabel = iasp_PageInfo.replace("[0]", pageIndex)
        var pageLabel = pageLabel.replace("[1]", this._totalPages)

        // build page label
        if (this.get_enablePagesLabel()) {
            element.appendChild(this.buildInfoButton(pageLabel, this.get_linkClass()));
        }

        // first page button
        if (pageIndex > 1 && this.get_enablePrevNextButtons()) {
            element.appendChild(this.buildButton(1, "««", this.get_linkClass()));
        }

        // previous page button
        if (pageIndex > 2 && this.get_enablePrevNextButtons()) {
            element.appendChild(this.buildButton(this.get_pageIndex() - 1, "«", this.get_linkClass()));
        }

        // build number buttons
        this.buildPagingButtonts();

        // next page button
        if (pageIndex < this._totalPages - 1 && this.get_enablePrevNextButtons()) {
            element.appendChild(this.buildButton(Number(this.get_pageIndex()) + 1, "»", this.get_linkClass()));
        }

        // last page button
        if (pageIndex < this._totalPages && this.get_enablePrevNextButtons()) {
            element.appendChild(this.buildButton(this._totalPages, "»»", this.get_linkClass()));
        }

    },


    // render paging buttons
    buildPagingButtonts: function() {

        var totalPages = this._totalPages;
        var pageIndex = Number(this.get_pageIndex());

        // Pages 1, 2, 3, 4, 5 
        if (!this.get_enableEndPages()) {

            if (totalPages <= 5) {

                this.buildButtonRange(1, totalPages);


            } else {

                var firstPage = (pageIndex - 2);
                var lastPage = (pageIndex + 2);
                if (firstPage < 0) { firstPage = 1; }

                if (pageIndex == 1) {

                    this.buildButtonRange(1, 5)

                } else if (pageIndex == 2) {

                    this.buildButtonRange(1, 5)

                } else if (pageIndex < totalPages - 2) {

                    this.buildButtonRange(firstPage, lastPage)

                } else if (pageIndex == totalPages - 2) {

                    this.buildButtonRange(totalPages - 4, pageIndex + 2)

                } else if (pageIndex == totalPages - 1) {

                    this.buildButtonRange(totalPages - 4, pageIndex + 1)

                } else if (pageIndex == totalPages) {

                    this.buildButtonRange(totalPages - 4, pageIndex)
                }

            }

        } else {

            // Pages 1, 2, 3, ... 8, 9

            if (totalPages <= 5) {

                this.buildButtonRange(1, totalPages);

            } else {

                this.buildButtonRange(1, 3);
                this.buildTextButton(" ... ", this.get_linkClass());
                this.buildButtonRange(totalPages - 1, totalPages);

            }

        }

    },

    // render paging buttons
    buildButtonRange: function(intStart, intEnd) {

        var element = this.get_element();
        element.style.width = "100%"

        for (var i = intStart; i <= intEnd; i++) {
            //            
            var strCss = this.get_linkClass();
            if (this.get_pageIndex() == i) {
                strCss = this.get_linkSelectedClass();
            }

            element.appendChild(this.buildButton(i, i, strCss));

            if (this.get_enableDelimiter()) {

                if (i < intEnd) {

                    var delimiter = document.createElement("SPAN");
                    delimiter.className = this.get_linkClass();
                    delimiter.appendChild(document.createTextNode(","));

                    element.appendChild(delimiter);
                }

            }

        }

    },

    // render paging buttons
    buildButton: function(id, text, css) {

        var hyp = document.createElement("A");
        hyp.id = id;

        if (this.get_navigateURL() != null) {
            var strURL = this.get_navigateURL() + "?PageIndex=" + id;
            hyp.setAttribute('href', strURL);
        } else {
            hyp.setAttribute('href', "javascript:void(0)");
        }

     
        hyp.appendChild(document.createTextNode(text));
        if (css != null) { hyp.className = css; }
        return hyp;


    },

    buildInfoButton: function(text, css) {

        var span = document.createElement("SPAN");

        var hyp = document.createElement("A");
        hyp.id = "butPageInfo_" + this.get_element().id;
        hyp.setAttribute('href', "javascript:void(0)");
        hyp.appendChild(document.createTextNode(text));
        if (css != null) { hyp.className = css; }

        document.body.appendChild(hyp);

        var butid = hyp.id;
        var layerid = this.get_jumpPageDiv() ? this.get_jumpPageDiv().id : "";

        // add click event to show menu
        addEvent(hyp, 'click', function() {
            iasp_OpnMnu(butid, layerid, '160px', '');
        }
        );

        addEvent(hyp, 'mouseover', function() {
            iasp_OpnMnuMO(butid, layerid, '160px', '');
        }
        );

        if (this._commonUI != null) {
            return this._commonUI.buildSimpleMenuLink(hyp);
        } else {
            return hyp;
        }

    },

    buildTextButton: function(text, css) {

        // get container
        var element = this.get_element();

        // create text layer
        var span = document.createElement("SPAN");
        span.appendChild(document.createTextNode(text));

        // add span
        element.appendChild(span);

    },

    clearElement: function() {

        var element = this.get_element();

        var spans = element.getElementsByTagName("SPAN");

        // ensure we never remove the first row  
        for (i = spans.length - 1; i >= 0; i--) {
            element.removeChild(spans[i]);
        }

        var hyps = element.getElementsByTagName("A");

        // ensure we never remove the first row  
        for (i = hyps.length - 1; i >= 0; i--) {
            element.removeChild(hyps[i]);
        }

    },

    disablePager: function() {

        var element = this.get_element();
        element.disabled = true;

        var hyps = element.getElementsByTagName("A");

        // do fade 
        if (iasp_IE4 || iasp_IE5 || iasp_Opera || iasp_NS6) {
            for (i = hyps.length - 1; i >= 0; i--) {
                //hyps[i].style.filter = "alpha(opacity=50); -moz-opacity: .50;";
                hyps[i].disabled = true;
            }
        }


    },

    enablePager: function() {

        var element = this.get_element();
        element.disabled = false;

        var hyps = element.getElementsByTagName("A");

        // tweak opacity
        if (iasp_IE4 || iasp_IE5 || iasp_Opera || iasp_NS6) {
            for (i = hyps.length - 1; i >= 0; i--) {
                hyps[i].style.filter = "";
                hyps[i].disabled = false;
            }
        }

    },

    // get total pages
    calculateTotalPages: function() {

        var intReturn = 0;

        if (this._totalRecords > 0) {
            intReturn = Math.ceil(this._totalRecords / this._pageSize)
        }

        return intReturn;

    },

    // ------------------------------------ initialize   

    // Overriden Methods
    initialize: function() {

        InstantASP.Common.UI.WebControls.AjaxPager.callBaseMethod(this, 'initialize');

        this.__isInitialized = true;

        $addHandlers(this.get_element(), { 'click': this.onIndexChanged }, this);

        if (this._commonUI == null) {
            this._commonUI = new InstantASPCommonUI();
        }



        this.renderAjaxPager();

    },

    // ------------------------------------ events

    add_indexChanged: function(handler) {
        this.get_events().addHandler("indexChanged", handler);
    },

    remove_indexChanged: function(handler) {
        this.get_events().removeHandler("indexChanged", handler);
    },

    onIndexChanged: function(source, e) {

        if (!this._events) return;
        var handler = this._events.getHandler("indexChanged");

        if (handler) {

            var ele = source.target;
            if (ele != null && ele != 'undefined') {
                if (ele.disabled == false) {
                    if (ele.id.indexOf("but") == -1) {
                        handler(ele.id);
                    }
                }
            }

        }

    },

    // ------------------------------------ dispose

    dispose: function() {

        $clearHandlers(this.get_element());

        InstantASP.Common.UI.WebControls.AjaxPager.callBaseMethod(this, 'dispose');

    }


}

InstantASP.Common.UI.WebControls.AjaxPager.registerClass('InstantASP.Common.UI.WebControls.AjaxPager', Sys.UI.Control);

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();