HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/PvdBoogaard/indoorski.nl/backup/oude-site/marketing/admin/functions/settings.php
<?php
/**
* This file has the settings page in it.
*
* @version     $Id: settings.php,v 1.86 2008/03/05 04:49:32 chris Exp $
* @author Chris <chris@interspire.com>
*
* @package SendStudio
* @subpackage SendStudio_Functions
*/

/**
* Include the base sendstudio functions.
*/
require_once(dirname(__FILE__) . '/sendstudio_functions.php');

/**
* Class for the settings page. This simply prints out and handles processing. The API does all of the work.
*
* @package SendStudio
* @subpackage SendStudio_Functions
*/
class Settings extends SendStudio_Functions
{

	/**
	* PopupWindows
	* An array of popup windows used in this class. Used to work out what sort of header and footer to print.
	*
	* @see Process
	*
	* @var Array
	*/
	var $PopupWindows = array('sendpreviewdisplay', 'sendsmtppreviewdisplay', 'testbouncedisplay', 'showinfo', 'testbouncesettings');

	/**
	* Suppress Header and Footer for these actions
	*
	* @see Process
	*
	* @var Array
	*/
	var $SuppressHeaderFooter = array('sendpreview', 'testbouncesettings');

	/**
	* Constructor
	* Loads the language file.
	*
	* @see LoadLanguageFile
	*
	* @return Void Doesn't return anything.
	*/
	function Settings()
	{
		$this->LoadLanguageFile();
		$this->LoadLanguageFile('CharacterSets');
		$this->LoadLanguageFile('TimeZones');
		$this->LoadLanguageFile('Lists');
	}


