var _synthsPerPage;
var _pageListSize;
var _totalResults;
var _xmlHttpCmd;
var _additionalParams;
var _currentPage;
var _lastPage;
var _checkHashInterval = 100; //milliseconds
var _pageOffset = 1;
var _synthPageLinks;
var _prevLink;
var _nextLink;

function InitTradeCard(synthsPerPage, pageListSize, totalResults, xmlHttpCmd, additionalParams)
{
    if (synthsPerPage == null || pageListSize == null || totalResults == null || totalResults == 0)
    {
        return;
    }
    _synthsPerPage = synthsPerPage;
    _pageListSize = pageListSize;
    _totalResults = totalResults;
    _xmlHttpCmd = xmlHttpCmd;
    _additionalParams = additionalParams;
    _currentPage = isNaN(parseInt(document.location.hash.slice(1))) ? 1 : parseInt(document.location.hash.slice(1));

    requestSynths(_currentPage);
    CreatePaginationControl();
    window.setInterval(CheckHash, _checkHashInterval);  
}

function CreatePaginationControl()
{
    _synthPageLinks = document.getElementById("synthPageLinks");
    _prevLink = document.getElementById("prevLink");
    _nextLink = document.getElementById("nextLink");    
    var numPages = Math.ceil(_totalResults / _synthsPerPage);
    var links = [];

    if (numPages > 1)
    {
        var pageLinksToCreate = Math.min(_pageListSize, numPages);
        for (var i = 0; i < pageLinksToCreate; i++)
        {
            links[i] = "<li style='display:inline'><a href='#";
            links[i] += [
                i + 1,
                "'>",
                i + 1,
                "</a>&nbsp;</li>"
            ].join('');
        }
        _synthPageLinks.innerHTML = ["<ul style='padding:0; margin:0; display:inline'>", links.join(''), "</ul>"].join('');
        _pageLinks = GetNonTextChildElements(_synthPageLinks.firstChild);
        SetPageLink(_currentPage);
    }
    else
    {
        _prevLink.innerHTML = "";
        _nextLink.innerHTML = "";
        links[0] = [
            "<li style='display:none'>",
            _currentPage,
            "&nbsp;</li>"
            ].join('');
    }
}

/// <summary>
/// Activate the current page link and deactivate the new page link.
/// </summary>
/// <param name="newPageNum">The page we are paginating to.</param>
function SetPageLink(newPageNum)
{
    // Create any new pages links before accessing them.
    while (newPageNum > _pageLinks.length)
    {
        _pageLinks[_pageLinks.length] = _synthPageLinks.firstChild.appendChild(createPageLink(_pageLinks.length + 1, "none"));
    }
    _pageLinks[_lastPage - 1].innerHTML = [
            "<a href='#",
            _lastPage,
            "'>",
            _lastPage,
            "</a>&nbsp;"
        ].join('');

    if (newPageNum == 1)
    {
        _prevLink.innerHTML = "&lt;Previous&nbsp;";
    }
    else
    {
        _prevLink.innerHTML = [
            "<a href='#",
            newPageNum - 1,
            "'>&lt;Previous&nbsp;</a>"
        ].join('');
    }

    _pageLinks[newPageNum - 1].innerHTML = [
            newPageNum,
            "&nbsp;"
        ].join('');

    if (newPageNum == Math.ceil(_totalResults / _synthsPerPage))
    {
        _nextLink.innerHTML = "Next&gt";
    }
    else
    {
        _nextLink.innerHTML = [
            "<a href='#",
            newPageNum + 1,
            "'>Next&gt</a>"
        ].join('');
    }
    while (newPageNum >= _pageListSize + _pageOffset)
    {
        _pageLinks[_pageListSize + _pageOffset - 1].style.display = "inline";
        _pageLinks[_pageOffset - 1].style.display = "none";
        _pageOffset++;
    }
    var pageCount = Math.ceil(_totalResults / _synthsPerPage);
    while (newPageNum <= _pageOffset - 1 || _pageOffset + Math.min(_pageListSize, pageCount) - 1 > pageCount)
    {
        _pageOffset--;
        _pageLinks[_pageOffset - 1].style.display = "inline";
        _pageLinks[_pageOffset + _pageListSize - 1].style.display = "none";
    }
}

function createPageLink(page, display)
{
    var el = document.createElement('li');
    el.style.display = display;
    el.innerHTML = [
        "<a href='#",
        page,
        "'>",
        page,
        "</a>&nbsp;"
    ].join('');
    return el;
}

function CheckHash()
{
    var newPageNum = isNaN(parseInt(document.location.hash.slice(1))) ? 1 : parseInt(document.location.hash.slice(1));
    // Only go in here if the hash changed, otherwise we want this function to be fast as it run 10 time a second.
    if (newPageNum != _currentPage)
    {
        requestSynths(newPageNum);
        SetPageLink(_currentPage);        
    }
}

