﻿function SlideList(listID)
{
    this._listID = listID;
    this._list = $("#" + listID);
    this._mapID = this._list.attr("mapid");
    this._itemContainer = null;
    this._pageHeight = parseInt(this._list.css("height"));
    this._pageSize = parseInt(this._list.attr("pagesize"));
    this._itemHeight = this._pageHeight / this._pageSize;
    this._loadedPages = new Array();
    this._currentItem = null;
    this._currentPage = 0;
    this._totalPageCount = 0;
    this._detailsOpen = false;
    this._partial = null;
    this._params = {};

    SlideList.prototype.initialize = function (partial, params)
    {
        this._partial = partial;

        if (params)
        {
            this._params = params;
            this._currentPage = params["pageNo"];
        }

        this._itemContainer = $("#" + this._listID).find(".slideListItemContainer");
        this._totalPageCount = parseInt(this._list.attr("pages"));
        this._loadedPages[this._currentPage] = true;

        if (this._list.is(".destinationList"))
            this.setTitleText(this._currentPage);

        this.updatePager();
        this.bufferPages();

        if (this._list.attr("opendetails") && this._list.attr("opendetails") == "True")
        {
            this.gotoPage(this._currentPage);

            var itemNo = parseInt(this._list.attr("detailsItemNo"));
            var row = $("#" + listID).find("#page" + this._currentPage + " .listItemRow").get(itemNo - (10 * this._currentPage) - 1);
            destListSelect(listID, row, true, true);
            pauseTimer(listID);

            this.toggleDetails(itemNo, null);
        }
    }

    SlideList.prototype.updatePager = function(details)
    {
        var pagerDiv = this._list.next(".slideListPager");
        var onlyPrevNext = $(this._list).is(".memberList");
        var html = "";

        if (details)
        {
            html += "<a class=\"standardLink2\" onclick=\"slideCloseDetails('" + this._listID + "');\">Close</a>&nbsp&nbsp";
        }
        else if (this._totalPageCount > 1)
        {
            if (this._currentPage > 4 && !onlyPrevNext)
            {
                html += "<a class=\"standardLink2\" onclick=\"slideToPage('" + this._listID + "', 0);\">";
                html += "<img src='/Resources/Images/Buttons/arrow_dbl_left.png' alt='First' title='First' />";
                html += "</a>&nbsp&nbsp";
            }

            if (this._currentPage > 0)
            {
                html += "<a class=\"standardLink2\" onclick=\"slidePrevPage('" + this._listID + "');\">";
                html += "<img src='/Resources/Images/Buttons/arrow_left.png' alt='Previous' title='Previous' />";
                html += "</a>&nbsp&nbsp";
            }

            if (!onlyPrevNext)
            {
                var startVal = Math.max(this._currentPage - 3, 1);
                for (var i = startVal; i <= Math.min((startVal + 8), this._totalPageCount); i++)
                {
                    if (i != this._currentPage + 1)
                        html += "<a class=\"standardLink2\" onclick=\"slideToPage('" + this._listID + "', " + (i - 1) + ");\">" + i + "</a>&nbsp";
                    else
                        html += "<span style='font-size: 120%; color: #993333'>" + i + "</span>&nbsp";
                }
            }

            if (this._currentPage < (this._totalPageCount - 1))
            {
                html += "&nbsp<a class=\"standardLink2\" onclick=\"slideNextPage('" + this._listID + "');\">";
                html += "<img src='/Resources/Images/Buttons/arrow_right.png' alt='Next' title='Next' />";
                html += "</a>&nbsp";
            }

            if (this._currentPage < (this._totalPageCount - 5) && !onlyPrevNext)
            {
                html += "&nbsp<a class=\"standardLink2\" onclick=\"slideToPage('" + this._listID + "', " + (this._totalPageCount - 1) + ");\">";
                html += "<img src='/Resources/Images/Buttons/arrow_dbl_right.png' alt='Last' title='Last' />";
                html += "</a>";
            }
        }

        pagerDiv.html(html);
    }

    SlideList.prototype.bufferPages = function ()
    {
//        for (var i = 0; i < this._currentPage + 2; i++)
//        {
//            if (this._itemContainer.find("#page" + i).length == 0)
//                this._itemContainer.find("#page" + (i - 1)).after("<div id='page" + i + "' class='slideListPage'></div>");
//        }

        if ((this._currentPage + 1) < this._totalPageCount && this._loadedPages[this._currentPage + 1] == null)
            this.bufferPage(this._currentPage + 1);

        if (this._currentPage > 0 && this._loadedPages[this._currentPage - 1] == null)
            this.bufferPage(this._currentPage - 1);

        this.clearBuffer();
    }

    SlideList.prototype.bufferPage = function(pageNo)
    {
        this._params["detailsID"] = 0;
        this._params["pageNo"] = parseInt(pageNo);
        this._params["isSlideListPage"] = true;

        var list = this;
        var lastPage = parseInt(this._itemContainer.find(".slideListPage:last").attr("id").replace("page", ""));

        for (var i = lastPage + 1; i < pageNo + 2; i++)
        {
            if (this._itemContainer.find("#page" + i).length == 0)
                this._itemContainer.find("#page" + (i - 1)).after("<div id='page" + i + "' class='slideListPage'></div>");
        }

        list._itemContainer.find("#page" + pageNo).html("Loading...");

        $.ajax({
            type: "GET",
            cache: false,
            url: this._partial,
            data: this._params,
            success: function(result)
            {
                var page = list._itemContainer.find("#page" + pageNo);
                page.html(result);
                list._loadedPages[pageNo] = true;

                if (pageNo == list._currentPage)
                {
                    if (list._list.is(".destinationList"))
                    {
                        initListMap(list._listID, pageNo);
                        initDestList(list._listID, pageNo);
                    }
                    else if (list._list.is(".reviewList"))
                    {
                        reviewListSelect(list._listID, parseInt(list._itemContainer.find("#page" + pageNo + " .slideListItem:first").attr("detailsid")));
                    }
                    else if (list._list.is(".featureList"))
                    {
                        var item = list._itemContainer.find("#page" + pageNo + " .slideListItem:first");
                        scrollToReviews(item, item.attr("detailsid"));
                    }

                    preventBubbling(page);
                    roundCorners(page);
                }
            },
            error: function(result)
            {

            }
        });
    }

    SlideList.prototype.clearBuffer = function()
    {
        for (var i = 0; i < this._loadedPages.length; i++)
        {
            if (this._loadedPages[i] && (i < (this._currentPage - 2) || i > (this._currentPage + 2)))
            {
                this._itemContainer.find("#page" + i).html("");
                this._loadedPages[i] = null;
            }
        }
    }

    SlideList.prototype.getPrevLoadedPage = function(pageNo)
    {
        for (var i = pageNo; i > -1; i--)
        {
            if (this._loadedPages[i] != null)
                return this._itemContainer.find("#" + ((i + 1) * this._pageSize));
        }

        return this._itemContainer;
    }

    SlideList.prototype.toggleDetails = function (itemNo, detailsPanel)
    {
        if (!detailsPanel)
            detailsPanel = "detailsReview";

        var item = this._itemContainer.find("#item" + itemNo);
        var detailsParent = item.next(".slideListItemDetails");
        var details = detailsParent.find("#" + detailsPanel);

        if (!details.is(":hidden"))
            this.closeDetails();
        else
        {
            this.updatePager(true);

            detailsParent.children().hide();
            details.show();

            if (details.html() == '' || details.html() == 'Loading...')
                this.loadDetails(details, parseInt(item.attr("detailsid")), details.attr("detailstype"));

            centerOnMarker(this._mapID, parseInt(item.attr("detailsid")), 13, true);

            if (!this._detailsOpen)
            {
                var index = parseInt(item.attr("index"));
                var slideAmount = index * this._itemHeight;

                this._itemContainer.animate({ "top": "-=" + slideAmount + "px" }, "slow");
                detailsParent.slideDown("slow");
            }

            this._currentItem = item;
            this._detailsOpen = true;
        }

        actionButtonToggle($(item).find("#" + $(details).attr("btn")), !this._detailsOpen);
    }

    SlideList.prototype.loadDetails = function(details, detailsID, detailsType)
    {
        this._params["detailsID"] = detailsID;
        this._params["detailsType"] = detailsType;

        $.ajax({
            type: "GET",
            cache: false,
            url: this._partial,
            data: this._params,
            success: function(result)
            {
                details.html(result);
                preventBubbling(details);
                roundCorners(details);
            },
            error: function(err)
            {
                alertError('SlideList.prototype.loadDetails');
                details.html("");
            }
        });

        this._params["detailsID"] = null;
        this._params["detailsType"] = null;
    }

    SlideList.prototype.closeDetails = function ()
    {
        if (this._detailsOpen)
        {
            var item = this._currentItem;
            var index = parseInt(item.attr("index"));
            var slideAmount = index * this._itemHeight;

            this._itemContainer.animate({ "top": "+=" + slideAmount + "px" }, "slow");
            item.next(".slideListItemDetails").slideUp("slow");
            item.next(".slideListItemDetails").children().hide();
            resetDetailButtons(item.find(".actionButtons"));

            initListMap(this._listID, this._currentPage);
            var row = this._list.find("#page" + this._currentPage + " .listItemRowSelected").get(0);
            destListSelect(this._listID, row, true, true);

            this._currentItem = null;
            this._detailsOpen = false;
            this.updatePager(false);

            resumeTimer(this._listID);
        }
    }

    SlideList.prototype.isDetailsMode = function()
    {
        return this._detailsOpen;
    }

    SlideList.prototype.slideItemToTop = function(itemNo)
    {

    }

    SlideList.prototype.prevPage = function()
    {
        if (this._currentPage > 0)
            this.gotoPage(this._currentPage - 1);
    }

    SlideList.prototype.nextPage = function()
    {
        if (this._currentPage < this._totalPageCount - 1)
            this.gotoPage(this._currentPage + 1);
    }

    SlideList.prototype.gotoPage = function(pageNo)
    {
        if (!this._detailsOpen)
        {
            if (this._loadedPages[pageNo] == null)
                this.bufferPage(pageNo);

            var top = this._pageHeight * pageNo;

            this._itemContainer.animate({ "top": -top }, "slow");

            if (this._loadedPages[pageNo])
            {
                if (this._list.is(".destinationList"))
                {
                    this.setTitleText(pageNo);
                    initListMap(this._listID, pageNo);
                    initDestList(this._listID, pageNo);
                }
                else if (this._list.is(".reviewList"))
                {
                    reviewListSelect(this._listID, parseInt(this._itemContainer.find("#page" + pageNo + " .slideListItem:first").attr("detailsid")));
                }
                else if (this._list.is(".featureList"))
                {
                    var item = this._itemContainer.find("#page" + pageNo + " .slideListItem:first");
                    scrollToReviews(item, item.attr("detailsid"));
                }

                preventBubbling(this._itemContainer.find("#page" + pageNo));
                roundCorners(this._itemContainer.find("#page" + pageNo));
            }

            this._currentPage = pageNo;

            this.updatePager();
            this.bufferPages();
        }
    }

    SlideList.prototype.getCurrentPage = function()
    {
        return this._currentPage;
    }

    SlideList.prototype.setTitleText = function(pageNo)
    {
        var titleText = "";

        if (this._itemContainer.find("#page" + pageNo).length > 0)
            titleText = this._itemContainer.find("#page" + pageNo).attr("titletext");

        if (this._list.closest(".tabContent").find("#titleText").length > 0)
            this._list.closest(".tabContent").find("#titleText").html(titleText);
    }
}

var slideLists = {};

function getSlideList(listID, createList)
{
    if (!slideLists[listID] || createList)
        slideLists[listID] = new SlideList(listID);

    return slideLists[listID];
}

function initiateSlideList(listID, partial, params)
{
    var list = getSlideList(listID, true);
    list.initialize(partial, params);
}

function slidePrevPage(listID)
{
    var list = getSlideList(listID);
    list.prevPage();
}

function slideNextPage(listID)
{
    var list = getSlideList(listID);
    list.nextPage();
}

function slideToPage(listID, pageNo)
{
    var list = getSlideList(listID);
    list.gotoPage(pageNo);
}

function slideToggleDetails(listID, itemNo, detailsPanel)
{
    var list = getSlideList(listID);
    list.toggleDetails(itemNo, detailsPanel);
}

function slideCloseDetails(listID)
{
    var list = getSlideList(listID);
    list.closeDetails();
}

function getSlideListIsDetailsMode(listID)
{
    var list = getSlideList(listID);

    if (list)
        return list.isDetailsMode();
    else
        return false;
}

function getCurrentSlidePage(listID)
{
    var list = getSlideList(listID);

    if (list)
        return list.getCurrentPage();
    else
        return 0;
}
