<?php
/**
 * pragmaMx SMF Integration
 * Copyright by A.Ellsel (Andi) - http://pragmaMx.org
 *
 * pragmaMx is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * $Id: setup.php,v 1.23 2008/06/03 18:48:43 tora60 Exp $
 */

error_reporting(E_ALL);
// Konstante definieren, mit der die pragmaMx-spezifischen Aenderungen in den SMF-Datein wirksam werden
if (!defined('SMF_IN_PRAGMAMX'))
    define('SMF_IN_PRAGMAMX', 1);

if (defined('MX_VERSION')) { // check, nur wenn nicht direkt aufgerufen
    // check ob die verwendete pragmaMx Version korrekt ist
    if (!defined('MX_VERSION_NUM') && !preg_match('#^pragmaMx#', MX_VERSION) || version_compare(trim(str_replace('pragmaMx', '', MX_VERSION)), '0.1.9', '<')) { // nicht für vkpMx u. Co.
        mxErrorScreen('Error: this pragmaMx SMF-bridge requires pragmaMx 0.1.9 or higher.', 'SMF-bridge ');
    }
}

// die pragmaMx spezifischen Einstellungen laden
require_once(dirname(__FILE__) . '/config.php');

$file = preg_replace('#\.php$#', '', basename(__FILE__));

@set_time_limit(300);
ob_start('setupPrepareOutput');
// /////////////////////////////////////////////////////////////////////
// versuchen die Sprache einzustellen
if (empty($_GET['lang_file'])) {
    $_GET['lang_file'] = '';
    if (!empty($_SESSION['installer_temp_lang'])) {
        $_GET['lang_file'] = $_SESSION['installer_temp_lang'];
    }
    if (!empty($_COOKIE['mx_smf_installer_temp_lang'])) {
        $_GET['lang_file'] = $_COOKIE['mx_smf_installer_temp_lang'];
    } else if (isset($currentlang) && defined("mxMainFileLoaded")) {
        $_GET['lang_file'] = 'Install.' . $currentlang . '.php';
    }
}
// / den Sprach-Cookie setzen, dieser wird im Schritt 2 benoetigt
if ($_GET['lang_file']) {
    setcookie('mx_smf_installer_temp_lang' , $_GET['lang_file'], 0);
    $_COOKIE['mx_smf_installer_temp_lang'] = $_GET['lang_file'];
    $_SESSION['installer_temp_lang'] = $_GET['lang_file'];
}
// /////////////////////////////////////////////////////////////////////
if (empty($_GET['step'])) {
    if (!defined("mxMainFileLoaded") && !isset($_GET['delete'])) {
        Header('Location: ../../modules.php?name=' . $mxsmf['module_name'] . '&file=' . $file . '&lang_file=' . $_GET['lang_file'] . '&step=0');
        exit;
        die ("You can't access this file directly...");
    }
    $_GET['step'] = 0;
} else if ($_GET['step'] == 1) {
    if ($_SERVER["REQUEST_METHOD"] != "POST") {
        Header('Location: modules.php?name=' . $mxsmf['module_name'] . '&file=' . $file . '&lang_file=' . $_GET['lang_file'] . '&step=0');
        exit;
    } else {
        if (!defined("mxMainFileLoaded")) {
            Header('Location: ../../modules.php?name=' . $mxsmf['module_name'] . '&file=' . $file . '&lang_file=' . $_GET['lang_file'] . '&step=0');
            exit;
        }
        $_POST['boardurl'] = MX_BASE_URL . 'modules/' . $mxsmf['module_name'] . '/' . $mxsmf['boardsubfolder'];
        $_POST['db_name'] = $dbname;
        $_POST['db_user'] = $dbuname;
        $_POST['db_passwd'] = $dbpass;
        $_POST['db_server'] = $dbhost;
        $_POST['db_prefix'] = $prefix . '_' . $_POST['db_prefix'];
        $setup_db_prefix = $_POST['db_prefix'];
        unset($_POST['dbsession'], $_POST['compress']);
    }
} else if ($_GET['step'] == 2) {
    // nur per Post den Zugriff erlauben
    if ($_SERVER["REQUEST_METHOD"] != "POST") {
        Header('Location: ../../modules.php?name=' . $mxsmf['module_name'] . '&file=' . $file . '&lang_file=' . $_GET['lang_file'] . '&step=0');
        exit;
    }
    // Die Passwoerter fuer den ersten Adminaccount md5 verschluesseln, das gleiche passiert auch beim login,
    // weil die Daten in der Usertabelle dies so erwarten ;)
    $_POST['password1'] = (empty($_POST['password1'])) ? '' : md5($_POST['password1']);
    $_POST['password2'] = (empty($_POST['password2'])) ? '' : md5($_POST['password2']);
    // print '<pre>';
    // print_r($_POST);
    // exit;
    // print '</pre>';
}