function requestSynths(page)
{
    var cid;
    
    if (page > Math.ceil(_totalResults / _synthsPerPage))
    {
        page = Math.ceil(_totalResults / _synthsPerPage);
        document.location.hash = page;
    }
    _lastPage = _currentPage;
    _currentPage = page;
    try
    {
        if (_collectionInfo.Id != null)
        {
            // This is used for get related collections
            cid = _collectionInfo.Id;
        }
    }
    catch (e)
    {
        //_collectionInfo does not exist
    }

    var textToSend = [
            "collectionId=",
            cid,
            "&cmd=",
            _xmlHttpCmd,
            "&text=",
            _synthsPerPage,
            ",",
            (page - 1) * _synthsPerPage
            ].join('');

    if (_additionalParams != null)
    {
        textToSend = [
            textToSend,
            ",",
            _additionalParams
            ].join('');
    }

    var xmlHttp = new LLO.Util.XmlHttp();
    xmlHttp.Open("POST", 'PhotosynthHandler.ashx', true);
    xmlHttp.SetContentHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlHttp.SetContentHeader("Content-Length", textToSend.length);
    xmlHttp.Send(textToSend,
        function(response)
        {
            if (response.status == 200 && response.responseText != "[]" && response.responseText != "")
            {
                var newSynths = Sys.Serialization.JavaScriptSerializer.deserialize(response.responseText);
                if (newSynths.Collections)
                {
                    newSynths = newSynths.Collections;
                }
                var synthCollection = document.getElementById("synthCollection");
                synthCollection.innerHTML = "";
                for (var i = 0; i < newSynths.length; i++)
                {
                    if (typeof (_modifyPermissions) != "undefined" && _modifyPermissions == true)
                    {
                        synthCollection.appendChild(createSynthBox(newSynths[i], true));
                    }
                    else
                    {
                        synthCollection.appendChild(createSynthBox(newSynths[i]));
                    }
                }
            }
        });
}

function createSynthBox(PhotosynthCollection, owner)
{
    var synthBox = document.createElement('div');
    synthBox.id = HtmlEncode(PhotosynthCollection.Id);
    synthBox.className = 'synthCard';
    PhotosynthCollection.UploadDate.dateTimeFormat = "%d";
    var deleteOption = '';
    var unlistedDiv = '';
    var globeImg = '';

    if (owner == true)
    {
        deleteOption = [
            '<div style="float:left"><a class="deleteButton" onclick="return OnDeleteClick(\'',
            HtmlEncode(PhotosynthCollection.Id),
            '\');"> </a></div>',
        ].join('');
    }
    
    if (PhotosynthCollection.GeoTagged)
    {
        globeImg = '<img class="tradeCardIcon" title="Geotagged" alt="Geotagged" src="./inc/images/globe_icon.png" /><span style="font-size:10px; padding-left:4px">GEOTAG</span>';
    }

    if (PhotosynthCollection.PrivacyLevel == 1)
    {
        unlistedDiv = '<div class="Unlisted">UNLISTED SYNTH</div>';
    }

    synthBox.innerHTML = [
        '<div class="thumbNailBox60x60"><a href="view.aspx?cid=',
        HtmlEncode(PhotosynthCollection.Id),
        '"><img class="thumbNail60x60" alt="',
        HtmlEncode(PhotosynthCollection.Name),
        '" src="',
        HtmlEncode(PhotosynthCollection.ThumbnailUrl),
        '" /></a>',
        unlistedDiv,
        '</div><div class="synthCardInfoBox"><div class="synthCardInfoBoxTop"><a class="font13" href="view.aspx?cid=',
        HtmlEncode(PhotosynthCollection.Id),
        '">',
        HtmlEncode(PhotosynthCollection.Name),
        '</a><br /><a class="author font11" href="userprofilepage.aspx?user=',
        HtmlEncode(PhotosynthCollection.OwnerFriendlyName),
        '">',
        HtmlEncode(PhotosynthCollection.OwnerFriendlyName),
        '</a> <span class="font11">',
        HtmlEncode(PhotosynthCollection.UploadDate._toFormattedString("d", Sys.CultureInfo.CurrentCulture)),
        '</span><div class="font11"><img style="margin-bottom:-4px" title="Favorites" alt="Favorites" src="inc/images/icon_fav_tradecard.png" /><span>',
        HtmlEncode(PhotosynthCollection.FavoriteCount.toString()),
        '</span><img style="margin: 0px 2px -2px 10px;" title="Comments" alt="Comments" src="./inc/images/ico_comment.png" /><span>',
        HtmlEncode(PhotosynthCollection.CommentCount.toString()),
        '</span>',
        globeImg,
        '</div></div>',
        deleteOption,
        '<div class="synthCardInfoBoxLeft font10"><span>',
        HtmlEncode(PhotosynthCollection.ImageCount.toString()),
        ' Photos - ',
        HtmlEncode(PhotosynthCollection.SynthinessScore.toString()),
        '% Synthy</span></div><div class="synthCardInfoBoxRight font10"><span>',
        HtmlEncode(PhotosynthCollection.Viewings.toString()),
        ' Views</span></div></div>'
    ].join('');
    return synthBox;
}

function OnDeleteClick(synthId)
{
    if (confirm('Are you sure that you want to delete this synth?') == true)
    {
        var textToSend = "collectionId=" + synthId + "&" + "cmd=delete";
        var xmlHttp = new LLO.Util.XmlHttp();

        xmlHttp.Open("POST", 'PhotosynthHandler.ashx', true);
        xmlHttp.SetContentHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlHttp.SetContentHeader("Content-Length", textToSend.length);
        xmlHttp.Send(textToSend,
            function(response)
            {
                _totalResults--;
                requestSynths(_currentPage);
                SetPageLink(_currentPage);                            
            });
        return true;
    }
    else
    {
        return false;
    }
}