﻿//debugger;

/******************************* * Start of Listener Functions * *******************************/
/* create an event queue ***/
Listener = function(src) {
    this.src = src;
    this.callStack = [];
};
/*The Listener class uses encapsulation to associate a callStack with the object. 
The object's event handler is assigned to an anonymous function returned from Listener.fire*/
Listener.instances = {};
Listener.getInstance = function(src, sEvent, oScope) {
    var bucket = Listener.instances[sEvent]
         || (Listener.instances[sEvent] = []);

    for (var i = bucket.length - 1; i >= 0; i--)
        if (bucket[i].src == src)
        return bucket[i];

    // not found.
    var listener = new Listener(src);
    if (src[sEvent]) {
        listener.callStack[listener.callStack.length] = src[sEvent];
    }
    src[sEvent] = Listener.fire(listener, oScope || src);
    return bucket[bucket.length] = listener;
};
/*Creates and returns a function reference. 
Using a closure to assign each function in the Listener's callStack to the object*/
/*the function returned by Listener.fire is executed 
in the context of the Listener's src property (object itself), or if Scope is specified, 
in the context of the Scope parameter object*/
Listener.fire = function(listener, src) {
    return function(e) {
        for (var i = listener.callStack.length - 1; i >= 0; i--) {
            src.__scopeFix = listener.callStack[i];
            src.__scopeFix(e);
        }
        src.__scopeFix = null;
    };
};
Listener.add = function(src, sEvent, fp, oScope) {
    var callStack = Listener.getInstance(src, sEvent, oScope).callStack;
    callStack[callStack.length] = fp;
};

Listener.remove = function(src, sEvent, fp, oScope) {
    var idx = this.findForEvent(src[sEvent], fp, oScope);
    if (idx != -1) {
        var iLast = src[sEvent]._listeners.length - 1;
        src[sEvent]._listeners[idx] = src[sEvent]._listeners[iLast];
        src[sEvent]._listeners.length--;
    }
};

Listener.cleanUp = function() {
    for (var type in Listener.instances) {
        var bucket = Listener.instances[type];
        var i = bucket.length - 1;
        while (i >= 0)
            bucket[i--][type] = null;
    }
    if (window.CollectGarbage && i > 15)
        window.CollectGarbage();
};
Listener.add(window, "unload", Listener.cleanUp);

/******************************* * End of Listener Functions * *******************************/


/******************************* * Start of Pagination Functions * *******************************/

