﻿Cwo.RegisterNamespace("Cwo.Search");

// Params:
// CurrentPageNumber - the number of the page which the user is currently viewing
// ButtonRegionIDs - array of element IDs in which paging buttons will be rendered
// ClickCallBack - reference to the javascript callback which will be called on a click event, passing pagenumber as parameter
// maximumPages is the highest possible page count for this result set.

Cwo.Search.PagingController = function (currentPageNumber, buttonRegionIDs, clickCallBack, totalResultsRef, resultsPerPageRef, changeEventName) {
    var pagingController = this;

    this.RenderButtons = function (newPageNumber) {
        var pagingHTML = "",
            CurrentPage = isNaN(newPageNumber) ? currentPageNumber() : newPageNumber,
            TotalResults = totalResultsRef(),
            ResultsPerPage = resultsPerPageRef(),
            MaximumPages = Math.ceil(TotalResults / ResultsPerPage),
            i,
            pagingSummaryObj = $("#ResultsListPagingSummary"),
            pagesOf = 0,
            buttonNumber,
            numButtonRegions;

        // Always scroll to the top of the page
        scroll(0, 0);

        if (pagingSummaryObj !== null) {
            pagesOf = Math.ceil(TotalResults / ResultsPerPage);
            pagingSummaryObj.text("Page " + CurrentPage.toString() + " of " + pagesOf);
        }

        if (MaximumPages > 1) { // Only show paging if we only have more than 1 page of results
            if (CurrentPage > 1) { // Show 'Prev' link if we are not on the current page
                pagingHTML += pagingController.ButtonHtml(CurrentPage - 1, "Prev", CurrentPage);
            }

            for (i = -2; i < 3; i += 1) {
                buttonNumber = parseInt(i, 10) + parseInt(CurrentPage, 10);
                if ((buttonNumber > 0) && (buttonNumber <= MaximumPages)) {
                    pagingHTML += pagingController.ButtonHtml(buttonNumber, buttonNumber, CurrentPage);
                }
            }

            // Add extra page numbers for pages 1 and 2
            if ((parseInt(CurrentPage, 10) === 1) && (MaximumPages >= 4)) {
                pagingHTML += pagingController.ButtonHtml(parseInt(4, 10), parseInt(4, 10), CurrentPage);
            }
            if ((parseInt(CurrentPage, 10) < 3) && (MaximumPages >= 5)) {
                pagingHTML += pagingController.ButtonHtml(parseInt(5, 10), parseInt(5, 10), CurrentPage);
            }

            if (CurrentPage < MaximumPages) { // Show 'Next' link
                pagingHTML += pagingController.ButtonHtml(parseInt(1, 10) + parseInt(CurrentPage, 10), "Next", CurrentPage);
            }
        }

        numButtonRegions = buttonRegionIDs.length;

        for (i = 0; i < numButtonRegions; i += 1) {
            // Add the paging HTML to the designated elements.
            $("#" + buttonRegionIDs[i]).html(pagingHTML);

            // Register click events for these buttons.
            $("#" + buttonRegionIDs[i] + " .pagingbutton").bind("click", function (e) {
                var pageNum = $(this).attr("pagenumber");
                pagingController.RenderButtons(pageNum);
                clickCallBack(pageNum);
            });
        }
    };

    Cwo.Page.EventController.Subscribe(changeEventName, this.RenderButtons);

    // Gets the HTML for a paging button, given the page and information about the current state.
    this.ButtonHtml = function (pageNumber, label, currentPageNumber) {
        if (typeof (label) === "undefined") {
            label = pageNumber;
        }
        var html = " <li";
        if ((+pageNumber) === (+currentPageNumber)) {
            html += " class=\"Selected\"";
        }
        html += "><a class=\"pagingbutton\" pagenumber=\"" + pageNumber + "\" a href=\"#Page " + pageNumber + "\" title=\"" + label + "\">" + label + "</a></li>";
        return html;
    };
};
