* (bug 12296) Simplify cache epoch in default LocalSettings.php
[lhc/web/wiklou.git] / config / index.php
index d00b3f5..c24b963 100644 (file)
@@ -29,18 +29,43 @@ $wgRequestTime = microtime( true );
 # Attempt to set up the include path, to fix problems with relative includes
 $IP = dirname( dirname( __FILE__ ) );
 define( 'MW_INSTALL_PATH', $IP );
-$sep = PATH_SEPARATOR;
-if( !ini_set( "include_path", ".$sep$IP$sep$IP/includes$sep$IP/languages" ) ) {
-       set_include_path( ".$sep$IP$sep$IP/includes$sep$IP/languages" );
-}
 
 # Define an entry point and include some files
 define( "MEDIAWIKI", true );
 define( "MEDIAWIKI_INSTALL", true );
-require_once( "includes/Defines.php" );
-require_once( "includes/DefaultSettings.php" );
-require_once( "includes/MagicWord.php" );
-require_once( "includes/Namespace.php" );
+
+// Run version checks before including other files
+// so people don't see a scary parse error.
+require_once( "$IP/install-utils.inc" );
+install_version_checks();
+
+require_once( "$IP/includes/Defines.php" );
+require_once( "$IP/includes/DefaultSettings.php" );
+require_once( "$IP/includes/AutoLoader.php" );
+require_once( "$IP/includes/MagicWord.php" );
+require_once( "$IP/includes/Namespace.php" );
+require_once( "$IP/includes/ProfilerStub.php" );
+require_once( "$IP/includes/GlobalFunctions.php" );
+require_once( "$IP/includes/Hooks.php" );
+
+# If we get an exception, the user needs to know
+# all the details
+$wgShowExceptionDetails = true;
+
+## Databases we support:
+
+$ourdb = array();
+$ourdb['mysql']['fullname']      = 'MySQL';
+$ourdb['mysql']['havedriver']    = 0;
+$ourdb['mysql']['compile']       = 'mysql';
+$ourdb['mysql']['bgcolor']       = '#ffe5a7';
+$ourdb['mysql']['rootuser']      = 'root';
+
+$ourdb['postgres']['fullname']   = 'PostgreSQL';
+$ourdb['postgres']['havedriver'] = 0;
+$ourdb['postgres']['compile']    = 'pgsql';
+$ourdb['postgres']['bgcolor']    = '#aaccff';
+$ourdb['postgres']['rootuser']   = 'postgres';
 
 ?>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
@@ -99,7 +124,7 @@ require_once( "includes/Namespace.php" );
                .error-top {
                        color: red;
                        background-color: #FFF0F0;
-                       border: 2px solid        red;
+                       border: 2px solid red;
                        font-size: 130%;
                        font-weight: bold;
                        padding: 1em 1.5em;
@@ -124,8 +149,39 @@ require_once( "includes/Namespace.php" );
                        font-size: 85%;
                        padding-top: 3em;
                }
+               
+               span.success-message {
+                       font-weight: bold;
+                       font-size: 110%;
+                       color: green;
+               }
+               .success-box {
+                       font-size: 130%;
+               }
 
        </style>
+       <script type="text/javascript">
+       <!--
+       function hideall() {
+               <?php foreach (array_keys($ourdb) as $db) {
+               echo "\n                document.getElementById('$db').style.display='none';";
+               }
+               ?>
+
+       }
+       function toggleDBarea(id,defaultroot) {
+               hideall();
+               var dbarea = document.getElementById(id).style;
+               dbarea.display = (dbarea.display == 'none') ? 'block' : 'none';
+               var db = document.getElementById('RootUser');
+               if (defaultroot) {
+<?php foreach (array_keys($ourdb) as $db) {
+                       echo "                  if (id == '$db') { db.value = '".$ourdb[$db]['rootuser']."';}\n";
+}?>
+               }
+       }
+       // -->
+       </script>
 </head>
 
 <body>
