﻿function AddServerPagerWithoutPagination(tableId, pagerGroupId, pageSize, totalElements, displayElements, refreshFunction, elementToBlockId, noResultsElement, resultsElement) {
    var table = document.getElementById(tableId);

    table.pagerGroupId = pagerGroupId;
    table.pageSize = pageSize;
    table.currentPage = 1;
    table.totalElements = totalElements;
    table.totalPages = Math.ceil(table.totalElements / table.pageSize);
    table.displayTotalsElementId = displayElements;
    table.refreshFunction = refreshFunction;
    table.elementToBlockId = elementToBlockId;
    table.noResultsElement = noResultsElement;
    table.resultsElement = resultsElement;
}


function AddServerPager(tableId, pagerGroupId, pageSize, totalElements, displayElements, refreshFunction, elementToBlockId, noResultsElement, resultsElement, divBlock, refreshPageFunction, refreshPageCount, getPageFunction, defaultPageNum) {
    var table = document.getElementById(tableId);
    
    table.pagerGroupId = pagerGroupId;
    table.pageSize = pageSize;
    table.currentPage = parseInt(defaultPageNum) || 1;
    table.totalElements = totalElements;
    table.totalPages = Math.ceil(table.totalElements / table.pageSize);
    table.displayTotalsElementId = displayElements;
    table.refreshFunction = refreshFunction;
    table.elementToBlockId = elementToBlockId;
    table.noResultsElement = noResultsElement;
    table.resultsElement = resultsElement;
    table.divBlock = divBlock;
    table.refreshPageFunction = refreshPageFunction;
    table.refreshPageCount = refreshPageCount;
    table.getPageFunction = getPageFunction;
    
    ServerPaginate(table);
}

function ServerPrevPage(tableId) {
    var table = document.getElementById(tableId);

    if (table.currentPage > 1) {
        table.currentPage--;
    }
    
    ServerPaginate(table, undefined, false);
}

function ServerNextPage(tableId) {

    var table = document.getElementById(tableId);

    if (table.currentPage < table.totalPages) {
        table.currentPage++;
    }
    
    ServerPaginate(table, undefined, false);
}

function ServerChangePageSize(tableId, newPageSize) {

    var table = document.getElementById(tableId);

    table.pageSize = newPageSize;
    table.totalPages = Math.ceil(table.totalElements / table.pageSize);

    table.currentPage = 1;

    ServerPaginate(table, undefined, false);
}

function ServerChangeDisplayedResults(tableId) {
    var table = document.getElementById(tableId);
    
    if (table.totalElements > 0) {
        
        var displayMessage = "Displaying ";

        var firstDisplayedElement = (table.currentPage * table.pageSize) - table.pageSize + 1;

        displayMessage += firstDisplayedElement;

        displayMessage += "-";

        var lastDisplayedElement = (table.currentPage * table.pageSize) < table.totalElements ? (table.currentPage * table.pageSize) : table.totalElements;

        displayMessage += lastDisplayedElement;

        displayMessage += " of ";

        displayMessage += formatNumber(table.totalElements);

        displayMessage += " Results";

        $("#" + table.displayTotalsElementId).html(displayMessage);    
    }

}

function ServerPaginate(table, newPage, updateCount) {

    // If the table parameter is not an object, it means it´s the table id. So gets the HtmlTable object using that id.
    if (typeof (table) != "object") {
        table = document.getElementById(table);
    }

    if (typeof (newPage) != "undefined") {
        table.currentPage = newPage;
    }

    // Blocks UI
    if (typeof (ToggleWorkingDisplay) != 'undefined') {
        ToggleWorkingDisplay(true, "Loading page " + table.currentPage, table.elementToBlockId, table.divBlock);
    }
    else {

        $('#' + table.elementToBlockId).block({ message: '<img src=' + BASE_URL + '"Content/images/LoadingImageSmall.gif"/>',
            css: { border: '1px solid #FFF' }
        });
    }

    if (typeof (table.refreshPageCount) == 'undefined' || table.refreshPageCount) {
        if (typeof (table.refreshPageFunction) == 'undefined')
            table.refreshPageFunction = RefreshPage;

        if (typeof (updateCount) == 'undefined' || updateCount) {

            var countData = GetJsonUserCriteria();

            //ExecuteJsonCall(getPageCountActionUrl, countData, table.refreshPageFunction);
            ExecuteAjaxCall(getPageCountActionUrl, countData, table.refreshPageFunction, null, "GET", "json");
        }
        else {

            table.refreshPageFunction(table.totalElements);
        }
    }
    else {
        table.getPageFunction();
    }
}

