//depot/main/private/engineering/Photosynth/website/inc/js/synthCollections.js#29 - edit change 21299 (text)
var _synthSets = [];
var _currentSet = null;
var _synthPageLinks = null;
var _currentPage = 1;
var _pageLinks = [];
var _prevLink = null;
var _nextLink = null;
var _pageListSize = 5;
var _pageOffset = 1;
var _synthsPerPage = 0;
var _synthBoxDisplay = "inline"
var _requestLock = false;
var _maxResultsPermitted = 100;
var _checkHashInterval = 100; //milliseconds

function LoadCollection(synthsPerPage, pageListSize, totalResults, xmlHttpCmd, additionalParams)
{
    if (synthsPerPage == null || pageListSize == null || totalResults == null)
    {
        return;
    }
    _pageOffset = 1;
    _currentPage = 1;
    _pageLinks = [];
    _synthsPerPage = synthsPerPage;
    _pageListSize = pageListSize;
    
    AddSynthSet(totalResults, xmlHttpCmd, additionalParams)
    _currentSet = xmlHttpCmd
    
    _synthPageLinks = document.getElementById("synthPageLinks");
    _prevLink = document.getElementById("prevLink");
    _nextLink = document.getElementById("nextLink");    
    
    var synthCount = 0;
    var child = document.getElementById("synthCollection").firstChild;
    
    while (child)
    {
        if (child.tagName == "DIV")
        {
            _synthSets[_currentSet].synthArray[synthCount] = child;            
            if (synthCount < _synthsPerPage)
            {
                _synthSets[_currentSet].synthArray[synthCount].style.display = _synthBoxDisplay;
            }
            else
            {
                _synthSets[_currentSet].synthArray[synthCount].style.display="none";
            }

            /// Hide the FavoriteCountDiv if the synth has not been favorited.
            var favoriteCount = $get('favoriteCount', child);
            if (favoriteCount.innerHTML == 0)
            {
                var favoriteCountDiv = $get('favoriteCountDiv', child);
                favoriteCountDiv.style.visibility = 'hidden';
            }
            
            synthCount++;
        }
        child = child.nextSibling;
    }
    
    var numPages = Math.min(Math.ceil(_synthSets[_currentSet].totalResults / _synthsPerPage), _pageListSize*2);
    var links = [];
    
    if (numPages > 1)
    {
        _prevLink.innerHTML = "&lt;Previous&nbsp;";    
        _nextLink.innerHTML = [
                "<a href='#",
                2,
                "' onclick='OnSynthPageClick(",
                2,
                ")'>",
                "Next&gt;",
                "</a>"
            ].join('');
        links[0] = [
            "<li style='display:inline'>",
            _currentPage,
            "&nbsp;</li>"
            ].join('');
    }
    else
    {
        _prevLink.innerHTML = "";
        _nextLink.innerHTML = "";
        links[0] = [
            "<li style='display:none'>",
            _currentPage,
            "&nbsp;</li>"
            ].join('');
    }
        
    var pageLinksToCreate = Math.min(_pageListSize, numPages);
    for (var i = 1; i < pageLinksToCreate; i++)
    {
        links[i] = "<li style='display:inline'><a href='#";
        links[i] += [
            i+1,
            "' onclick='OnSynthPageClick(",
            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);
    window.setInterval(CheckHash, _checkHashInterval);    
}

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)
    {
        // If the page does not exist or if the page requested is more than the max results the server
        // will permitted in one request, set it back to the current page, as not to waste cycles.
        if ((newPageNum - 1) * _synthsPerPage >= _synthSets[_currentSet].totalResults ||
            _synthsPerPage * newPageNum - _synthSets[_currentSet].synthArray.length > _maxResultsPermitted)
        {
            document.location.hash = '#' + _currentPage;
        }
        else
        {
            OnSynthPageClick(newPageNum);
        }
    }
}

function AddSynthSet(totalResults, xmlHttpCmd, additionalParams)
{
    var synthSet = { synthArray: [], totalResults: totalResults, xmlHttpCmd: xmlHttpCmd, additionalParams: additionalParams };
    _synthSets[xmlHttpCmd] = synthSet;
}

function SwitchSynthSet(xmlHttpCmd)
{
    if (_requestLock == true)
    {
        return;
    }
    SetDisplayRange(0, 0);
    _currentSet = xmlHttpCmd;    
    for (var i = 0; i < _pageListSize && i < _pageLinks.length; i++)
    {
        _pageLinks[_pageOffset+i-1].style.display="none";        
    }
    var numPages = Math.min(Math.ceil(_synthSets[_currentSet].totalResults / _synthsPerPage), _pageListSize);
    for (var i = 0; i < numPages; i++)
    {
        if (_pageLinks.length == i)
        {
            _pageLinks[_pageLinks.length] = _synthPageLinks.firstChild.appendChild(createPageLink(i + 1, "inline"));
        }
        else
        {
            _pageLinks[i].style.display="inline";
        }
    }
    _prevLink.innerHTML = "";
    _nextLink.innerHTML = "";
    _pageLinks[_currentPage - 1].innerHTML = [
            "<a href='#",
            _currentPage,
            "' onclick='OnSynthPageClick(",
            _currentPage,
            ")'>",
            _currentPage,
            "</a>&nbsp;"
        ].join('');
        
    _pageOffset = 1;
    _currentPage = 1;
    if (numPages > 0)
    {
        OnSynthPageClick(1);
    }
    if (numPages < 2)
    {
        _synthPageLinks.parentNode.style.visibility = "hidden";
    }
    else
    {
        _synthPageLinks.parentNode.style.visibility = "visible";    
    }
}

