/// <summary>
        /// Callback when a gesture state is modified during operation of the engine 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnSynchronizeGesturesState(object sender, SynchronizeGesturesStateEventArgs e)
        {
            switch (e.GestureName)
            {
                case "SwipeLeft":
                    if (!PropertiesPluginKinect.Instance.EnableGestureSwipeLeft)
                    {
                        if (!PropertiesPluginKinect.Instance.EnableGestureSwipeRight && m_refSwipeHandLeftChecker != null && m_refSwipeHandRightChecker != null)
                        {
                            DisableGestureChecker(m_refSwipeHandLeftChecker);
                            DisableGestureChecker(m_refSwipeHandRightChecker);
                        }
                    }
                    else
                    {
                        if (!PropertiesPluginKinect.Instance.EnableGestureSwipeRight)
                        {
                            m_refSwipeHandRightChecker = new SwipeGestureChecker(m_refUser, JointType.HandRight);
                            EnableGestureChecker(m_refSwipeHandRightChecker);

                            m_refSwipeHandLeftChecker = new SwipeGestureChecker(m_refUser, JointType.HandLeft);
                            EnableGestureChecker(m_refSwipeHandLeftChecker);
                        }
                    }
                    break;

                case "SwipeRight":
                    if (!PropertiesPluginKinect.Instance.EnableGestureSwipeRight)
                    {
                        if (!PropertiesPluginKinect.Instance.EnableGestureSwipeLeft && m_refSwipeHandLeftChecker != null && m_refSwipeHandRightChecker != null)
                        {
                            DisableGestureChecker(m_refSwipeHandLeftChecker);
                            DisableGestureChecker(m_refSwipeHandRightChecker);
                        }
                    }
                    else
                    {
                        if (!PropertiesPluginKinect.Instance.EnableGestureSwipeLeft)
                        {
                            m_refSwipeHandRightChecker = new SwipeGestureChecker(m_refUser, JointType.HandRight);
                            EnableGestureChecker(m_refSwipeHandRightChecker);

                            m_refSwipeHandLeftChecker = new SwipeGestureChecker(m_refUser, JointType.HandLeft);
                            EnableGestureChecker(m_refSwipeHandLeftChecker);
                        }
                    }
                    break;

                case "Wave":
                    if (!PropertiesPluginKinect.Instance.EnableGestureWave)
                    {
                        DisableGestureChecker(m_refHandLeftWaveChecker);
                        DisableGestureChecker(m_refHandRightWaveChecker);
                    }
                    else
                    {
                        m_refHandRightWaveChecker = new WaveGestureChecker(m_refUser, JointType.HandRight);
                        EnableGestureChecker(m_refHandLeftWaveChecker);

                        m_refHandLeftWaveChecker = new WaveGestureChecker(m_refUser, JointType.HandLeft);
                        EnableGestureChecker(m_refHandRightWaveChecker);
                    }
                    break;

                case "Grip":
                    if (!PropertiesPluginKinect.Instance.EnableGestureGrip)
                    {
                        // Nothing to do ?
                    }
                    break;
                case "Push":
                    if (!PropertiesPluginKinect.Instance.EnableGesturePush)
                    {
                        DisableGestureChecker(m_refPushLeftHandGestureChecker);
                        DisableGestureChecker(m_refPushRightHandGestureChecker);
                    }
                    else
                    {
                        m_refPushRightHandGestureChecker = new PushGestureChecker(m_refUser, JointType.HandRight);
                        EnableGestureChecker(m_refPushRightHandGestureChecker);

                        m_refPushLeftHandGestureChecker = new PushGestureChecker(m_refUser, JointType.HandLeft);
                        EnableGestureChecker(m_refPushLeftHandGestureChecker);
                    }
                    break;

                case "Maximize":
                    if (!PropertiesPluginKinect.Instance.EnableGestureMaximize)
                    {
                        DisableGestureChecker(m_refMaximizeGestureChecker);
                    }
                    else
                    {
                        m_refMaximizeGestureChecker = new MaximizeGestureChecker(m_refUser);
                        EnableGestureChecker(m_refMaximizeGestureChecker);
                    }
                    break;

                case "Minimize":
                    if (!PropertiesPluginKinect.Instance.EnableGestureMinimize)
                    {
                        DisableGestureChecker(m_refMinimizeGestureChecker);
                    }
                    else
                    {
                        m_refMinimizeGestureChecker = new MinimizeGestureChecker(m_refUser);
                        EnableGestureChecker(m_refMinimizeGestureChecker);
                    }
                    break;

                case "A":
                    if (!PropertiesPluginKinect.Instance.EnablePostureA)
                    {
                        DisablePostureChecker(m_refPostureAChecker);
                    }
                    else
                    {
                        m_refPostureAChecker = new PostureAChecker(m_refUser);
                        EnablePostureChecker(m_refPostureAChecker);
                    }
                    break;

                case "Home":
                    if (!PropertiesPluginKinect.Instance.EnablePostureHome)
                    {
                        DisableGestureChecker(m_refPostureHomeChecker);
                    }
                    else
                    {
                        m_refPostureHomeChecker = new PostureHomeChecker(m_refUser);
                        EnablePostureChecker(m_refPostureHomeChecker);
                    }
                    break;

                case "Stay":
                    if (!PropertiesPluginKinect.Instance.EnablePostureStay)
                    {
                        DisablePostureChecker(m_refPostureHomeChecker);
                    }
                    else
                    {
                        m_refPostureHomeChecker = new PostureHomeChecker(m_refUser);
                        EnablePostureChecker(m_refPostureHomeChecker);
                    }
                    break;

                case "T":
                    if (!PropertiesPluginKinect.Instance.EnablePostureT)
                    {
                        DisablePostureChecker(m_refPostureTChecker);
                    }
                    else
                    {
                        m_refPostureTChecker = new PostureTChecker(m_refUser);
                        EnablePostureChecker(m_refPostureTChecker);
                    }
                    break;

                case "U":
                    if (!PropertiesPluginKinect.Instance.EnablePostureU)
                    {
                        DisablePostureChecker(m_refPostureUChecker);
                    }
                    else
                    {
                        m_refPostureUChecker = new PostureUChecker(m_refUser);
                        EnablePostureChecker(m_refPostureUChecker);
                    }
                    break;

                case "V":
                    if (!PropertiesPluginKinect.Instance.EnablePostureV)
                    {
                        DisablePostureChecker(m_refPostureVChecker);
                    }
                    else
                    {
                        m_refPostureVChecker = new PostureVChecker(m_refUser);
                        EnablePostureChecker(m_refPostureVChecker);
                    }
                    break;

                case "Wait":
                    if (!PropertiesPluginKinect.Instance.EnablePostureWait)
                    {
                        DisablePostureChecker(m_refPostureWaitChecker);
                    }
                    else
                    {
                        m_refPostureWaitChecker = new PostureWaitChecker(m_refUser);
                        EnablePostureChecker(m_refPostureWaitChecker);
                    }
                    break;
            }
        }
        public GestureRecognizerManager(UserData user)
        {
            //m_InstanceGestureRecognizerManager = this;

            m_refUser = user;

            #region Variables initialisation

            // Instantiate timer for manage gesture recognize
            m_refTimerGestureManager = new Timer();
            m_refTimerGestureManager.Interval = PropertiesPluginKinect.Instance.GestureRecognizedTime;
            m_refTimerGestureManager.Elapsed += OnTimeOutGesture;

            // Initialize buffer gesture recognition
            m_refGestureRecognized = new List<EnumGesture>();

            // Initialize gesture begin flags
            var ValueGestureAsList = System.Enum.GetValues(typeof(EnumGesture));
            m_refFlagGesturesBegin = new Dictionary<EnumGesture, bool>();
            foreach (EnumGesture gesture in ValueGestureAsList)
            {
                m_refFlagGesturesBegin.Add(gesture, false);
            }

            m_refAuthorizedGesture = true;

            // Instantiate timer for manage when a posture is recognized
            m_refTimerPostureManager = new Timer();
            m_refTimerPostureManager.Interval = PropertiesPluginKinect.Instance.PostureRecognizedTime;
            m_refTimerPostureManager.Elapsed += OnTimeOutPosture;

            m_refPostureRecognized = PropertiesPluginKinect.Instance.SavePosturerecognize;

            if (PropertiesPluginKinect.Instance.SavePosturerecognize != EnumPosture.POSTURE_NONE)
            {
                m_refTimerPostureManager.Start();
            }

            // Initialize posture begin flags
            var ValuePostureAsList = System.Enum.GetValues(typeof(EnumPosture));
            m_refFlagPostureBegin = new Dictionary<EnumPosture, bool>();
            foreach (EnumPosture posture in ValuePostureAsList)
            {
                m_refFlagPostureBegin.Add(posture, false);
            }

            // Listen the Gestures enable changement
            PropertiesPluginKinect.Instance.SynchronizeGesturesState += OnSynchronizeGesturesState;

            #endregion

            #region Gesture Checker initialisation

            if(!PropertiesPluginKinect.Instance.KinectPointingModeEnabled)
            {
                if (PropertiesPluginKinect.Instance.EnableGestureSwipeRight || PropertiesPluginKinect.Instance.EnableGestureSwipeLeft)
                {
                    m_refSwipeHandRightChecker = new SwipeGestureChecker(user, JointType.HandRight);
                    EnableGestureChecker(m_refSwipeHandRightChecker);

                    m_refSwipeHandLeftChecker = new SwipeGestureChecker(user, JointType.HandLeft);
                    EnableGestureChecker(m_refSwipeHandLeftChecker);
                }

                if (PropertiesPluginKinect.Instance.EnableGestureWave)
                {
                    m_refHandRightWaveChecker = new WaveGestureChecker(user, JointType.HandRight);
                    EnableGestureChecker(m_refHandRightWaveChecker);

                    m_refHandLeftWaveChecker = new WaveGestureChecker(user, JointType.HandLeft);
                    EnableGestureChecker(m_refHandLeftWaveChecker);
                }

                if (PropertiesPluginKinect.Instance.EnableGesturePush)
                {
                    m_refPushRightHandGestureChecker = new PushGestureChecker(user, JointType.HandRight);
                    EnableGestureChecker(m_refPushRightHandGestureChecker);

                    m_refPushLeftHandGestureChecker = new PushGestureChecker(user, JointType.HandLeft);
                    EnableGestureChecker(m_refPushLeftHandGestureChecker);
                }

                if (PropertiesPluginKinect.Instance.EnableGestureMaximize)
                {
                    m_refMaximizeGestureChecker = new MaximizeGestureChecker(user);
                    EnableGestureChecker(m_refMaximizeGestureChecker);
                }

                if (PropertiesPluginKinect.Instance.EnableGestureMinimize)
                {
                    m_refMinimizeGestureChecker = new MinimizeGestureChecker(user);
                    EnableGestureChecker(m_refMinimizeGestureChecker);
                }
            }

            if (PropertiesPluginKinect.Instance.EnablePostureA)
            {
                m_refPostureAChecker = new PostureAChecker(user);
                EnablePostureChecker(m_refPostureAChecker);
            }

            if (PropertiesPluginKinect.Instance.EnablePostureHome)
            {
                m_refPostureHomeChecker = new PostureHomeChecker(user);
                EnablePostureChecker(m_refPostureHomeChecker);
            }

            if (PropertiesPluginKinect.Instance.EnablePostureStay)
            {
                m_refPostureStayChecker = new PostureStayChecker(user);
                EnablePostureChecker(m_refPostureStayChecker);
            }

            if (PropertiesPluginKinect.Instance.EnablePostureT)
            {
                m_refPostureTChecker = new PostureTChecker(user);
                EnablePostureChecker(m_refPostureTChecker);
            }

            if (PropertiesPluginKinect.Instance.EnablePostureU)
            {
                m_refPostureUChecker = new PostureUChecker(user);
                EnablePostureChecker(m_refPostureUChecker);
            }

            if (PropertiesPluginKinect.Instance.EnablePostureV)
            {
                m_refPostureVChecker = new PostureVChecker(user);
                EnablePostureChecker(m_refPostureVChecker);
            }

            if (PropertiesPluginKinect.Instance.EnablePostureWait)
            {
                m_refPostureWaitChecker = new PostureWaitChecker(user);
                EnablePostureChecker(m_refPostureWaitChecker);
            }
            #endregion
        }