/// <summary>
        /// consume an ActionArgs send from ActionRecogniser
        /// </summary>
        /// <param name="sender">the action manager</param>
        /// <param name="a">the action detected</param>
        private void Event_ActionRecognised(object sender, ActionArgs a)
        {
            ActionName previousActionName = ActionName.NULL;
            String     activeWindow       = NativeMethods.GetActiveWindow();

            if (previousActionsQueue.Count > 1)
            {
                previousActionName = previousActionsQueue.ToArray()[previousActionsQueue.Count - 1];
            }

            if (!
                (previousActionsQueue.Count >= 1 && previousActionName == ActionName.IDLE && a.name == ActionName.IDLE ||
                 (previousActionsQueue.Count > 1 && previousActionName == ActionName.MOUSE_PRESS && a.name == ActionName.MOUSE_PRESS) ||
                 (previousActionsQueue.Count > 1 && previousActionName != ActionName.MOUSE_PRESS && a.name == ActionName.MOUSE_RELEASE) ||
                 (previousActionsQueue.Count >= 1 && previousActionName == ActionName.MENU && a.name == ActionName.MENU)) &&
                !Helper.disabledActions.Contains(a.name)
                )
            {
                LogHelper.logInput("Action Recognised : \r\n" + a.ToString(), LogHelper.logType.INFO, this);

                if (previousActiveWindow == null || !previousActiveWindow.Equals(activeWindow))
                {
                    LogHelper.logInput("Current window : " + activeWindow, LogHelper.logType.INFO, this);
                    previousActiveWindow = activeWindow;
                }

                previousActionsQueue.Enqueue(a.name);
                if (previousActionsQueue.Count == maxActionsNumber)
                {
                    previousActionsQueue.Dequeue();
                }



                if (!String.IsNullOrEmpty(activeWindow) && activeWindow.ToLower().Contains("firefox") && !ServerHelper.isKeyboardLaunched)
                {
                    ServerHelper.Send(new Message(a));
                }
                else
                {
                    switch (a.name)
                    {
                    case ActionName.OPEN:
                        MouseSimulator.LeftButtonClick();
                        MouseSimulator.LeftButtonClick();
                        break;

                    case ActionName.NEXT_SELECTION:
                    case ActionName.NEXT_TAB:
                        KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.RIGHT);
                        break;

                    case ActionName.PREVIOUS_SELECTION:
                    case ActionName.PREVIOUS_TAB:
                        KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.LEFT);
                        break;

                    case ActionName.REDO:
                        KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                        KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.VK_Y);
                        KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                        break;

                    case ActionName.UNDO:
                        KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                        KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.VK_Z);
                        KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                        break;

                    default:
                        break;
                    }
                }



                //NOT DEPENDING ON THE ACTIVE WINDOW
                switch (a.name)
                {
                case ActionName.CLOSE:
                    //if the virtual keyboard is up, kill it
                    if (ServerHelper.isKeyboardLaunched)
                    {
                        ServerHelper.keyboardProcess.Kill();
                        ServerHelper.keyboardProcess    = null;
                        ServerHelper.isKeyboardLaunched = false;

                        Helper.RemoveDisabledActions(new List <ActionName>()
                        {
                            ActionName.NEXT_TAB, ActionName.PREVIOUS_TAB
                        });
                    }
                    else
                    {
                        KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LMENU);
                        KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.F4);
                        KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LMENU);
                    }
                    break;

                case ActionName.SIMPLE_SELECTION:
                    MouseSimulator.LeftButtonClick();
                    break;

                case ActionName.MENU:
                    KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LWIN);
                    KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                    KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.TAB);
                    KeyboardSimulator.NokeyDown();
                    break;

                case ActionName.MOUSE_PRESS:
                    if (!ServerHelper.isKeyboardLaunched)
                    {
                        clickTimer = new Timer(Click, null, 800, System.Threading.Timeout.Infinite);
                    }
                    break;

                case ActionName.MOUSE_RELEASE:
                    if (isPressing == false)
                    {
                        MouseSimulator.LeftButtonClick();
                        ServerHelper.Send(new Message(new ActionArgs(ActionName.SIMPLE_SELECTION, Helper.GetTimeStamp(), a.events)));
                    }
                    else if (isPressing == true)
                    {
                        MouseSimulator.LeftButtonUp();
                        isPressing = false;
                    }
                    if (clickTimer != null)
                    {
                        clickTimer.Dispose();
                    }
                    break;

                case ActionName.MULTIPLE_SELECTION:
                    if (KeyboardSimulator.keyDownList != null && !KeyboardSimulator.keyDownList.Contains(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL))
                    {
                        KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                    }
                    else
                    {
                        KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL);
                    }
                    break;

                case ActionName.SCROLL_DOWN:
                    MouseSimulator.VerticalMouseWheel(-5);
                    break;

                case ActionName.SCROLL_UP:
                    MouseSimulator.VerticalMouseWheel(5);
                    break;

                case ActionName.EXIT:
                    //reset Kinect
                    if (KinectHelper.Instance.elevationAngle != 0)
                    {
                        KinectHelper.Instance.elevationAngle = 0;
                    }
                    //reset KeyBoard & Mouse
                    InputControler.KeyboardSimulator.NokeyDown();
                    //kill the osk process if it exists
                    if (ServerHelper.keyboardProcess != null)
                    {
                        ServerHelper.keyboardProcess.Kill();
                    }
                    //Exit
                    Environment.Exit(0);
                    break;

                case ActionName.IDLE:
                    //what to do depending on the previous action
                    if (previousActionsQueue.Count != 0)
                    {
                        switch (previousActionsQueue.Peek())
                        {
                        case ActionName.PREVIOUS_SELECTION:
                        case ActionName.NEXT_SELECTION:
                        case ActionName.MENU:
                            InputControler.KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.EXECUTE);
                            break;

                        default:
                            break;
                        }
                    }
                    //release all entries
                    InputControler.KeyboardSimulator.NokeyDown();
                    break;

                default:
                    break;
                }
            }
        }