	/**
	* Process
	* Does all the work.
	* Saves settings, Checks details, calls the API to save the actual settings and checks whether it worked or not.
	*
	* @see GetApi
	* @see API::Set
	* @see API::Save
	* @see GetLang
	* @see ParseTemplate
	* @see SendStudio_Functions::Process
	* @see SendTestPreview
	* @see Settings_API::CheckCron
	* @see Settings_API::UpdateCron
	*
	* @return Void Does all of the processing, doesn't return anything.
	*/
	function Process()
	{
		$action = (isset($_GET['Action'])) ? strtolower($_GET['Action']) : null;

		$user = &GetUser();
		$access = $user->HasAccess('System', 'System');

		$popup = (in_array($action, $this->PopupWindows)) ? true : false;

		if (!$access) {
			$this->DenyAccess();
			return;
		}

		$LK = false;


		switch ($action) {
			case 'addons':

				// we need a subaction & addon name.
				if (!isset($_GET['SubAction'])) {
					return $this->ShowSettingsPage();
				}

				if (!isset($_GET['Addon'])) {
					return $this->ShowSettingsPage();
				}

				require_once(SENDSTUDIO_BASE_DIRECTORY . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . 'interspire_addons.php');

				$post = array();
				if (!empty($_POST)) {
					$post = $_POST;
				}

				try {
					$allowed_sub_action = array('install', 'uninstall', 'enable', 'disable', 'upgrade', 'configure', 'savesettings');
					$subaction = $this->_getGETRequest('SubAction', '');

					if (!in_array(strtolower($subaction), $allowed_sub_action)) {
						FlashMessage(GetLang('Addon_Action_NotAllowed'), SS_FLASH_MSG_ERROR, 'index.php?Page=Settings&Tab=6');
						return;
					}

					$result = Interspire_Addons::Process($_GET['Addon'], $subaction, $post);
					if ($result === true) {
						FlashMessage(GetLang('Addon_Success_' . strtolower($_GET['SubAction'])), SS_FLASH_MSG_SUCCESS, 'index.php?Page=Settings&Tab=6');
						return;
					}
					if ($result === false || $result == null) {
						FlashMessage(GetLang('Addon_Failure_' . strtolower($_GET['SubAction'])), SS_FLASH_MSG_ERROR, 'index.php?Page=Settings&Tab=6');
						return;
					}
					echo $result;
				} catch (Exception $e) {
					$error = $e->GetMessage();
					FlashMessage($error, SS_FLASH_MSG_ERROR, 'index.php?Page=Settings&Tab=6');
				}
				return;
			break;

			case 'viewdisabled':
				$this->PrintHeader(true);
				$reporttype = (isset($_GET['Report'])) ? $_GET['Report'] : null;
				switch ($reporttype) {
					case 'autoresponder':
						$GLOBALS['Heading'] = GetLang('Autoresponders_Disabled_Heading');
						$GLOBALS['Intro'] = GetLang('Autoresponders_Disabled_Heading_Intro');

						$disabled_list = IEM::sessionGet('AutorespondersDisabled');

						$disabled_report = '';
						$var = GetLang('DisabledAutoresponder_Item');
						foreach ($disabled_list as $p => $details) {
							$disabled_report .= sprintf($var, $details['autorespondername'], $details['listname']) . "\n";
						}
					break;

					case 'newsletter':
						$GLOBALS['Heading'] = GetLang('Newsletters_Disabled_Heading');
						$GLOBALS['Intro'] = GetLang('Newsletters_Disabled_Heading_Intro');

						$disabled_list = IEM::sessionGet('NewslettersDisabled');

						$disabled_report = '';
						$var = GetLang('DisabledNewsletter_Item');
						foreach ($disabled_list as $p => $details) {
							$disabled_report .= sprintf($var, $details['newslettername']) . "\n";
						}
					break;
				}
				$GLOBALS['DisabledList'] = $disabled_report;
				$this->ParseTemplate('Settings_Disabled_Report');
				$this->PrintFooter(true);
			break;

			case 'systeminfo':
				$this->PrintHeader();
				$db = IEM::getDatabase();
				$GLOBALS['DatabaseVersion'] = $db->FetchOne('SELECT version() AS version');

				$GLOBALS['ProductVersion'] = GetLang('SENDSTUDIO_VERSION');
				$GLOBALS['ShowProd'] = empty($GLOBALS['ProductEdition']) ? 'none' : '';
				$charset = (isset($SENDSTUDIO_DEFAULTCHARSET)) ? $SENDSTUDIO_DEFAULTCHARSET : SENDSTUDIO_CHARSET;
				$GLOBALS['DefaultCharset'] = $charset;
				$GLOBALS['CharsetDescription'] = GetLang($charset);
				$GLOBALS['ServerTimeZone'] = SENDSTUDIO_SERVERTIMEZONE;
				$GLOBALS['ServerTimeZoneDescription'] = GetLang(SENDSTUDIO_SERVERTIMEZONE);
				$GLOBALS['ServerTime'] = date('r');
				$GLOBALS['PHPVersion'] = phpversion();
				$GLOBALS['ServerSoftware'] = htmlspecialchars($_SERVER["SERVER_SOFTWARE"], ENT_QUOTES, SENDSTUDIO_CHARSET);

				$GLOBALS['SafeModeEnabled'] = (SENDSTUDIO_SAFE_MODE) ? GetLang('Yes') : GetLang('No');

				$GLOBALS['ImapSupportFound'] = (function_exists('imap_open')) ? GetLang('Yes') : GetLang('No');

				$GLOBALS['CurlSupportFound'] = (function_exists('curl_init')) ? GetLang('Yes') : GetLang('No');

				$php_mods = $this->ParsePHPModules();

				$GLOBALS['GDVersion'] = GetLang('GD_NotDetected');
				if (Settings_API::GDEnabled() && $php_mods !== false) {
					$GLOBALS['GDVersion'] = $php_mods['gd']['GD Version'];
				}

				$GLOBALS['ModSecurity'] = GetLang('ModSecurity_Unknown');

				if (!is_numeric(strpos(php_sapi_name(), 'cgi')) && $php_mods !== false) {
					$apache_mods = $this->ParseApacheModules($php_mods);
					if (in_array('mod_security', $apache_mods)) {
						$GLOBALS['ModSecurity'] = GetLang('Yes');
					} else {
						$GLOBALS['ModSecurity'] = GetLang('No');
					}
				}
				$this->ParseTemplate('Settings_SystemInfo');
				$this->PrintFooter();
			break;

			case 'showinfo':
				$this->PrintHeader(true);
				phpinfo();
				$this->PrintFooter(true);
			break;

			case 'sendpreviewdisplay':
				$this->PrintHeader($popup);
				$this->SendTestPreviewDisplay('index.php?Page=Settings&Action=SendPreview', 'self.parent.getPreviewParameters()');
				$this->PrintFooter($popup);
			break;

			case 'sendsmtppreviewdisplay':
				$this->PrintHeader($popup);
				$this->SendTestPreviewDisplay('index.php?Page=Settings&Action=SendPreview', 'self.parent.getSMTPPreviewParameters()');
				$this->PrintFooter($popup);
			break;

			case 'sendpreview':
				$this->SendTestPreview();
			break;

			case 'testbouncedisplay':
				$this->PrintHeader($popup);
				$this->TestBounceSettingsDisplay();
				$this->PrintFooter($popup);
			break;

			case 'testbouncesettings':
				$this->TestBounceSettings();
			break;

			case 'save':
				if (empty($_POST)) {
					$this->ShowSettingsPage();
					break;
				}
				$api = $this->GetApi();
				$result = false;

				$errors = array();

				// Make sure that Contact email is filled in
				if (!isset($_POST['email_address']) || trim($_POST['email_address']) == '') {
					array_push($errors, GetLang('ErrorAlertMessage_BlankContactEmail'));
				}

				// Make sure that application name is filled in
				if (!isset($_POST['lng_applicationtitle']) || trim($_POST['lng_applicationtitle']) == '') {
					array_push($errors, GetLang('ErrorAlertMessage_BlankApplicationName'));
				}

				$agencyId = get_agency_license_variables();
				if(!empty($agencyId['agencyid'])) {
					$temp = IEM::requestGetPOST('lng_accountupgrademessage', '', 'trim');
					if (empty($temp)) {
						array_push($errors, GetLang('ErrorAlertMessage_BlankAccountUpgradeMessage'));
					}

					$temp = IEM::requestGetPOST('lng_freetrial_expiry_login', '', 'trim');
					if (empty($temp)) {
						array_push($errors, GetLang('ErrorAlertMessage_BlankExpiredLogin'));
					}
				}

				if ($api && count($errors) == 0) {
					do {
						$settings = array();

						// fix up the database settings first.
						$all_areas = $api->Areas;

						$LK = (isset($_POST['licensekey'])) ? $_POST['licensekey'] : false;

						if (defined('APPLICATION_SHOW_WHITELABEL_MENU') && constant('APPLICATION_SHOW_WHITELABEL_MENU')) {
							foreach ($all_areas['whitelabel'] as $area) {
								$val = IEM::requestGetPOST(strtolower($area), false);

								$temp = strtolower($area);
								switch ($temp) {
									// Special case for handling logo image
									case 'application_logo_image':
										$val = IEM::requestGetPOST('existing_app_logo_image', false);

										if (isset($_FILES['Application_Logo_Image']) && !empty($_FILES['Application_Logo_Image']['name'])) {
											if ($_FILES['Application_Logo_Image']['error'] != 0 || !@is_uploaded_file($_FILES['Application_Logo_Image']['tmp_name'])) {
												array_push($errors, GetLang('ErrorAlertMessage_ErrorApplicationLogoImage'));
												break 3;
											}

											if (!$this->IsImageFile(strtolower($_FILES['Application_Logo_Image']['name']))){
												array_push($errors, GetLang('ErrorAlertMessage_InvalidNameApplicationLogoImage'));
												break 3;
											}

											$uploadedFile = strtolower(basename($_FILES['Application_Logo_Image']['name']));
											$uploadedFile = preg_replace('/.*(\..*)$/', 'applicationlogo${1}', $uploadedFile);

											if(move_uploaded_file($_FILES['Application_Logo_Image']['tmp_name'], (TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile))) {
												@chmod(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile, 0666);
												$val = 'temp/' . $uploadedFile;
											}

											if (!$this->IsValidImageFile(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile, $_FILES['Application_Logo_Image']['type'])){
												@unlink(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile);
												array_push($errors, GetLang('ErrorAlertMessage_InvalidFormatApplicationLogoImage'));
												break 3;
											}
										}
									break;

									// Special case for handling favicon
									case 'application_favicon':
										$val = IEM::requestGetPOST('existing_app_favicon', false);

										if (isset($_FILES['Application_Favicon']) && !empty($_FILES['Application_Favicon']['name'])) {
											if ($_FILES['Application_Favicon']['error'] != 0 || !@is_uploaded_file($_FILES['Application_Favicon']['tmp_name'])) {
												array_push($errors, GetLang('ErrorAlertMessage_ErrorApplicationFavicon'));
												break 3;
											}

											if (!$this->IsIconFile(strtolower($_FILES['Application_Favicon']['name']))){
												array_push($errors, GetLang('ErrorAlertMessage_InvalidNameApplicationFavicon'));
												break 3;
											}

											$uploadedFile = 'favicon.ico';

											if(move_uploaded_file($_FILES['Application_Favicon']['tmp_name'], (TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile))) {
												@chmod(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile, 0666);
												$val = 'temp/' . $uploadedFile;
											}

											if (!$this->IsValidIconFile(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile, $_FILES['Application_Favicon']['type'])){
												@unlink(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . $uploadedFile);
												array_push($errors, GetLang('ErrorAlertMessage_InvalidFormatApplicationFavicon'));
												break 3;
											}
										}
									break;
								}

								$settings[$area] = $val;
							}
						}

						foreach ($all_areas['config'] as $area) {

							if (isset($_POST[strtolower($area)])) {
								$val = $_POST[strtolower($area)];
							} else {
								$val = false;
							}

							if ($area == 'DATABASE_USER') {
								if (isset($_POST['database_u'])) {
									$val = $_POST['database_u'];
								}
							}

							if ($area == 'DATABASE_PASS') {
								if (isset($_POST['database_p'])) {
									$val = $_POST['database_p'];
								}
							}

							if ($area == 'APPLICATION_URL') {
								if (substr($val, -1) == '/') {
									$val = substr($val, 0, -1);
								}
							}
							$settings[$area] = $val;
						}

						unset($all_areas['config']);
						unset($all_areas['whitelabel']);

						// look after all of the other settings now.
						foreach ($all_areas as $p => $area) {
							if (isset($_POST[strtolower($area)])) {
								$val = $_POST[strtolower($area)];
							} else {
								$val = false;
							}

							if ($area == 'BOUNCE_AGREEDELETE' && isset($_POST['bounce_process'])) {
								$val = 1;
							}

							if ($area == 'TEXTFOOTER') {
								$val = strip_tags($val);
							}

							if ($area == 'SMTP_USERNAME') {
								if (isset($_POST['smtp_u'])) {
									$val = $_POST['smtp_u'];
								}
							}

							if ($area == 'SMTP_PASSWORD') {
								if (isset($_POST['smtp_p'])) {
									$val = $_POST['smtp_p'];
								}
								$val = base64_encode($val);
							}

							if ($area == 'BOUNCE_PASSWORD') {
								if (isset($_POST['bounce_password'])) {
									$val = $_POST['bounce_password'];
								}
								$val = base64_encode($val);
							}

							$settings[$area] = $val;
						}

						// ----- Settings that cannot be changed
							$settings['DEFAULTCHARSET'] = SENDSTUDIO_DEFAULTCHARSET;
							if (!empty($settings['DEFAULTCHARSET'])) {
								$settings['DEFAULTCHARSET'] = 'UTF-8';
							}
						// -----

						// ----- Security settings
							$settings['SECURITY_WRONG_LOGIN_WAIT'] = intval($settings['SECURITY_WRONG_LOGIN_WAIT']);
							$settings['SECURITY_WRONG_LOGIN_THRESHOLD_COUNT'] = intval($settings['SECURITY_WRONG_LOGIN_THRESHOLD_COUNT']);
							$settings['SECURITY_WRONG_LOGIN_THRESHOLD_DURATION'] = intval($settings['SECURITY_WRONG_LOGIN_THRESHOLD_DURATION']) * 60;
							$settings['SECURITY_BAN_DURATION'] = intval($settings['SECURITY_BAN_DURATION']) * 60;

							if (!isset($_POST['security_wrong_login_wait_enable'])) {
								$settings['SECURITY_WRONG_LOGIN_WAIT'] = 0;
							}

							if (!isset($_POST['security_wrong_login_threshold_enable'])) {
								$settings['SECURITY_WRONG_LOGIN_THRESHOLD_COUNT'] = 0;
							}
						// -----

						$api->Set('Settings', $settings);

						$result = $api->Save();

						// Save warnings
						if ($result) {
							$tempRequestWarningsEnabled = IEM::requestGetPOST('credit_percentage_warnings_enable', array());
							$tempRequestWarningLevels = IEM::requestGetPOST('credit_percentage_warnings_level', array());
							$tempRequestWarnigSubjects = IEM::requestGetPOST('credit_percentage_warnings_subject', array());
							$tempRequestWarningEmails = IEM::requestGetPOST('credit_percentage_warnings_text', array());

							if (!empty($tempRequestWarningsEnabled) && !empty($tempRequestWarningLevels) && !empty($tempRequestWarningEmails)) {
								$tempRecords = array();
								foreach ($tempRequestWarningLevels as $index => $level) {
									$tempRecords[] = array(
										'enabled' => in_array($index, $tempRequestWarningsEnabled),
										'creditlevel' => $level,
										'aspercentage' => '1', // FIXME at this stage, only monthly credits warnings are available
										'emailsubject' => (isset($tempRequestWarnigSubjects[$index]) ? $tempRequestWarnigSubjects[$index] : ''),
										'emailcontents' => (isset($tempRequestWarningEmails[$index]) ? $tempRequestWarningEmails[$index] : '')
									);
								}

								$result = $api->SaveCreditWarnings($tempRecords);
							} else {
								$result = $api->SaveCreditWarnings(array());
							}

							unset($tempRequestWarningsEnabled);
							unset($tempRequestWarningLevels);
							unset($tempRequestWarningEmails);
						}
					} while(false);
				}

				$tabNum = ($_POST['tab_num'] && intval($_POST['tab_num'])) ? intval($_POST['tab_num']) : 1 ;

				if ($result) {
					FlashMessage(GetLang('SettingsSaved'), SS_FLASH_MSG_SUCCESS, 'index.php?Page=Settings&Tab='.$tabNum);
				} else {
					foreach ($errors as $error) {
						FlashMessage($error, SS_FLASH_MSG_ERROR);
					}

					FlashMessage(GetLang('SettingsNotSaved'), SS_FLASH_MSG_ERROR, 'index.php?Page=Settings&Tab='.$tabNum);
				}
			break;

			default:
				$this->ShowSettingsPage();
			break;
		}
	}

