﻿//--------------------------------------------------------------------------------
function CliLibrarySection( libraryView, containerDiv, channelId, channelName,
    libraryCache )
{
    this._libraryView = libraryView;
    this._containerDiv = containerDiv;
    this._channelId = channelId;
    this._channelName = channelName;
    this._libraryCache = libraryCache;
    
    this.SortColumnEventHandler = null; // fn( channelId, displayName, sortId, sortDir )
    this.ItemRowSelectionChanged = null;  // fn( CliLibraryItemRowSelectionChangedEventArgs )
    
    this._rowsBody;
    this._selectedItems;  // to track which items are selected so we can sort
    this._sectionEmpty = true;
}

CliLibrarySection.prototype =
{
    //--------------------------------------------------------------------------------
    RenderSection : function( sortId, sortOrder, selectedRowsMap ) // : div
    {
        ///<summary>Creates a div containing a section of library (item rows)
        ///for a given channel.</summary>
        ///<returns>A div containing the section, or null if no section created</returns>
        this.Clear();
        var self = this;

        this._selectedItems = CliCreateMap();
        
        var sortAsc = true;
        if( sortOrder != null )
            sortAsc = ( sortOrder == "asc" );
        
        if( sortId == null )
            sortId = "title";
            
        var itemsIterator = this._libraryView.GetLibraryItemIterator( this._channelId, sortId, sortAsc );
        
        if( !itemsIterator.More )
        {
            itemsIterator = null;
            return null; // nothing to render
        }
            
        this._sectionEmpty = false;
        var sectionChannelContainer = this._CreateSection( sortId, sortOrder, selectedRowsMap, itemsIterator );
        itemsIterator = null;
        return sectionChannelContainer;
    },
    
    _CreateSection : function( sortId, sortOrder, selectedRowsMap, itemsIterator )
    {
        var createElement = document.createElement;
        
        var sectionChannelContainer = createElement( "<div class=\"" + this._channelId.toLowerCase() + "\" channel-id=\"" + this._channelId + "\" channel-name=\"" + this._channelName + "\" />" );
        var sectionContainer = createElement( "<div class=\"row-section\" />" );
        sectionChannelContainer.appendChild( sectionContainer );

        this._AddTitleRow( sectionContainer, this._channelName );
        
        sectionContainer.appendChild( this._CreateSectionHeader( sortId, sortOrder ) );
        sectionContainer.appendChild( this._CreateSectionBody( selectedRowsMap, itemsIterator ) );
        
        return sectionChannelContainer;
    },
    
    _CreateSectionBody : function( selectedRowsMap, itemsIterator )
    {
        var self = this;
        var rowSelectionEventHandler = function( eventArgs ){ self._RowSelectionChangedHandler( eventArgs ); };
            
        var rowsRenderer = new CliLibrarySectionBodyRenderer( this._libraryView, rowSelectionEventHandler );
            
        this._rowsBody = rowsRenderer;
        var bodyDiv = rowsRenderer.Render( this._channelId, itemsIterator, selectedRowsMap, this._libraryCache );
        
        return bodyDiv;
    },
    
    _CreateSectionHeader : function( sortId, sortOrder )
    {
        var self = this;
        var headerSortEventHandler =
            function( evtSortId, evtSortDir )
            {
                self.SortColumnEventHandler( self._channelId, evtSortId, evtSortDir, self._selectedItems );
            }
            
        var header = new CliLibrarySectionHeaderRenderer( this._libraryView );
        header.SortColumnEventHandler = headerSortEventHandler;
        var headerDiv = header.RenderHeader( this._channelId, this._channelName, sortId, sortOrder );
        
        return headerDiv;
    },

    //--------------------------------------------------------------------------------
    IsEmpty : function()
    {
        /// <summary>Get a value indicating if the section is empty</summary>
        return this._sectionEmpty;
    },
    
    //--------------------------------------------------------------------------------
    SnapshotSelectedItems : function()
    {
        ///<summary>duplicate the selected status of the section into a map</summary>
        
        var snapshot = CliCreateMap();
        var selected = this._selectedItems;
        
        for( var i = 0; i < selected.Keys.length; i++ )
        {
            var candidate = selected[ selected.Keys[ i ] ];
            if( candidate.Selected )
            {
                snapshot.Add( selected.Keys[ i ], candidate.Clone() );
            }
        }
        
        return snapshot;
    },
    
    //--------------------------------------------------------------------------------
    Clear : function()
    {
        ///<summary>clear down any child elements</summary>
        
        if( this._rowsBody == null )
            return;

        this._rowsBody.Clear();
        this._rowsBody = null;
        this._selectedItems = null;
        this._sectionEmpty = true;
    },
    
    //--------------------------------------------------------------------------------
    SelectAllItems : function( selected )
    {
        if( this._rowsBody != null )
            this._rowsBody.SelectAllItems( selected );
    },

    //--------------------------------------------------------------------------------
    RefreshItem : function( libraryItem )
    {
        if( this._rowsBody != null )
            this._rowsBody.RefreshItem( libraryItem, this._selectedItems );
    },
    
    //--------------------------------------------------------------------------------
    _AddTitleRow : function( sectionContainer, displayName )
    {
        var titleDiv = createElement( "div" );
        titleDiv.className = "section-title renderedtitle";
        titleDiv.innerText = displayName;
        
        sectionContainer.appendChild( titleDiv );
    },    

    //--------------------------------------------------------------------------------
    _RowSelectionChangedHandler : function( eventArgs ) //CliLibraryItemRowSelectionChangedEventArgs
    {
        var bubble = true;
        
        var selectedEntry = this._selectedItems[ eventArgs.getMediaContentId() ];
        if( selectedEntry == null )
        {
            this._selectedItems.Add( eventArgs.getMediaContentId(),
                this._CreateSelectedRowMapEntry( eventArgs.getMediaContentId(), eventArgs.getState(), eventArgs.getSelected() ) );
        }
        else
        {
            if( selectedEntry.RenderedState == eventArgs.getState() &&
                selectedEntry.Selected == eventArgs.getSelected() )
            {
                bubble = false;
            }
            
            selectedEntry.Selected = eventArgs.getSelected();
        }

        if( bubble && this.ItemRowSelectionChanged != null )
            this.ItemRowSelectionChanged( eventArgs );
    },
        
    //--------------------------------------------------------------------------------
    _CreateSelectedRowMapEntry : function( mediaContentId, state, selected )
    {
        var x = new Object();
        x[ "MediaContentId" ] = mediaContentId;
        x[ "RenderedState" ]  = state;
        x[ "Selected" ]       = selected;
        
        x[ "Clone" ] = function()
        {
            var x = new Object();
            x[ "MediaContentId" ] = this.MediaContentId;
            x[ "RenderedState" ]  = this.RenderedState;
            x[ "Selected" ]       = this.Selected;
            
            return x;
        };
        
        return x;
    }
}//