/// <summary>
/// Sets the range of synths that are displayed.
/// </summary>
/// <param name="start">Start index of the synths to display.</param>
/// <param name="end">End index of the synths to display.</param>
function SetDisplayRange(start, end)
{
    var startIndex = (_currentPage-1)*_synthsPerPage;
    var endIndex = Math.min(startIndex + _synthsPerPage, _synthSets[_currentSet].synthArray.length);        
    for (var i = startIndex; i < endIndex; i++)
    {
        _synthSets[_currentSet].synthArray[i].style.display="none";            
    }
    for (var i = start; i < end; i++)
    {
        _synthSets[_currentSet].synthArray[i].style.display=_synthBoxDisplay;
    }
}

/// <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[_currentPage-1].innerHTML = [
            "<a href='#",
            _currentPage,
            "' onclick='OnSynthPageClick(",
            _currentPage,
            ")'>",
            _currentPage,
            "</a>&nbsp;"
        ].join('');

    if (newPageNum == 1)
    {
        _prevLink.innerHTML = "&lt;Previous&nbsp;";
    }
    else
    {
        _prevLink.innerHTML = [
            "<a href='#",
            newPageNum - 1,
            "' onclick='OnSynthPageClick(",
            newPageNum - 1 ,
            ")'>&lt;Previous&nbsp;</a>"
        ].join('');
    }
    
    _pageLinks[newPageNum-1].innerHTML = [
            newPageNum,
            "&nbsp;"
        ].join('');
    
    if (newPageNum == Math.ceil(_synthSets[_currentSet].totalResults / _synthsPerPage))
    {
        _nextLink.innerHTML = "Next&gt";
    }
    else
    {
        _nextLink.innerHTML = [
            "<a href='#",
            newPageNum + 1,
            "' onclick='OnSynthPageClick(",
            newPageNum + 1 ,
            ")'>Next&gt</a>"
        ].join('');
    }
    while (newPageNum >= _pageListSize + _pageOffset)
    {
        _pageLinks[_pageListSize + _pageOffset - 1].style.display="inline";
        _pageLinks[_pageOffset-1].style.display="none";
        _pageOffset++;
    }
    while (newPageNum <= _pageOffset - 1)
    {
        _pageOffset--;
        _pageLinks[_pageOffset-1].style.display="inline";
        _pageLinks[_pageOffset + _pageListSize - 1].style.display="none";
    }
}

function OnSynthPageClick(newPageNum)
{
    if (_requestLock == true ||
    newPageNum == 0 ||
    (newPageNum - 1) * _synthsPerPage >= _synthSets[_currentSet].totalResults)
    {
        return;
    }
    
    // Check if we have the page requested,
    // then check if that page exists.
    if (_synthSets[_currentSet].synthArray.length < newPageNum *_synthsPerPage &&
        _synthSets[_currentSet].synthArray.length != _synthSets[_currentSet].totalResults)
    {
        requestSynths(_synthsPerPage * newPageNum - _synthSets[_currentSet].synthArray.length, _synthSets[_currentSet].synthArray.length, newPageNum);
    }
    else
    {
        MoveToPage(newPageNum);
    }
}

function MoveToPage(newPageNum)
{
    SetPageLink(newPageNum);
    
    var startIndex = (newPageNum-1)*_synthsPerPage;
    var endIndex = Math.min(startIndex + _synthsPerPage, _synthSets[_currentSet].synthArray.length);
    SetDisplayRange(startIndex, endIndex);
    
    _currentPage = newPageNum;
    document.location.hash = '#' + _currentPage;
}