	/**
	 * ShowSettingsPage
	 * Prints out the settings page and pre-fills the form fields as much as it can.
	 *
	 * It will also show:
	 * - if there is a license key issue
	 * - if there is a problem with cron/scheduled tasks set up not working properly
	 * - if 'test mode' is enabled
	 * - if you disable attachments, it checks autoresponders to see if any need to be disabled
	 *
	 * @return Void Prints out the settings form, doesn't return anything.
	 */
	function ShowSettingsPage()
	{
		require_once(SENDSTUDIO_BASE_DIRECTORY . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . 'interspire_addons.php');
		$addonSystem = new Interspire_Addons();
		$addonStatus = $addonSystem->GetAvailableAddons();

		$this->PrintHeader();

		$tpl = GetTemplateSystem();

		$GLOBALS['Message'] = '';

		list($license_error, $msg) = sesion_start();

		$extra = '';

		if ($license_error) {
			$GLOBALS['Error'] = $msg;
			$GLOBALS['Message'] .= $this->ParseTemplate('ErrorMsg', true, false);
			$extra = '
				<script>
					$(function() {
						$("licensekey").select();
						$("licensekey").focus();
					});
				</script>
			';
			unset($GLOBALS['Error']);
		}

		if (!is_writable(SENDSTUDIO_INCLUDES_DIRECTORY . '/config.php')) {
			FlashMessage(sprintf(GetLang('ConfigFileNotWritable'), SENDSTUDIO_INCLUDES_DIRECTORY . '/config.php'), SS_FLASH_MSG_WARNING);
		}

		$api = $this->GetApi();
		$api->Load();

		$all_areas = $api->Areas;


		foreach ($all_areas['config'] as $k => $option) {
			$opt_name = 'SENDSTUDIO_' . $option;
			${$opt_name} = constant($opt_name);
		}


		unset($all_areas['config']);
		unset($all_areas['whitelabel']);

		foreach ($all_areas as $k => $option) {
			$opt_name = 'SENDSTUDIO_' . $option;
			${$opt_name} = constant($opt_name);
		}

		if (isset($SENDSTUDIO_FORCE_UNSUBLINK) && $SENDSTUDIO_FORCE_UNSUBLINK == 1) {
			$SENDSTUDIO_FORCE_UNSUBLINK = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_FORCE_UNSUBLINK)) {
			$SENDSTUDIO_FORCE_UNSUBLINK = '';
		}

		$cron_checked = false;
		if (isset($SENDSTUDIO_CRON_ENABLED) && $SENDSTUDIO_CRON_ENABLED == 1) {
			$SENDSTUDIO_CRON_ENABLED = ' CHECKED';
			$cron_checked = true;
		}

		if (!isset($SENDSTUDIO_CRON_ENABLED)) {
			$SENDSTUDIO_CRON_ENABLED = '';
		}

		$GLOBALS['Cron_ShowInfo'] = 'none';
		if ($cron_checked) {
			$GLOBALS['Cron_ShowInfo'] = '';
		}

