/// <summary>
        /// SaveTabData saves the Tab to the Database
        /// </summary>
        /// <param name="action">The action to perform "edit" or "add"</param>
        /// <history>
        ///     [cnurse]	9/10/2004	Updated to reflect design changes for Help, 508 support
        ///                       and localisation
        /// </history>
        public int SaveTabData(string action)
        {
            EventLogController objEventLog = new EventLogController();

            string strIcon = ctlIcon.Url;

            TabController objTabs = new TabController();

            TabInfo objTab = new TabInfo();

            objTab.TabID          = TabId;
            objTab.PortalID       = PortalId;
            objTab.TabName        = txtTabName.Text;
            objTab.Title          = txtTitle.Text;
            objTab.Description    = txtDescription.Text;
            objTab.KeyWords       = txtKeyWords.Text;
            objTab.IsVisible      = !chkHidden.Checked;
            objTab.DisableLink    = chkDisableLink.Checked;
            objTab.ParentId       = int.Parse(cboTab.SelectedItem.Value);
            objTab.IconFile       = strIcon;
            objTab.IsDeleted      = false;
            objTab.Url            = ctlURL.Url;
            objTab.TabPermissions = dgPermissions.Permissions;
            objTab.SkinSrc        = ctlSkin.SkinSrc;
            objTab.ContainerSrc   = ctlContainer.SkinSrc;
            objTab.TabPath        = Globals.GenerateTabPath(objTab.ParentId, objTab.TabName);
            if (!String.IsNullOrEmpty(txtStartDate.Text))
            {
                objTab.StartDate = Convert.ToDateTime(txtStartDate.Text);
            }
            else
            {
                objTab.StartDate = Null.NullDate;
            }
            if (!String.IsNullOrEmpty(txtEndDate.Text))
            {
                objTab.EndDate = Convert.ToDateTime(txtEndDate.Text);
            }
            else
            {
                objTab.EndDate = Null.NullDate;
            }
            int refreshInt;

            if (txtRefreshInterval.Text.Length > 0 && Int32.TryParse(txtRefreshInterval.Text, out refreshInt))
            {
                objTab.RefreshInterval = Convert.ToInt32(txtRefreshInterval.Text);
            }
            objTab.PageHeadText = txtPageHeadText.Text;

            if (action == "edit")
            {
                // trap circular tab reference
                if (objTab.TabID != int.Parse(cboTab.SelectedItem.Value) && !IsCircularReference(int.Parse(cboTab.SelectedItem.Value)))
                {
                    objTabs.UpdateTab(objTab);
                    objEventLog.AddLog(objTab, PortalSettings, UserId, "", EventLogController.EventLogType.TAB_UPDATED);
                }
            }
            else // add or copy
            {
                objTab.TabID = objTabs.AddTab(objTab);
                objEventLog.AddLog(objTab, PortalSettings, UserId, "", EventLogController.EventLogType.TAB_CREATED);

                if (int.Parse(cboCopyPage.SelectedItem.Value) != -1)
                {
                    ModuleController objModules = new ModuleController();

                    foreach (DataGridItem objDataGridItem in grdModules.Items)
                    {
                        CheckBox chkModule = (CheckBox)objDataGridItem.FindControl("chkModule");
                        if (chkModule.Checked)
                        {
                            int intModuleID = Convert.ToInt32(grdModules.DataKeys[objDataGridItem.ItemIndex]);
                            //RadioButton optNew = (RadioButton)objDataGridItem.FindControl( "optNew" );
                            RadioButton optCopy      = (RadioButton)objDataGridItem.FindControl("optCopy");
                            RadioButton optReference = (RadioButton)objDataGridItem.FindControl("optReference");
                            TextBox     txtCopyTitle = (TextBox)objDataGridItem.FindControl("txtCopyTitle");

                            ModuleInfo objModule = objModules.GetModule(intModuleID, Int32.Parse(cboCopyPage.SelectedItem.Value), false);
                            if (objModule != null)
                            {
                                if (!optReference.Checked)
                                {
                                    objModule.ModuleID = Null.NullInteger;
                                }

                                objModule.TabID       = objTab.TabID;
                                objModule.ModuleTitle = txtCopyTitle.Text;
                                objModule.ModuleID    = objModules.AddModule(objModule);

                                if (optCopy.Checked)
                                {
                                    if (!String.IsNullOrEmpty(objModule.BusinessControllerClass))
                                    {
                                        object objObject = Reflection.CreateObject(objModule.BusinessControllerClass, objModule.BusinessControllerClass);
                                        if (objObject is IPortable)
                                        {
                                            try
                                            {
                                                string Content = Convert.ToString(((IPortable)objObject).ExportModule(intModuleID));
                                                if (!String.IsNullOrEmpty(Content))
                                                {
                                                    ((IPortable)objObject).ImportModule(objModule.ModuleID, Content, objModule.Version, UserInfo.UserID);
                                                }
                                            }
                                            catch (Exception exc)
                                            {
                                                // the export/import operation failed
                                                Exceptions.ProcessModuleLoadException(this, exc);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    // create the page from a template
                    if (cboTemplate.SelectedItem != null)
                    {
                        if (!String.IsNullOrEmpty(cboTemplate.SelectedItem.Value))
                        {
                            // open the XML file
                            try
                            {
                                XmlDocument xmlDoc = new XmlDocument();
                                xmlDoc.Load(cboTemplate.SelectedItem.Value);
                                PortalController objPortals = new PortalController();
                                objPortals.ParsePanes(xmlDoc.SelectSingleNode("//portal/tabs/tab/panes"), objTab.PortalID, objTab.TabID, PortalTemplateModuleAction.Ignore, new Hashtable());
                            }
                            catch
                            {
                                // error opening page template
                            }
                        }
                    }
                }
            }

            // url tracking
            UrlController objUrls = new UrlController();

            objUrls.UpdateUrl(PortalId, ctlURL.Url, ctlURL.UrlType, 0, Null.NullDate, Null.NullDate, ctlURL.Log, ctlURL.Track, Null.NullInteger, ctlURL.NewWindow);

            return(objTab.TabID);
        }