// File: /include/js/messageArea.js
// Desc: VM_MessageArea class
// $Revision: 9$
// $Date: 4/26/2007 3:27:11 PM$
// $Author: Donnie Tognazzini$
// $NoKeywords$

/*
CW_MessageArea
Singleton object to manage status message area of widget

Supports timed dismissal of messages
The only unusual thing is that it supports some weird Uri-to-link expansion that
I don't believe is used. It would be good to redesign if there are plans to use it..

DOM/CSS:
    widgets/googleV2W.aspx
    include/css/voicemail.css
    #messageArea       status area div default syle is for alerts/errors
    .messageTypeStatus style changes for status-type messages ( currently a font-color change only )

Globals
    include/js/jquery-1.0.4.js
    $                  : basic jQuery object
        method         trigger

    shared/utils.js
    UTILS              : the static utility class
        method         adjustHeight (may be overrident in include/js/voicemail.js )
*/
function CW_MessageArea( )
{
    try
    {
        UTILS.inheritFromBase( this, 'CW_MessageArea', "#messageArea" );

        this.m_lastMessageType = null;
        this.currentTimeout    = null;
    }
    catch ( e )
    {
        EX_ASSERT_NO_EXCEPTIONS( e, "CW_MessageArea::CW_MessageArea( )" );
    }
}

var CW_GetMessageArea = new function( )
{
    var messageArea = null;

    return function( )
    {
        if ( messageArea === null )
        {
            messageArea = new CW_MessageArea( );
        }

        return messageArea;
    };
}( );


var CW_MessageArea_prototype =
{
    MESSAGE_TYPE_ALERT  : 0,
    MESSAGE_TYPE_STATUS : 1,

    endMessageDisplay: function( )
    {
        try
        {
            if ( this.currentTimeout )
            {
                clearTimeout( this.currentTimeout );
                this.currentTimeout = null;
            }

            // other objects may have bound to the messageText
            this.jObject.trigger( "clear" );
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "CW_MessageArea::endMessageDisplay( )" );
        }
    },

    Clear : function( )
    {
        try
        {
            this.endMessageDisplay( );

            this.jObject.html( "" );
            UTILS.adjustHeight( );
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "CW_MessageArea::Clear( )" );
        }
    },

    display: function( messageText, messageType, secondsToDismiss )
    {
        try
        {
            this.endMessageDisplay( );

            if ( this.m_lastMessageType === null || messageType != this.m_lastMessageType )
            {
                if ( messageType == this.MESSAGE_TYPE_ALERT )
                {
                    this.jObject.addClass( "messageTypeAlert" );
                    this.jObject.removeClass( "messageTypeStatus" );
                }
                else
                {
                    this.jObject.removeClass( "messageTypeAlert" );
                    this.jObject.addClass( "messageTypeStatus" );
                }

                this.m_lastMessageType = messageType;
            }

            var displayText = "";
            if ( /^\177/.test( messageText ) )
            {
                displayText = messageText.substr( 1 );
            }
            else
            {
                function handleRegExMatches( str, s1, s2, s3, pos, offset )
                {
                    var queryString = controller.queryString.get( );

                    var url = s2 + ( /\?/.test( s2 ) ? "&" + queryString.substr( 1 ) : queryString );

                    return UTILS.escapeHTML( s1 ) + "<a href=\"http://" + url + "\" target=\"_blank\">" + s2 + "</a>" + UTILS.escapeHTML( s3 );
                }

                displayText = messageText.replace( /^(.*?)(?:http[:][/][/])?(www\S*\w)(\W+|\W+\s.*|\s.*)?$/, handleRegExMatches );
            }

            this.jObject.html( displayText );

            UTILS.adjustHeight( );

            if ( secondsToDismiss !== undefined )
            {
                this.currentTimeout = setTimeout( function( ) { CW_GetMessageArea( ).Clear( ); }, secondsToDismiss * 1000 );
            }
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "CW_MessageArea::display( )" );
        }
    }
};