private void InitializeGatheringSpot(Character user, GatheringWindow uiWindow, Gathering currentSpot)
            {
                user.Refresh();
                Debug.Print("User Status: " + user.Status.ToString() + "  -  " + user.Status.ToString("X"));
                currentSpot.Target();
                Thread.Sleep(100);

                while (uiWindow.RefreshPointers() == false)
                {

                    user.Refresh();

                    user.Heading = user.Coordinate.AngleTo(currentSpot.Coordinate);

                    Utilities.Keyboard.KeyBoardHelper.KeyDown(Keys.W);

                    if (user.Coordinate.Distance2D(currentSpot.Coordinate) > DistanceThreshold)
                    {
                        user.Heading = user.Coordinate.AngleTo(currentSpot.Coordinate);

                        Utilities.Keyboard.KeyBoardHelper.KeyDown(Keys.W);
                        continue;
                    }

                    Utilities.Keyboard.KeyBoardHelper.KeyUp(Keys.W);

                    Thread.Sleep(350);
                    user.Refresh();
                    user.Heading = user.Coordinate.AngleTo(currentSpot.Coordinate);

                    Debug.Print("Waiting for window...");
                    Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.NumPad0);
                    Thread.Sleep(750);
                }
            }
            public void DoWork()
            {
                try
                {

                    List<Character> monsters = new List<Character>();
                    List<Character> fate = new List<Character>();
                    List<Character> players = new List<Character>();
                    List<Gathering> gathering = new List<Gathering>();
                    GatheringWindow uiWindow = new GatheringWindow();
                    long gathercount = 0;

                    Character user = null;
                    Gathering currentTarget = null;

                    Stopwatch _claimwatch;
                    byte lastPosition = 1;

                    MemoryFunctions.GetCharacters(monsters, fate, players, ref user);
                    MemoryFunctions.GetGathering(gathering);
                    _botstage = BotStage.Detection;
                    _navigation.Start();

                    _initial = true;
                    while (true)
                    {
                        //Debug.Print(_botstage.ToString());
                        switch (_botstage)
                        {
                            case BotStage.Detection:

                                currentTarget = FindClosestGatheringSpot();
                                if (currentTarget != null)
                                {
                                    _navigation.Stop();
                                    _botstage = BotStage.Initialize;
                                    // Start timer to see if we have run into a problem claiming the monster.
                                    _claimwatch = new Stopwatch();
                                    _claimwatch.Start();
                                }

                                break;

                            case BotStage.Initialize:

                                InitializeGatheringSpot(user, uiWindow, currentTarget);

                                Debug.Print("Window open...");
                                uiWindow.Refresh();

                                Debug.Print("Items Found: " + uiWindow.Items.Count.ToString());
                                GatheringWindow.GatheringItems idealItem = null;

                                bool found = false;
                                foreach (string lstitem in SearchItems)
                                {
                                    foreach (GatheringWindow.GatheringItems item in uiWindow.Items)
                                    {
                                        if (item.Name.ToLower().Contains(lstitem.ToLower()))
                                        {
                                            idealItem = item;
                                            found = true;
                                            break;
                                        }
                                    }

                                    if (found)
                                        break;

                                }

                                //foreach (GatheringWindow.GatheringItems item in uiWindow.Items)
                                //{
                                //    foreach (string lstitem in SearchItems)
                                //    {
                                //        if (item.Name.ToLower().Contains(lstitem.ToLower()))
                                //        {
                                //            idealItem = item;
                                //            found = true;
                                //            break;
                                //        }
                                //    }

                                //    if (found)
                                //        break;
                                //}

                                if (idealItem == null)
                                    idealItem = uiWindow.Items.First();

                                Thread.Sleep(1000);
                                Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.NumPad6);
                                Thread.Sleep(150);
                                Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.NumPad6);
                                Thread.Sleep(150);
                                Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.NumPad6);
                                Thread.Sleep(200);

                                Debug.Print("Found Item: " + idealItem.Name + " Pos: " + idealItem.Position.ToString() + " " + found);
                                int positionShift = idealItem.Position - lastPosition;
                                Debug.Print("Shift: " + positionShift);
                                for (int i = 1; i <= Math.Abs(positionShift); i++)
                                {
                                    if (positionShift > 0)
                                        Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.NumPad2);
                                    else
                                        Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.NumPad8);

                                    Thread.Sleep(350);
                                }

                                lastPosition = idealItem.Position;

                                if (_initial)
                                {
                                    MessageBox.Show("Make sure your current selection is: " + idealItem.Name +
                                                    "... Click OK to continue.", "Chocobot", MessageBoxButton.OK, MessageBoxImage.Information);
                                    _initial = false;
                                }

                                user.Refresh();

                                if (idealItem.Name.ToLower().Contains("shard") || idealItem.Name.ToLower().Contains("crystal") || idealItem.Name.ToLower().Contains("cluster"))
                                {
                                    if (user.CurrentGP >= 400 && user.Level >= 20)
                                    {

                                        if (idealItem.Name.ToLower().Contains("fire"))
                                            Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.Dash);
                                        else if (idealItem.Name.ToLower().Contains("lightning"))
                                            Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.D0);
                                        else if (idealItem.Name.ToLower().Contains("water"))
                                            Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.VK_OEM_PLUS);
                                        else if (user.Level >= 30)
                                            Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.D1);

                                        Thread.Sleep(500);
                                    }
                                } else {

                                    if (user.CurrentGP >= 100 && user.Level >= 15)
                                    {
                                        Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.D4);
                                        Thread.Sleep(500);
                                    }

                                    //if (user.CurrentGP >= 400 && user.Level >= 30)
                                    //{

                                    //    Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.D1);
                                    //    Thread.Sleep(500);
                                    //}

                                    //if (user.CurrentGP >= 100 && user.Level >= 15)
                                    //{
                                    //    Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.D9);
                                    //    Thread.Sleep(500);
                                    //}

                                    //user.Refresh();
                                    //if (user.CurrentGP >= 250 && user.Level >= 10)
                                    //{

                                    //    Utilities.Keyboard.KeyBoardHelper.KeyPress(Keys.D7);
                                    //    Thread.Sleep(500);
                                    //}
                                }
                                gathercount += 1;
                                _botstage = BotStage.Gather;

                                break;

                            case BotStage.Gather:
                                GatherSpot(user, currentTarget);

                                break;

                        }

                        Thread.Sleep(250);
                    }
                }
                catch (Exception)
                {
                    _navigation.Stop();
                    throw;
                }
            }