var CBQPagingClass = function(CBQOObj, AllRecords, ItemsPerPage, CurrPageNo) {
    this.CBQO = CBQOObj;
    //this.CBQOP = CBQOPagingObj;
    this.totalRecords = AllRecords;
    this.recordsPerPage = ItemsPerPage;
    this.currentPageNo = CurrPageNo;
    this.init = function() {
        //Style class definitions
        var pagingContainerCls = "ISDesign_CBQOverride";
        var pgFirstButtonCls = "CBQPgFirst";
        var pgPrevButtonCls = "CBQPgPrev";
        var pgNextButtonCls = "CBQPgNext";
        var pgLastButtonCls = "CBQPgLast";
        var pgMsgCls = "CBQPgMsg";

        //Paging container
        this.pagingContainer = this.getElementsByClassName(pagingContainerCls, "div", this.CBQO)[0];
        //Scrolling components
        this.firstRecordButton = ((this.getElementsByClassName(pgFirstButtonCls, "div", this.CBQO)[0]) == null) ? this.getElementsByClassName(pgFirstButtonCls + "Off", "div", this.CBQO)[0] : (this.getElementsByClassName(pgFirstButtonCls, "div", this.CBQO)[0]);
        this.prevRecordButton = ((this.getElementsByClassName(pgPrevButtonCls, "div", this.CBQO)[0]) == null) ? this.getElementsByClassName(pgPrevButtonCls + "Off", "div", this.CBQO)[0] : (this.getElementsByClassName(pgPrevButtonCls, "div", this.CBQO)[0]);
        this.nextRecordButton = ((this.getElementsByClassName(pgNextButtonCls, "div", this.CBQO)[0]) == null) ? this.getElementsByClassName(pgNextButtonCls + "Off", "div", this.CBQO)[0] : (this.getElementsByClassName(pgNextButtonCls, "div", this.CBQO)[0]);
        this.lastRecordButton = ((this.getElementsByClassName(pgLastButtonCls, "div", this.CBQO)[0]) == null) ? this.getElementsByClassName(pgLastButtonCls + "Off", "div", this.CBQO)[0] : (this.getElementsByClassName(pgLastButtonCls, "div", this.CBQO)[0]);
        this.messageText = ((this.getElementsByClassName(pgMsgCls, "div", this.CBQO)[0]) == null) ? this.getElementsByClassName(pgMsgCls + "Off", "div", this.CBQO)[0] : (this.getElementsByClassName(pgMsgCls, "div", this.CBQO)[0]);

        var objThis = this;


        this.RefreshScrolling(objThis);
    };


    this.RefreshScrolling = function(objThis) {
        //alert("control refresh");
        //Style class definitions
        var pagingContainerCls = "ISDesign_CBQOverride";
        var pgFirstButtonCls = "CBQPgFirst";
        var pgPrevButtonCls = "CBQPgPrev";
        var pgNextButtonCls = "CBQPgNext";
        var pgLastButtonCls = "CBQPgLast";
        var pgMsgCls = "CBQPgMsg";
    
        var params = getQueryStringParams();

        var totalPages = Math.ceil(this.totalRecords / this.recordsPerPage);

        if (totalPages == 1) {
            //Disable all styles
            /*
            var elements = this.getElementsByClassName(pagingContainerCls, "div", this.CBQO)
            for (var e = 0; e < elements.length; e++) {
                if (elements[e].className.indexOf("CBQPgMsg") != -1)
                    this.disableStatus(elements[e]);
            }
            */
            this.disableStatus(document.getElementById("FirstPg"));
            this.disableStatus(document.getElementById("PrevPg"));
            this.disableStatus(document.getElementById("NextPg"));
            this.disableStatus(document.getElementById("LastPg"));
            
            document.getElementById("msgRecordStatus").innerHTML = "Showing 1 to " + this.totalRecords + " of " + this.totalRecords;
        }
        else if (cbqPage == 1) {
            //Disable preivous styles
            this.disableStatus(document.getElementById("FirstPg"));
            this.disableStatus(document.getElementById("PrevPg"));

            Listener.add(this.nextRecordButton, "onclick", objThis.ShowNextPage, objThis);
            Listener.add(this.lastRecordButton, "onclick", objThis.ShowLastPage, objThis);

            document.getElementById("msgRecordStatus").innerHTML = "Showing 1 to " + (cbqPage * this.recordsPerPage) + " of " + this.totalRecords;
        }
        else if (cbqPage >= totalPages) {
            //Disable next+last styles
            this.disableStatus(document.getElementById("NextPg"));
            this.disableStatus(document.getElementById("LastPg"));

            Listener.add(this.firstRecordButton, "onclick", objThis.ShowFirstPage, objThis);
            Listener.add(this.prevRecordButton, "onclick", objThis.ShowPrevPage, objThis);

            document.getElementById("msgRecordStatus").innerHTML = "Showing " + ((cbqPage - 1) * this.recordsPerPage + 1) + " to " + this.totalRecords + " of " + this.totalRecords;
        }
        else {
            //Enable all

            Listener.add(this.firstRecordButton, "onclick", objThis.ShowFirstPage, objThis);
            Listener.add(this.prevRecordButton, "onclick", objThis.ShowPrevPage, objThis);
            Listener.add(this.nextRecordButton, "onclick", objThis.ShowNextPage, objThis);
            Listener.add(this.lastRecordButton, "onclick", objThis.ShowLastPage, objThis);

            document.getElementById("msgRecordStatus").innerHTML = "Showing " + ((cbqPage - 1) * this.recordsPerPage + 1) + " to " + (cbqPage * this.recordsPerPage) + " of " + this.totalRecords;
        }

    };

    this.disableStatus = function(elm) {
        elm.className = elm.className + "Off";
        elm.onclick = "javascript.event.returnValue = false";
    };

    this.ShowFirstPage = function() {

        var params = getQueryStringParams();
        cbqPage = 1;
        buildNewQueryString(params);
    };

    this.ShowPrevPage = function() {

        var params = getQueryStringParams();
        cbqPage--;
        if (cbqPage <= 0) cbqPage = 1;
        buildNewQueryString(params);
    };

    this.ShowNextPage = function() {

        var params = getQueryStringParams();
        if ((cbqPage * this.recordsPerPage) >= this.totalRecords)
            alert("last page");
        else {
            cbqPage++;
            buildNewQueryString(params);
        }

    };
    this.ShowLastPage = function() {

        var params = getQueryStringParams();
        cbqPage = Math.ceil(this.totalRecords / this.recordsPerPage);
        buildNewQueryString(params);
    };

    //this.getElementsByClassName=function(className, tag, elm)
    this.getElementsByClassName = function(className, tag, elm) {
        var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
        var tag = tag || "*";
        var elm = elm || document;
        var elements = (tag == "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag);
        var returnElements = [];
        var current;
        var length = elements.length;
        for (var i = 0; i < length; i++) {
            current = elements[i];
            if (testClass.test(current.className)) {
                returnElements.push(current);
            }
        }
        return returnElements;
    };

    this.init();
}

/******************************* * End of Pagination Functions * *******************************/


/******************************* * Start of CBQO Functions * *******************************/
var cbqPage = 1;
var otherQueryParams = new Array();

function cbqFilter() { }
cbqFilter.prototype.Type;
cbqFilter.prototype.Column;
cbqFilter.prototype.Value;
cbqFilter.prototype.Operation;
cbqFilter.prototype.ColumnType;


function getQueryStringParams() {
    var cbq = new Array();
    otherQueryParams = new Array();
    var qstring = window.location.href.split(/\?/)[1];
    if (qstring == null) return cbq;

    qstring = qstring.split(/\&/);
    for (var i = 0; i < qstring.length; i++) {
        var param = qstring[i].substring(0, 2);
        var index = (param == "sf" || param == "so") ? 0 : qstring[i].substring(2, 3);
        var value = qstring[i].split(/=/)[1];

        if (cbq[index] == null) cbq[index] = new cbqFilter();

        switch (param.toLowerCase()) {
            // Sort Params   
            case "ff":
                cbq[index].Type = "filter";
                cbq[index].Column = value;
                break;
            case "fv":
                cbq[index].Value = value;
                break;
            case "fo":
                cbq[index].Operation = value;
                break;
            case "ft":
                cbq[index].ColumnType = value;
                break;
            // Sort Params   
            case "sf":
                cbq[index].Type = "sort";
                cbq[index].Column = value;
                break;
            case "so":
                cbq[index].Value = value;
                break;
            case "pg":
                cbqPage = value;
                break;
            default:
                otherQueryParams[otherQueryParams.length] = qstring[i].split(/=/)[0] + "=" + value;
        }
    }
    return cbq;
}

function buildNewQueryString(params) {
    var href = getBaseLocation();
    var pstring = "";
    var filterIndex = 1;
    for (var i = 0; i < params.length; i++) {
        if (params[i] == null) continue;
        if (pstring.length == 0) pstring += "?";
        else pstring += "&";

        if (params[i].Type == "filter") {
            pstring += "ff" + filterIndex + "=" + params[i].Column;
            pstring += "&fv" + filterIndex + "=" + params[i].Value;
            pstring += "&fo" + filterIndex + "=" + params[i].Operation;
            pstring += "&ft" + filterIndex + "=" + params[i].ColumnType;
            filterIndex++;
        }
        else if (params[i].Type == "sort") {
            pstring += "sf1=" + params[i].Column;
            pstring += "&so1=" + params[i].Value;
        }
    }
    if (pstring == "") pstring += "?pg=" + cbqPage;
    else if (pstring == "?") pstring += "pg=" + cbqPage;
    else pstring += "&pg=" + cbqPage;
    for (var i = 0; i < otherQueryParams.length; i++) {
        pstring += "&" + otherQueryParams[i];
    }

    window.location = href + pstring;
}

function getBaseLocation() {
    return window.location.href.split(/\?/)[0];
}
/******************************* * End of CBQO Functions * *******************************/


/******************************* * Start of CBQO Toolpart Functions * *******************************/

function EnablePaging(chkPagingObj, editorpartObj) {
    var chkPgingObj = document.getElementById(editorpartObj + "_" + chkPagingObj)
    var editorPropObj = document.getElementById(editorpartObj)
    var propElems = editorPropObj.getElementsByTagName("input");

    if (chkPgingObj.checked == true) {

        for (var e = 0; e < propElems.length; e++) {
            if (propElems[e].id.indexOf("pageSize") >= 0) {
                //alert(propElems[e].name);
                //alert(chkPgingObj.checked);
                propElems[e].disabled = false;
            }
        }
    }
    else {
        for (var e = 0; e < propElems.length; e++) {
            if (propElems[e].id.indexOf("pageSize") >= 0) {
                propElems[e].disabled = true;
            }
        }

    }
}

/******************************* * End of CBQO Toolpart Functions * *******************************/