if (!is_file($mxsmf['boarddir'] . '/install.php')) {
    die('file "' . $mxsmf['path'] . '/install.php" is missing, <br/>or mx-Port installed');
    exit;
}

require($mxsmf['boarddir'] . '/install.php');
// im ersten Schritt noch versch. Datnbankoperationen durchfuehren
if ($_GET['step'] == 1 && isset($setup_db_prefix)) {
    $qry = array();
    // / die SMF-Gruppentabelle um ein Feld erweitern
    $fields = setupGetTableFields("{$setup_db_prefix}membergroups");
    if (!in_array('mx_group', $fields)) {
        $qry[] = "ALTER TABLE {$setup_db_prefix}membergroups ADD `mx_group` INT( 10 ) DEFAULT '0' NOT NULL";
        $qry[] = "ALTER TABLE {$setup_db_prefix}membergroups ADD INDEX mx_group( `mx_group` )";
    }
    // GAANZ wichtig, dass die pragmaMx-Initialisierung am Anfang der Bridge ueberhaupt durchgefuehrt wird
    $qry[] = "REPLACE INTO `{$setup_db_prefix}settings` ( `variable` , `value` ) VALUES ('integrate_pre_load', 'mxSmf_preLoad')";
    // Zur Sicherheit, das Adminlogin abschalten
    $qry[] = "REPLACE INTO `{$setup_db_prefix}settings` ( `variable` , `value` ) VALUES ('securityDisable', '1')";

    foreach ($qry as $oneqry) {
        mysql_query($oneqry);
    }
}