@@ -141,7 +197,8 @@ require_once( "includes/Namespace.php" );
 /* Check for existing configurations and bug out! */
 
 if( file_exists( "../LocalSettings.php" ) ) {
-       dieout( "       <p><strong>Setup has completed, <a href='../index.php'>your wiki</a> is configured.</strong></p>
+       $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+ dieout( "<p><strong>Setup has completed, <a href='../$script'>your wiki</a> is configured.</strong></p>
 
        <p>Please delete the /config directory for extra security.</p></div></div></div></div>" );
 }
@@ -165,12 +222,14 @@ if( !is_writable( "." ) ) {
        <pre>
        cd <i>/path/to/wiki</i>
        chmod a+w config
-       </pre>" );
+       </pre>
+       
+       <p>Afterwards retry to start the <a href=\"\">setup</a>.</p>" );
 }
 
 
-require_once( "install-utils.inc" );
-require_once( "maintenance/updaters.inc" );
+require_once( "$IP/install-utils.inc" );
+require_once( "$IP/maintenance/updaters.inc" );
 
 class ConfigData {
        function getEncoded( $data ) {
@@ -180,6 +239,31 @@ class ConfigData {
        function getSitename() { return $this->getEncoded( $this->Sitename ); }
        function getSysopName() { return $this->getEncoded( $this->SysopName ); }
        function getSysopPass() { return $this->getEncoded( $this->SysopPass ); }
+
+       function setSchema( $schema, $engine ) {
+               $this->DBschema = $schema;
+               if ( !preg_match( '/^\w*$/', $engine ) ){
+                       $engine = 'InnoDB';
+               }
+               switch ( $this->DBschema ) {
+                       case 'mysql5':
+                               $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=utf8";
+                               $this->DBmysql5 = 'true';
+                               break;
+                       case 'mysql5-binary':
+                               $this->DBTableOptions = "ENGINE=$engine, DEFAULT CHARSET=binary";
+                               $this->DBmysql5 = 'true';
+                               break;
+                       default:
+                               $this->DBTableOptions = "TYPE=$engine";
+                               $this->DBmysql5 = 'false';
+               }
+               $this->DBengine = $engine;
+
+               # Set the global for use during install
+               global $wgDBTableOptions;
+               $wgDBTableOptions = $this->DBTableOptions;
+       }
 }
 
 ?>
@@ -187,7 +271,7 @@ class ConfigData {
 <ul>
        <li>
                <b>Don't forget security updates!</b> Keep an eye on the
-               <a href="http://mail.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
+               <a href="http://lists.wikimedia.org/mailman/listinfo/mediawiki-announce">low-traffic
                release announcements mailing list</a>.
        </li>
 </ul>
@@ -199,19 +283,54 @@ class ConfigData {
 <?php
 $endl = "
 ";
-$wgNoOutputBuffer = true;
+define( 'MW_NO_OUTPUT_BUFFER', 1 );
 $conf = new ConfigData;
 
 install_version_checks();
+$self = 'Installer'; # Maintenance script name, to please Setup.php
 
 print "<li>PHP " . phpversion() . " installed</li>\n";
 
-if( ini_get( "register_globals" ) ) {
+error_reporting( 0 );
+$phpdatabases = array();
+foreach (array_keys($ourdb) as $db) {
+       $compname = $ourdb[$db]['compile'];
+       if( extension_loaded( $compname ) || ( mw_have_dl() && dl( "{$compname}." . PHP_SHLIB_SUFFIX ) ) ) {
+               array_push($phpdatabases, $db);
+               $ourdb[$db]['havedriver'] = 1;
+       }
+}
+error_reporting( E_ALL );
+
+if (!$phpdatabases) {
+       print "Could not find a suitable database driver!<ul>";
+       foreach (array_keys($ourdb) AS $db) {
+               $comp = $ourdb[$db]['compile'];
+               $full = $ourdb[$db]['fullname'];
+               print "<li>For <b>$full</b>, compile PHP using <b>--with-$comp</b>, "
+                       ."or install the $comp.so module</li>\n";
+       }
+       dieout( "</ul></ul>" );
+}
+
+print "<li>Found database drivers for:";
+$DefaultDBtype = '';
+foreach (array_keys($ourdb) AS $db) {
+       if ($ourdb[$db]['havedriver']) {
+               if ( $DefaultDBtype == '' ) {
+                       $DefaultDBtype = $db;
+               }
+               print "  ".$ourdb[$db]['fullname'];
+       }
+}
+print "</li>\n";
+
+if( wfIniGetBool( "register_globals" ) ) {
        ?>
        <li>
                <div style="font-size:110%">
                <strong class="error">Warning:</strong>
-               <strong>PHP's   <tt><a href="http://php.net/register_globals">register_globals</a></tt> option is enabled. Disable it if you can.</strong>
+               <strong>PHP's <tt><a href="http://php.net/register_globals">register_globals</a></tt> option is enabled. Disable it if you can.</strong>
                </div>
                MediaWiki will work, but your server is more exposed to PHP-based security vulnerabilities.
        </li>
@@ -220,7 +339,7 @@ if( ini_get( "register_globals" ) ) {
 
 $fatal = false;
 
-if( ini_get( "magic_quotes_runtime" ) ) {
+if( wfIniGetBool( "magic_quotes_runtime" ) ) {
        $fatal = true;
        ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime'>magic_quotes_runtime</a> is active!</strong>
        This option corrupts data input unpredictably; you cannot install or use
@@ -228,7 +347,7 @@ if( ini_get( "magic_quotes_runtime" ) ) {
        <?php
 }
 
-if( ini_get( "magic_quotes_sybase" ) ) {
+if( wfIniGetBool( "magic_quotes_sybase" ) ) {
        $fatal = true;
        ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.sybase.php#ini.magic-quotes-sybase'>magic_quotes_sybase</a> is active!</strong>
        This option corrupts data input unpredictably; you cannot install or use
@@ -236,7 +355,7 @@ if( ini_get( "magic_quotes_sybase" ) ) {
        <?php
 }
 
-if( ini_get( "mbstring.func_overload" ) ) {
+if( wfIniGetBool( "mbstring.func_overload" ) ) {
        $fatal = true;
        ?><li class='error'><strong>Fatal: <a href='http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload'>mbstring.func_overload</a> is active!</strong>
        This option causes errors and may corrupt data unpredictably;
@@ -244,11 +363,20 @@ if( ini_get( "mbstring.func_overload" ) ) {
        <?php
 }
 
+if( wfIniGetBool( "zend.ze1_compatibility_mode" ) ) {
+       $fatal = true;
+       ?><li class="error"><strong>Fatal: <a href="http://www.php.net/manual/en/ini.core.php">zend.ze1_compatibility_mode</a> is active!</strong>
+       This option causes horrible bugs with MediaWiki; you cannot install or use
+       MediaWiki unless this option is disabled.
+       <?php
+}
+
+
 if( $fatal ) {
        dieout( "</ul><p>Cannot install MediaWiki.</p>" );
 }
 
-if( ini_get( "safe_mode" ) ) {
+if( wfIniGetBool( "safe_mode" ) ) {
        $conf->safeMode = true;
        ?>
        <li><b class='error'>Warning:</b> <strong>PHP's
@@ -261,22 +389,12 @@ if( ini_get( "safe_mode" ) ) {
 }
 
 $sapi = php_sapi_name();
-$conf->prettyURLs = true;
 print "<li>PHP server API is $sapi; ";
-switch( $sapi ) {
-case "apache":
-case "apache2handler":
-       print "ok, using pretty URLs (<tt>index.php/Page_Title</tt>)";
-       break;
-default:
-       print "unknown; ";
-case "cgi":
-case "cgi-fcgi":
-case "apache2filter":
-case "isapi":
-       print "using ugly URLs (<tt>index.php?title=Page_Title</tt>)";
-       $conf->prettyURLs = false;
-       break;
+$script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+if( $wgUsePathInfo ) {
+ print "ok, using pretty URLs (<tt>$script/Page_Title</tt>)";
+} else {
+       print "using ugly URLs (<tt>$script?title=Page_Title</tt>)";
 }
 print "</li>\n";
 
@@ -289,16 +407,41 @@ if( $conf->xml ) {
                If you're running Mandrake, install the php-xml package." );
 }
 
-# Crude check for session support
+# Check for session support
 if( !function_exists( 'session_name' ) )
        dieout( "PHP's session module is missing. MediaWiki requires session support in order to function." );
 
+# session.save_path doesn't *have* to be set, but if it is, and it's
+# not valid/writable/etc. then it can cause problems
+$sessionSavePath = mw_get_session_save_path();
+$ssp = htmlspecialchars( $sessionSavePath );
+# Warn the user if it's not set, but let them proceed
+if( !$sessionSavePath ) {
+       print "<li><strong>Warning:</strong> A value for <tt>session.save_path</tt>
+       has not been set in PHP.ini. If the default value causes problems with
+       saving session data, set it to a valid path which is read/write/execute
+       for the user your web server is running under.</li>";
+} elseif ( is_dir( $sessionSavePath ) && is_writable( $sessionSavePath ) ) {
+       # All good? Let the user know
+       print "<li>Session save path (<tt>{$ssp}</tt>) appears to be valid.</li>";
+} else {
+       # Something not right? Warn the user, but let them proceed
+       print "<li><strong>Warning:</strong> Your <tt>session.save_path</tt> value (<tt>{$ssp}</tt>)
+               appears to be invalid or is not writable. PHP needs to be able to save data to
+               this location for correct session operation.</li>";
+}
+
+# Check for PCRE support
+if( !function_exists( 'preg_match' ) )
+       dieout( "The PCRE support module appears to be missing. MediaWiki requires the
+       Perl-compatible regular expression functions." );
+
 $memlimit = ini_get( "memory_limit" );
 $conf->raiseMemory = false;
 if( empty( $memlimit ) || $memlimit == -1 ) {
        print "<li>PHP is configured with no <tt>memory_limit</tt>.</li>\n";
 } else {
-       print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ) . ". <strong>If this is too low, installation may fail!</strong> ";
+       print "<li>PHP's <tt>memory_limit</tt> is " . htmlspecialchars( $memlimit ) . ". ";
        $n = intval( $memlimit );
        if( preg_match( '/^([0-9]+)[Mm]$/', trim( $memlimit ), $m ) ) {
                $n = intval( $m[1] * (1024*1024) );
@@ -306,7 +449,7 @@ if( empty( $memlimit ) || $memlimit == -1 ) {
        if( $n < 20*1024*1024 ) {
                print "Attempting to raise limit to 20M... ";
                if( false === ini_set( "memory_limit", "20M" ) ) {
-                       print "failed.";
+                       print "failed.<br /><b>" . htmlspecialchars( $memlimit ) . " seems too low, installation may fail!</b>";
                } else {
                        $conf->raiseMemory = true;
                        print "ok.";
@@ -315,40 +458,45 @@ if( empty( $memlimit ) || $memlimit == -1 ) {
        print "</li>\n";
 }
 
-$conf->zlib = function_exists( "gzencode" );
-if( $conf->zlib ) {
-       print "<li>Have zlib support; enabling output compression.</li>\n";
-} else {
-       print "<li>No zlib support.</li>\n";
-}
-
 $conf->turck = function_exists( 'mmcache_get' );
 if ( $conf->turck ) {
        print "<li><a href=\"http://turck-mmcache.sourceforge.net/\">Turck MMCache</a> installed</li>\n";
 }
 
+$conf->xcache = function_exists( 'xcache_get' );
+if( $conf->xcache )
+       print "<li><a href=\"http://trac.lighttpd.net/xcache/\">XCache</a> installed</li>";
+
 $conf->apc = function_exists('apc_fetch');
 if ($conf->apc ) {
-       print '<li><a href="http://www.php.net/apc">APC</a> installed</li>\n';
+       print "<li><a href=\"http://www.php.net/apc\">APC</a> installed</li>";
 }
 
 $conf->eaccel = function_exists( 'eaccelerator_get' );
 if ( $conf->eaccel ) {
-    $conf->turck = 'eaccelerator';
-    print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
+       $conf->turck = 'eaccelerator';
+       print "<li><a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> installed</li>\n";
 }
-if (!$conf->turck && !$conf->eaccel && !$conf->apc) {
-       print "<li>Neither <a href=\"http://turck-mmcache.sourceforge.net/\">Turck MMCache</a> nor ".
-               "<a href=\"http://eaccelerator.sourceforge.net/\">eAccelerator</a> nor ".
-               "<a href=\"http://www.php.net/apc\">APC</a> are installed, " .
-               "can't use object caching functions</li>\n";
+
+if( !( $conf->turck || $conf->eaccel || $conf->apc || $conf->xcache ) ) {
+       echo( '<li>Couldn\'t find <a href="http://turck-mmcache.sourceforge.net">Turck MMCache</a>,
+               <a href="http://eaccelerator.sourceforge.net">eAccelerator</a>,
+               <a href="http://www.php.net/apc">APC</a> or <a href="http://trac.lighttpd.net/xcache/">XCache</a>;
+               cannot use these for object caching.</li>' );
 }
 
 $conf->diff3 = false;
-$diff3locations = array("/usr/bin", "/opt/csw/bin", "/usr/gnu/bin", "/usr/sfw/bin") + explode($sep, getenv("PATH"));
-$diff3names = array("gdiff3", "diff3", "diff3.exe");
-
-$diff3versioninfo = array('$1 --version 2>&1', 'diff3 (GNU diffutils)');
+$diff3locations = array_merge(
+       array(
+               "/usr/bin",
+               "/usr/local/bin",
+               "/opt/csw/bin",
+               "/usr/gnu/bin",
+               "/usr/sfw/bin" ),
+       explode( PATH_SEPARATOR, getenv( "PATH" ) ) );
+$diff3names = array( "gdiff3", "diff3", "diff3.exe" );
+
+$diff3versioninfo = array( '$1 --version 2>&1', 'diff3 (GNU diffutils)' );
 foreach ($diff3locations as $loc) {
        $exe = locate_executable($loc, $diff3names, $diff3versioninfo);
        if ($exe !== false) {
@@ -366,7 +514,7 @@ $conf->ImageMagick = false;
 $imcheck = array( "/usr/bin", "/opt/csw/bin", "/usr/local/bin", "/sw/bin", "/opt/local/bin" );
 foreach( $imcheck as $dir ) {
        $im = "$dir/convert";
-       if( file_exists( $im ) ) {
+       if( @file_exists( $im ) ) {
                print "<li>Found ImageMagick: <tt>$im</tt>; image thumbnailing will be enabled if you enable uploads.</li>\n";
                $conf->ImageMagick = $im;
                break;
@@ -386,14 +534,32 @@ if( $conf->HaveGD ) {
        }
 }
 
-$conf->UseImageResize = $conf->HaveGD || $conf->ImageMagick;
-
 $conf->IP = dirname( dirname( __FILE__ ) );
 print "<li>Installation directory: <tt>" . htmlspecialchars( $conf->IP ) . "</tt></li>\n";
 
-$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $_SERVER["PHP_SELF"] ); # was SCRIPT_NAME
+
+// PHP_SELF isn't available sometimes, such as when PHP is CGI but
+// cgi.fix_pathinfo is disabled. In that case, fall back to SCRIPT_NAME
+// to get the path to the current script... hopefully it's reliable. SIGH
+$path = ($_SERVER["PHP_SELF"] === '')
+       ? $_SERVER["SCRIPT_NAME"]
+       : $_SERVER["PHP_SELF"];
+
+$conf->ScriptPath = preg_replace( '{^(.*)/config.*$}', '$1', $path );
 print "<li>Script URI path: <tt>" . htmlspecialchars( $conf->ScriptPath ) . "</tt></li>\n";
 
+
+
+// We may be installing from *.php5 extension file, if so, print message
+$conf->ScriptExtension = '.php';
+if (defined('MW_INSTALL_PHP5_EXT')) {
+    $conf->ScriptExtension = '.php5';
+    print "<li>Installing MediaWiki with <tt>php5</tt> file extensions</li>\n";
+} else {
+    print "<li>Installing MediaWiki with <tt>php</tt> file extensions</li>\n";
+}
+
+
 print "<li style='font-weight:bold;color:green;font-size:110%'>Environment checked. You can install MediaWiki.</li>\n";
        $conf->posted = ($_SERVER["REQUEST_METHOD"] == "POST");
 
@@ -402,20 +568,33 @@ print "<li style='font-weight:bold;color:green;font-size:110%'>Environment check
                ? 'root@localhost'
                : $_SERVER["SERVER_ADMIN"];
        $conf->EmergencyContact = importPost( "EmergencyContact", $defaultEmail );
-       $conf->DBtype = importPost( "DBtype", "mysql" );
+       $conf->DBtype = importPost( "DBtype", $DefaultDBtype );
+?>
+
+<?php
        $conf->DBserver = importPost( "DBserver", "localhost" );
        $conf->DBname = importPost( "DBname", "wikidb" );
        $conf->DBuser = importPost( "DBuser", "wikiuser" );
        $conf->DBpassword = importPost( "DBpassword" );
        $conf->DBpassword2 = importPost( "DBpassword2" );
-       $conf->DBprefix = importPost( "DBprefix" );
-       $conf->DBmysql5 = (importPost( "DBmysql5" ) == "true") ? "true" : "false";
-       $conf->RootUser = importPost( "RootUser", "root" );
-       $conf->RootPW = importPost( "RootPW", "-" );
-       $conf->LanguageCode = importPost( "LanguageCode", "en" );
        $conf->SysopName = importPost( "SysopName", "WikiSysop" );
        $conf->SysopPass = importPost( "SysopPass" );
        $conf->SysopPass2 = importPost( "SysopPass2" );
+       $conf->RootUser = importPost( "RootUser", "root" );
+       $conf->RootPW = importPost( "RootPW", "" );
+       $useRoot = importCheck( 'useroot', false );
+       $conf->LanguageCode = importPost( "LanguageCode", "en" );
+
+       ## MySQL specific:
+       $conf->DBprefix     = importPost( "DBprefix" );
+       $conf->setSchema( 
+               importPost( "DBschema", "mysql4" ), 
+               importPost( "DBengine", "InnoDB" ) );
+
+       ## Postgres specific:
+       $conf->DBport      = importPost( "DBport",      "5432" );
+       $conf->DBmwschema  = importPost( "DBmwschema",  "mediawiki" );
+       $conf->DBts2schema = importPost( "DBts2schema", "public" );
 
 /* Check for validity */
 $errs = array();
@@ -426,7 +605,10 @@ if( $conf->Sitename == "" || $conf->Sitename == "MediaWiki" || $conf->Sitename =
 if( $conf->DBuser == "" ) {
        $errs["DBuser"] = "Must not be blank";
 }
-if( $conf->DBpassword == "" ) {
+if( ($conf->DBtype == 'mysql') && (strlen($conf->DBuser) > 16) ) {
+       $errs["DBuser"] = "Username too long";
+}
+if( $conf->DBpassword == "" && $conf->DBtype != "postgres" ) {
        $errs["DBpassword"] = "Must not be blank";
 }
 if( $conf->DBpassword != $conf->DBpassword2 ) {
@@ -436,11 +618,47 @@ if( !preg_match( '/^[A-Za-z_0-9]*$/', $conf->DBprefix ) ) {
        $errs["DBprefix"] = "Invalid table prefix";
 }
 
-if( $conf->SysopPass == "" ) {
-       $errs["SysopPass"] = "Must not be blank";
-}
-if( $conf->SysopPass != $conf->SysopPass2 ) {
-       $errs["SysopPass2"] = "Passwords don't match!";
+error_reporting( E_ALL );
+
+/**
+ * Initialise $wgLang and $wgContLang to something so we can
+ * call case-folding methods. Per Brion, this is English for
+ * now, although we could be clever and initialise to the
+ * user-selected language.
+ */
+$wgContLang = Language::factory( 'en' );
+$wgLang = $wgContLang;
+
+/**
+ * We're messing about with users, so we need a stub
+ * authentication plugin...
+ */
+$wgAuth = new AuthPlugin();
+
+/**
+ * Validate the initial administrator account; username,
+ * password checks, etc.
+ */
+if( $conf->SysopName ) {
+       # Check that the user can be created
+       $u = User::newFromName( $conf->SysopName );
+       if( is_a($u, 'User') ) { // please do not use instanceof, it breaks PHP4
+               # Various password checks
+               if( $conf->SysopPass != '' ) {
+                       if( $conf->SysopPass == $conf->SysopPass2 ) {
+                               if( !$u->isValidPassword( $conf->SysopPass ) ) {
+                                       $errs['SysopPass'] = "Bad password";
+                               }
+                       } else {
+                               $errs['SysopPass2'] = "Passwords don't match";
+                       }
+               } else {
+                       $errs['SysopPass'] = "Cannot be blank";
+               }
+               unset( $u );
+       } else {
+               $errs['SysopName'] = "Bad username";
+       }
 }
 
 $conf->License = importRequest( "License", "none" );
@@ -448,7 +666,7 @@ if( $conf->License == "gfdl" ) {
        $conf->RightsUrl = "http://www.gnu.org/copyleft/fdl.html";
        $conf->RightsText = "GNU Free Documentation License 1.2";
        $conf->RightsCode = "gfdl";
-       $conf->RightsIcon = '${wgStylePath}/common/images/gnu-fdl.png';
+       $conf->RightsIcon = '${wgScriptPath}/skins/common/images/gnu-fdl.png';
 } elseif( $conf->License == "none" ) {
        $conf->RightsUrl = $conf->RightsText = $conf->RightsCode = $conf->RightsIcon = "";
 } else {
@@ -477,10 +695,10 @@ if ( $conf->Shm == 'memcached' && $conf->MCServers ) {
 }
 
 /* default values for installation */
-$conf->Email   =importRequest("Email", "email_enabled");
-$conf->Emailuser=importRequest("Emailuser", "emailuser_enabled");
-$conf->Enotif  =importRequest("Enotif", "enotif_allpages");
-$conf->Eauthent        =importRequest("Eauthent", "eauthent_enabled");
+$conf->Email     = importRequest("Email", "email_enabled");
+$conf->Emailuser = importRequest("Emailuser", "emailuser_enabled");
+$conf->Enotif    = importRequest("Enotif", "enotif_allpages");
+$conf->Eauthent  importRequest("Eauthent", "eauthent_enabled");
 
 if( $conf->posted && ( 0 == count( $errs ) ) ) {
        do { /* So we can 'continue' to end prematurely */
@@ -488,31 +706,58 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
 
                /* Load up the settings and get installin' */
                $local = writeLocalSettings( $conf );
+               echo "<li style=\"list-style: none\">\n";
                echo "<p><b>Generating configuration file...</b></p>\n";
-               // for debugging: // echo "<pre>" . htmlspecialchars( $local ) . "</pre>\n";
-               
+               echo "</li>\n";         
+
                $wgCommandLineMode = false;
                chdir( ".." );
-               eval($local);
-               if (!in_array($conf->DBtype, array("mysql", "oracle", "postgres"))) {
-                       $errs["DBtype"] = "Unknown database type.";
+               $ok = eval( $local );
+               if( $ok === false ) {
+                       dieout( "Errors in generated configuration; " .
+                               "most likely due to a bug in the installer... " .
+                               "Config file was: " .
+                               "<pre>" .
+                               htmlspecialchars( $local ) .
+                               "</pre>" .
+                               "</ul>" );
+               }
+               $conf->DBtypename = '';
+               foreach (array_keys($ourdb) as $db) {
+                       if ($conf->DBtype === $db)
+                               $conf->DBtypename = $ourdb[$db]['fullname'];
+               }
+               if ( ! strlen($conf->DBtype)) {
+                       $errs["DBpicktype"] = "Please choose a database type";
                        continue;
                }
-               print "<li>Database type: {$conf->DBtype}</li>\n";
+
+               if (! $conf->DBtypename) {
+                       $errs["DBtype"] = "Unknown database type '$conf->DBtype'";
+                       continue;
+               }
+               print "<li>Database type: {$conf->DBtypename}</li>\n";
                $dbclass = 'Database'.ucfirst($conf->DBtype);
-               require_once("$dbclass.php");
                $wgDBtype = $conf->DBtype;
                $wgDBadminuser = "root";
                $wgDBadminpassword = $conf->RootPW;
+
+               ## Mysql specific:
                $wgDBprefix = $conf->DBprefix;
+
+               ## Postgres specific:
+               $wgDBport      = $conf->DBport;
+               $wgDBmwschema  = $conf->DBmwschema;
+               $wgDBts2schema = $conf->DBts2schema;
+
                $wgCommandLineMode = true;
-               $wgUseDatabaseMessages = false; /* FIXME: For database failure */
-               require_once( "includes/Setup.php" );
+               $wgUseDatabaseMessages = false; /* FIXME: For database failure */
+               require_once( "$IP/includes/Setup.php" );
                chdir( "config" );
 
-               require_once( "maintenance/InitialiseMessages.inc" );
-
                $wgTitle = Title::newFromText( "Installation script" );
+               error_reporting( E_ALL );
+               print "<li>Loading class: $dbclass";
                $dbc = new $dbclass;
 
                if( $conf->DBtype == 'mysql' ) {
@@ -524,24 +769,21 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                        >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b></li>\n";
                        }
                        $ok = true; # Let's be optimistic
-                       
+
                        # Decide if we're going to use the superuser or the regular database user
-                       if( $conf->RootPW == '-' ) {
-                               # Regular user
-                               $conf->Root = false;
-                               $db_user = $wgDBuser;
-                               $db_pass = $wgDBpassword;
-                       } else {
-                               # Superuser
-                               $conf->Root = true;
+                       $conf->Root = $useRoot;
+                       if( $conf->Root ) {
                                $db_user = $conf->RootUser;
                                $db_pass = $conf->RootPW;
+                       } else {
+                               $db_user = $wgDBuser;
+                               $db_pass = $wgDBpassword;
                        }
-                       
+
                        # Attempt to connect
                        echo( "<li>Attempting to connect to database server as $db_user..." );
                        $wgDatabase = Database::newFromParams( $wgDBserver, $db_user, $db_pass, '', 1 );
-                       
+
                        # Check the connection and respond to errors
                        if( $wgDatabase->isOpen() ) {
                                # Seems OK
@@ -550,7 +792,7 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                $wgDBadminpassword = $db_pass;
                                echo( "success.</li>\n" );
                                $wgDatabase->ignoreErrors( true );
-                               $myver = mysql_get_server_info( $wgDatabase->mConn );
+                               $myver = $wgDatabase->getServerVersion();
                        } else {
                                # There were errors, report them and back out
                                $ok = false;
@@ -579,18 +821,34 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                                                break;
                                } # switch
                        } #conn. att.
-               
+
                        if( !$ok ) { continue; }
 
                } else /* not mysql */ {
-                       echo( "<li>Attempting to connect to database server as $wgDBuser..." );
+                       error_reporting( E_ALL );
+                       $wgSuperUser = '';
+                       ## Possible connect as a superuser
+                       if( $useRoot ) {
+                               $wgDBsuperuser = $conf->RootUser;
+                               echo( "<li>Attempting to connect to database \"postgres\" as superuser \"$wgDBsuperuser\"..." );
+                               $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBsuperuser, $conf->RootPW, "postgres", 1);
+                               if (!$wgDatabase->isOpen()) {
+                                       print " error: " . $wgDatabase->lastError() . "</li>\n";
+                                       $errs["DBserver"] = "Could not connect to database as superuser";
+                                       $errs["RootUser"] = "Check username";
+                                       $errs["RootPW"] = "and password";
+                                       continue;
+                               }
+                               $wgDatabase->initial_setup($conf->RootPW, 'postgres');
+                       }
+                       echo( "<li>Attempting to connect to database \"$wgDBname\" as \"$wgDBuser\"..." );
                        $wgDatabase = $dbc->newFromParams($wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1);
                        if (!$wgDatabase->isOpen()) {
                                print " error: " . $wgDatabase->lastError() . "</li>\n";
                        } else {
-                               $wgDatabase->ignoreErrors(true);
                                $myver = $wgDatabase->getServerVersion();
                        }
+                       $wgDatabase->initial_setup('', $wgDBname);
                }
 
                if ( !$wgDatabase->isOpen() ) {
@@ -601,14 +859,14 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                print "<li>Connected to $myver";
                if ($conf->DBtype == 'mysql') {
                        if( version_compare( $myver, "4.0.14" ) < 0 ) {
-                               die( " -- mysql 4.0.14 or later required. Aborting." );
+                               dieout( " -- mysql 4.0.14 or later required. Aborting." );
                        }
-                       $mysqlNewAuth   = version_compare( $myver, "4.1.0", "ge" );
+                       $mysqlNewAuth = version_compare( $myver, "4.1.0", "ge" );
                        if( $mysqlNewAuth && $mysqlOldClient ) {
                                print "; <b class='error'>You are using MySQL 4.1 server, but PHP is linked
-                                       to old client libraries; if you have trouble with authentication, see
-                                       <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
-                                       >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
+                                       to old client libraries; if you have trouble with authentication, see
+                                       <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'
+                                       >http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
                        }
                        if( $wgDBmysql5 ) {
                                if( $mysqlNewAuth ) {
@@ -620,16 +878,21 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                        }
                        print "</li>\n";
 
-                       @$sel = mysql_select_db( $wgDBname, $wgDatabase->mConn );
+                       @$sel = $wgDatabase->selectDB( $wgDBname );
                        if( $sel ) {
                                print "<li>Database <tt>" . htmlspecialchars( $wgDBname ) . "</tt> exists</li>\n";
                        } else {
                                $err = mysql_errno();
-                               if ( $err != 1049 ) {
-                                       print "<ul><li>Error selecting database $wgDBname: $err " .
-                                               htmlspecialchars( mysql_error() ) . "</li></ul>";
+                               $databaseSafe = htmlspecialchars( $wgDBname );
+                               if( $err == 1102 /* Invalid database name */ ) {
+                                       print "<ul><li><strong>{$databaseSafe}</strong> is not a valid database name.</li></ul>";
+                                       continue;
+                               } elseif( $err != 1049 /* Database doesn't exist */ ) {
+                                       print "<ul><li>Error selecting database <strong>{$databaseSafe}</strong>: {$err} ";
+                                       print htmlspecialchars( mysql_error() ) . "</li></ul>";
                                        continue;
                                }
+                               print "<li>Attempting to create database...</li>";
                                $res = $wgDatabase->query( "CREATE DATABASE `$wgDBname`" );
                                if( !$res ) {
                                        print "<li>Couldn't create database <tt>" .
@@ -642,81 +905,146 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                        }
                        $wgDatabase->selectDB( $wgDBname );
                }
+               else if ($conf->DBtype == 'postgres') {
+                       if( version_compare( $myver, "PostgreSQL 8.0" ) < 0 ) {
+                               dieout( " <b>Postgres 8.0 or later is required</b>. Aborting.</li></ul>" );
+                       }
+               }
 
                if( $wgDatabase->tableExists( "cur" ) || $wgDatabase->tableExists( "revision" ) ) {
                        print "<li>There are already MediaWiki tables in this database. Checking if updates are needed...</li>\n";
 
-                       # Create user if required
-                       if ( $conf->Root ) {
-                               $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
-                               if ( $conn->isOpen() ) {
-                                       print "<li>DB user account ok</li>\n";
-                                       $conn->close();
-                               } else {
-                                       print "<li>Granting user permissions...";
-                                       if( $mysqlOldClient && $mysqlNewAuth ) {
-                                               print " <b class='error'>If the next step fails, see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'>http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
+                       if ( $conf->DBtype == 'mysql') {
+                               # Determine existing default character set
+                               if ( $wgDatabase->tableExists( "revision" ) ) {
+                                       $revision = $wgDatabase->escapeLike( $conf->DBprefix . 'revision' );
+                                       $res = $wgDatabase->query( "SHOW TABLE STATUS LIKE '$revision'" );
+                                       $row = $wgDatabase->fetchObject( $res );
+                                       if ( !$row ) {
+                                               echo "<li>SHOW TABLE STATUS query failed!</li>\n";
+                                               $existingSchema = false;
+                                               $existingEngine = false;
+                                       } else {
+                                               if ( preg_match( '/^latin1/', $row->Collation ) ) {
+                                                       $existingSchema = 'mysql4';
+                                               } elseif ( preg_match( '/^utf8/', $row->Collation ) ) {
+                                                       $existingSchema = 'mysql5';
+                                               } elseif ( preg_match( '/^binary/', $row->Collation ) ) {
+                                                       $existingSchema = 'mysql5-binary';
+                                               } else {
+                                                       $existingSchema = false;
+                                                       echo "<li><strong>Warning:</strong> Unrecognised existing collation</li>\n";
+                                               }
+                                               if ( isset( $row->Engine ) ) {
+                                                       $existingEngine = $row->Engine;
+                                               } else {
+                                                       $existingEngine = $row->Type;
+                                               }
+                                       }
+                                       if ( $existingSchema && $existingSchema != $conf->DBschema ) {
+                                               print "<li><strong>Warning:</strong> you requested the {$conf->DBschema} schema, " .
+                                                       "but the existing database has the $existingSchema schema. This upgrade script ". 
+                                                       "can't convert it, so it will remain $existingSchema.</li>\n";
+                                               $conf->setSchema( $existingSchema, $conf->DBengine );
+                                       }
+                                       if ( $existingEngine && $existingEngine != $conf->DBengine ) {
+                                               print "<li><strong>Warning:</strong> you requested the {$conf->DBengine} storage " .
+                                                       "engine, but the existing database uses the $existingEngine engine. This upgrade " .
+                                                       "script can't convert it, so it will remain $existingEngine.</li>\n";
+                                               $conf->setSchema( $conf->DBschema, $existingEngine );
+                                       }
+                               }
+
+                               # Create user if required
+                               if ( $conf->Root ) {
+                                       $conn = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
+                                       if ( $conn->isOpen() ) {
+                                               print "<li>DB user account ok</li>\n";
+                                               $conn->close();
+                                       } else {
+                                               print "<li>Granting user permissions...";
+                                               if( $mysqlOldClient && $mysqlNewAuth ) {
+                                                       print " <b class='error'>If the next step fails, see <a href='http://dev.mysql.com/doc/mysql/en/old-client.html'>http://dev.mysql.com/doc/mysql/en/old-client.html</a> for help.</b>";
+                                               }
+                                               print "</li>\n";
+                                               dbsource( "../maintenance/users.sql", $wgDatabase );
                                        }
-                                       print "</li>\n";
-                                       dbsource( "../maintenance/users.sql", $wgDatabase );
                                }
                        }
-                       print "<pre>\n";
+                       print "</ul><pre>\n";
                        chdir( ".." );
                        flush();
                        do_all_updates();
                        chdir( "config" );
-
                        print "</pre>\n";
-                       print "<li>Finished update checks.</li>\n";
+                       print "<ul><li>Finished update checks.</li>\n";
                } else {
+                       # Determine available storage engines if possible
+                       if ( $conf->DBtype == 'mysql' && version_compare( $myver, "4.1.2", "ge" ) ) {
+                               $res = $wgDatabase->query( 'SHOW ENGINES' );
+                               $found = false;
+                               while ( $row = $wgDatabase->fetchObject( $res ) ) {
+                                       if ( $row->Engine == $conf->DBengine ) {
+                                               $found = true;
+                                               break;
+                                       }
+                               }
+                               $wgDatabase->freeResult( $res );
+                               if ( !$found && $conf->DBengine != 'MyISAM' ) {
+                                       echo "<li><strong>Warning:</strong> {$conf->DBengine} storage engine not available, " .
+                                               "using MyISAM instead</li>\n";
+                                       $conf->setSchema( $conf->DBschema, 'MyISAM' );
+                               }
+                       }
+
                        # FIXME: Check for errors
                        print "<li>Creating tables...";
                        if ($conf->DBtype == 'mysql') {
-                               if( $wgDBmysql5 ) {
-                                       print " using MySQL 5 table defs...";
-                                       dbsource( "../maintenance/mysql5/tables.sql", $wgDatabase );
-                               } else {
-                                       print " using MySQL 4 table defs...";
-                                       dbsource( "../maintenance/tables.sql", $wgDatabase );
-                               }
+                               dbsource( "../maintenance/tables.sql", $wgDatabase );
                                dbsource( "../maintenance/interwiki.sql", $wgDatabase );
                        } else if ($conf->DBtype == 'postgres') {
-                               dbsource( "../maintenance/postgres/tables.sql", $wgDatabase );
-                               $wgDatabase->update_interwiki();
-                       else {
-                               dbsource( "../maintenance/oracle/tables.sql", $wgDatabase );
-                               dbsource( "../maintenance/oracle/interwiki.sql", $wgDatabase );
+                               $wgDatabase->setup_database();
+                       }
+                       else {
+                               $errs["DBtype"] = "Do not know how to handle database type '$conf->DBtype'";
+                               continue;
                        }
 
                        print " done.</li>\n";
 
-                       print "<li>Initializing data...";
+                       print "<li>Initializing statistics...</li>\n";
                        $wgDatabase->insert( 'site_stats',
-                               array( 'ss_row_id'        => 1,
-                                      'ss_total_views'   => 0,
-                                      'ss_total_edits'   => 0,
-                                      'ss_good_articles' => 0 ) );
-                                          
+                               array ( 'ss_row_id'        => 1,
+                                               'ss_total_views'   => 0,
+                                               'ss_total_edits'   => 1, # Main page first edit
+                                               'ss_good_articles' => 0, # Main page is not a good article - no internal link
+                                               'ss_total_pages'   => 1, # Main page
+                                               'ss_users'         => $conf->SysopName ? 1 : 0, # Sysop account, if created
+                                               'ss_admins'        => $conf->SysopName ? 1 : 0, # Sysop account, if created
+                                               'ss_images'        => 0 ) );
+
                        # Set up the "regular user" account *if we can, and if we need to*
-                       if( $conf->Root ) {
+                       if( $conf->Root and $conf->DBtype == 'mysql') {
                                # See if we need to
                                $wgDatabase2 = $dbc->newFromParams( $wgDBserver, $wgDBuser, $wgDBpassword, $wgDBname, 1 );
                                if( $wgDatabase2->isOpen() ) {
                                        # Nope, just close the test connection and continue
                                        $wgDatabase2->close();
-                                       echo( "<li>User $wgDBuser exists. Skipping grants.</li>" );
+                                       echo( "<li>User $wgDBuser exists. Skipping grants.</li>\n" );
                                } else {
                                        # Yes, so run the grants
                                        echo( "<li>Granting user permissions to $wgDBuser on $wgDBname..." );
                                        dbsource( "../maintenance/users.sql", $wgDatabase );
-                                       echo( "success.</li>" );
+                                       echo( "success.</li>\n" );
                                }
                        }
-                                          
+
                        if( $conf->SysopName ) {
                                $u = User::newFromName( $conf->getSysopName() );
-                               if ( 0 == $u->idForName() ) {
+                               if ( !$u ) {
+                                       print "<li><strong class=\"error\">Warning:</strong> Skipped sysop account creation - invalid username!</li>\n";
+                               }
+                               else if ( 0 == $u->idForName() ) {
                                        $u->addToDatabase();
                                        $u->setPassword( $conf->getSysopPass() );
                                        $u->saveSettings();
@@ -738,31 +1066,22 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                        $newid = $article->insertOn( $wgDatabase );
                        $revision = new Revision( array(
                                'page'      => $newid,
-                               'text'      => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsg( 'mainpagedocfooter' ),
+                               'text'      => wfMsg( 'mainpagetext' ) . "\n\n" . wfMsgNoTrans( 'mainpagedocfooter' ),
                                'comment'   => '',
                                'user'      => 0,
                                'user_text' => 'MediaWiki default',
                                ) );
                        $revid = $revision->insertOn( $wgDatabase );
                        $article->updateRevisionOn( $wgDatabase, $revision );
-
-                       print "<li><pre>";
-                       initialiseMessages();
-                       print "</pre></li>\n";
                }
 
                /* Write out the config file now that all is well */
+               print "<li style=\"list-style: none\">\n";
                print "<p>Creating LocalSettings.php...</p>\n\n";
-               $localSettings =  "<" . "?php$endl$local$endl?" . ">";
+               $localSettings = "<" . "?php$endl$local";
                // Fix up a common line-ending problem (due to CVS on Windows)
                $localSettings = str_replace( "\r\n", "\n", $localSettings );
-
-               if( version_compare( phpversion(), "4.3.2" ) >= 0 ) {
-                       $xt = "xt"; # Refuse to overwrite an existing file
-               } else {
-                       $xt = "wt"; # 'x' is not available prior to PHP 4.3.2. We did check above, but race conditions blah blah
-               }
-               $f = fopen( "LocalSettings.php", $xt );
+               $f = fopen( "LocalSettings.php", 'xt' );
 
                if( $f == false ) {
                        dieout( "<p>Couldn't write out LocalSettings.php. Check that the directory permissions are correct and that there isn't already a file of that name here...</p>\n" .
@@ -771,11 +1090,12 @@ if( $conf->posted && ( 0 == count( $errs ) ) ) {
                }
                if(fwrite( $f, $localSettings ) ) {
                        fclose( $f );
+                       print "</li></ul><hr/>\n";
                        writeSuccessMessage();
                } else {
                        fclose( $f );
                        die("<p class='error'>An error occured while writing the config/LocalSettings.php file. Check user rights and disk space then try again.</p>\n");
-
+                       print "</li></ul>\n";
                }
 
        } while( false );
@@ -794,7 +1114,7 @@ if( count( $errs ) ) {
        }
 ?>
 
-<form action="index.php" name="config" method="post">
+<form action="<?php echo defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php'; ?>" name="config" method="post">
 
 
 <h2>Site config</h2>
@@ -806,7 +1126,7 @@ if( count( $errs ) ) {
                ?>
        </div>
        <p class="config-desc">
-               Preferably a short word without punctuation, i.e. "Wikipedia".<br>
+               Preferably a short word without punctuation, i.e. "Wikipedia".<br />
                Will appear as the namespace name for "meta" pages, and throughout the interface.
        </p>
 
@@ -833,7 +1153,7 @@ if( count( $errs ) ) {
                </select>
        </div>
        <p class="config-desc">
-               Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) used for all localizations.
+               Select the language for your wiki's interface. Some localizations aren't fully complete. Unicode (UTF-8) is used for all localizations.
        </p>
 
        <div class="config-input">
@@ -845,14 +1165,15 @@ if( count( $errs ) ) {
                <li><?php
                        aField( $conf, "License", "A Creative Commons license - ", "radio", "cc" );
                        $partner = "MediaWiki";
-                       $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/index.php?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
+   $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+                       $exit = urlencode( "$wgServer{$conf->ScriptPath}/config/$script?License=cc&RightsUrl=[license_url]&RightsText=[license_name]&RightsCode=[license_code]&RightsIcon=[license_button]" );
                        $icon = urlencode( "$wgServer$wgUploadPath/wiki.png" );
                        $ccApp = htmlspecialchars( "http://creativecommons.org/license/?partner=$partner&exit_url=$exit&partner_icon_url=$icon" );
                        print "<a href=\"$ccApp\" target='_blank'>choose</a>";
                        ?>
                <?php if( $conf->License == "cc" ) { ?>
                        <ul>
-                               <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='icon' />", "hidden" ); ?></li>
+                               <li><?php aField( $conf, "RightsIcon", "<img src=\"" . htmlspecialchars( $conf->RightsIcon ) . "\" alt='(Creative Commons icon)' />", "hidden" ); ?></li>
                                <li><?php aField( $conf, "RightsText", htmlspecialchars( $conf->RightsText ), "hidden" ); ?></li>
                                <li><?php aField( $conf, "RightsCode", "code: " . htmlspecialchars( $conf->RightsCode ), "hidden" ); ?></li>
                                <li><?php aField( $conf, "RightsUrl", "<a href=\"" . htmlspecialchars( $conf->RightsUrl ) . "\">" . htmlspecialchars( $conf->RightsUrl ) . "</a>", "hidden" ); ?></li>
@@ -876,8 +1197,10 @@ if( count( $errs ) ) {
                <?php aField( $conf, "SysopPass2", "Password confirm:", "password" ) ?>
        </div>
        <p class="config-desc">
-               An admin can lock/delete pages, block users from editing, and other maintenance tasks.<br>
+               An admin can lock/delete pages, block users from editing, and do other maintenance tasks.<br />
                A new account will be added only when creating a new wiki database.
+               <br /><br />
+               The password cannot be the same as the username.
        </p>
 
        <div class="config-input">
@@ -891,6 +1214,11 @@ if( count( $errs ) ) {
                                aField( $conf, "Shm", "Turck MMCache", "radio", "turck" );
                                echo "</li>";
                        }
+                       if( $conf->xcache ) {
+                               echo( '<li>' );
+                               aField( $conf, 'Shm', 'XCache', 'radio', 'xcache' );
+                               echo( '</li>' );
+                       }
                        if ( $conf->apc ) {
                                echo "<li>";
                                aField( $conf, "Shm", "APC", "radio", "apc" );
@@ -907,10 +1235,11 @@ if( count( $errs ) ) {
                <div style="clear:left"><?php aField( $conf, "MCServers", "Memcached servers:", "text" ) ?></div>
        </div>
        <p class="config-desc">
-               Using a shared memory system such as Turck MMCache, APC, eAccelerator, or Memcached 
-               will speed up MediaWiki significantly. Memcached is the best solution but needs to be
-               installed. Specify the server addresses and ports in a comma-separted list. Only
-               use Turck shared memory if the wiki will be running on a single Apache server.
+               An object caching system such as memcached will provide a significant performance boost,
+               but needs to be installed. Provide the server addresses and ports in a comma-separated list.
+               <br /><br />
+               MediaWiki can also detect and support eAccelerator, Turck MMCache, APC, and XCache, but
+               these should not be used if the wiki will be running on multiple application servers.
        </p>
 </div>
 
@@ -925,7 +1254,7 @@ if( count( $errs ) ) {
                </ul>
        </div>
        <p class="config-desc">
-               Use this to disable all e-mail functions (password reminders, user-to-user e-mail and e-mail notifications)
+               Use this to disable all e-mail functions (password reminders, user-to-user e-mail, and e-mail notifications)
                if sending mail doesn't work on your server.
        </p>
 
@@ -948,7 +1277,7 @@ if( count( $errs ) ) {
                </ul>
        </div>
        <div class="config-desc">
-               <p>             
+               <p>
                For this feature to work, an e-mail address must be present for the user account, and the notification
                options in the user's preferences must be enabled. Also note the 
                authentication option below. When testing the feature, keep in mind that your own changes will never trigger notifications to be sent to yourself.</p>
@@ -975,27 +1304,20 @@ if( count( $errs ) ) {
 <div class="config-section">
 <div class="config-input">
                <label class='column'>Database type:</label>
-               <ul class='plain'>
-                       <li><?php aField( $conf, "DBtype", "MySQL", "radio", "mysql"); ?></li>
-                       <li><?php aField( $conf, "DBtype", "Oracle (experimental)", "radio", "oracle" ); ?></li>
-                       <li><?php aField( $conf, "DBtype", "PostgreSQL", "radio", "postgres" ); ?></li>
-               </ul>
+<?php if (isset($errs['DBpicktype'])) print "<span class='error'>$errs[DBpicktype]</span>\n"; ?>
+               <ul class='plain'><?php database_picker($conf) ?></ul>
        </div>
 
        <div class="config-input" style="clear:left"><?php
-               aField( $conf, "DBserver", "SQL server host:" );
+               aField( $conf, "DBserver", "Database host:" );
        ?></div>
        <p class="config-desc">
-               If your database server isn't on your web server, enter the name
-               or IP address here. MySQL and PostgreSQL only. If using a port for PostgreSQL, enter the number here.
+               If your database server isn't on your web server, enter the name or IP address here.
        </p>
 
        <div class="config-input"><?php
                aField( $conf, "DBname", "Database name:" );
        ?></div>
-       <div class="config-desc">
-               If using Oracle, set this to your connection identifier.
-       </div>
        <div class="config-input"><?php
                aField( $conf, "DBuser", "DB username:" );
        ?></div>
@@ -1008,29 +1330,63 @@ if( count( $errs ) ) {
        <p class="config-desc">
                If you only have a single user account and database available,
                enter those here. If you have database root access (see below)
-               you can specify new accounts/databases to be created.
+               you can specify new accounts/databases to be created. This account 
+               will not be created if it pre-exists. If this is the case, ensure that it
+               has SELECT, INSERT, UPDATE, and DELETE permissions on the MediaWiki database.
        </p>
-       <p>
-               This account will not be created if it pre-exists. If this is the case, ensure that it
-               has SELECT, INSERT, UPDATE and DELETE permissions on the MediaWiki database.
+
+       <div class="config-input">
+               <label class="column">Superuser account:</label>
+               <input type="checkbox" name="useroot" id="useroot" <?php if( $useRoot ) { ?>checked="checked" <?php } ?>/>
+               &nbsp;<label for="useroot">Use superuser account</label>
+       </div>
+       <div class="config-input">
+               <?php
+               aField( $conf, "RootUser", "Superuser name:", "superuser" );
+               ?>
+       </div>
+       <div class="config-input">
+               <?php
+               aField( $conf, "RootPW", "Superuser password:", "password" );
+               ?>
+       </div>
+
+       <p class="config-desc">
+               If the database user specified above does not exist, or does not have access to create
+               the database (if needed) or tables within it, please check the box and provide details
+               of a superuser account, such as <strong>root</strong>, which does.
        </p>
 
+       <?php database_switcher('mysql'); ?>
        <div class="config-input"><?php
                aField( $conf, "DBprefix", "Database table prefix:" );
        ?></div>
        <div class="config-desc">
                <p>If you need to share one database between multiple wikis, or
-               MediaWiki and another web application, you may choose to
+               between MediaWiki and another web application, you may choose to
                add a prefix to all the table names to avoid conflicts.</p>
 
                <p>Avoid exotic characters; something like <tt>mw_</tt> is good.</p>
        </div>
 
-       <div class="config-input"><label class="column">Database charset</label>
+       <div class="config-input"><label class="column">Storage Engine</label>
                <div>Select one:</div>
                <ul class="plain">
-               <li><?php aField( $conf, "DBmysql5", "Backwards-compatible UTF-8", "radio", "false" ); ?></li>
-               <li><?php aField( $conf, "DBmysql5", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "true" ); ?></li>
+               <li><?php aField( $conf, "DBengine", "InnoDB", "radio", "InnoDB" ); ?></li>
+               <li><?php aField( $conf, "DBengine", "MyISAM", "radio", "MyISAM" ); ?></li>
+               </ul>
+       </div>
+       <p class="config-desc">
+               InnoDB is best for public web installations, since it has good concurrency 
+               support. MyISAM may be faster in single-user installations. MyISAM databases 
+               tend to get corrupted more often than InnoDB databases.
+       </p>
+       <div class="config-input"><label class="column">Database character set</label>
+               <div>Select one:</div>
+               <ul class="plain">
+               <li><?php aField( $conf, "DBschema", "Backwards-compatible UTF-8", "radio", "mysql4" ); ?></li>
+               <li><?php aField( $conf, "DBschema", "Experimental MySQL 4.1/5.0 UTF-8", "radio", "mysql5" ); ?></li>
+               <li><?php aField( $conf, "DBschema", "Experimental MySQL 4.1/5.0 binary", "radio", "mysql5-binary" ); ?></li>
                </ul>
        </div>
        <p class="config-desc">
@@ -1039,23 +1395,24 @@ if( count( $errs ) ) {
                cause things to break. <b>If upgrading an older installation, leave
                in backwards-compatible mode.</b>
        </p>
-
-       <div class="config-input">
-               <?php
-               aField( $conf, "RootUser", "Superuser account:", "superuser" );
-               ?>
        </div>
-       <div class="config-input">
-               <?php
-               aField( $conf, "RootPW", "Superuser password:", "password" );
-               ?>
+
+       <?php database_switcher('postgres'); ?>
+       <div class="config-input"><?php
+               aField( $conf, "DBport", "Database port:" );
+       ?></div>
+       <div class="config-input"><?php
+               aField( $conf, "DBmwschema", "Schema for mediawiki:" );
+       ?></div>
+       <div class="config-input"><?php
+               aField( $conf, "DBts2schema", "Schema for tsearch2:" );
+       ?></div>
+       <div class="config-desc">
+               <p>The username specified above (at "DB username") will have its search path set to the above schemas, 
+               so it is recommended that you create a new user. The above schemas are generally correct: 
+        only change them if you are sure you need to.</p>
        </div>
-       
-       <p class="config-desc">
-               If the database user specified above does not exist, or does not have access to create
-               the database (if needed) or tables within it, please provide details of a superuser account,
-               such as <strong>root</strong>, which does. Leave the password set to <strong>-</strong> if this is not needed.
-       </p>
+       </fieldset>
 
        <div class="config-input" style="padding:2em 0 3em">
                <label class='column'>&nbsp;</label>
@@ -1064,6 +1421,14 @@ if( count( $errs ) ) {
 
 </div>
 
+<script type="text/javascript">
+window.onload = toggleDBarea('<?php echo $conf->DBtype; ?>',
+<?php
+       ## If they passed in a root user name, don't populate it on page load
+       echo strlen(importPost('RootUser', '')) ? 0 : 1;
+?>);
+</script>
+
 </form>
 
 <?php
@@ -1071,24 +1436,35 @@ if( count( $errs ) ) {
 
 /* -------------------------------------------------------------------------------------- */
 function writeSuccessMessage() {
-       if ( ini_get( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
+ $script = defined('MW_INSTALL_PHP5_EXT') ? 'index.php5' : 'index.php';
+       if ( wfIniGetBool( 'safe_mode' ) && !ini_get( 'open_basedir' ) ) {
                echo <<<EOT
+<div class="success-box">
 <p>Installation successful!</p>
 <p>To complete the installation, please do the following:
 <ol>
        <li>Download config/LocalSettings.php with your FTP client or file manager</li>
        <li>Upload it to the parent directory</li>
        <li>Delete config/LocalSettings.php</li>
-       <li>Start using <a href='../index.php'>your wiki</a>!
+       <li>Start using <a href='../$script'>your wiki</a>!
 </ol>
 <p>If you are in a shared hosting environment, do <strong>not</strong> just move LocalSettings.php
 remotely. LocalSettings.php is currently owned by the user your webserver is running under,
 which means that anyone on the same server can read your database password! Downloading
 it and uploading it again will hopefully change the ownership to a user ID specific to you.</p>
+</div>
 EOT;
        } else {
-               echo "<p>Installation successful! Move the config/LocalSettings.php file into the parent directory, then follow
-                       <a href='../index.php'>this link</a> to your wiki.</p>\n";
+               echo <<<EOT
+<div class="success-box">
+<p>
+<span class="success-message">Installation successful!</span>
+Move the <tt>config/LocalSettings.php</tt> file to the parent directory, then follow
+<a href="../$script"> this link</a> to your wiki.</p>
+<p>You should change file permissions for <tt>LocalSettings.php</tt> as required to
+prevent other users on the server reading passwords and altering configuration data.</p>
+</div>
+EOT;
        }
 }
 
@@ -1106,13 +1482,9 @@ function escapePhpString( $string ) {
 }
 
 function writeLocalSettings( $conf ) {
-       $conf->UseImageResize = $conf->UseImageResize ? 'true' : 'false';
        $conf->PasswordSender = $conf->EmergencyContact;
-       $zlib = ($conf->zlib ? "" : "# ");
        $magic = ($conf->ImageMagick ? "" : "# ");
        $convert = ($conf->ImageMagick ? $conf->ImageMagick : "/usr/bin/convert" );
-       $pretty = ($conf->prettyURLs ? "" : "# ");
-       $ugly = ($conf->prettyURLs ? "# " : "");
        $rights = ($conf->RightsUrl) ? "" : "# ";
        $hashedUploads = $conf->safeMode ? '' : '# ';
 
@@ -1122,6 +1494,7 @@ function writeLocalSettings( $conf ) {
                        $mcservers = var_export( $conf->MCServerArray, true );
                        break;
                case 'turck':
+               case 'xcache':
                case 'apc':
                case 'eaccel':
                        $cacheType = 'CACHE_ACCEL';
@@ -1196,7 +1569,7 @@ if( defined( 'MW_INSTALL_PATH' ) ) {
 \$path = array( \$IP, \"\$IP/includes\", \"\$IP/languages\" );
 set_include_path( implode( PATH_SEPARATOR, \$path ) . PATH_SEPARATOR . get_include_path() );
 
-require_once( \"includes/DefaultSettings.php\" );
+require_once( \"\$IP/includes/DefaultSettings.php\" );
 
 # If PHP's memory limit is very low, some operations may fail.
 " . ($conf->raiseMemory ? '' : '# ' ) . "ini_set( 'memory_limit', '20M' );" . "
@@ -1205,38 +1578,29 @@ if ( \$wgCommandLineMode ) {
        if ( isset( \$_SERVER ) && array_key_exists( 'REQUEST_METHOD', \$_SERVER ) ) {
                die( \"This script must be run from the command line\\n\" );
        }
-} elseif ( empty( \$wgNoOutputBuffer ) ) {
-       ## Compress output if the browser supports it
-       {$zlib}if( !ini_get( 'zlib.output_compression' ) ) @ob_start( 'ob_gzhandler' );
 }
+## Uncomment this to disable output compression
+# \$wgDisableOutputCompression = true;
 
 \$wgSitename         = \"{$slconf['Sitename']}\";
 
-\$wgScriptPath     = \"{$slconf['ScriptPath']}\";
-\$wgScript           = \"\$wgScriptPath/index.php\";
-\$wgRedirectScript   = \"\$wgScriptPath/redirect.php\";
+## The URL base path to the directory containing the wiki;
+## defaults for all runtime URL paths are based off of this.
+\$wgScriptPath       = \"{$slconf['ScriptPath']}\";
+\$wgScriptExtension  = \"{$slconf['ScriptExtension']}\";
 
 ## For more information on customizing the URLs please see:
-## http://meta.wikimedia.org/wiki/Eliminating_index.php_from_the_url
-## If using PHP as a CGI module, the ?title= style usually must be used.
-{$pretty}\$wgArticlePath      = \"\$wgScript/\$1\";
-{$ugly}\$wgArticlePath      = \"\$wgScript?title=\$1\";
-
-\$wgStylePath        = \"\$wgScriptPath/skins\";
-\$wgStyleDirectory   = \"\$IP/skins\";
-\$wgLogo             = \"\$wgStylePath/common/images/wiki.png\";
+## http://www.mediawiki.org/wiki/Manual:Short_URL
 
-\$wgUploadPath       = \"\$wgScriptPath/images\";
-\$wgUploadDirectory  = \"\$IP/images\";
-
-\$wgEnableEmail = $enableemail;
-\$wgEnableUserEmail = $enableuseremail;
+\$wgEnableEmail      = $enableemail;
+\$wgEnableUserEmail  = $enableuseremail;
 
 \$wgEmergencyContact = \"{$slconf['EmergencyContact']}\";
-\$wgPasswordSender     = \"{$slconf['PasswordSender']}\";
+\$wgPasswordSender = \"{$slconf['PasswordSender']}\";
 
 ## For a detailed description of the following switches see
-## http://meta.wikimedia.org/Enotif and http://meta.wikimedia.org/Eauthent
+## http://www.mediawiki.org/wiki/Extension:Email_notification 
+## and http://www.mediawiki.org/wiki/Extension:Email_notification
 ## There are many more options for fine tuning available see
 ## /includes/DefaultSettings.php
 ## UPO means: this is also a user preference option
@@ -1244,24 +1608,33 @@ if ( \$wgCommandLineMode ) {
 \$wgEnotifWatchlist = $enotifwatchlist; # UPO
 \$wgEmailAuthentication = $eauthent;
 
+\$wgDBtype           = \"{$slconf['DBtype']}\";
 \$wgDBserver         = \"{$slconf['DBserver']}\";
 \$wgDBname           = \"{$slconf['DBname']}\";
 \$wgDBuser           = \"{$slconf['DBuser']}\";
 \$wgDBpassword       = \"{$slconf['DBpassword']}\";
+
+# MySQL specific settings
 \$wgDBprefix         = \"{$slconf['DBprefix']}\";
-\$wgDBtype           = \"{$slconf['DBtype']}\";
+
+# MySQL table options to use during installation or update
+\$wgDBTableOptions   = \"{$slconf['DBTableOptions']}\";
 
 # Experimental charset support for MySQL 4.1/5.0.
 \$wgDBmysql5 = {$conf->DBmysql5};
 
+# Postgres specific settings
+\$wgDBport           = \"{$slconf['DBport']}\";
+\$wgDBmwschema       = \"{$slconf['DBmwschema']}\";
+\$wgDBts2schema      = \"{$slconf['DBts2schema']}\";
+
 ## Shared memory settings
 \$wgMainCacheType = $cacheType;
 \$wgMemCachedServers = $mcservers;
 
 ## To enable image uploads, make sure the 'images' directory
 ## is writable, then set this to true:
-\$wgEnableUploads              = false;
-\$wgUseImageResize             = {$conf->UseImageResize};
+\$wgEnableUploads       = false;
 {$magic}\$wgUseImageMagick = true;
 {$magic}\$wgImageMagickConvertCommand = \"{$convert}\";
 
@@ -1273,10 +1646,7 @@ if ( \$wgCommandLineMode ) {
 
 ## If you have the appropriate support software installed
 ## you can enable inline LaTeX equations:
-\$wgUseTeX              = false;
-\$wgMathPath         = \"{\$wgUploadPath}/math\";
-\$wgMathDirectory    = \"{\$wgUploadDirectory}/math\";
-\$wgTmpDirectory     = \"{\$wgUploadDirectory}/tmp\";
+\$wgUseTeX           = false;
 
 \$wgLocalInterwiki   = \$wgSitename;
 
@@ -1302,9 +1672,9 @@ if ( \$wgCommandLineMode ) {
 
 # When you make changes to this configuration file, this will make
 # sure that cached pages are cleared.
-\$configdate = gmdate( 'YmdHis', @filemtime( __FILE__ ) );
-\$wgCacheEpoch = max( \$wgCacheEpoch, \$configdate );
-";
+\$wgCacheEpoch = max( \$wgCacheEpoch, gmdate( 'YmdHis', @filemtime( __FILE__ ) ) );
+       "; ## End of setting the $localsettings string
+
        // Keep things in Unix line endings internally;
        // the system will write out as local text type.
        return str_replace( "\r\n", "\n", $localsettings );
@@ -1330,13 +1700,17 @@ function importPost( $name, $default = "" ) {
        return importVar( $_POST, $name, $default );
 }
 
+function importCheck( $name ) {
+       return isset( $_POST[$name] );
+}
+
 function importRequest( $name, $default = "" ) {
        return importVar( $_REQUEST, $name, $default );
 }
 
 $radioCount = 0;
 
-function aField( &$conf, $field, $text, $type = "text", $value = "" ) {
+function aField( &$conf, $field, $text, $type = "text", $value = "", $onclick = '' ) {
        global $radioCount;
        if( $type != "" ) {
                $xtype = "type=\"$type\"";
@@ -1361,12 +1735,18 @@ function aField( &$conf, $field, $text, $type = "text", $value = "" ) {
        } else {
                $checked = "";
        }
-       echo "\t\t<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked value=\"";
+       echo "\t\t<input $xtype name=\"$field\" id=\"$id\" class=\"iput-$type\" $checked ";
+       if ($onclick) {
+               echo " onclick='toggleDBarea(\"$value\",1)' " ;
+       }
+       echo "value=\"";
        if( $type == "radio" ) {
                echo htmlspecialchars( $value );
        } else {
                echo htmlspecialchars( $conf->$field );
        }
+
+
        echo "\" />\n";
        if( $nolabel ) {
                echo " $text</label>\n";
@@ -1377,17 +1757,20 @@ function aField( &$conf, $field, $text, $type = "text", $value = "" ) {
 }
 
 function getLanguageList() {
-       global $wgLanguageNames;
+       global $wgLanguageNames, $IP;
        if( !isset( $wgLanguageNames ) ) {
-               require_once( "languages/Names.php" );
+               require_once( "$IP/languages/Names.php" );
        }
 
        $codes = array();
 
-       $d = opendir( "../languages" );
+       $d = opendir( "../languages/messages" );
+       /* In case we are called from the root directory */
+       if (!$d)
+               $d = opendir( "languages/messages");
        while( false !== ($f = readdir( $d ) ) ) {
                $m = array();
-               if( preg_match( '/Language([A-Z][a-z_]+)\.php$/', $f, $m ) ) {
+               if( preg_match( '/Messages([A-Z][a-z_]+)\.php$/', $f, $m ) ) {
                        $code = str_replace( '_', '-', strtolower( $m[1] ) );
                        if( isset( $wgLanguageNames[$code] ) ) {
                                $name = $code . ' - ' . $wgLanguageNames[$code];
@@ -1412,7 +1795,7 @@ function locate_executable($loc, $names, $versioninfo = false) {
 
        foreach ($names as $name) {
                $command = "$loc".DIRECTORY_SEPARATOR."$name";
-               if (file_exists($command)) {
+               if (@file_exists($command)) {
                        if (!$versioninfo)
                                return $command;
 
@@ -1424,15 +1807,6 @@ function locate_executable($loc, $names, $versioninfo = false) {
        return false;
 }
 
-function get_db_version() {
-       global $wgDatabase, $conf;
-       if ($conf->DBtype == 'mysql')
-               return mysql_get_server_info( $wgDatabase->mConn );
-       else if ($conf->DBtype == 'oracle')
-               return oci_server_version($wgDatabase->mConn);
-       else return 'unknown';
-}
-
 # Test a memcached server
 function testMemcachedServer( $server ) {
        $hostport = explode(":", $server);
@@ -1441,7 +1815,7 @@ function testMemcachedServer( $server ) {
        if ( !function_exists( 'fsockopen' ) ) {
                $errstr = "Can't connect to memcached, fsockopen() not present";
        }
-       if ( !$errstr &&  count( $hostport ) != 2 ) {
+       if ( !$errstr && count( $hostport ) != 2 ) {
                $errstr = 'Please specify host and port';
                var_dump( $hostport );
        }
@@ -1477,6 +1851,31 @@ function testMemcachedServer( $server ) {
        }
        return $errstr;
 }
+
+function database_picker($conf) {
+       global $ourdb;
+       print "\n";
+       foreach(array_keys($ourdb) as $db) {
+               if ($ourdb[$db]['havedriver']) {
+                       print "<li>";
+                       aField( $conf, "DBtype", $ourdb[$db]['fullname'], 'radio', $db, 'onclick');
+                       print "</li>\n";
+               }
+       }
+       print "\n";
+}
+
+function database_switcher($db) {
+       global $ourdb;
+       $color = $ourdb[$db]['bgcolor'];
+       $full = $ourdb[$db]['fullname'];
+       print "<fieldset id='$db'><legend>$full specific options</legend>\n";
+}
+
+function printListItem( $item ) {
+       print "<li>$item</li>";
+}
+
 ?>
 
        <div class="license">
@@ -1516,7 +1915,7 @@ function testMemcachedServer( $server ) {
                        <li><a href="http://meta.wikipedia.org/wiki/MediaWiki_User's_Guide">User's Guide</a></li>
                        <li><a href="http://meta.wikimedia.org/wiki/MediaWiki_FAQ">FAQ</a></li>
                </ul>
-               <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright &copy; 2001-2006 by Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik M&ouml;ller, Gabriel Wicke and others.</p>
+               <p style="font-size:90%;margin-top:1em">MediaWiki is Copyright &copy; 2001-2007 by Magnus Manske, Brion Vibber, Lee Daniel Crocker, Tim Starling, Erik M&ouml;ller, Gabriel Wicke and others.</p>
        </div></div>
 </div>