﻿Type.registerNamespace( 'ControlTests' );

/// <summary>
/// ThreadView constructor.
/// </summary>

ControlTests.ThreadView = function( element ) {
    
    ControlTests.ThreadView.initializeBase( this, [element] );
    
    this._articleHeaders = new Array();
    this._loadQueue = new Array();
    this._articleHeaderIDs = null;
    this._articleHeaderIDsParsed = false;
    this._pageRequestManager = null;
    this._postbackElement = null;
    this._request = false;
    this._currentlyLoadingArticleHeader = null;
    this._currentlySelectedArticleHeader = null;
    this._loader = null;
    this._updatePanel = null;
    this._pageLoadedHandler = null;
    this._childArticlesRequestedHandler = null;
    this._articleHeaderExpandedHandler = null;
    this._articleHeaderClickedHandler = null;
    this._applicationLoadHandler = null;

}

/// <summary>
/// ThreadView prototype.
/// </summary>

ControlTests.ThreadView.prototype = {

    /// <summary>
    /// Initializes this object. Subscribes to the initializeRequest and 
    /// pageLoaded events of the PageRequestManager. Also listens for the
    /// application load event.
    /// </summary>

    initialize : function() {
    
        ControlTests.ThreadView.callBaseMethod( this, 'initialize' );

        this._pageLoadedHandler = Function.createDelegate( this, this._pageLoaded )
        this._childArticlesRequestedHandler = Function.createDelegate( this, this._childArticlesRequested );
        this._articleHeaderExpandedHandler = Function.createDelegate( this, this._articleHeaderExpanded );
        this._articleHeaderClickedHandler = Function.createDelegate( this, this._articleHeaderClicked );
        this._applicationLoadHandler = Function.createDelegate( this, this._applicationLoaded );

        this._pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
                    
        if ( this._pageRequestManager ) {
            this._pageRequestManager.add_pageLoaded( this._pageLoadedHandler );
        }

        Sys.Application.add_load( this._applicationLoadHandler );
        
    },
    
    /// <summary>
    /// Handles the application load event. Parses the article header IDs 
    /// and subscribes to the childArticlesRequested and articleHeaderExpanded
    /// events for each.
    /// </summary>
    
    _applicationLoaded : function() {
    
        if ( this._articleHeaderIDs && !this._articleHeaderIDsParsed ) {

            var idSplit = this._articleHeaderIDs.split( '|' );
            for ( i=0; i < idSplit.length; i++ ) {
            
                headerObj = $find( idSplit[ i ] ); 
                Array.add( this._articleHeaders, headerObj );
                
                headerObj.add_childArticlesRequested( this._childArticlesRequestedHandler );
                headerObj.add_articleHeaderExpanded( this._articleHeaderExpandedHandler );
                headerObj.add_articleHeaderClicked( this._articleHeaderClickedHandler );
                
            }
            
            this._articleHeaderIDsParsed = true;
                
        }
    
    },
        
    /// <summary>
    /// Handles the pageLoaded event raised by the PageRequestManager.
    /// </summary>
    /// <param name="sender">The PageRequestManager object that raised this 
    /// event.</param>
    /// <param name="args">An EventArgs object containing event data.</param>
    
    _pageLoaded : function ( sender, args ) {

        var updatedPanels = args.get_panelsUpdated();

        for ( i = 0; i < updatedPanels.length; i++ ) {

            if ( this._currentlyLoadingArticleHeader && updatedPanels[ i ].id == this._currentlyLoadingArticleHeader.get_updatePanel().id ) {
                this._currentlyLoadingArticleHeader = null;
            } else if ( this._updatePanel && updatedPanels[ i ].id == this._updatePanel.id ) {
                this._loader.fadeOut();
            }

        }
            
    },
    
    /// <summary>
    /// Attaches the provided handler to the threadsLoaded event.
    /// </summary>
    /// <param name="handler">The handler that is to be attached to the event.</param>

    add_threadsLoaded : function ( handler ) {
        this.get_events().addHandler( 'threadsLoaded', handler );
    },
    
    /// <summary>
    /// Detaches the provided handler from the threadsLoaded event.
    /// </summary>
    /// <param name="handler">The handler that is to be detached from the 
    /// event.</param>

    remove_threadsLoaded : function ( handler ) {
        this.get_events().removeHandler( 'threadsLoaded', handler );
    },

    /// <summary>
    /// Raises the threadsLoaded event.
    /// </summary>
    /// <param name="eventArgs">An EventArgs object containing event data.</param>

    raiseThreadsLoaded : function( eventArgs ) {

        var handler = this.get_events().getHandler( 'threadsLoaded' );
        
        if ( handler ) {
            handler( this, eventArgs );
        }
    
    },
    
    /// <summary>
    /// Prepares the control for loading new articles.
    /// </summary>
    /// <param name="func">The function that is to be evaluated once the 
    /// control is ready.</param>
    
    loadArticles : function( func ) {
        
        if ( func ) {

            if ( this._loader ) {
                this._loader.fadeIn( func );            
            } else {
                eval( func );
            }

        }
    
    },
    
    /// <summary>
    /// Gets the concatenated string of article header IDs.
    /// </summary>
    
    get_articleHeaderIDs : function() {
        return this._articleHeaderIDs;
    },
    
    /// <summary>
    /// Sets the concatenated string of article header IDs.
    /// </summary>
    /// <param name="value">The article header IDs.</param>
    
    set_articleHeaderIDs : function( value ) {
    
        if ( this._articleHeaderIDs !== value ) {
        
            this._articleHeaderIDs = value;
            this.raisePropertyChanged( 'articleHeaderIDs' );
                        
        }
    
    },

    /// <summary>
    /// Gets the loader component.
    /// </summary>
    
    get_loader : function() {
        return this._loader;
    },
    
    /// <summary>
    /// Sets the loader component.
    /// </summary>
    /// <param name="value">The loader panel.</param>
    
    set_loader : function( value ) {
    
        if ( this._loader !== value ) {
        
            this._loader = value;
            //this._loader.get_element().style.width = this.get_element().offsetWidth + 'px';
            this.raisePropertyChanged( 'loader' );
                        
        }
    
    },

    /// <summary>
    /// Gets the update panel element.
    /// </summary>
    
    get_updatePanel : function() {
        return this._updatePanel;
    },
    
    /// <summary>
    /// Sets the update panel element.
    /// </summary>
    /// <param name="value">The update panel.</param>
    
    set_updatePanel : function( value ) {
    
        if ( this._updatePanel !== value ) {
        
            this._updatePanel = value;
            this.raisePropertyChanged( 'updatePanel' );
                        
        }
    
    },

    /// <summary>
    /// Gets the currently selected article header.
    /// </summary>

    get_currentlySelectedArticleHeader : function() {
        return this._currentlySelectedArticleHeader;
    },
    
    /// <summary>
    /// Sets the currently selected article header.
    /// </summary>
    /// <param name="value">The new selected article header.</param>

    set_currentlySelectedArticleHeader : function( value ) {

        if ( this._currentlySelectedArticleHeader !== value ) {
        
            if ( this._currentlySelectedArticleHeader ) {
                this._currentlySelectedArticleHeader.deselect();
            }
        
            this._currentlySelectedArticleHeader = value;
            this.raisePropertyChanged( 'currentlySelectedArticleHeader' );
                        
        }
    
    },

    /// <summary>
    /// Handles the articleHeaderClicked event raised by the article headers 
    /// when they are clicked. Deselects the previously selected article 
    /// header.
    /// </summary>
    /// <param name="sender">The ArticleHeader object that raised this 
    /// event.</param>
    /// <param name="args">An EventArgs object containing event data.</param>

    _articleHeaderClicked : function( sender, eventArgs ) {
                        
        if ( this._currentlySelectedArticleHeader && sender != this._currentlySelectedArticleHeader ) {
            this._currentlySelectedArticleHeader.deselect();
        }
        
        if ( this._currentlyLoadingArticleHeader ) {
            
            this._currentlyLoadingArticleHeader.cancelExpansion();
            this._currentlyLoadingArticleHeader = null;
            
        }

        while ( this._loadQueue.length > 0 ) {
            Array.dequeue( this._loadQueue ).cancelExpansion();
        }
        
        this._currentlySelectedArticleHeader = sender;
        
    },
    
    /// <summary>
    /// Handles the articleHeaderExpanded event raised by the article headers.
    /// Checks the load queue for pending child article requests and relays 
    /// the next request to the server.
    /// </summary>
    /// <param name="sender">The ArticleHeader object that raised this 
    /// event.</param>
    /// <param name="args">An EventArgs object containing event data.</param>

    _articleHeaderExpanded : function( sender, eventArgs ) {
                
        if ( this._loadQueue && this._loadQueue.length > 0 ) {
        
            this._currentlyLoadingArticleHeader = Array.dequeue( this._loadQueue );
            eval( this._currentlyLoadingArticleHeader.get_buttonClickPostbackFunction() );

        }
        
    },
    
    /// <summary>
    /// Handles the childArticlesRequested event raised by the article headers
    /// when child articles are requested from the server.
    /// </summary>
    /// <param name="sender">The ArticleHeader object that raised this 
    /// event.</param>
    /// <param name="args">An ChildArticlesRequestedEventArgs object containing
    /// event data.</param>

    _childArticlesRequested : function( sender, eventArgs ) {
       
        Array.add( this._loadQueue, sender );
        
        if ( !this._currentlyLoadingArticleHeader ) {
        
            this._currentlyLoadingArticleHeader = Array.dequeue( this._loadQueue );
            eval( this._currentlyLoadingArticleHeader.get_buttonClickPostbackFunction() );
            
        }
        
    },
    
    /// <summary>
    /// Release resources before the control is disposed.
    /// </summary>
    
    dispose : function() {

        if ( this._pageRequestManager && this._pageLoadedHandler ) {
            this._pageRequestManager.remove_pageLoaded( this._pageLoadedHandler );
        }

        if ( this._articleHeaders ) {
                
            for ( i = 0; i < this._articleHeaders.length; i++ ) {

                this._articleHeaders[ i ].remove_childArticlesRequested( this._childArticlesRequestedHandler );
                this._articleHeaders[ i ].remove_articleHeaderExpanded( this._articleHeaderExpandedHandler );
                this._articleHeaders[ i ].remove_articleHeaderClicked( this._articleHeaderClickedHandler );
            
            }
        
            //this._articleHeaders = null;
            
        }
        
//        if ( this._loadQueue ) {
//            
//        }
        
        if ( this._applicationLoadHandler ) {
            Sys.Application.remove_load( this._applicationLoadHandler );
        }
        
        ControlTests.ThreadView.callBaseMethod( this, 'dispose' );
        
    }
    
} // ControlTests.ThreadView.prototype

ControlTests.ThreadView.registerClass( 'ControlTests.ThreadView', Sys.UI.Control );

if ( typeof( Sys ) != 'undefined' ) Sys.Application.notifyScriptLoaded();

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();