function OnDeleteClick(synthId)
{
    if (_requestLock == false && 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 );
        _requestLock = true;        
        xmlHttp.Send(textToSend,
            function(response)
            {
                _requestLock = false;
                if (response.status == 200) 
                { 
                    // Delete the div
                    var deletedSynth = $get(synthId);
                    deletedSynth.parentNode.removeChild(deletedSynth);
                    
                    // Fix up the synthSets
                    _synthSets[_currentSet].totalResults -= 1;
                    var startIndex = (_currentPage-1)*_synthsPerPage;
                    var endIndex = Math.min(startIndex + _synthsPerPage, _synthSets[_currentSet].synthArray.length);   
                    for (var i = startIndex; i < endIndex; i++)
                    {
                        if (_synthSets[_currentSet].synthArray[i] == deletedSynth)
                        {
                            _synthSets[_currentSet].synthArray.splice(i, 1);
                            break;
                        }
                    }
                    
                    // Fill the hole in the page with the next synth
                    if (endIndex - 1 < _synthSets[_currentSet].synthArray.length)
                    {
                        // We have more synths in the dom, display the next one.
                        _synthSets[_currentSet].synthArray[endIndex - 1].style.display=_synthBoxDisplay;
                    }
                    else if(endIndex - 1 < _synthSets[_currentSet].totalResults)
                    {
                        // The server has more synths, request one.                        
                        requestSynths(1, endIndex - 1);
                    }
                    
                    // Fix up the pagination links
                    var oldLastPage = _pageLinks.length;
                    var newLastPage = Math.floor((_synthSets[_currentSet].totalResults-1)/_synthsPerPage) + 1;
                    if (_currentPage >= newLastPage)
                    {
                        _nextLink.innerHTML = "Next&gt";                            
                    }                    
                    if (oldLastPage > newLastPage)
                    {
                        // If we were on the page being removed move back one.
                        if (_currentPage == oldLastPage)
                        {
                            OnSynthPageClick(newLastPage);
                        }
                        
                        if (newLastPage >= _pageListSize)
                        {
                            _pageOffset--;
                            _pageLinks[_pageOffset-1].style.display="inline";
                        }
                        // That delete knotted out a page, remove last page for link array.
                        _pageLinks[_pageLinks.length - 1].parentNode.removeChild(_pageLinks[_pageLinks.length - 1]);
                        _pageLinks.splice(_pageLinks.length - 1, 1);
                    }
                }
            });
        return true;
    }
    else
    {
        return false;            
    }
}

function requestSynths(maxResults, offset, newPageNum)
{
    var cid;
    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=",
            _synthSets[_currentSet].xmlHttpCmd,
            "&text=",
            maxResults,
            ",",
            offset
            ].join('');

    if(_synthSets[_currentSet].additionalParams !=  null)
    {
        textToSend = [ 
            textToSend,
            ",",            
            _synthSets[_currentSet].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 );
    _requestLock = true;
    xmlHttp.Send(textToSend,
        function(response)
        {
            _requestLock = false;
            if (response.status == 200 && response.responseText != "[]" && response.responseText != "")
            {
                //alert(response.responseText);//TODO there is too much being returned, only get what is needed
                var newSynths = Sys.Serialization.JavaScriptSerializer.deserialize(response.responseText);
                if (newSynths.Collections)
                {
                    //Temp hack untill I refactor server.
                    newSynths = newSynths.Collections;
                }
                var synthCollection = document.getElementById("synthCollection");
                for (var i = 0; i < newSynths.length; i++)
                {
                    var synthCount = _synthSets[_currentSet].synthArray.length;

                    if (typeof (_modifyPermissions) != "undefined" && _modifyPermissions == true)
                    {
                        _synthSets[_currentSet].synthArray[synthCount] = synthCollection.appendChild(createSynthBox(newSynths[i], true));
                    }
                    else
                    {
                        _synthSets[_currentSet].synthArray[synthCount] = synthCollection.appendChild(createSynthBox(newSynths[i]));
                    }                        
                }
                if (newPageNum != undefined)
                {
                    MoveToPage(newPageNum);
                }
                else
                {
                    // Display the new synths
                    for (var i = offset; i < _synthSets[_currentSet].synthArray.length; i++)
                    {
                        _synthSets[_currentSet].synthArray[i].style.display=_synthBoxDisplay;
                    }
                }
            }
        });
}

function createSynthBox(PhotosynthCollection, owner)
{
    var synthBox = document.createElement('div');
    synthBox.id = HtmlEncode(PhotosynthCollection.Id);
    synthBox.className = 'synthCard';
    synthBox.style.display = "none";
    PhotosynthCollection.UploadDate.dateTimeFormat = "%d";
    var deleteOption = '';
    var favoriteCountDiv = '';
    var unlistedDiv = '';
    
    if (owner == true)
    {
        deleteOption = [
            '<div style="float:left"><a class="deleteButton" onclick="return OnDeleteClick(\'',
            HtmlEncode(PhotosynthCollection.Id),
            '\');"> </a></div>',
        ].join('');
    }

    if (PhotosynthCollection.FavoriteCount > 0)
    {
        favoriteCountDiv = [
            '<div id="FavoriteCountDiv" class="font11"><img style="margin-bottom:-4px" alt="Favorites" src="inc/images/icon_fav_tradecard.png" />',
            HtmlEncode(PhotosynthCollection.FavoriteCount.toString()),
            '</div>'
        ].join('');
    }

    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>',
        favoriteCountDiv,
        '</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 createPageLink(page, display)
{
    var el = document.createElement('li');
    el.style.display=display;
    el.innerHTML = [
        "<a href='#",
        page,
        "' onclick='OnSynthPageClick(",
        page,
        ")'>",
        page,
        "</a>&nbsp;"
    ].join('');
    return el;    
}

function selectTab(el)
{
    /// deselect the tabs
    var child = LLO.GetElementById("synthTabs").firstChild;
    while (child)
    {
        /// only deselect hrefs <A>
        if (child.tagName == "A")
        {
            child.className = "deselected";
        }
        child = child.nextSibling;
    }

    /// select the active tab
    el.className = "selected";
}