function RefreshPageData(table) {

    var pagers = $("[groupId='" + table.pagerGroupId + "']");

    /* Renders Html for the pager (page numbers + next/prev) */
    
    // Clears the current html
    pagers.html("");
    
    // If the results fit in one page, don´t show the page numbers or next/prev buttons
    if (table.totalPages > 1) {

        // If the user is not on the first page and there´s more that 5 pages, renders the "previous link"
        if (table.currentPage != 1 && table.totalPages > 5)
            pagers.append("<a href='#' class='next' onclick=\"ServerPrevPage('" + table.id + "')\">previous</a>");

        /* Establishes the first and last page to be showed */

        var lastShowedPage;
        var firstShowedPage;

        if (table.totalPages > 5) {
            lastShowedPage = table.currentPage > 5 ? table.currentPage : 5;
            firstShowedPage = table.currentPage > 5 ? table.currentPage - 4 : 1;
        }
        else {
            lastShowedPage = table.totalPages;
            firstShowedPage = 1;
        }

        /* Renders links for the page numbers */

        for (var i = firstShowedPage; i <= lastShowedPage; i++) {
            if (i == table.currentPage) {
                pagers.append("<span class='current' onclick=\"ServerPaginate('" + table.id + "'," + i + ")\">" + i + "</span>");
            } else {
                pagers.append("<a href='#' onclick=\"ServerPaginate('" + table.id + "'," + i + ")\">" + i + "</a>");
            }
        }

        // Renders the "next" button
        if (table.currentPage != table.totalPages && table.totalPages > 5)
            pagers.append("<a class='next' href='#' onclick=\"ServerNextPage('" + table.id + "')\">next</a>");
    }
    else {

        if (table.totalElements <= 10) {
            // Tries to get the page size selector element (assuming that is called pageSizeSelector) and if it exists hides it´s content
            var pageSizeSelectItem = document.getElementById("pageSizeSelector");

            if (pageSizeSelectItem)
                pageSizeSelectItem.parentNode.style.display = 'none';
        }
        
    }

    // If the displayTotalsElementId property is set. Shows the "Displaying 1-x results" message.
    if (table.displayTotalsElementId != "undefined")
        ServerChangeDisplayedResults(table.id);

    // Unblock UI
    if (typeof (ToggleWorkingDisplay) != 'undefined') {
        ToggleWorkingDisplay(false, "", table.elementToBlockId, table.divBlock);
    }
    else {
        $('#' + table.elementToBlockId).unblock();
    }

    if (typeof (table.noResultsElement) != 'undefined') {

        if (table.totalElements > 0) {
            $("#" + table.resultsElement).show();
            $("#" + table.noResultsElement).hide();
        }
        else {
            $("#" + table.resultsElement).hide();
            $("#" + table.noResultsElement).show();
        }
    }
}

function ToggleWorkingDisplay(showProgres, text, contentPanel, elementToDisplay, noResultsElement) {

    var idDisplayedElement = (typeof (elementToDisplay) != 'undefined') ? elementToDisplay : "divWorking";

    if (showProgres) {
        $("#" + contentPanel).hide();

        $("#" + idDisplayedElement).show();

        $("#" + idDisplayedElement + " span").html(text);

    }
    else {
        $("#" + contentPanel).show();
        $("#" + idDisplayedElement).hide();
    }
}


