/**
  * Prepare the parameters to execute the installation asynchronously
  * @return Hash A big hash array that can be converted to XML or JSON with all the needed parameters
  */
 protected function BuildConfig()
 {
     $sMode = $this->oWizard->GetParameter('install_mode', 'install');
     $aSelectedModules = json_decode($this->oWizard->GetParameter('selected_modules'), true);
     $sBackupDestination = '';
     $sPreviousConfigurationFile = '';
     $sDBName = $this->oWizard->GetParameter('db_name');
     if ($sMode == 'upgrade') {
         $sPreviousVersionDir = $this->oWizard->GetParameter('previous_version_dir', '');
         if (!empty($sPreviousVersionDir)) {
             $aPreviousInstance = SetupUtils::GetPreviousInstance($sPreviousVersionDir);
             if ($aPreviousInstance['found']) {
                 $sPreviousConfigurationFile = $aPreviousInstance['configuration_file'];
             }
         }
         if ($this->oWizard->GetParameter('db_backup', false)) {
             $sBackupDestination = $this->oWizard->GetParameter('db_backup_path', '');
         }
     } else {
         $sDBNewName = $this->oWizard->GetParameter('db_new_name', '');
         if ($sDBNewName != '') {
             $sDBName = $sDBNewName;
             // Database will be created
         }
     }
     $sSourceDir = $this->oWizard->GetParameter('source_dir');
     $aCopies = array();
     if ($sMode == 'upgrade' && $this->oWizard->GetParameter('upgrade_type') == 'keep-previous') {
         $sPreviousVersionDir = $this->oWizard->GetParameter('previous_version_dir');
         $aCopies[] = array('source' => $sSourceDir, 'destination' => 'modules');
         // Source is an absolute path, destination is relative to APPROOT
         $aCopies[] = array('source' => $sPreviousVersionDir . '/portal', 'destination' => 'portal');
         // Source is an absolute path, destination is relative to APPROOT
         $sSourceDir = APPROOT . 'modules';
     }
     if ($sMode == 'upgrade') {
         // Copy the previous extensions, if any
         $sPreviousExtensionsDir = $this->oWizard->GetParameter('copy_extensions_from');
         if (is_dir($sPreviousExtensionsDir)) {
             // Copy the extensions one by one to merge them with the existing extensions in /extensions
             $aExtensions = glob($sPreviousExtensionsDir . '/*', GLOB_ONLYDIR);
             foreach ($aExtensions as $sDirPath) {
                 $sExtName = basename($sDirPath);
                 $aCopies[] = array('source' => $sDirPath, 'destination' => 'extensions/' . $sExtName);
                 // Source is an absolute path, destination is relative to APPROOT
             }
         }
     }
     $aInstallParams = array('mode' => $sMode, 'preinstall' => array('copies' => $aCopies), 'source_dir' => str_replace(APPROOT, '', $sSourceDir), 'datamodel_version' => $this->oWizard->GetParameter('datamodel_version'), 'previous_configuration_file' => $sPreviousConfigurationFile, 'extensions_dir' => 'extensions', 'target_env' => 'production', 'workspace_dir' => '', 'database' => array('server' => $this->oWizard->GetParameter('db_server'), 'user' => $this->oWizard->GetParameter('db_user'), 'pwd' => $this->oWizard->GetParameter('db_pwd'), 'name' => $sDBName, 'prefix' => $this->oWizard->GetParameter('db_prefix')), 'url' => $this->oWizard->GetParameter('application_url'), 'admin_account' => array('user' => $this->oWizard->GetParameter('admin_user'), 'pwd' => $this->oWizard->GetParameter('admin_pwd'), 'language' => $this->oWizard->GetParameter('admin_language')), 'language' => $this->oWizard->GetParameter('default_language'), 'selected_modules' => $aSelectedModules, 'sample_data' => $this->oWizard->GetParameter('sample_data', '') == 'yes' ? true : false, 'old_addon' => $this->oWizard->GetParameter('old_addon', false), 'options' => json_decode($this->oWizard->GetParameter('misc_options', '[]'), true));
     if ($sBackupDestination != '') {
         $aInstallParams['preinstall']['backup'] = array('destination' => $sBackupDestination, 'configuration_file' => $sPreviousConfigurationFile);
     }
     return $aInstallParams;
 }