/// <summary>
        /// Called when [validation finished handler].
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
        void OnValidationFinishedHandler(object sender, EventArgs e)
        {
            ChannelSetupControl control = sender as ChannelSetupControl;

            if (control.IsValidated)
            {
                if (control.InviteFriends)
                {
                    // Send out viral
                    var message = Messages.Next();
                    var config  = control.ChannelConfiguration;

                    var status = new UserStatus
                    {
                        Status          = message,
                        StatusType      = StatusTypes.MyUpdate,
                        SortDate        = DateTime.Now,
                        DateCreated     = DateTime.Now,
                        TargetChannelId = config.ChannelId.ToString()
                    };

                    new BackgroundActionTask(delegate
                    {
                        var channel = ChannelsManager.GetChannelObject(config.ChannelId);

                        ChannelContext.Current.ClientContext =
                            new ChannelClientContext(ClientState.Current.Context, config);

                        channel.StatusUpdatesChannel.UpdateMyStatus(status.DuckCopy <ChannelStatusUpdate>());
                    }).ExecuteAsync();
                }

                var firstItem  = (FrameworkElement)transitionContainer.Items[0];
                var secondItem = (FrameworkElement)transitionContainer.Items[1];

                TimeSpan duration = new TimeSpan(0, 0, 0);
                transitionContainer.RestDuration = new Duration(duration);
                transitionContainer.ApplyTransition(firstItem, secondItem);
            }

            OnPropertyChanged("HasConfiguredChannels");
        }
        /// <summary>
        /// Edits the channel.
        /// </summary>
        /// <param name="configuration">The configuration.</param>
        void EditChannel(ChannelConfiguration configuration)
        {
            if (configuration != null)
            {
                ChannelSetupControlPanel.Children.Clear();

                // Setup Control
                ChannelSetupControl setupControl = new ChannelSetupControl(configuration.Clone());
                setupControl.IsInEditModus = true;
                setupControl.Username = configuration.InputChannel.Authentication.Username;
                setupControl.HorizontalAlignment = HorizontalAlignment.Center;
                setupControl.VerticalAlignment = VerticalAlignment.Center;
                setupControl.OnValidationFinished += OnValidationFinishedHandler;
                setupControl.OnCancel += OnCancelHandler;
                setupControl.RenderTransform = new TranslateTransform(0, 0);

                ChannelSetupControlPanel.Children.Add(setupControl);

                // Play Animation
                var firstItem = (FrameworkElement)transitionContainer.Items[0];
                var secondItem = (FrameworkElement)transitionContainer.Items[1];

                FlipTransition transition = Resources["FlipTransition"] as FlipTransition;
                transition.Rotation = Direction.RightToLeft;
                transitionContainer.Transition = transition;
                transitionContainer.TransitionCompleted -= OnTransitionCompleted;
                transitionContainer.ApplyTransition(firstItem, secondItem);

                OnPropertyChanged("AllChannelConfigurations");
                OnPropertyChanged("ChannelConfiguration");
            }
        }
        /// <summary>
        /// Handles the Click event of the ChannelAddWrapPannel control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.Windows.RoutedEventArgs"/> instance containing the event data.</param>
        void ChannelAddWrapPannel_Click(object sender, RoutedEventArgs e)
        {
            if (ChannelSetupControlPanel.Children.Count == 0)
            {
                ChannelAddControl channelAddControl = e.Source as ChannelAddControl;

                // Setup Control
                ChannelSetupControl setupControl = new ChannelSetupControl(channelAddControl.ChannelConfiguration.Clone());
                setupControl.IsInEditModus = false;
                setupControl.HorizontalAlignment = HorizontalAlignment.Center;
                setupControl.VerticalAlignment = VerticalAlignment.Center;
                setupControl.OnValidationFinished += OnValidationFinishedHandler;
                setupControl.OnCancel += OnCancelHandler;
                setupControl.RenderTransform = new TranslateTransform(0, 0);

                ChannelSetupControlPanel.Children.Add(setupControl);

                // Play Animation
                var firstItem = (FrameworkElement)transitionContainer.Items[0];
                var secondItem = (FrameworkElement)transitionContainer.Items[1];

                FlipTransition transition = Resources["FlipTransition"] as FlipTransition;
                transition.Rotation = Direction.RightToLeft;
                transitionContainer.Transition = transition;
                transitionContainer.TransitionCompleted -= OnTransitionCompleted;
                transitionContainer.ApplyTransition(firstItem, secondItem);
            }

            OnPropertyChanged("AllChannelConfigurations");
            OnPropertyChanged("ChannelConfiguration");

            e.Handled = true;
        }
        /// <summary>
        /// Called when [channel add animation complete].
        /// </summary>
        /// <param name="channelAddControl">The channel add control.</param>
        private void OnChannelAddAnimationComplete(ChannelAddControl channelAddControl)
        {
            if (transitionContainer.Items.Count == 0)
            {
                // Set Canvas Top
                if (channelAddControl.ChannelConfiguration.DisplayStyle == DisplayStyle.Other)
                {
                    Canvas.SetTop(ChannelSetupStackPanel, 0);
                }
                else
                {
                    Canvas.SetTop(ChannelSetupStackPanel, 110);
                }

                // Tranisition Settings
                transitionContainer.Opacity = 0;

                // Setup Control
                ChannelSetupControl setupControl = new ChannelSetupControl(channelAddControl.ChannelConfiguration.Clone());
                setupControl.IsInEditModus         = false;
                setupControl.OnValidationFinished += OnValidationFinishedHandler;
                setupControl.OnCancel             += OnCancelHandler;
                setupControl.RenderTransform       = new TranslateTransform(0, 0);
                setupControl.OnFormLayoutUpdated  +=
                    delegate
                {
                    // Set Canvas Top
                    if (setupControl.ChannelConfiguration.DisplayStyle == DisplayStyle.Other ||
                        setupControl.IsManuallyCustomized)
                    {
                        Canvas.SetTop(ChannelSetupStackPanel, 0);
                    }
                    else
                    {
                        Canvas.SetTop(ChannelSetupStackPanel, 110);
                    }
                };

                transitionContainer.Items.Add(setupControl);

                // Empty Control
                Control emptyControl = new Control();
                emptyControl.HorizontalAlignment = HorizontalAlignment.Stretch;
                emptyControl.VerticalAlignment   = VerticalAlignment.Bottom;
                emptyControl.RenderTransform     = new TranslateTransform(0, 0);

                transitionContainer.Items.Add(emptyControl);

                // NOTE: This is a workaround to get the focus
                // correctly on the SetupControl. This way the command binding
                // on the CheckCredentials button is triggerd correctly.
                emptyControl.Focus();
                setupControl.Focus();

                // Animate Opacity Tween
                PennerDoubleAnimation.Equations equation = PennerDoubleAnimation.Equations.QuintEaseOut;
                int durationMS = 750;
                Animator.AnimatePenner(transitionContainer, OpacityProperty, equation, transitionContainer.Opacity, 1, durationMS, delegate { });
            }

            OnPropertyChanged("HasConfiguredChannels");
        }
        /// <summary>
        /// Called when [channel add animation complete].
        /// </summary>
        /// <param name="channelAddControl">The channel add control.</param>
        private void OnChannelAddAnimationComplete(ChannelAddControl channelAddControl)
        {
            if (transitionContainer.Items.Count == 0)
            {
                // Set Canvas Top
                if (channelAddControl.ChannelConfiguration.DisplayStyle == DisplayStyle.Other)
                {
                    Canvas.SetTop(ChannelSetupStackPanel, 0);
                }
                else
                {
                    Canvas.SetTop(ChannelSetupStackPanel, 110);
                }

                // Tranisition Settings
                transitionContainer.Opacity = 0;

                // Setup Control
                ChannelSetupControl setupControl = new ChannelSetupControl(channelAddControl.ChannelConfiguration.Clone());
                setupControl.IsInEditModus = false;
                setupControl.OnValidationFinished += OnValidationFinishedHandler;
                setupControl.OnCancel += OnCancelHandler;
                setupControl.RenderTransform = new TranslateTransform(0, 0);
                setupControl.OnFormLayoutUpdated +=
                    delegate
                    {
                        // Set Canvas Top
                        if (setupControl.ChannelConfiguration.DisplayStyle == DisplayStyle.Other ||
                            setupControl.IsManuallyCustomized)
                        {
                            Canvas.SetTop(ChannelSetupStackPanel, 0);
                        }
                        else
                        {
                            Canvas.SetTop(ChannelSetupStackPanel, 110);
                        }
                    };

                transitionContainer.Items.Add(setupControl);

                // Empty Control
                Control emptyControl = new Control();
                emptyControl.HorizontalAlignment = HorizontalAlignment.Stretch;
                emptyControl.VerticalAlignment = VerticalAlignment.Bottom;
                emptyControl.RenderTransform = new TranslateTransform(0, 0);

                transitionContainer.Items.Add(emptyControl);

                // NOTE: This is a workaround to get the focus
                // correctly on the SetupControl. This way the command binding
                // on the CheckCredentials button is triggerd correctly.
                emptyControl.Focus();
                setupControl.Focus();

                // Animate Opacity Tween
                PennerDoubleAnimation.Equations equation = PennerDoubleAnimation.Equations.QuintEaseOut;
                int durationMS = 750;
                Animator.AnimatePenner(transitionContainer, OpacityProperty, equation, transitionContainer.Opacity, 1, durationMS, delegate { });
            }

            OnPropertyChanged("HasConfiguredChannels");
        }