function mxSmfSetupGetStyle()
{
    return '
	<style type="text/css"><!--
			body
			{
				font-family: Verdana, sans-serif;
				background-color: #ABD140;
				margin: 0;
			}
			body, td
			{
				font-size: 10pt;
			}
			div#header
			{
				background-color: white;
				padding: 22px 4% 12px 4%;
				font-family: Georgia, serif;
				font-size: xx-large;
				border-bottom: 1px solid black;
				height: 40px;
			}
			div#content
			{
				margin: 20px 30px;
			}
			div.error_message
			{
				border: 2px dashed red;
				background-color: #FFF8DC;
				margin: 1ex 4ex;
				padding: 1.5ex;
			}
			div.panel
			{
				border: 1px solid gray;
				background-color: #ECF4D7;
				margin: 1ex 0;
				padding: 1.2ex;
			}
			div.panel h2
			{
				margin: 0;
				margin-bottom: 0.5ex;
				padding-bottom: 3px;
				border-bottom: 1px dashed black;
				font-size: 14pt;
				font-weight: normal;
			}
			div.panel h4
			{
				margin: 0;
				margin-bottom: 2ex;
				font-size: 10pt;
				font-weight: normal;
			}
			form
			{
				margin: 0;
			}
			td.textbox
			{
				padding-top: 2px;
				font-weight: bold;
				white-space: nowrap;
				padding-right: 2ex;
			}
		--></style>
	';
}
// #########################################################################################
// liest alle Felder einer Tabelle in ein assoziatives Array
// der Feldname dient als Index
function setupGetTableFields($tablename)
{
    $fields = array();
    $result = mysql_query("SHOW COLUMNS FROM `${tablename}`;");
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        $fields[$row['Field']] = $row;
    }
    return $fields;
}
// #########################################################################################
function setupPrepareOutput($smfContent)
{
    global $mxsmf, $txt, $file, $prefix;
    // den Seitentitel anpassen
    $smfContent = str_replace($txt['smf_installer'], 'pragmaMx - ' . $txt['smf_installer'], $smfContent);
    // den Themeordner fixen
    $smfContent = preg_replace('#(["\'])(Themes/[^"\']+["\'])#', '$1modules/' . $mxsmf['module_name'] . '/' . $mxsmf['boardsubfolder'] . '/$2', $smfContent);

    if ($_GET['step'] == 0) {
        // in jedes Formular die hidden-Felder "name" und "file" einschliessen
        $smfContent = preg_replace('#(<form[^>]*' . preg_quote($_SERVER['PHP_SELF'], '#') . '[^>]+>)#i', '$1<input type="hidden" name="name" value="' . $mxsmf['module_name'] . '" />' . "\n" . '<input type="hidden" name="file" value="' . $file . '" />', $smfContent);
        // das Javascript fuer die Sprachumschaltung aendern
        $smfContent = preg_replace('#(' . preg_quote($_SERVER['PHP_SELF'], '#') . '\?)(lang_file=)#i', $_SERVER['PHP_SELF'] . '?name=' . $mxsmf['module_name'] . '&file=' . $file . '&$2', $smfContent);
        // Eingabe der Forumsdaten
        // unnoetige Optionen aus Formular entfernen
        if (preg_match_all('#<tr>.*</tr>#isU', $smfContent, $matches)) {
            foreach ($matches[0] as $x) {
                if (preg_match('#<tr>.*name=["\'](boardurl|compress|dbsession|db_user|db_server|db_passwd|db_name|utf8)["\'].*</tr>[^<]*#isU', $x)) {
                    $smfContent = str_replace($x, '', $smfContent);
                }
            }
        }
        // unnoetige Ueberschriften entfernen
        $smfContent = preg_replace('#<h[1-9]>[^<]*(' . preg_quote($txt['mysql_settings'], '#') . '|' . preg_quote($txt['mysql_settings_info'], '#') . ')[^<]*</h[1-9]>#i', '', $smfContent);
        // Tabellen zusammenfuehren
        $smfContent = preg_replace('#</table>[^<]*<table[^<]*>#isU', '', $smfContent);
        // den pragma-Prefix vor den SMF-Prefix schreiben
        $smfContent = preg_replace('#(<input[^<]*value=["\']smf_["\'][^<]*>)#isU', '<div style="white-space: nowrap;"><b>' . $prefix . '_</b>$1</div>', $smfContent);
        // try-again URL fixen
        $smfContent = preg_replace('#(' . preg_quote($_SERVER['PHP_SELF'], '#') . '\?)([[:alnum:]]*)#iU', $_SERVER['PHP_SELF'] . '?name=' . $mxsmf['module_name'] . '&file=' . $file . '&$2', $smfContent);
        // sonstiges mit php_self in Anfuehrungszeichen fixen...
        $smfContent = preg_replace('#(["\'])' . preg_quote($_SERVER['PHP_SELF'], '#') . '\1#iU', '\1' . $_SERVER['PHP_SELF'] . '?name=' . $mxsmf['module_name'] . '&file=' . $file . '\1', $smfContent);
        // doppelte parameter fixen
        $smfContent = str_replace('name=' . $mxsmf['module_name'] . '&file=' . $file . '&name=' . $mxsmf['module_name'] . '&file=' . $file . '', 'name=' . $mxsmf['module_name'] . '&file=' . $file . '', $smfContent);
    } else if ($_GET['step'] == 1) {
        $smfContent .= $_SERVER['PHP_SELF'];
        // in jedes Formular die hidden-Felder "name" und "file" einschliessen
        $smfContent = preg_replace('#(<form[^>]*' . preg_quote($_SERVER['PHP_SELF'], '#') . '[^>]+>)#i', '$1<input type="hidden" name="name" value="' . $mxsmf['module_name'] . '" />' . "\n" . '<input type="hidden" name="file" value="' . $file . '" />', $smfContent);
        // alle Links und Formulare aendern, name und file mit dranhaengen
        $smfContent = preg_replace('#(<(?:a|form)[^>]+)(' . preg_quote($_SERVER['PHP_SELF'], '#') . ')\?*([^>\'"]*)([^>]*>)#s', '$1modules/' . basename(dirname(__file__)) . '/setup.php?lang_file=' . $_GET['lang_file'] . '&$3$4', $smfContent);
    } else if ($_GET['step'] == 2) {
        // den Link zum Forum aendern
        $smfContent = str_replace($mxsmf['path'] . '/index.php', 'modules/' . $mxsmf['module_name'] . '/index.php?action=packages;sa=browse', $smfContent); #
        $smfContent = str_replace('modules/' . $mxsmf['module_name'] . '/smf/Themes/default/', 'smf/Themes/default/', $smfContent);
        $smfContent = str_replace('http://www.simplemachines.org/community/index.php', 'http://www.pragmamx.org/forum.html', $smfContent);
    }
    // das Stylesheet aendern
    $smfContent = preg_replace('#<style[^>]*>.*body.*</style>#isU', mxSmfSetupGetStyle(), $smfContent);

    return $smfContent;
}

?>