/// <summary>
        /// Adds a context menu to a TreeNode control
        /// </summary>
        /// <param name="node">TreeNode where to add the context menu</param>
        /// <param name="form">Current application form</param>
        public static void AddContextMenu(TreeNode node, SiteMapEditor form)
        {
            var collec = (Dictionary<string, string>)node.Tag;

            HideAllContextMenuItems(form.nodeMenu);

            switch (node.Text.Split(' ')[0])
            {
                case "SiteMap":
                    {
                        form.addSystemAreaToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorSystem.Visible = true;
                        form.addAreaToolStripMenuItem.Visible = true;

                        form.toolStripSeparatorAction.Visible = true;
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled= true;

                        form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("SiteMap");
                    }
                    break;
                case "Area":
                    {
                        form.addGroupToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorSystem.Visible = true;
                        form.addSystemGroupToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorAction.Visible = true;
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled = true;
                        form.addDescriptionsToolStripMenuItem.Visible = true;
                        form.addDescriptionsToolStripMenuItem.Enabled = node.Nodes.Find("Descriptions", false).Length == 0;
                        form.addTitlesToolStripMenuItem.Visible = true;
                        form.addTitlesToolStripMenuItem.Enabled = node.Nodes.Find("Titles",false).Length == 0;

                        form.disableToolStripMenuItem.Visible = true;
                        form.disableToolStripMenuItem.Enabled = true;
                        form.disableToolStripMenuItem.Text = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;
                        form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Area");
                    }
                    break;
                case "Group":
                    {
                        form.addSystemSubAreaToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorSystem.Visible = true;
                        form.addSubAreaToolStripMenuItem.Visible = true;
                        form.addDescriptionsToolStripMenuItem.Visible = true;
                        form.addDescriptionsToolStripMenuItem.Enabled = node.Nodes.Find("Descriptions", false).Length == 0;
                        form.addTitlesToolStripMenuItem.Visible = true;
                        form.addTitlesToolStripMenuItem.Enabled = node.Nodes.Find("Titles", false).Length == 0;
                        form.toolStripSeparatorAction.Visible = true;
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled = true;

                        form.disableToolStripMenuItem.Visible = true;
                        form.disableToolStripMenuItem.Enabled = true;
                        form.disableToolStripMenuItem.Text = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;
                        form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Group");

                        foreach (TreeNode childNode in node.Nodes)
                        {
                            if (childNode.Text == "Descriptions")
                            {
                                form.addDescriptionsToolStripMenuItem.Enabled = false;
                                break;
                            }

                            if (childNode.Text == "Titles")
                            {
                                form.addTitlesToolStripMenuItem.Enabled = false;
                                break;
                            }
                        }
                    }
                    break;
                case "SubArea":
                    {
                        form.addPrivilegeToolStripMenuItem.Visible = true;
                        form.addDescriptionsToolStripMenuItem.Visible = true;
                        form.addDescriptionsToolStripMenuItem.Enabled = node.Nodes.Find("Descriptions", false).Length == 0;
                        form.addTitlesToolStripMenuItem.Visible = true;
                        form.addTitlesToolStripMenuItem.Enabled = node.Nodes.Find("Titles",false).Length == 0;
                        form.toolStripSeparatorAction.Visible = true;
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled = true;

                        form.disableToolStripMenuItem.Visible = true;
                        form.disableToolStripMenuItem.Enabled = true;
                        form.disableToolStripMenuItem.Text = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;
                        form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("SubArea");

                        foreach (TreeNode childNode in node.Nodes)
                        {
                            if (childNode.Text == "Titles")
                            {
                                form.addTitlesToolStripMenuItem.Enabled = false;
                                break;
                            }
                        }
                    }
                    break;
                case "Privilege":
                    {
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled = true;
                        form.toolStripSeparatorBeginOfEdition.Visible = false;

                        form.disableToolStripMenuItem.Visible = true;
                        form.disableToolStripMenuItem.Enabled = true;
                        form.disableToolStripMenuItem.Text = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                        form.toolStripSeparatorAction.Visible = true;
                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;
                    }
                    break;
                case "Titles":
                    {
                        form.addTitleToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorAction.Visible = true;
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled = true;

                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;
                        form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Titles");
                    }
                    break;
                case "Descriptions":
                    {
                        form.addDescriptionToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorAction.Visible = true;
                        form.deleteToolStripMenuItem.Visible = true;
                        form.deleteToolStripMenuItem.Enabled = true;

                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;
                        form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Descriptions");
                    }
                    break;
                case "Title":
                case "Description":
                    {
                        form.deleteToolStripMenuItem.Visible = true;
                        form.toolStripSeparatorAction.Visible = true;

                        form.toolStripSeparatorBeginOfEdition.Visible = false;
                        form.cutToolStripMenuItem.Enabled = true;
                        form.copyToolStripMenuItem.Enabled = true;

                        if (node.Parent != null && node.Parent.Nodes.Count == 1)
                            form.deleteToolStripMenuItem.Enabled = false;
                    }
                    break;
            }

            node.ContextMenuStrip = form.nodeMenu;
        }
        /// <summary>
        /// Adds a context menu to a TreeNode control
        /// </summary>
        /// <param name="node">TreeNode where to add the context menu</param>
        /// <param name="form">Current application form</param>
        public static void AddContextMenu(TreeNode node, SiteMapEditor form)
        {
            var collec = (Dictionary <string, string>)node.Tag;

            HideAllContextMenuItems(form.nodeMenu);

            switch (node.Text.Split(' ')[0])
            {
            case "SiteMap":
            {
                form.addSystemAreaToolStripMenuItem.Visible = true;
                form.toolStripSeparatorSystem.Visible       = true;
                form.addAreaToolStripMenuItem.Visible       = true;

                form.toolStripSeparatorAction.Visible = true;
                form.deleteToolStripMenuItem.Visible  = true;
                form.deleteToolStripMenuItem.Enabled  = true;

                form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("SiteMap");
            }
            break;

            case "Area":
            {
                form.addGroupToolStripMenuItem.Visible        = true;
                form.toolStripSeparatorSystem.Visible         = true;
                form.addSystemGroupToolStripMenuItem.Visible  = true;
                form.toolStripSeparatorAction.Visible         = true;
                form.deleteToolStripMenuItem.Visible          = true;
                form.deleteToolStripMenuItem.Enabled          = true;
                form.addDescriptionsToolStripMenuItem.Visible = true;
                form.addDescriptionsToolStripMenuItem.Enabled = node.Nodes.Find("Descriptions", false).Length == 0;
                form.addTitlesToolStripMenuItem.Visible       = true;
                form.addTitlesToolStripMenuItem.Enabled       = node.Nodes.Find("Titles", false).Length == 0;

                form.disableToolStripMenuItem.Visible = true;
                form.disableToolStripMenuItem.Enabled = true;
                form.disableToolStripMenuItem.Text    = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                form.cutToolStripMenuItem.Enabled   = true;
                form.copyToolStripMenuItem.Enabled  = true;
                form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Area");
            }
            break;

            case "Group":
            {
                form.addSystemSubAreaToolStripMenuItem.Visible = true;
                form.toolStripSeparatorSystem.Visible          = true;
                form.addSubAreaToolStripMenuItem.Visible       = true;
                form.addDescriptionsToolStripMenuItem.Visible  = true;
                form.addDescriptionsToolStripMenuItem.Enabled  = node.Nodes.Find("Descriptions", false).Length == 0;
                form.addTitlesToolStripMenuItem.Visible        = true;
                form.addTitlesToolStripMenuItem.Enabled        = node.Nodes.Find("Titles", false).Length == 0;
                form.toolStripSeparatorAction.Visible          = true;
                form.deleteToolStripMenuItem.Visible           = true;
                form.deleteToolStripMenuItem.Enabled           = true;

                form.disableToolStripMenuItem.Visible = true;
                form.disableToolStripMenuItem.Enabled = true;
                form.disableToolStripMenuItem.Text    = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                form.cutToolStripMenuItem.Enabled   = true;
                form.copyToolStripMenuItem.Enabled  = true;
                form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Group");

                foreach (TreeNode childNode in node.Nodes)
                {
                    if (childNode.Text == "Descriptions")
                    {
                        form.addDescriptionsToolStripMenuItem.Enabled = false;
                        break;
                    }

                    if (childNode.Text == "Titles")
                    {
                        form.addTitlesToolStripMenuItem.Enabled = false;
                        break;
                    }
                }
            }
            break;

            case "SubArea":
            {
                form.addPrivilegeToolStripMenuItem.Visible    = true;
                form.addDescriptionsToolStripMenuItem.Visible = true;
                form.addDescriptionsToolStripMenuItem.Enabled = node.Nodes.Find("Descriptions", false).Length == 0;
                form.addTitlesToolStripMenuItem.Visible       = true;
                form.addTitlesToolStripMenuItem.Enabled       = node.Nodes.Find("Titles", false).Length == 0;
                form.toolStripSeparatorAction.Visible         = true;
                form.deleteToolStripMenuItem.Visible          = true;
                form.deleteToolStripMenuItem.Enabled          = true;

                form.disableToolStripMenuItem.Visible = true;
                form.disableToolStripMenuItem.Enabled = true;
                form.disableToolStripMenuItem.Text    = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                form.cutToolStripMenuItem.Enabled   = true;
                form.copyToolStripMenuItem.Enabled  = true;
                form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("SubArea");

                foreach (TreeNode childNode in node.Nodes)
                {
                    if (childNode.Text == "Titles")
                    {
                        form.addTitlesToolStripMenuItem.Enabled = false;
                        break;
                    }
                }
            }
            break;

            case "Privilege":
            {
                form.deleteToolStripMenuItem.Visible          = true;
                form.deleteToolStripMenuItem.Enabled          = true;
                form.toolStripSeparatorBeginOfEdition.Visible = false;

                form.disableToolStripMenuItem.Visible = true;
                form.disableToolStripMenuItem.Enabled = true;
                form.disableToolStripMenuItem.Text    = collec.ContainsKey("_disabled") ? "Enable" : "Disable";

                form.toolStripSeparatorAction.Visible = true;
                form.cutToolStripMenuItem.Enabled     = true;
                form.copyToolStripMenuItem.Enabled    = true;
            }
            break;

            case "Titles":
            {
                form.addTitleToolStripMenuItem.Visible = true;
                form.toolStripSeparatorAction.Visible  = true;
                form.deleteToolStripMenuItem.Visible   = true;
                form.deleteToolStripMenuItem.Enabled   = true;

                form.cutToolStripMenuItem.Enabled   = true;
                form.copyToolStripMenuItem.Enabled  = true;
                form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Titles");
            }
            break;

            case "Descriptions":
            {
                form.addDescriptionToolStripMenuItem.Visible = true;
                form.toolStripSeparatorAction.Visible        = true;
                form.deleteToolStripMenuItem.Visible         = true;
                form.deleteToolStripMenuItem.Enabled         = true;

                form.cutToolStripMenuItem.Enabled   = true;
                form.copyToolStripMenuItem.Enabled  = true;
                form.pasteToolStripMenuItem.Enabled = form.clipboard.IsValidForPaste("Descriptions");
            }
            break;

            case "Title":
            case "Description":
            {
                form.deleteToolStripMenuItem.Visible  = true;
                form.toolStripSeparatorAction.Visible = true;

                form.toolStripSeparatorBeginOfEdition.Visible = false;
                form.cutToolStripMenuItem.Enabled             = true;
                form.copyToolStripMenuItem.Enabled            = true;

                if (node.Parent != null && node.Parent.Nodes.Count == 1)
                {
                    form.deleteToolStripMenuItem.Enabled = false;
                }
            }
            break;
            }

            node.ContextMenuStrip = form.nodeMenu;
        }
        /// <summary>
        /// Adds a new TreeNode to the parent object from the XmlNode information
        /// </summary>
        /// <param name="parentObject">Object (TreeNode or TreeView) where to add a new TreeNode</param>
        /// <param name="xmlNode">Xml node from the sitemap</param>
        /// <param name="form">Current application form</param>
        /// <param name="isDisabled"> </param>
        public static void AddTreeViewNode(object parentObject, XmlNode xmlNode, SiteMapEditor form, bool isDisabled = false)
        {
            TreeNode node = new TreeNode(xmlNode.Name);

            Dictionary<string, string> attributes = new Dictionary<string, string>();

            foreach (XmlAttribute attr in xmlNode.Attributes)
            {
                attributes.Add(attr.Name, attr.Value);
            }

            if (xmlNode.Attributes["Id"] != null)
            {
                node.Text += " (" + xmlNode.Attributes["Id"].Value + ")";
            }
            if (xmlNode.Attributes["LCID"] != null)
            {
                node.Text += " (" + xmlNode.Attributes["LCID"].Value + ")";
            }

            node.Name = node.Text.Replace(" ", "");

            if (isDisabled)
            {
                node.ToolTipText =
                    "This node is disabled and won't appear in Microsoft Dynamics CRM 2011. Right click this node and enable it and make it appear on Microsoft Dynamics CRM 2011";
                node.ForeColor = Color.Gray;
                node.Text += " - disabled";
                attributes.Add("_disabled", "true");
            }

            node.Tag = attributes;

            AddContextMenu(node, form);

            if (parentObject is TreeView)
            {
                ((TreeView)parentObject).Nodes.Add(node);
            }
            else if (parentObject is TreeNode)
            {
                ((TreeNode)parentObject).Nodes.Add(node);
            }
            else
            {
                throw new Exception("AddTreeViewNode: Unsupported control type");
            }

            foreach (XmlNode childNode in xmlNode.ChildNodes)
            {
                if (childNode.NodeType != XmlNodeType.Comment)
                {
                    AddTreeViewNode(node, childNode, form);
                }
                else
                {
                    var commentDoc = new XmlDocument();
                    commentDoc.LoadXml(childNode.InnerText);

                    AddTreeViewNode(node, commentDoc.DocumentElement, form, true);
                }
            }
        }
        /// <summary>
        /// Adds a new TreeNode to the parent object from the XmlNode information
        /// </summary>
        /// <param name="parentObject">Object (TreeNode or TreeView) where to add a new TreeNode</param>
        /// <param name="xmlNode">Xml node from the sitemap</param>
        /// <param name="form">Current application form</param>
        /// <param name="isDisabled"> </param>
        public static void AddTreeViewNode(object parentObject, XmlNode xmlNode, SiteMapEditor form, bool isDisabled = false)
        {
            TreeNode node = new TreeNode(xmlNode.Name);

            Dictionary <string, string> attributes = new Dictionary <string, string>();

            if (xmlNode.NodeType != XmlNodeType.Text)
            {
                foreach (XmlAttribute attr in xmlNode.Attributes)
                {
                    attributes.Add(attr.Name, attr.Value);
                }

                if (xmlNode.Attributes["Id"] != null)
                {
                    node.Text += " (" + xmlNode.Attributes["Id"].Value + ")";
                }
                if (xmlNode.Attributes["LCID"] != null)
                {
                    node.Text += " (" + xmlNode.Attributes["LCID"].Value + ")";
                }
                if (node.Text.ToLower() == "comment")
                {
                    node.Text = string.Format("# - {0}", xmlNode.InnerText);
                }
            }
            else
            {
                node.Text = String.Format("# {0}", xmlNode.InnerText);
            }

            node.Name = node.Text.Replace(" ", "");

            if (isDisabled)
            {
                if (node.Text.StartsWith("#"))
                {
                    node.ToolTipText = "This is a comment in SiteMap";
                }
                else
                {
                    node.ToolTipText =
                        "This node is disabled and won't appear in Microsoft Dynamics CRM 2011. Right click this node and enable it and make it appear on Microsoft Dynamics CRM 2011";
                    node.Text += " - disabled";
                    attributes.Add("_disabled", "true");
                }
                node.ForeColor = Color.Gray;
            }

            node.Tag = attributes;

            AddContextMenu(node, form);

            if (parentObject is TreeView)
            {
                ((TreeView)parentObject).Nodes.Add(node);
            }
            else if (parentObject is TreeNode)
            {
                ((TreeNode)parentObject).Nodes.Add(node);
            }
            else
            {
                throw new Exception("AddTreeViewNode: Unsupported control type");
            }

            foreach (XmlNode childNode in xmlNode.ChildNodes)
            {
                if (childNode.NodeType == XmlNodeType.Comment)
                {
                    var commentDoc = new XmlDocument();

                    try
                    {
                        commentDoc.LoadXml(childNode.InnerText);
                        AddTreeViewNode(node, commentDoc.DocumentElement, form, true);
                    }
                    catch
                    {
                        commentDoc.LoadXml("<comment>" + childNode.InnerText + "</comment>");

                        foreach (XmlNode commentChildNode in commentDoc.DocumentElement.ChildNodes)
                        {
                            AddTreeViewNode(node, commentChildNode, form, true);
                        }
                    }
                }
                else if (childNode.NodeType == XmlNodeType.Element)
                {
                    AddTreeViewNode(node, childNode, form);
                }
                else if (childNode.NodeType == XmlNodeType.Text)
                {
                    var tvChildNode = new TreeNode("#" + childNode.InnerText);
                    node.Nodes.Add(tvChildNode);
                }
            }
        }