		$ip_tracking = false;
		if (isset($SENDSTUDIO_IPTRACKING) && $SENDSTUDIO_IPTRACKING == 1) {
			$SENDSTUDIO_IPTRACKING = ' CHECKED';
			$ip_tracking = true;
		}

		if (!isset($SENDSTUDIO_IPTRACKING)) {
			$SENDSTUDIO_IPTRACKING = '';
		}

		if (isset($SENDSTUDIO_USEMULTIPLEUNSUBSCRIBE) && $SENDSTUDIO_USEMULTIPLEUNSUBSCRIBE == 1) {
			$SENDSTUDIO_USEMULTIPLEUNSUBSCRIBE = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_USEMULTIPLEUNSUBSCRIBE)) {
			$SENDSTUDIO_USEMULTIPLEUNSUBSCRIBE = '';
		}

		if (isset($SENDSTUDIO_CONTACTCANMODIFYEMAIL) && $SENDSTUDIO_CONTACTCANMODIFYEMAIL == 1) {
			$SENDSTUDIO_CONTACTCANMODIFYEMAIL = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_CONTACTCANMODIFYEMAIL)) {
			$SENDSTUDIO_CONTACTCANMODIFYEMAIL = '';
		}


		$send_test_mode = false;
		if (isset($SENDSTUDIO_SEND_TEST_MODE) && $SENDSTUDIO_SEND_TEST_MODE == 1) {
			$SENDSTUDIO_SEND_TEST_MODE = ' CHECKED';
			$send_test_mode = true;
		}

		if (!isset($SENDSTUDIO_SEND_TEST_MODE) && SENDSTUDIO_SEND_TEST_MODE == 1) {
			$SENDSTUDIO_SEND_TEST_MODE = ' CHECKED';
			$send_test_mode = true;
		}

		if (!isset($SENDSTUDIO_SEND_TEST_MODE)) {
			$SENDSTUDIO_SEND_TEST_MODE = '';
		}


		if ($SENDSTUDIO_SMTP_SERVER) {
			$GLOBALS['UseSMTP'] = ' CHECKED';
			$GLOBALS['DisplaySMTP'] = "'';";
		} else {
			$GLOBALS['UseDefaultMail'] = ' CHECKED';
			$GLOBALS['DisplaySMTP'] = 'none';
		}

		$GLOBALS['ShowCronInfo'] = 'none';
		$GLOBALS['CronRunTime'] = GetLang('CronRunTime_Never');
		$GLOBALS['CronRunTime_Explain'] = GetLang('CronRunTime_Explain');
		if ($SENDSTUDIO_CRON_ENABLED) {
			$GLOBALS['ShowCronInfo'] = '';
			$cron_ok = $api->Get('cronok');
			if ($cron_ok) {
				$cron_1 = $api->Get('cronrun1');
				$cron_2 = $api->Get('cronrun2');
				if (!$cron_1) {
					$GLOBALS['CronRunTime'] = GetLang('CronRunTime_Once');
				} else {
					$diff = $this->TimeDifference($cron_2 - $cron_1);
					$GLOBALS['CronRunTime'] = sprintf(GetLang('CronRunTime_Difference'), $diff);
				}
			}
		}

		$GLOBALS['Settings_CronOptionsList'] = '';

		/**
		 * The schedule stuff is a little different and comes from the database.
		 * Look at all of the options in the schedule
		 * as addons can defined their own schedules if they need to.
		 */
		$cron_schedule = $api->Get('Schedule');
		$cron_options = array_keys($cron_schedule);


		foreach ($cron_options as $p => $cron_option) {
			if ($cron_option == 'triggeremails_p') {
				$GLOBALS['Settings_CronOptionsList'] .= '<tr style="display:none;"><td><input type="hidden" name="cron_triggeremails_p" value="' . SENDSTUDIO_CRON_TRIGGEREMAILS_P . '" /></td></tr>';
				continue;
			}

			$opt_name = 'Cron_Options';
			$GLOBALS[$opt_name] = '';
			$settings_var = ${'SENDSTUDIO_CRON_' . strtoupper($cron_option)};

			$GLOBALS['Cron_Option_SelectName'] = 'cron_' . $cron_option;

			$GLOBALS['Cron_Option_Heading'] = GetLang('Cron_Option_'.$cron_option.'_Heading');




			foreach ($api->Get($cron_option . '_options') as $opt => $desc) {
				$selected = '';
				if ($opt == $settings_var) {
					$selected = ' SELECTED';
				}
				$GLOBALS[$opt_name] .= '<option value="' . $opt . '"' . $selected . '>' . GetLang('Cron_Option_' . $desc) . '</option>';
			}


			$GLOBALS['Cron_LastRun'] = $GLOBALS['Cron_NextRun'] = '';

			$last_run = $cron_schedule[$cron_option]['lastrun'];
			if ($last_run > 0) {
				$GLOBALS['Cron_LastRun'] = IEM::timeGetUserDisplayString(GetLang('Cron_DateFormat'), $last_run);
				if ($settings_var > 0) {
					$next_run = $last_run + ($settings_var * 60);
					$GLOBALS['Cron_NextRun'] = IEM::timeGetUserDisplayString(GetLang('Cron_DateFormat'), $next_run);
				} else {
					$GLOBALS['Cron_NextRun'] = GetLang('Cron_Option_Disabled');
				}
			} else {
				$GLOBALS['Cron_LastRun'] = GetLang('Cron_Option_HasNotRun');
			}

			// Skipping any problematic CRON schedule
			if (!defined('LNG_Cron_Option_'.$cron_option.'_Heading')) {
				continue;
			}

			$GLOBALS['Cron_Option_Heading'] = GetLang('Cron_Option_'.$cron_option.'_Heading');
			$GLOBALS['Settings_CronOptionsList'] .= $this->ParseTemplate('Settings_Cron_Option', true, false);
		}





		$GLOBALS['Imap_Selected'] = $GLOBALS['Pop3_Selected'] = '';
		if (!isset($SENDSTUDIO_BOUNCE_IMAP) && SENDSTUDIO_BOUNCE_IMAP == 1) {
			$GLOBALS['Imap_Selected'] = ' SELECTED ';
		} else {
			$GLOBALS['Pop3_Selected'] = ' SELECTED ';
		}

		if (isset($SENDSTUDIO_BOUNCE_IMAP) && $SENDSTUDIO_BOUNCE_IMAP == 1) {
			$GLOBALS['Imap_Selected'] = ' SELECTED ';
		} else {
			$GLOBALS['Pop3_Selected'] = ' SELECTED ';
		}

		if (!isset($SENDSTUDIO_BOUNCE_AGREEDELETE) && SENDSTUDIO_BOUNCE_AGREEDELETE == 1) {
			$SENDSTUDIO_BOUNCE_AGREEDELETE = ' CHECKED';
		}

		if (isset($SENDSTUDIO_BOUNCE_AGREEDELETE) && $SENDSTUDIO_BOUNCE_AGREEDELETE == 1) {
			$SENDSTUDIO_BOUNCE_AGREEDELETE = ' CHECKED';
			$GLOBALS['ProcessBounceChecked'] = ' CHECKED';
		} else {
			$GLOBALS['DisplayExtraMailSettings'] = 'none';
		}

		if (!isset($SENDSTUDIO_BOUNCE_AGREEDELETEALL) && SENDSTUDIO_BOUNCE_AGREEDELETEALL == 1) {
			$SENDSTUDIO_BOUNCE_AGREEDELETEALL = ' CHECKED';
		}

		if (isset($SENDSTUDIO_BOUNCE_AGREEDELETEALL) && $SENDSTUDIO_BOUNCE_AGREEDELETEALL == 1) {
			$SENDSTUDIO_BOUNCE_AGREEDELETEALL = ' CHECKED';
		}


		if ($SENDSTUDIO_BOUNCE_EXTRASETTINGS) {
			$GLOBALS['Bounce_ExtraSettings'] = ' CHECKED';
		} else {
			$GLOBALS['DisplayExtraMailSettings'] = 'none';
		}

		$allow_attachments = false;
		if (isset($SENDSTUDIO_ALLOW_ATTACHMENTS) && $SENDSTUDIO_ALLOW_ATTACHMENTS == 1) {
			$SENDSTUDIO_ALLOW_ATTACHMENTS = ' CHECKED';
			$allow_attachments = true;
		}
		if (!isset($SENDSTUDIO_ALLOW_ATTACHMENTS) && SENDSTUDIO_ALLOW_ATTACHMENTS == 1) {
			$SENDSTUDIO_ALLOW_ATTACHMENTS = ' CHECKED';
			$allow_attachments = true;
		}
		if (!isset($SENDSTUDIO_ALLOW_ATTACHMENTS)) {
			$SENDSTUDIO_ALLOW_ATTACHMENTS = '';
		}

		$GLOBALS['ShowAttachmentSize'] = 'none';
		if ($allow_attachments) {
			$GLOBALS['ShowAttachmentSize'] = "'';";
		}

		$embedded_images = false;
		if (isset($SENDSTUDIO_ALLOW_EMBEDIMAGES) && $SENDSTUDIO_ALLOW_EMBEDIMAGES == 1) {
			$embedded_images = true;
			$SENDSTUDIO_ALLOW_EMBEDIMAGES = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_ALLOW_EMBEDIMAGES) && SENDSTUDIO_ALLOW_EMBEDIMAGES == 1) {
			$embedded_images = true;
			$SENDSTUDIO_ALLOW_EMBEDIMAGES = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_ALLOW_EMBEDIMAGES)) {
			$SENDSTUDIO_ALLOW_EMBEDIMAGES = '';
		}

		// this option is hidden by the embedded_images check but we should remember the 'state' in case the admin turns off embedded images and then turns it back on.
		if (isset($SENDSTUDIO_DEFAULT_EMBEDIMAGES) && $SENDSTUDIO_DEFAULT_EMBEDIMAGES == 1) {
			$SENDSTUDIO_DEFAULT_EMBEDIMAGES = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_DEFAULT_EMBEDIMAGES) && SENDSTUDIO_DEFAULT_EMBEDIMAGES == 1) {
			$SENDSTUDIO_DEFAULT_EMBEDIMAGES = ' CHECKED';
		}

		if (!isset($SENDSTUDIO_DEFAULT_EMBEDIMAGES)) {
			$SENDSTUDIO_DEFAULT_EMBEDIMAGES = '';
		}

		$GLOBALS['ShowDefaultEmbeddedImages'] = 'none';
		if ($embedded_images) {
			$GLOBALS['ShowDefaultEmbeddedImages'] = "'';";
		}

		/**
		* Now we have worked out the logic of what options are pre-filled,
		* we'll just set up the variables ready for the template system to use everything.
		*/

		$disabled_functions = explode(',', SENDSTUDIO_DISABLED_FUNCTIONS);
		$php_binary = 'php';
		if (substr(strtolower(PHP_OS), 0, 3) == 'win') {
			$php_binary = 'php.exe';
		}
		$php_path = $this->Which($php_binary);

		// If we can't find the full path, just print the binary so people get the right idea.
		if ($php_path == '') {
			$php_path = $php_binary;
		}
		$php_path .= ' -f ';

		$GLOBALS['CronPath'] = $php_path . SENDSTUDIO_BASE_DIRECTORY . DIRECTORY_SEPARATOR . 'cron' . DIRECTORY_SEPARATOR . 'cron.php';

		$GLOBALS['DatabaseType'] = $SENDSTUDIO_DATABASE_TYPE;
		$GLOBALS['DatabaseUser'] = $SENDSTUDIO_DATABASE_USER;
		$GLOBALS['DatabaseHost'] = $SENDSTUDIO_DATABASE_HOST;
		$GLOBALS['DatabasePass'] = $SENDSTUDIO_DATABASE_PASS;
		$GLOBALS['DatabaseName'] = $SENDSTUDIO_DATABASE_NAME;
		$GLOBALS['DatabaseTablePrefix'] = $SENDSTUDIO_TABLEPREFIX;
		$GLOBALS['ApplicationURL'] = $SENDSTUDIO_APPLICATION_URL;
		$GLOBALS['LicenseKey'] = $SENDSTUDIO_LICENSEKEY;
		$GLOBALS['DatabaseVersion'] = $api->Db->FetchOne('SELECT version() AS version');

		$GLOBALS['System_Message'] = htmlentities($SENDSTUDIO_SYSTEM_MESSAGE, ENT_QUOTES, SENDSTUDIO_CHARSET);

		$GLOBALS['TextFooter'] = strip_tags($SENDSTUDIO_TEXTFOOTER);
		$GLOBALS['HTMLFooter'] = $SENDSTUDIO_HTMLFOOTER;

		$GLOBALS['ForceUnsubLink'] = $SENDSTUDIO_FORCE_UNSUBLINK;

		$GLOBALS['CronEnabled'] = $SENDSTUDIO_CRON_ENABLED;

		$GLOBALS['IpTracking'] = $SENDSTUDIO_IPTRACKING;
		$GLOBALS['UseMultipleUnsubscribe'] = $SENDSTUDIO_USEMULTIPLEUNSUBSCRIBE;
		$GLOBALS['ContactCanModifyEmail'] = $SENDSTUDIO_CONTACTCANMODIFYEMAIL;

		$GLOBALS['SendTestMode'] = $SENDSTUDIO_SEND_TEST_MODE;

		$GLOBALS['MaxHourlyRate'] = $SENDSTUDIO_MAXHOURLYRATE;

		$GLOBALS['MaxOverSize'] = $SENDSTUDIO_MAXOVERSIZE;

		$GLOBALS['EmailAddress'] = htmlspecialchars($SENDSTUDIO_EMAIL_ADDRESS, ENT_QUOTES, SENDSTUDIO_CHARSET);

		$GLOBALS['MaxImageWidth'] = intval($SENDSTUDIO_MAX_IMAGEWIDTH);
		$GLOBALS['MaxImageHeight'] = intval($SENDSTUDIO_MAX_IMAGEHEIGHT);

		$GLOBALS['Smtp_Server'] = htmlspecialchars($SENDSTUDIO_SMTP_SERVER, ENT_QUOTES, SENDSTUDIO_CHARSET);
		$GLOBALS['Smtp_Username'] = htmlspecialchars($SENDSTUDIO_SMTP_USERNAME, ENT_QUOTES, SENDSTUDIO_CHARSET);
		$GLOBALS['Smtp_Password'] = base64_decode($SENDSTUDIO_SMTP_PASSWORD);
		$GLOBALS['Smtp_Port'] = $SENDSTUDIO_SMTP_PORT;

		$GLOBALS['Bounce_Address'] = htmlspecialchars($SENDSTUDIO_BOUNCE_ADDRESS, ENT_QUOTES, SENDSTUDIO_CHARSET);
		$GLOBALS['Bounce_Server'] = htmlspecialchars($SENDSTUDIO_BOUNCE_SERVER, ENT_QUOTES, SENDSTUDIO_CHARSET);
		$GLOBALS['Bounce_Username'] = htmlspecialchars($SENDSTUDIO_BOUNCE_USERNAME, ENT_QUOTES, SENDSTUDIO_CHARSET);
		$GLOBALS['Bounce_Password'] = base64_decode($SENDSTUDIO_BOUNCE_PASSWORD);
		$GLOBALS['Bounce_Imap'] = $SENDSTUDIO_BOUNCE_IMAP;
		$GLOBALS['Bounce_ExtraSettings'] = htmlspecialchars($SENDSTUDIO_BOUNCE_EXTRASETTINGS, ENT_QUOTES, SENDSTUDIO_CHARSET);
		$GLOBALS['Bounce_AgreeDelete'] = $SENDSTUDIO_BOUNCE_AGREEDELETE;
		$GLOBALS['Bounce_AgreeDeleteAll'] = $SENDSTUDIO_BOUNCE_AGREEDELETEALL;

		$GLOBALS['AllowAttachments'] = $SENDSTUDIO_ALLOW_ATTACHMENTS;
		$GLOBALS['AllowEmbedImages'] = $SENDSTUDIO_ALLOW_EMBEDIMAGES;

		$GLOBALS['AttachmentSize'] = $SENDSTUDIO_ATTACHMENT_SIZE;

		$GLOBALS['EmailSize_Warning'] = $SENDSTUDIO_EMAILSIZE_WARNING;
		$GLOBALS['EmailSize_Maximum'] = $SENDSTUDIO_EMAILSIZE_MAXIMUM;

		$GLOBALS['Resend_Maximum'] = $SENDSTUDIO_RESEND_MAXIMUM;

		$GLOBALS['DefaultEmbedImages'] = $SENDSTUDIO_DEFAULT_EMBEDIMAGES;

		$GLOBALS['Copyright'] = htmlspecialchars(LNG_Copyright, ENT_QUOTES, SENDSTUDIO_CHARSET);

		$GLOBALS['Existing_App_Logo_Image'] = APPLICATION_LOGO_IMAGE;

		$GLOBALS['Existing_App_Favicon'] = APPLICATION_FAVICON;

		$GLOBALS['EnableUpdatesCheck'] = (isset($addonStatus['updatecheck']['enabled']) && $addonStatus['updatecheck']['enabled'] == '1') ? 'CHECKED' : '';

		$GLOBALS['ShowIntroVideo'] = (SHOW_INTRO_VIDEO == true) ? 'CHECKED' : '';

		$GLOBALS['ShowSmtpComOption'] = (SHOW_SMTP_COM_OPTION == true) ? 'CHECKED' : '';

		$GLOBALS['ShowSmtpComOptionShow'] = (SHOW_SMTP_COM_OPTION == true) ? '' : 'none';



		$GLOBALS['FormAction'] = 'Action=Save';

		if (!$cron_checked) {
			$api->DisableCron();
		}

		if ($cron_checked) {
			$this->DisplayCronWarning(false);
		}

		$test_mode_report = '';
		if ($send_test_mode) {
			$jobs_api = $this->GetApi('Jobs');
			$job_found = $jobs_api->FindJob('send', 'newsletter', 0, true, false, false);
			if ($job_found) {
				$test_mode_report = $this->PrintWarning('Send_TestMode_JobsWaiting');
			}
		}

		$GLOBALS['Send_TestMode_Report'] = $test_mode_report;

		$attachments_report = '';

		if (!$allow_attachments) {
			$autos_to_disable = array();

			$auto_files = list_files(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . 'autoresponders', null, true);
			if (!empty($auto_files)) {
				$autoresponder_ids = array_keys($auto_files);
				foreach ($autoresponder_ids as $p => $autoresponderid) {
					$files = $auto_files[$autoresponderid];
					if (isset($files['attachments'])) {
						if (!empty($files['attachments'])) {
							$autos_to_disable[] = $autoresponderid;
						}
					}
				}
			}

			if (!empty($autos_to_disable)) {
				$auto_api = $this->GetApi('Autoresponders');
				$disabled_list = $auto_api->DisableAutoresponders($autos_to_disable);
				if (!empty($disabled_list)) {
					$amount = sizeof(array_keys($disabled_list));
					if ($amount == 1) {
						$attachments_report .= GetLang('Autoresponders_Disabled_Attachments_One_Link');
					} else {
						$attachments_report .= sprintf(GetLang('Autoresponders_Disabled_Attachments_Many_Link'), $this->FormatNumber($amount));
					}

					$email_api = $this->GetApi('Email');
					$email_api->Set('CharSet', SENDSTUDIO_CHARSET);

					foreach ($disabled_list as $p => $disabled_details) {
						$subject = GetLang('Autoresponders_Disabled_Email_Subject');

						$message = sprintf(GetLang('Autoresponders_Disabled_Email_Message'), $disabled_details['autorespondername'], $disabled_details['listname']);

						$email_api->ClearAttachments();
						$email_api->ClearRecipients();

						$email_api->Set('Multipart', false);
						$email_api->AddBody('text', $message);
						$email_api->Set('Subject', $subject);

						$email_api->Set('FromAddress', SENDSTUDIO_EMAIL_ADDRESS);

						$email_api->AddRecipient($disabled_details['owneremail'], $disabled_details['ownername'], 't');

						$email_api->Send();
					}
					IEM::sessionSet('AutorespondersDisabled', $disabled_list);
				}
			}

			$newsletterts_to_disable = array();

			$newsletter_files = list_files(TEMP_DIRECTORY . DIRECTORY_SEPARATOR . 'newsletters', null, true);
			if (!empty($newsletter_files)) {
				$newsletter_ids = array_keys($newsletter_files);
				foreach ($newsletter_ids as $p => $newsid) {
					$files = $newsletter_files[$newsid];
					if (isset($files['attachments'])) {
						if (!empty($files['attachments'])) {
							$newsletterts_to_disable[] = $newsid;
						}
					}
				}
			}

			if (!empty($newsletterts_to_disable)) {

				if ($attachments_report != '') {
					$attachments_report .= '<br/><br/>';
				}

				$news_api = $this->GetApi('Newsletters');
				$disabled_list = $news_api->DisableNewsletters($newsletterts_to_disable);
				if (!empty($disabled_list)) {
					$amount = sizeof(array_keys($disabled_list));
					if ($amount == 1) {
						$attachments_report .= GetLang('Newsletters_Disabled_Attachments_One_Link');
					} else {
						$attachments_report .= sprintf(GetLang('Newsletters_Disabled_Attachments_Many_Link'), $this->FormatNumber($amount));
					}
					IEM::sessionSet('NewslettersDisabled', $disabled_list);
				}
			}
		}

		$GLOBALS['DisplayAttachmentsMessage'] = "none;";
		if ($attachments_report) {
			$GLOBALS['DisplayAttachmentsMessage'] = '';
			$GLOBALS['Warning'] = $attachments_report;

			$GLOBALS['Attachments_Message'] = $this->ParseTemplate('WarningMsg', true, false);
		}

		$GLOBALS['ExtraScript'] = $extra;

		$GLOBALS['Settings_AddonsDisplay'] = $this->PrintAddonsList();

		// ----- Credit settings
			$tempPercentageWarnings = array();
			$tempFixedWarnings = array(); // TODO fixed credit warnings aren't implemented yet
			$tempWarnings = $api->GetCreditWarningsSettings();

			// If warnings can't be found, create default.
			if (empty($tempWarnings)) {
				$tempDefaultLevel = array('0', '15', '25');
				$tempWarnings = array();

				foreach ($tempDefaultLevel as $each) {
					$tempPercentageWarnings[] = array(
						'enabled' => '0',
						'creditlevel' => $each,
						'aspercentage' => '1',
						'emailsubject' => GetLang('CreditWarnings_Warnings_EmailSubjectDefaultText'),
						'emailcontents' => str_replace('%s', "{$each}%", GetLang('CreditSettings_Warnings_PercentageDefaultText'))
					);
				}

				unset($tempDefaultLevel);

			// Split the warnings into two arrays (fixed and percentage warnings)
			} else {
				foreach ($tempWarnings as $each) {
					if ($each['aspercentage']) {
						$tempPercentageWarnings[] = $each;
					} else {
						$tempFixedWarnings[] = $each;
					}
				}
			}

			unset($tempWarnings);

			$tpl->Assign('credit_settings', array(
				'autoresponders_take_credit' => (bool)SENDSTUDIO_CREDIT_INCLUDE_AUTORESPONDERS,
				'triggers_take_credit' => (bool)SENDSTUDIO_CREDIT_INCLUDE_TRIGGERS,
				'enable_credit_level_warnings' => (bool)SENDSTUDIO_CREDIT_WARNINGS,
				'warnings_percentage_level' => $tempPercentageWarnings,
				'warnings_percentage_level_choices' => array(
					'0', '5', '10', '15', '20', '25',
					'30', '35', '40', '45', '50'
				)
			));
		// -----

		// ----- Login Security settings
			$security_settings = array(
				'login_wait' => SENDSTUDIO_SECURITY_WRONG_LOGIN_WAIT,
				'threshold_login_count' => SENDSTUDIO_SECURITY_WRONG_LOGIN_THRESHOLD_COUNT,
				'threshold_login_duration' => SENDSTUDIO_SECURITY_WRONG_LOGIN_THRESHOLD_DURATION / 60,
				'ip_login_ban_duration' => SENDSTUDIO_SECURITY_BAN_DURATION / 60
			);

			$security_settings_options = array(
				'login_wait' => array(1, 2, 3, 4, 5),
				'threshold_login_count' => array(3, 4, 5, 10, 15),
				'threshold_login_duration' => array(1, 5, 10, 15),
				'ip_login_ban_duration' => array(1, 5, 10, 15)
			);

			$tpl->Assign('security_settings', $security_settings);
			$tpl->Assign('security_settings_options', $security_settings_options);
		// -----

		$tpl->Assign('AgencyEdition', get_agency_license_variables());

		$showtab = 1;
		if (isset($_GET['Tab'])) {
			$tab = (int)$_GET['Tab'];
			if ($tab > 0) {
				$showtab = $tab;
			}
		}

		$GLOBALS['Message'] .= GetFlashMessages();

		$tpl->Assign('ShowTab', $showtab);
		$tpl->Assign('DisplayPrivateLabel', (defined('APPLICATION_SHOW_WHITELABEL_MENU')? constant('APPLICATION_SHOW_WHITELABEL_MENU') : true));

		$tpl->ParseTemplate('Settings');

		$this->PrintFooter();
	}

	/**
	* ParsePHPModules
	* Function to grab the list of PHP modules installed.
	*
	* @return Array An associative array of all the modules installed for PHP
	*/
	function ParsePHPModules()
	{
		ob_start();
		phpinfo(INFO_MODULES);
		$s = ob_get_contents();
		ob_end_clean();

		if (strstr($s,'phpinfo() has been disabled for security reasons')) {
			// phpinfo() is disabled
			return false;
		}

		$s = strip_tags($s,'<h2><th><td>');
		$s = preg_replace('/<th[^>]*>([^<]+)<\/th>/',"<info>\\1</info>",$s);
		$s = preg_replace('/<td[^>]*>([^<]+)<\/td>/',"<info>\\1</info>",$s);
		$vTmp = preg_split('/(<h2[^>]*>[^<]+<\/h2>)/',$s,-1,PREG_SPLIT_DELIM_CAPTURE);
		$vModules = array();
		for ($i=1;$i<count($vTmp);$i++) {
			if (preg_match('/<h2[^>]*>([^<]+)<\/h2>/',$vTmp[$i],$vMat)) {
				$vName = trim($vMat[1]);
				$vTmp2 = explode("\n",$vTmp[$i+1]);
				foreach ($vTmp2 AS $vOne) {
					$vPat = '<info>([^<]+)<\/info>';
					$vPat3 = "/".$vPat."\s*".$vPat."\s*".$vPat."/";
					$vPat2 = "/".$vPat."\s*".$vPat."/";
					if (preg_match($vPat3,$vOne,$vMat)) { // 3cols
						$vModules[$vName][trim($vMat[1])] = array(trim($vMat[2]),trim($vMat[3]));
					} elseif (preg_match($vPat2,$vOne,$vMat)) { // 2cols
						$vModules[$vName][trim($vMat[1])] = trim($vMat[2]);
					}
				}
			}
		}
		return $vModules;
	}

	/**
	* ParseApacheModules
	* Function to grab the list of Apache modules installed.
	* This is mainly used to check if mod-security is enabled or not.
	*
	* @param String $input The input string to parse to look for apache modules.
	*
	* @return Array An associative array of all the modules installed for Apache.
	*/
	function ParseApacheModules($input)
	{
		if (isset($input['apache'])) {
			$modules = $input['apache']['Loaded Modules'];
			$mod_list = explode(",",$modules);
			foreach ($mod_list as $key=>$value) {
				$mod_list[$key] = trim($value);
			}
			return $mod_list;
		}

		if (isset($input['apache2handler'])) {
			$modules = $input['apache2handler']['Loaded Modules'];
			$mod_list = explode(" ",$modules);
			foreach ($mod_list as $key=>$value) {
				$mod_list[$key] = trim($value);
			}
			return $mod_list;
		}

		//apache2handler
		return array();
	}

	/**
	 * TestBounceSettingsDisplay
	 * This sets session variables for showing the 'test bounce account' details
	 * It then passes control to the 'TestBounceSettings' method which actually tests the details.
	 *
	 * @see TestBounceSettings
	 *
	 * @return Void Doesn't return anything. Sets session variables then prints the window which actually tests the account details.
	 */
	function TestBounceSettingsDisplay()
	{
		$test_bounce_details = array (
			'server' => $_GET['Bounce_Server'],
			'username' => $_GET['Bounce_Username'],
			'password' => base64_encode($_GET['Bounce_Password']),
			'extra_settings' => $_GET['Bounce_ExtraSettings'],
			'imap' => (isset($_GET['bounce_imap']) && $_GET['bounce_imap'] == 1) ? 1 : 0,
		);
		IEM::sessionSet('TestBounceDetails', $test_bounce_details);

		$GLOBALS['Page'] = 'Settings';
		$this->LoadLanguageFile('Bounce');
		$this->ParseTemplate('Bounce_Test_Window');
	}

	/**
	 * TestBounceSettings
	 * This is the function which actually tests the bounce account details
	 * It then prints an appropriate message (success/failure and why if possible)
	 * It uses the session variables set by TestBounceSettingsDisplay.
	 *
	 * @uses TestBounceSettingsDisplay
	 *
	 * @return Void Prints out a success/failure message if an email account can be logged in to or not.
	 */
	function TestBounceSettings()
	{
		$this->LoadLanguageFile('Bounce');

		if (!function_exists('imap_open')) {
			$GLOBALS['Error'] = GetLang('Bounce_No_ImapSupport_Intro');
			$this->ParseTemplate('ErrorMsg');
			return;
		}

		$test_bounce_details = IEM::sessionGet('TestBounceDetails');

		if ($test_bounce_details === false || empty($test_bounce_details)) {
			$GLOBALS['Error'] = sprintf(GetLang('BadLogin_Details'), GetLang('BounceError_NoDetails'));
			$this->ParseTemplate('ErrorMsg');
			return;
		}

		$bounce_server = $test_bounce_details['server'];
		$bounce_user = $test_bounce_details['username'];
		$bounce_pass = $test_bounce_details['password'];

		$extra_settings = false;
		if ($test_bounce_details['extra_settings'] !== '') {
			$extra_settings = $test_bounce_details['extra_settings'];
		}

		$imap = ($test_bounce_details['imap'] === 1) ? true : false;

		$bounce_api = $this->GetApi('Bounce');

		$bounce_api->Set('bounceuser', $bounce_user);
		$bounce_api->Set('bouncepassword', $bounce_pass);
		$bounce_api->Set('bounceserver', $bounce_server);
		$bounce_api->Set('imapaccount', $imap);
		if ($extra_settings) {
			$bounce_api->Set('extramailsettings', $extra_settings);
		}

		$login_ok = $bounce_api->Login();
		if (!$login_ok) {
			$GLOBALS['Error'] = sprintf(GetLang('BadLogin_Details'), $bounce_api->Get('ErrorMessage'));
			$GLOBALS['Message'] = $this->ParseTemplate('ErrorMsg', true, false);
		} else {
			$GLOBALS['Message'] = $this->PrintSuccess('BounceLogin_Successful');
		}
		$bounce_api->Logout(false);

		print $GLOBALS['Message'];
	}

	/**
	* Behaves like the unix which command
	* It checks the path in order for which version of $binary to run
	*
	* @param String $binary The name of a binary
	*
	* @return String The full path to the binary or an empty string if it couldn't be found
	*/
	function Which($binary)
	{
		// If the binary has the / or \ in it then skip it
		if (strpos($binary, DIRECTORY_SEPARATOR) !== false) {
			return '';
		}
		$path = null;

		if (ini_get('safe_mode')) {
			// if safe mode is on the path is in the ini setting safe_mode_exec_dir
			$_SERVER['safe_mode_path'] = ini_get('safe_mode_exec_dir');
			$path = 'safe_mode_path';
		} else if (isset($_SERVER['PATH']) && $_SERVER['PATH'] != '') {
			// On unix the env var is PATH
			$path = 'PATH';
		} else if (isset($_SERVER['Path']) && $_SERVER['Path'] != '') {
			// On windows under IIS the env var is Path
			$path = 'Path';
		}

		// If we don't have a path to search we can't find the binary
		if ($path === null) {
			return '';
		}

		$dirs_to_check = explode(PATH_SEPARATOR, $_SERVER[$path]);

		$open_basedirs = explode(PATH_SEPARATOR, ini_get('open_basedir'));

		foreach ($dirs_to_check as $dir) {
			if ($dir == '') {
				continue;
			}
			if (substr($dir, -1) == DIRECTORY_SEPARATOR) {
				$dir = substr($dir, 0, -1);
			}
			$can_check = true;
			if (!empty($open_basedirs)) {
				$can_check = false;
				foreach ($open_basedirs as $restricted_dir) {
					// if open_basedir isn't set, sometimes we end up with an array with an empty dir in it.
					// so ignore this one and see if there are more.
					if ($restricted_dir == '') {
						$can_check = true;
						continue;
					}
					if (strpos($dir, $restricted_dir) === 0) {
						$can_check = true;
					}
				}
			}

			if ($can_check && is_dir($dir) && is_file($dir.DIRECTORY_SEPARATOR.$binary)) {
				return $dir.DIRECTORY_SEPARATOR.$binary;
			}
		}
		return '';
	}

	/**
	 * PrintAddonsList
	 * Prints a list of all addons that the system can use.
	 * It works out what step an addon is up to (whether it is configured, enabled, installed or not) and prints an appropriate action
	 *
	 * @uses Interspire_Addons
	 * @uses Interspire_Addons::GetAllAddons
	 * @uses Interspire_Addons::GetAvailableAddons
	 * @uses FlashMessage
	 * @uses GetFlashMessages
	 *
	 * @return String Returns a formatted (table design) list of addons and what they are up to (whether they need to be configured, installed, enabled etc).
	 */
	function PrintAddonsList()
	{
		require_once(SENDSTUDIO_BASE_DIRECTORY . DIRECTORY_SEPARATOR . 'addons' . DIRECTORY_SEPARATOR . 'interspire_addons.php');
		$addon_system = new Interspire_Addons();
		$addons = $addon_system->GetAllAddons();
		if (empty($addons)) {
			FlashMessage(GetLang('Addon_NoAddonsAvailable'), SS_FLASH_MSG_ERROR);
			$GLOBALS['Message'] .= GetFlashMessages();
			return $this->ParseTemplate('Settings_Addons_Empty', true, false);
		} else {
			$GLOBALS['Message'] .= GetFlashMessages();
		}

		$addons_status = $addon_system->GetAvailableAddons();

		$addons_list = '';

		$page = array(
			'message' => $GLOBALS['Message']
		);

		foreach ($addons as $addon_name => $details) {
			$addons[$addon_name]['name'] = htmlspecialchars($details['name'], ENT_QUOTES, SENDSTUDIO_CHARSET);
			$addons[$addon_name]['short_name'] = htmlspecialchars($this->TruncateName($details['name']), ENT_QUOTES, SENDSTUDIO_CHARSET);
			$addons[$addon_name]['description'] = htmlspecialchars($details['description'], ENT_QUOTES, SENDSTUDIO_CHARSET);
			$addons[$addon_name]['short_description'] = htmlspecialchars($this->TruncateName($details['description']), ENT_QUOTES, SENDSTUDIO_CHARSET);

			if (isset($addons_status[$addon_name])) {
				$addons[$addon_name]['install_details'] = $addons_status[$addon_name];
				$addons[$addon_name]['need_upgrade'] = (version_compare($details['addon_version'], $addons_status[$addon_name]['addon_version']) == 1);
			} else {
				$addons[$addon_name]['install_details'] = false;
			}
		}

		$tpl = GetTemplateSystem();
		$tpl->Assign('PAGE', $page);
		$tpl->Assign('records', $addons);
		return $tpl->ParseTemplate('Settings_Addons_Display', true);
	}
}