private void comboBoxActionSelector_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (treeViewCategories.SelectedNode == null)
                return;

            selectedTreeNode.BackColor = Color.Transparent;
            selectedTreeNode = treeViewCategories.SelectedNode;

            switch (comboBoxActionSelector.SelectedIndex)
            {
                case 0: // NOT SELECTED ACTION --> view state
                    _formState = CategoryEditorStateEnum.VIEW;
                    buttonDeleteCategory.Enabled = false;
                    buttonSaveChanges.Enabled = false;
                    ActivateInputFields(false);
                    ClearForm();
                    break;
                case 1: // ADD NEW CATEGORY
                    _formState = CategoryEditorStateEnum.ADD;
                    buttonDeleteCategory.Enabled = false;
                    ActivateInputFields(true);
                    buttonSaveChanges.Enabled = true;
                    ClearForm();
                    break;
                case 2: // EDIT category
                    _formState = CategoryEditorStateEnum.EDIT;
                    FillFormWithSelectedNodeData();            
                    buttonDeleteCategory.Enabled = false;
                    buttonSaveChanges.Enabled = true;
                    ActivateInputFields(true);       
                    break;
                case 3: // DELETE category
                    _formState = CategoryEditorStateEnum.EDIT; // delete is also category's edit state
                    FillFormWithSelectedNodeData();
                    buttonDeleteCategory.Enabled = true;
                    buttonSaveChanges.Enabled = false;
                    ActivateInputFields(false);
                    break;
            }

            if (_formState != CategoryEditorStateEnum.VIEW)
                selectedTreeNode.BackColor = Color.OrangeRed;
            
            return;
        }
        private void AddTreeNodeSiblingFromForm(TreeNode node)
        {
            if (NodeNameExistInSiblings(node))
                return;

            // ELSE:

            buttonSaveChanges.Enabled = false;

            try
            {
                int parentId = int.Parse(node.ToolTipText);

                if (_formState == CategoryEditorStateEnum.ADD)
                {
                    // add the node to tree
                    Form_CategoriesManager.newNode = node.Nodes.Add(textBoxCategoryNameHebrew.Text);

                    FillFromFormAndSaveToDB(parentId);

                    // fetching the new Category from DB to get its CatId
                    _linqLookupCategoryTableRow = (from c in Db.Table_LookupCategories
                                                   where c.CatHebrewName.Contains(textBoxCategoryNameHebrew.Text)
                                                   select c).Single();

                    newNode.ToolTipText = _linqLookupCategoryTableRow.CatId.ToString();
                    
                    _formState = CategoryEditorStateEnum.EDIT;
                }
                else if (_formState == CategoryEditorStateEnum.EDIT)
                {
                    FillFromFormAndSaveToDB(parentId);
                    selectedTreeNode.Text = textBoxCategoryNameHebrew.Text;
                }
            }
            catch (Exception ex)
            {
                buttonSaveChanges.Enabled = true;
                MessageBox.Show(ex.Message ,  "חלה שגיאה בהוספת קטגוריה" , MessageBoxButtons.OK , MessageBoxIcon.Error);
            }            
        }
        private void ResetForm(bool rebuildTreeView)
        {
            if (rebuildTreeView)
            {
                this.treeViewCategories.Nodes.Clear();

                this.treeViewCategories = PopulateRootLevel();

                if (treeViewCategories.Nodes.Count == 0)
                {
                    // this should never occur !!
                    this.treeViewCategories.Nodes.Add("אין קטגוריות");
                }

                Form_CategoriesManager.selectedTreeNode = this.treeViewCategories.Nodes[0];

                this.treeViewCategories.Refresh();
            }

            ClearForm();
            buttonDeleteCategory.Enabled = false;
            buttonSaveChanges.Enabled = false;

            radioButtonAddNewCat.Checked = false;
            radioButtonDelCat.Checked = false;
            radioButtonEditCat.Checked = false;
            comboBoxActionSelector.SelectedIndex = 0;
            _formState = CategoryEditorStateEnum.VIEW;
            selectedTreeNode = treeViewCategories.Nodes[0];
            selectedTreeNode.Expand();
        }
        private void ResetForm(bool rebuildTreeView)
        {
            if (rebuildTreeView)
            {
                this.treeViewCategories.Nodes.Clear();

                this.treeViewCategories = PopulateRootLevel();

                if (treeViewCategories.Nodes.Count == 0)
                    this.treeViewCategories.Nodes.Add("אין קטגוריות");

                Form_CategoriesManager.selectedTreeNode = this.treeViewCategories.Nodes[0];

                this.treeViewCategories.Refresh();
            }

            textBoxKeys.Text = "";
            textBoxTags.Text = "";
            textBoxCategoryNameHebrew.Text = "";
            textBoxCategoryNameEnglish.Text = "";
            listBoxRelatedCategories.Items.Clear();
            checkBoxEnableDelete.Checked = false;
            checkBoxEnableDelete.Enabled = false;
            buttonDeleteCategory.Enabled = false;
            buttonSaveChanges.Enabled = false;
            _formState = CategoryEditorStateEnum.VIEW;
        }
        private void ToolStripMenuItemAddCategory_Click(object sender, EventArgs e)
        {
            _formState = CategoryEditorStateEnum.ADD;

            this.buttonSaveChanges.Enabled = true;
            
            // clear KEYS
            this.textBoxKeys.Text = "";
            // clear TAGS
            this.textBoxTags.Text = "";
            // clear RELATED CATEGORIES
            this.listBoxRelatedCategories.Items.Clear();

            this.textBoxCategoryNameEnglish.Text = "";
            this.textBoxCategoryNameHebrew.Text = "";

            //enabled only explicitly
            this.checkBoxEnableDelete.Enabled = false;
            this.buttonDeleteCategory.Enabled = false;            
        }
        private void ToolStripMenuItemEditCategory_Click(object sender, EventArgs e)
        {
            selectedTreeNode = treeViewCategories.Nodes[0];

            if (selectedTreeNode.ToolTipText == "-1") 
                return;

            _formState = CategoryEditorStateEnum.EDIT;

            try
            {
                _linqLookupCategoryTableRow = (from c in _db.Table_LookupCategories
                                               where c.CatId == int.Parse(selectedTreeNode.ToolTipText)
                                               select c).Single();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            this.buttonSaveChanges.Enabled = true;
            
            // fetch KEYS
            this.textBoxKeys.Text = _linqLookupCategoryTableRow.Description;
            // fetch TAGS
            this.textBoxTags.Text = _linqLookupCategoryTableRow.MetaTags;
            // fetch RELATED CATEGORIES
            
            listBoxRelatedCategories.Items.Clear();
            if (_linqLookupCategoryTableRow.RelatedCatIds != null)
            {
                string[] relatedCategoriesIds = _linqLookupCategoryTableRow.RelatedCatIds.Split('#');

                foreach (string item in relatedCategoriesIds)
                {
                    try
                    {
                        string relatedCatStr = (from c in _db.Table_LookupCategories
                                                where c.CatId == int.Parse(item.Trim('#',' '))
                                                select c.CatHebrewName).Single();

                        listBoxRelatedCategories.Items.Add(relatedCatStr);
                    }
                    catch
                    {
                    }
                }
            }
            this.textBoxCategoryNameEnglish.Text = _linqLookupCategoryTableRow.CatEnglishName;
            this.textBoxCategoryNameHebrew.Text = _linqLookupCategoryTableRow.CatHebrewName; 

            this.buttonSaveChanges.Enabled = true;

            // only for delete need explicitly enabled
            this.checkBoxEnableDelete.Enabled = true;
            this.checkBoxEnableDelete.Checked = false;
            this.buttonDeleteCategory.Enabled = false;
        }
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        { // delete radio button
            if (selectedTreeNode == null)
            {
                radioButton1.Checked = false;
                return;
            }
            
            bool isChecked = radioButton1.Checked;

            if (isChecked)
            {
                _formState = CategoryEditorStateEnum.EDIT;
                FillFormWithSelectedNodeData();
            }
            buttonDeleteCategory.Enabled = isChecked ;
            buttonSaveChanges.Enabled = !isChecked ;
            ActivateInputFields(!isChecked);
        }
        private void radioButtonAddNewCategory_CheckedChanged(object sender, EventArgs e)
        {
            bool isChecked = radioButtonAddNewCategory.Checked;

            //if (selectedTreeNode == null)
            //    selectedTreeNode = treeViewCategories.Nodes[0];
            
            if (isChecked)
            {
                _formState = CategoryEditorStateEnum.ADD;                
            }
            buttonDeleteCategory.Enabled = !isChecked;
            ActivateInputFields(isChecked);
            buttonSaveChanges.Enabled = isChecked;
            ClearForm();
        }