﻿//--------------------------------------------------------------------------------
function CliLibrarySectionBodyRenderer( libraryView, itemRowSelectionChanged )
{
    ///<summary>render a number of item rows and maintain structures for their
    ///manipulation</summary>
    
    this._libraryView = libraryView;
    
    this.SortSectionRequested = null; // fn( a, b )

    this._rowRenderer = new CliLibraryItemRowRenderer( libraryView );
    this._rowRenderer.RowSelectionChangedClickHandler = itemRowSelectionChanged; // fn( CliLibraryItemRowSelectionChangedEventArgs )
    this._rows = CliCreateMap();    // we keep track of the rows we create
}

CliLibrarySectionBodyRenderer.prototype =
{
    //--------------------------------------------------------------------------------
    Render : function( channelId, itemsIterator, selectedRowsMap, libraryCache )
    {
        var self = this;

        this.Clear();
        var rowsContainer = createElement( "<div class=\"rows-container\" />");
        
        var render = this._rowRenderer;
        
        var libraryItem;
        //var firstRow = true;
        
        while( itemsIterator.More )
        {
            try
            {
                //if( !firstRow )
                //    var innerFooter = document.createElement( "<div class=\"innerfooter\" />" );

                libraryItem = itemsIterator.Current;
                
                var row = render.Render( libraryItem, libraryCache );
                
                this._SelectRowIfPreviouslySelected( selectedRowsMap, libraryItem.MediaContentId,
                    row, render );
                
                //if( !firstRow )
                //{
                //    rowsContainer.appendChild( innerFooter );
                //}
                //else
                //{
                //    firstRow = false;
                //}
                rowsContainer.appendChild( row );
                
                this._rows.Add( libraryItem.MediaContentId, row );
            }
            catch( e )
            {
                
                CliDebug( "error rendering row: " + e.message );
            }
            
            itemsIterator.Next();
        }
        
        return rowsContainer;
    },
    
    //--------------------------------------------------------------------------------
    Clear : function()
    {
        // deselect any selected rows
        for( var i = 0; i < this._rows.Keys.length; i++ )
        {
            var row = this._rows[ this._rows.Keys[ i ] ];
            
            if( row != null )
                this._rowRenderer.DeselectRow( row );
        }
        
        this._rows = CliCreateMap();
    },
    
    //--------------------------------------------------------------------------------
    SelectAllItems : function( selected )
    {
        for( var i = 0; i < this._rows.Keys.length; i++ )
        {
            var row = this._rows[ this._rows.Keys[ i ] ];
            
            if( row != null )
                this._rowRenderer.SelectRow( row, selected );
        }
    },
    
    //--------------------------------------------------------------------------------
    RefreshItem : function( libraryItem, selectedRowsMap )
    {
        var render = this._rowRenderer;
        var rowId = render.GenerateRowId( libraryItem.MediaContentId );
        var rowDiv = document.getElementById( rowId );
        
        if( rowDiv != null )
        {
            var cache = this._libraryView.GetLibraryCache();
        
            var newDiv = render.Render( libraryItem, cache );
            
            rowDiv.replaceNode( newDiv );
            this._SelectRowIfPreviouslySelected( selectedRowsMap, libraryItem.MediaContentId,
                newDiv, render );
        }
    },
    
    //--------------------------------------------------------------------------------
    _SelectRowIfPreviouslySelected : function( selectedRowsMap, mediaContentId, row, render )
    {
        /// <summary>Looks at the map of selected rows, and if this indicates that the
        /// row for the specified item was previously selected, it is reselected.</summary>
        /// <param name="selectedRowsMap">Map that contains one entry for each items that
        /// is selected</param>
        
        if( selectedRowsMap != null )
        {
            var selectionEntry = selectedRowsMap[ mediaContentId ];
            
            if( selectionEntry != null && selectionEntry.Selected )
            {
                render.SelectRow( row, true );
            }
        }
    }
}//
