/// <summary>
        /// Initializes a new instance of the MainWindow class
        /// </summary>
        public MainWindow()
        {
            // only one sensor is currently supported
            this.kinectSensor = KinectSensor.GetDefault();

            // set IsAvailableChanged event notifier
            this.kinectSensor.IsAvailableChanged += this.Sensor_IsAvailableChanged;

            // open the sensor
            this.kinectSensor.Open();

            this._reader = kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color | FrameSourceTypes.Depth);
            this._reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

            // set the status text
            this.StatusText = this.kinectSensor.IsAvailable ? Properties.Resources.RunningStatusText
                                                            : Properties.Resources.NoSensorStatusText;

            // open the reader for the body frames
            this.bodyFrameReader = this.kinectSensor.BodyFrameSource.OpenReader();

            // set the BodyFramedArrived event notifier
            this.bodyFrameReader.FrameArrived += this.Reader_BodyFrameArrived;

            // initialize the BodyViewer object for displaying tracked bodies in the UI
            this.kinectBodyView = new KinectBodyView(this.kinectSensor);

            // initialize the gesture detection objects for our gestures
            this.gestureDetectorList = new List <GestureDetector>();

            // initialize the MainWindow
            this.InitializeComponent();

            // set our data context objects for display in UI
            this.DataContext = this;
            this.kinectBodyViewbox.DataContext = this.kinectBodyView;

            // connect to htk server via tcpClient
            //this.clientInterface = ClientInterface.getClientInstance();
            //clientInterface.connect();

            //Console.WriteLine("connect to the client interface \n " + clientInterface.GetHashCode() + "\n");
            //clientInterface.disconnect();

            // create a gesture detector for each body (6 bodies => 6 detectors) and create content controls to display results in the UI
            //int col0Row = 0, col1Row = 0;

            this.colorFrameWriter           = new ColorFrameWriter();
            this.depthFrameWriter           = new DepthFrameWriter();
            this.jointDataWriter            = new JointDataWriter();
            this.totalCapturedFrames_joints = 0;
            this.totalCapturedFrames_color  = 0;
            this.totalCapturedFrames_depth  = 0;
            this.framesCapturedInPhrase     = 0;
            this.phrase_indices             = new int[phrase_list.Length];

            if (File.Exists(@".\indices_state.txt"))
            {
                System.IO.StreamReader file = new System.IO.StreamReader(@".\indices_state.txt");
                String   indices_line       = file.ReadLine();
                String[] indices_states     = indices_line.Split(' ');
                for (int i = 0; i < phrase_indices.Length; i++)
                {
                    if (i >= indices_states.Length)
                    {
                        this.phrase_indices[i] = 0;
                    }
                    else
                    {
                        this.phrase_indices[i] = Int32.Parse(indices_states[i]);
                    }
                }
            }
            else
            {
                for (int i = 0; i < phrase_indices.Length; i++)
                {
                    this.phrase_indices[i] = 0;
                }
            }

            random_phrase_indices     = new int[phrase_list.Length];
            random_phrase_inx_counter = 0;
            for (int i = 0; i < phrase_list.Length; i++)
            {
                random_phrase_indices[i] = i;
            }
            new Random().Shuffle(random_phrase_indices);

            session_number = 1;

            int maxBodies = this.kinectSensor.BodyFrameSource.BodyCount;

            for (int i = 0; i < maxBodies; ++i)
            {
                GestureResultView result   = new GestureResultView(i, false, false, 0.0f);
                GestureDetector   detector = new GestureDetector(this.kinectSensor, result);
                this.gestureDetectorList.Add(detector);

                // split gesture results across the first two columns of the content grid
                ContentControl contentControl = new ContentControl();
                contentControl.Content = this.gestureDetectorList[i].GestureResultView;

                /*
                 * if (i % 2 == 0)
                 * {
                 *  // Gesture results for bodies: 0, 2, 4
                 *  Grid.SetColumn(contentControl, 0);
                 *  Grid.SetRow(contentControl, col0Row);
                 ++col0Row;
                 * }
                 * else
                 * {
                 *  // Gesture results for bodies: 1, 3, 5
                 *  Grid.SetColumn(contentControl, 1);
                 *  Grid.SetRow(contentControl, col1Row);
                 ++col1Row;
                 * }
                 *
                 * this.contentGrid.Children.Add(contentControl);*/
            }

            prevDeleteButton.Click += deletePreviousSample;
            currentPhraseName.Text  = phrase_list[current_phrase_index];

            String current_phrase = phrase_list[current_phrase_index];

            char[]   delims = { '_' };
            String[] words  = current_phrase.Split(delims);

            StringBuilder builder = new StringBuilder();

            foreach (string s in words)
            {
                builder.Append(s.ToLower()).Append(" ");
            }
            String cleanedPhrase = builder.ToString().TrimEnd(new char[] { ' ' });

            cleanedPhrase += ".png";
            //Console.WriteLine("!!!!!!!!!!!!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + cleanedPhrase);

            BitmapImage image = new BitmapImage();

            image.BeginInit();
            image.UriSource = new Uri(System.IO.Path.Combine(
                                          @"C:\Users\aslr\Documents\GitHub\SignLanguageRecognition\phrase-sampler-3.0\phrase_images", cleanedPhrase));
            image.EndInit();
            phraseImage.Source = image;

            phrase_name = phrase_list[current_phrase_index];

            /*clientInterface.sendData("new_phrase");
             * clientInterface.sendData(phrase_name);*/

            //String mainDir = System.IO.Path.Combine(@"C:\Users\aslr\Documents\aslr-data", phrase_name);
            //String colorDir = System.IO.Path.Combine(mainDir, "color");
            //String depthDir = System.IO.Path.Combine(mainDir, "depth");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& " + kinect.DepthStream.FrameWidth);\

            mainDir = System.IO.Path.Combine(dataWritePath, phrase_name);
            //String colorDir = System.IO.Path.Combine(mainDir, "color");
            //String depthDir = System.IO.Path.Combine(mainDir, "depth");
            System.IO.Directory.CreateDirectory(mainDir);
            //System.IO.Directory.CreateDirectory(colorDir);
            //System.IO.Directory.CreateDirectory(depthDir);

            //System.IO.Directory.CreateDirectory(mainDir);
            //System.IO.Directory.CreateDirectory(colorDir);
            //System.IO.Directory.CreateDirectory(depthDir);

            colorFrameWriter.setCurrentPhrase(phrase_name);
            depthFrameWriter.setCurrentPhrase(phrase_name);
            jointDataWriter.setCurrentPhrase(phrase_name);
        }
        /// <summary>
        /// Initializes a new instance of the MainWindow class
        /// </summary>
        public MainWindow()
        {
            // only one sensor is currently supported
            this.kinectSensor = KinectSensor.GetDefault();
            
            // set IsAvailableChanged event notifier
            this.kinectSensor.IsAvailableChanged += this.Sensor_IsAvailableChanged;

            // open the sensor
            this.kinectSensor.Open();

            this._reader = kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Color | FrameSourceTypes.Depth);
            this._reader.MultiSourceFrameArrived += Reader_MultiSourceFrameArrived;

            // set the status text
            this.StatusText = this.kinectSensor.IsAvailable ? Properties.Resources.RunningStatusText
                                                            : Properties.Resources.NoSensorStatusText;

            // open the reader for the body frames
            this.bodyFrameReader = this.kinectSensor.BodyFrameSource.OpenReader();

            // set the BodyFramedArrived event notifier
            this.bodyFrameReader.FrameArrived += this.Reader_BodyFrameArrived;

            // initialize the BodyViewer object for displaying tracked bodies in the UI
            this.kinectBodyView = new KinectBodyView(this.kinectSensor);

            // initialize the gesture detection objects for our gestures
            this.gestureDetectorList = new List<GestureDetector>();

            // initialize the MainWindow
            this.InitializeComponent();

            // set our data context objects for display in UI
            this.DataContext = this;
            this.kinectBodyViewbox.DataContext = this.kinectBodyView;

            // connect to htk server via tcpClient
            //this.clientInterface = ClientInterface.getClientInstance();
            //clientInterface.connect();

            //Console.WriteLine("connect to the client interface \n " + clientInterface.GetHashCode() + "\n");            
            //clientInterface.disconnect();

            // create a gesture detector for each body (6 bodies => 6 detectors) and create content controls to display results in the UI
            //int col0Row = 0, col1Row = 0;

            this.colorFrameWriter = new ColorFrameWriter();
            this.depthFrameWriter = new DepthFrameWriter();
            this.jointDataWriter = new JointDataWriter();
            this.totalCapturedFrames_joints = 0;
            this.totalCapturedFrames_color = 0;
            this.totalCapturedFrames_depth = 0;

            session_number = 1;

            int maxBodies = this.kinectSensor.BodyFrameSource.BodyCount;
            for (int i = 0; i < maxBodies; ++i)
            {
                GestureResultView result = new GestureResultView(i, false, false, 0.0f);
                GestureDetector detector = new GestureDetector(this.kinectSensor, result);
                this.gestureDetectorList.Add(detector);                
                
                // split gesture results across the first two columns of the content grid
                ContentControl contentControl = new ContentControl();
                contentControl.Content = this.gestureDetectorList[i].GestureResultView;
                /*
                if (i % 2 == 0)
                {
                    // Gesture results for bodies: 0, 2, 4
                    Grid.SetColumn(contentControl, 0);
                    Grid.SetRow(contentControl, col0Row);
                    ++col0Row;
                }
                else
                {
                    // Gesture results for bodies: 1, 3, 5
                    Grid.SetColumn(contentControl, 1);
                    Grid.SetRow(contentControl, col1Row);
                    ++col1Row;
                }

                this.contentGrid.Children.Add(contentControl);*/
            }

            prevDeleteButton.Click += deletePreviousSample;
            currentPhraseName.Text = phrase_list[current_phrase_index];

            String current_phrase = phrase_list[current_phrase_index];
            char[] delims = { '_' };
            String[] words = current_phrase.Split(delims);

            StringBuilder builder = new StringBuilder();
            foreach (string s in words)
            {
                builder.Append(s.ToLower()).Append(" ");
            }
            String cleanedPhrase = builder.ToString().TrimEnd(new char[] { ' ' });
            cleanedPhrase += ".png";
            //Console.WriteLine("!!!!!!!!!!!!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" + cleanedPhrase);

            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.UriSource = new Uri(System.IO.Path.Combine(
                @"C:\Users\aslr\Documents\GitHub\SignLanguageRecognition\phrase-sampler-2.0\phrase_images", cleanedPhrase));
            image.EndInit();
            phraseImage.Source = image;

            phrase_name = phrase_list[current_phrase_index];
            /*clientInterface.sendData("new_phrase");
            clientInterface.sendData(phrase_name);*/

            //String mainDir = System.IO.Path.Combine(@"C:\Users\aslr\Documents\aslr-data", phrase_name);
            //String colorDir = System.IO.Path.Combine(mainDir, "color");
            //String depthDir = System.IO.Path.Combine(mainDir, "depth");
            //Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& " + kinect.DepthStream.FrameWidth);\

            mainDir = System.IO.Path.Combine(dataWritePath, phrase_name);
            //String colorDir = System.IO.Path.Combine(mainDir, "color");
            //String depthDir = System.IO.Path.Combine(mainDir, "depth");
            System.IO.Directory.CreateDirectory(mainDir);
            //System.IO.Directory.CreateDirectory(colorDir);
            //System.IO.Directory.CreateDirectory(depthDir);

            //System.IO.Directory.CreateDirectory(mainDir);
            //System.IO.Directory.CreateDirectory(colorDir);
            //System.IO.Directory.CreateDirectory(depthDir);

            colorFrameWriter.setCurrentPhrase(phrase_name);
            depthFrameWriter.setCurrentPhrase(phrase_name);
            jointDataWriter.setCurrentPhrase(phrase_name);
        }