/******************************************************************************

    Classes:
        MPC_MobileNumberControlSynchronizer

    $Revision: 2$
    $Date: 2007-07-27 15:28:50$
    $NoKeywords$

******************************************************************************/

/******************************************************************************
  MPC_MobileNumberControlSynchronizer c'tor

    Synchronizes state between a collection of SMS_MobileNumberControlBase's.

    Signals:
        OnChange - Raised whenever a control in the managed collection changes.

******************************************************************************/
function MPC_MobileNumberControlSynchronizer( )
{
    try
    {
        var counter = 0;
        this.GetNextControlId = function( )
        {
            return counter++;
        };

        this.m_controls = {};

        this.m_slotManager    = new SIGSLOT_SlotManager( );
        this.m_onChangeSignal = new SIGSLOT_Signal( );
    }
    catch ( e )
    {
        EX_ASSERT_NO_EXCEPTIONS( e, "MPC_MobileNumberControlSynchronizer::MPC_MobileNumberControlSynchronizer( )" );
    }
}

MPC_MobileNumberControlSynchronizer.prototype =
{

    /******************************************************************************
    PUBLIC METHODS
    ******************************************************************************/

    GetSlotManager : function( )
    {
        return this.m_slotManager;
    },

    GetOnChangeSignal : function( )
    {
        return this.m_onChangeSignal;
    },

    /******************************************************************************
      SimulateControlChangeTo

        Synchronizes a target synchronizer with the state of the monitored controls.

        Parameters:
            [in/out] targetSynchronizer

    ******************************************************************************/
    SimulateControlChangeTo : function( targetSynchronizer )
    {
        try
        {
            targetSynchronizer.OnControlChange( this.m_controls[ 0 ] );
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "MPC_MobileNumberControlSynchronizer::SimulateControlChangeTo( )" );
        }
    },

    /******************************************************************************
      Initialize

        Initializes all the controls from the persistent state stored in the
        PREF_KEY_SENDER_MOBILE preference. This method should be called after all
        SMS_MobileNumberControlBase's to be monitored have been added to the
        collection via AddControl( ).

    ******************************************************************************/
    Initialize : function( )
    {
        try
        {
            var mobileNumberState = SMS_MobileNumberControlPersistentState.prototype.CreateFromString( VM_GetPreference( PREF_KEY_SENDER_MOBILE ) );

            if ( mobileNumberState )
            {
                this.m_controls[ 0 ].SetPersistentState( mobileNumberState );
            }
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "MPC_MobileNumberControlSynchronizer::Initialize( )" );
        }
    },

    /******************************************************************************
      AddControl

        Adds a control to the collection to be monitored.

        Parameters:
            [in] control

        Returns:
            Unique control Id

    ******************************************************************************/
    AddControl : function( control )
    {
        try
        {
            control.GetOnChangeSignal( ).Connect( this, "OnControlChange" );

            var controlId = this.GetNextControlId( );

            this.m_controls[ controlId ] = control;

            return controlId;
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "MPC_MobileNumberControlSynchronizer::AddControl( )" );
        }
    },


    /******************************************************************************
    PRIVATE METHODS
    ******************************************************************************/

    /******************************************************************************
      OnControlChange

        Handler for change events from monitored controls. This method notifies all
        other managed controls of the change.

        Parameters:
            [in] changedControl

    ******************************************************************************/
    OnControlChange : function( changedControl )
    {
        try
        {
            for ( var controlIndex in this.m_controls )
            {
                var control = this.m_controls[ controlIndex ];

                if ( control !== changedControl )
                {
                    control.OnNotify( changedControl );
                }
            }

            this.m_onChangeSignal.Emit( changedControl );
        }
        catch ( e )
        {
            EX_ASSERT_NO_EXCEPTIONS( e, "MPC_MobileNumberControlSynchronizer::AddControl( )" );
        }
    }
};