/// <summary>
        /// Creates a new portal.
        /// </summary>
        /// <param name="PortalName">Name of the portal to be created</param>
        /// <param name="FirstName">Portal Administrator's first name</param>
        /// <param name="LastName">Portal Administrator's last name</param>
        /// <param name="Username">Portal Administrator's username</param>
        /// <param name="Password">Portal Administrator's password</param>
        /// <param name="Email">Portal Administrator's email</param>
        /// <param name="Description">Description for the new portal</param>
        /// <param name="KeyWords">KeyWords for the new portal</param>
        /// <param name="TemplatePath">Path where the templates are stored</param>
        /// <param name="TemplateFile">Template file</param>
        /// <param name="PortalAlias">Portal Alias String</param>
        /// <param name="ServerPath">The Path to the root of the Application</param>
        /// <param name="ChildPath">The Path to the Child Portal Folder</param>
        /// <param name="IsChildPortal">True if this is a child portal</param>
        /// <returns>PortalId of the new portal if there are no errors, -1 otherwise.</returns>
        /// <remarks>
        /// After the selected portal template is parsed the admin template ("admin.template") will be
        /// also processed. The admin template should only contain the "Admin" menu since it's the same
        /// on all portals. The selected portal template can contain a <settings/> node to specify portal
        /// properties and a <roles/> node to define the roles that will be created on the portal by default.
        /// </remarks>
        /// <history>
        /// 	[cnurse]	11/08/2004	created (most of this code was moved from SignUp.ascx.vb)
        /// </history>
        public int CreatePortal( string PortalName, string FirstName, string LastName, string Username, string Password, string Email, string Description, string KeyWords, string TemplatePath, string TemplateFile, string HomeDirectory, string PortalAlias, string ServerPath, string ChildPath, bool IsChildPortal )
        {
            FolderController objFolderController = new FolderController();
            string strMessage = Null.NullString;
            int AdministratorId = Null.NullInteger;
            UserInfo objAdminUser = new UserInfo();

            //Attempt to create a new portal
            int intPortalId = CreatePortal( PortalName, HomeDirectory );

            if( intPortalId != -1 )
            {
                if( HomeDirectory == "" )
                {
                    HomeDirectory = "Portals/" + intPortalId.ToString();
                }
                string MappedHomeDirectory = objFolderController.GetMappedDirectory( Globals.ApplicationPath + "/" + HomeDirectory + "/" );

                strMessage += CreateProfileDefinitions( intPortalId, TemplatePath, TemplateFile );
                if( strMessage == Null.NullString )
                {
                    // add administrator
                    try
                    {
                        objAdminUser.PortalID = intPortalId;
                        objAdminUser.FirstName = FirstName;
                        objAdminUser.LastName = LastName;
                        objAdminUser.Username = Username;
                        objAdminUser.DisplayName = FirstName + " " + LastName;
                        objAdminUser.Membership.Password = Password;
                        objAdminUser.Email = Email;
                        objAdminUser.IsSuperUser = false;
                        objAdminUser.Membership.Approved = true;

                        objAdminUser.Profile.FirstName = FirstName;
                        objAdminUser.Profile.LastName = LastName;

                        UserCreateStatus createStatus = UserController.CreateUser( ref objAdminUser );

                        if( createStatus == UserCreateStatus.Success )
                        {
                            AdministratorId = objAdminUser.UserID;
                        }
                        else
                        {
                            strMessage += UserController.GetUserCreateStatus( createStatus );
                        }
                    }
                    catch( Exception Exc )
                    {
                        strMessage += Localization.GetString( "CreateAdminUser.Error" ) + Exc.Message + Exc.StackTrace;
                    }
                }
                else
                {
                    throw new Exception( strMessage );
                }

                if( strMessage == "" & AdministratorId > 0 )
                {
                    try
                    {
                        // the upload directory may already exist if this is a new DB working with a previously installed application
                        if( Directory.Exists( MappedHomeDirectory ) )
                        {
                            Globals.DeleteFolderRecursive( MappedHomeDirectory );
                        }
                    }
                    catch( Exception Exc )
                    {
                        strMessage += Localization.GetString( "DeleteUploadFolder.Error" ) + Exc.Message + Exc.StackTrace;
                    }

                    //Set up Child Portal
                    if( strMessage == Null.NullString )
                    {
                        try
                        {
                            if( IsChildPortal )
                            {
                                // create the subdirectory for the new portal
                                if( !( Directory.Exists( ChildPath ) ) )
                                {
                                    Directory.CreateDirectory( ChildPath );
                                }

                                // create the subhost default.aspx file
                                if( !( File.Exists( ChildPath + "\\" + Globals.glbDefaultPage ) ) )
                                {
                                    File.Copy( Globals.HostMapPath + "subhost.aspx", ChildPath + "\\" + Globals.glbDefaultPage );
                                }
                            }
                        }
                        catch( Exception Exc )
                        {
                            strMessage += Localization.GetString( "ChildPortal.Error" ) + Exc.Message + Exc.StackTrace;
                        }
                    }
                    else
                    {
                        throw new Exception( strMessage );
                    }

                    if( strMessage == Null.NullString )
                    {
                        try
                        {
                            // create the upload directory for the new portal
                            Directory.CreateDirectory( MappedHomeDirectory );

                            // copy the default stylesheet to the upload directory
                            File.Copy( Globals.HostMapPath + "portal.css", MappedHomeDirectory + "portal.css" );

                            // process zip resource file if present
                            ProcessResourceFile( MappedHomeDirectory, TemplatePath + TemplateFile );
                        }
                        catch( Exception Exc )
                        {
                            strMessage += Localization.GetString( "ChildPortal.Error" ) + Exc.Message + Exc.StackTrace;
                        }
                    }
                    else
                    {
                        throw new Exception( strMessage );
                    }

                    if( strMessage == Null.NullString )
                    {
                        // parse portal template
                        try
                        {
                            ParseTemplate( intPortalId, TemplatePath, TemplateFile, AdministratorId, PortalTemplateModuleAction.Replace, true );
                        }
                        catch( Exception Exc )
                        {
                            strMessage += Localization.GetString( "PortalTemplate.Error" ) + Exc.Message + Exc.StackTrace;
                        }

                        // parse admin template
                        try
                        {
                            ParseTemplate( intPortalId, TemplatePath, "admin.template", AdministratorId, PortalTemplateModuleAction.Replace, true );
                        }
                        catch( Exception Exc )
                        {
                            strMessage += Localization.GetString( "AdminTemplate.Error" ) + Exc.Message + Exc.StackTrace;
                        }
                    }
                    else
                    {
                        throw new Exception( strMessage );
                    }

                    if( strMessage == Null.NullString )
                    {
                        // update portal setup
                        PortalInfo objportal = GetPortal( intPortalId );

                        // update portal info
                        objportal.Description = Description;
                        objportal.KeyWords = KeyWords;
                        UpdatePortalInfo( objportal.PortalID, objportal.PortalName, objportal.LogoFile, objportal.FooterText, objportal.ExpiryDate, objportal.UserRegistration, objportal.BannerAdvertising, objportal.Currency, objportal.AdministratorId, objportal.HostFee, objportal.HostSpace, objportal.PageQuota, objportal.UserQuota, objportal.PaymentProcessor, objportal.ProcessorUserId, objportal.ProcessorPassword, objportal.Description, objportal.KeyWords, objportal.BackgroundFile, objportal.SiteLogHistory, objportal.SplashTabId, objportal.HomeTabId, objportal.LoginTabId, objportal.UserTabId, objportal.DefaultLanguage, objportal.TimeZoneOffset, objportal.HomeDirectory );

                        //Update Administrators Locale/TimeZone
                        objAdminUser.Profile.PreferredLocale = objportal.DefaultLanguage;
                        objAdminUser.Profile.TimeZone = objportal.TimeZoneOffset;

                        //Save Admin User
                        UserController.UpdateUser( objportal.PortalID, objAdminUser );

                        //clear portal alias cache
                        DataCache.ClearHostCache( true );

                        // clear roles cache
                        DataCache.RemoveCache( "GetRoles" );

                        //Create Portal Alias
                        AddPortalAlias( intPortalId, PortalAlias );

                        // log installation event
                        try
                        {
                            LogInfo objEventLogInfo = new LogInfo();
                            objEventLogInfo.LogTypeKey = EventLogController.EventLogType.HOST_ALERT.ToString();
                            objEventLogInfo.LogTypeKey = EventLogController.EventLogType.HOST_ALERT.ToString();
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "Install Portal:", PortalName ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "FirstName:", FirstName ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "LastName:", LastName ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "Username:"******"Email:", Email ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "Description:", Description ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "Keywords:", KeyWords ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "TemplatePath:", TemplatePath ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "TemplateFile:", TemplateFile ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "HomeDirectory:", HomeDirectory ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "PortalAlias:", PortalAlias ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "ServerPath:", ServerPath ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "ChildPath:", ChildPath ) );
                            objEventLogInfo.LogProperties.Add( new LogDetailInfo( "IsChildPortal:", IsChildPortal.ToString() ) );
                            EventLogController objEventLog = new EventLogController();
                            objEventLog.AddLog( objEventLogInfo );
                        }
                        catch( Exception ex )
                        {
                            // error
                        }
                    }
                    else
                    {
                        throw new Exception( strMessage );
                    }
                }
                else // clean up
                {
                    DeletePortalInfo( intPortalId );
                    intPortalId = -1;
                    throw new Exception( strMessage );
                }
            }
            else
            {
                strMessage += Localization.GetString( "CreatePortal.Error" );
                throw new Exception( strMessage );
            }

            return intPortalId;
        }