OSDN Git Service

Merge branch 'skinnable-master'
[nucleus-jp/nucleus-next.git] / install / index.php
index 61704de..13fd7be 100644 (file)
+<<<<<<< HEAD
+<?php\r
+/*\r
+ * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
+ * Copyright (C) 2002-2012 The Nucleus Group\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * (see nucleus/documentation/index.html#license for more info)\r
+ *\r
+ * This script will install the Nucleus tables in your SQL-database,\r
+ * and initialize the data in those tables.\r
+ */\r
+\r
+/**\r
+ * @license http://nucleuscms.org/license.txt GNU General Public License\r
+ * @copyright Copyright (C) 2002-2012 The Nucleus Group\r
+ * @version $Id: index.php 1745 2012-04-12 23:45:47Z sakamocchi $\r
+ */\r
+\r
+/* global values initialize */\r
+$CONF = array();\r
+\r
+/* reporting all errors for support */\r
+error_reporting(E_ALL);\r
+\r
+$minimum_php_version = '5.0.6';\r
+$minimum_mysql_version = '3.23';\r
+\r
+$page_footer_copyright = '&copy; 2001-2012 The Nucleus Groupe . Running Nucleus CMS v4.00';\r
+\r
+// begin if: server's PHP version is below the minimum; halt installation\r
+if ( version_compare(PHP_VERSION, $minimum_php_version, '<') )\r
+{\r
+       exit('<div style="font-size: xx-large;"> Nucleus requires at least PHP version ' . $minimum_php_version . '</div>');\r
+}\r
+\r
+// make sure there's no unnecessary escaping: # set_magic_quotes_runtime(0);\r
+if ( version_compare(PHP_VERSION, '5.3.0', '<') )\r
+{\r
+       ini_set('magic_quotes_runtime', '0');\r
+}\r
+\r
+/* default installed plugins and skins */\r
+$aConfPlugsToInstall = array('NP_SecurityEnforcer', 'NP_SkinFiles');\r
+$aConfSkinsToImport = array('atom', 'rss2.0', 'rsd', 'default');\r
+\r
+// Check if some important files\r
+do_check_files();\r
+\r
+/* i18n class is needed for internationalization */\r
+include_once('../nucleus/libs/i18n.php');\r
+if ( !i18n::init('UTF-8', '../nucleus/locales') )\r
+{\r
+       exit('<div style="font-size: xx-large;"> Failed to initialize iconv or mbstring extension. Would you please contact the administrator of your PHP server? </div>');\r
+}\r
+\r
+// include core classes that are needed for login & plugin handling\r
+\r
+// added for 3.5 sql_* wrapper\r
+global $MYSQL_HANDLER;\r
+\r
+if ( !isset($MYSQL_HANDLER) )\r
+{\r
+       $MYSQL_HANDLER = array('mysql', '');\r
+       \r
+       // check if mysql support is installed; this check may not make sense, as is, in a version past 3.5x\r
+       if ( !function_exists('mysql_query') && !function_exists('mysqli_query') )\r
+       {\r
+               exit('<div style="font-size: xx-large;"> Your PHP version does not have support for MySQL :( </div>');\r
+       }\r
+}\r
+include_once('../nucleus/libs/sql/sql.php');\r
+\r
+session_start();\r
+if ( count($_GET) == 0 && count($_POST) == 0 )\r
+{\r
+       unset($_SESSION['param_manager']);\r
+}\r
+\r
+// restore the $param from the session\r
+if ( array_key_exists('param_manager', $_SESSION) )\r
+{\r
+       $param = $_SESSION['param_manager'];\r
+}\r
+else\r
+{\r
+       $param = new ParamManager();\r
+}\r
+\r
+// include translation file\r
+if ( array_key_exists('locale', $_POST) ) $param->set_locale();\r
+i18n::set_current_locale($param->locale);\r
+$translation_file = './locales/' . i18n::get_current_locale() . '.' . i18n::get_current_charset() . '.php';\r
+if ( !file_exists($translation_file) )\r
+{\r
+       $translation_file = './locales/en_Latn_US.UTF-8.php';\r
+}\r
+include($translation_file);\r
+\r
+do_action();\r
+\r
+// $param is saved to the session\r
+if ( isset($param) )\r
+{\r
+       $_SESSION['param_manager'] = $param;\r
+}\r
+else\r
+{\r
+       unset($_SESSION['param_manager']);\r
+}\r
+exit;\r
+\r
+/**\r
+ * installer action\r
+ */\r
+function do_action()\r
+{\r
+       global $param;\r
+\r
+       if ( array_key_exists('action', $_POST) )\r
+       {\r
+               $isPostback = true;\r
+       }\r
+       else\r
+       {\r
+               $isPostback = false;\r
+       }\r
+\r
+       // mode change\r
+       if ( array_key_exists('mode', $_REQUEST) )\r
+       {\r
+               if ( $_REQUEST['mode'] == 'detail' )\r
+               {\r
+                       $param->set_state('detail');\r
+               }\r
+               elseif ( $_REQUEST['mode'] == 'simple' )\r
+               {\r
+                       $param->set_state('mysql');\r
+               }\r
+       }\r
+\r
+       // input parameter check\r
+       if ( $isPostback )\r
+       {\r
+               switch ( $param->state )\r
+               {\r
+                       case 'locale':\r
+                               $param->set_locale();\r
+                               $param->set_state('mysql');\r
+                               $isPostback = false;\r
+                               break;\r
+                       case 'mysql':\r
+                               if ( count($param->check_mysql_parameters()) == 0 )\r
+                               {\r
+                                       $param->set_state('weblog');\r
+                                       $isPostback = false;\r
+                               }\r
+                               break;\r
+                       case 'weblog':\r
+                               if ( count($param->check_user_parameters()) == 0\r
+                                       && count($param->check_weblog_parameters()) == 0 )\r
+                               {\r
+                                       $param->set_state('install');\r
+                                       $isPostback = false;\r
+                               }\r
+                               break;\r
+                       case 'detail':\r
+                               if ( $param->check_all_parameters() )\r
+                               {\r
+                                       $param->set_state('install');\r
+                                       $isPostback = false;\r
+                               }\r
+                               break;\r
+               }\r
+       }\r
+\r
+       // page render\r
+       show_header();\r
+       switch ( $param->state )\r
+       {\r
+               case 'locale':\r
+                       show_select_locale_form();\r
+                       break;\r
+               case 'mysql':\r
+                       show_database_setting_form($isPostback);\r
+                       break;\r
+               case 'weblog':\r
+                       show_blog_setting_form($isPostback);\r
+                       break;\r
+               case 'detail':\r
+                       show_detail_setting_form($isPostback);\r
+                       break;\r
+               case 'install':\r
+                       show_install_complete_form();\r
+                       break;\r
+       }\r
+       show_footer();\r
+}\r
+\r
+/**\r
+ * header tag of the installation screens\r
+ **/\r
+function show_header()\r
+{\r
+       global $param;\r
+\r
+       /* HTTP 1.1 application for no caching */\r
+       header("Cache-Control: no-cache, must-revalidate");\r
+       header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");\r
+       header('Content-Type: text/html; charset=' . i18n::get_current_charset());\r
+?>\r
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+       <head>\r
+               <title><?php echo _TITLE; ?></title>\r
+               <link rel="stylesheet" type="text/css" href="./styles/inst.css" />\r
+               <style type="text/css">\r
+               <!--\r
+               <?php echo _BODYFONTSTYLE; ?>\r
+               -->\r
+               </style>\r
+               <script type="text/javascript">\r
+                       function SelectText( element ) {\r
+                               window.setTimeout( function() { element.select() }, 0 );\r
+                       }\r
+                       var isSubmit = false;\r
+                       function OnceSubmit() {\r
+                               if (!isSubmit) {\r
+                                       isSubmit = true;\r
+                                       window.setTimeout( function() { isSubmit = false; }, 10000 );\r
+                                       return true;\r
+                               }\r
+                               return false;\r
+                       }\r
+               </script>\r
+       </head>\r
+       <body>\r
+               <div id="header">\r
+                       <div id="navigation">\r
+                               <h1><img src="./styles/nucleus_rogo.png" alt="NucleusCMS" /></h1>\r
+                               <ul>\r
+<?php\r
+       if ( in_array($param->state, array('mysql', 'weblog', 'install')) )\r
+       {\r
+               echo '<li>', _STEP1, '</li><li';\r
+               if ( $param->state == 'mysql' )\r
+               {\r
+                       echo ' class="gry"';\r
+               }\r
+               echo '>&nbsp; &gt; &nbsp;', _STEP2, '</li><li';\r
+               if ( in_array($param->state, array('mysql', 'weblog')) )\r
+               {\r
+                       echo ' class="gry"';\r
+               }\r
+               echo '>&nbsp; &gt; &nbsp;', _STEP3, "</li>\n";\r
+       }\r
+       if ( in_array($param->state, array('mysql', 'weblog', 'detail')) )\r
+       {\r
+               echo '<li class="rightbox">';\r
+               if ( in_array($param->state, array('mysql', 'weblog')) )\r
+               {\r
+                       echo '<a href="./?mode=detail">', _MODE2, '</a>';\r
+               }\r
+               else\r
+               {\r
+                       echo '<a href="./?mode=simple">', _MODE1, '</a>';\r
+               }\r
+               echo '</li>';\r
+       }\r
+?>\r
+                               </ul>\r
+                       </div>\r
+               </div>\r
+<?php\r
+}\r
+\r
+/**\r
+ * footer tag of the installation screens\r
+ **/\r
+function show_footer()\r
+{\r
+       global $page_footer_copyright;\r
+?>\r
+               <div id="footer">\r
+                       <?php echo $page_footer_copyright; ?>\r
+               </div>\r
+       </body>\r
+</html>\r
+<?php\r
+}\r
+\r
+/**\r
+ * Display the form for language select\r
+ */\r
+function show_select_locale_form()\r
+{\r
+       // get locale list\r
+       $localelist = i18n::get_available_locale_list();\r
+       $locales = array();\r
+       foreach ( $localelist as $locale ) {\r
+               $checkfile = './locales/' . $locale . '.' . i18n::get_current_charset() . '.php';\r
+               $locales[] = array( $locale, (!file_exists($checkfile) ? '*&nbsp;' : '') . $locale );\r
+       }\r
+?>\r
+               <div id="container">\r
+                       <p style="font-size:152%;font-weight:bold;">\r
+                               Select your locale:\r
+                       </p>\r
+                       <form method="post" action="./index.php">\r
+\r
+                               <div class="prt">\r
+                                       <select name="locale">\r
+<?php\r
+       // Get the browser language that can be displayed\r
+       // TODO: default locale select simple implementation\r
+       $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);\r
+       $language = (is_array($languages) && count($languages) > 0) ? preg_replace('#^([\w]+).*$#', '$1', $languages[0]) : '';\r
+\r
+       foreach ( $locales as $locale )\r
+       {\r
+               echo "<option value=\"$locale[0]\"";\r
+               if ( i18n::strpos($locale[0], $language) === 0 )\r
+               {\r
+                       echo ' selected';\r
+               }\r
+               echo ">$locale[1]</option>\n";\r
+       }\r
+?>\r
+                                       </select>\r
+                                       <p>Nucleus is installed in the selected locale, the locale of the Asterisk prefixed will be displayed in English because there is no translation of the installer file.</p>\r
+                                       <p>We will wait for the translator by volunteers!</p>\r
+                                       </p>\r
+                                       <p class="sbt">\r
+                                               <button type="submit" name="action" value="locale" class="sbt_arw">START</button>\r
+                                       </p>\r
+                               </div>\r
+                       </form>\r
+               </div>\r
+<?php\r
+}\r
+\r
+/**\r
+ * Display the form to set up a database\r
+ * @param bool $isPostback\r
+ */\r
+function show_database_setting_form($isPostback)\r
+{\r
+       global $param, $minimum_mysql_version;\r
+\r
+       $config_writable = canConfigFileWritable();\r
+       $mysql_version = getMySqlVersion();\r
+?>\r
+               <div id="container">\r
+                       <p class="msg">\r
+<?php\r
+       echo _SIMPLE_NAVI1;\r
+       if ( $config_writable != '' )\r
+       {\r
+               echo '<span class="err">', $config_writable, '</span>';\r
+       }\r
+       if ( $mysql_version == '0.0.0' )\r
+       {\r
+               echo '<span class="err">', _DBVERSION_UNKOWN, '</span>';\r
+       }\r
+       elseif ( version_compare($mysql_version, $minimum_mysql_version, '<') )\r
+       {\r
+               echo '<span class="err">', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '</span>';\r
+       }\r
+?>\r
+                       </p>\r
+                       <form method="post" action="./index.php">\r
+                               <div class="prt">\r
+                                       <h2><?php echo _DB_HEADER; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_mysql_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD1; ?></span><span class="sub"><?php echo _DB_FIELD1_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_host" value="<?php echo $param->mysql_host; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD2; ?></span><span class="sub"><?php echo _DB_FIELD2_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_user" value="<?php echo $param->mysql_user; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD3; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_password" value="<?php echo $param->mysql_password; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD4; ?></span><span class="sub"><?php echo _DB_FIELD4_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_database" value="<?php echo $param->mysql_database; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                                       <p class="sbt">\r
+                                               <button type="submit" name="mode" value="detail" class="sbt_sqr"><?php echo _MODE2; ?></button>\r
+                                               <button type="submit" name="action" value="mysql" class="sbt_arw"><?php echo _NEXT; ?></button>\r
+                                       </p>\r
+                                       <p class="msg">\r
+                                               <?php echo _DB_TEXT1; ?>\r
+                                       </p>\r
+                               </div>\r
+                       </form>\r
+               </div>\r
+<?php\r
+}\r
+\r
+/**\r
+ * Displays a form to the blog settings\r
+ * @param bool $isPostback\r
+ */\r
+function show_blog_setting_form($isPostback)\r
+{\r
+       global $param;\r
+?>\r
+               <div id="container">\r
+                       <p class="msg">\r
+                               <?php echo _SIMPLE_NAVI2; ?>\r
+                       </p>\r
+                       <form method="post" action="./index.php">\r
+                               <div class="prt">\r
+                                       <h2><?php echo _BLOG_HEADER; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_weblog_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD1; ?></span></th>\r
+                                                               <td><input type="text" name="blog_name" value="<?php echo $param->blog_name; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD2; ?></span><span class="sub"><?php echo _BLOG_FIELD2_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="blog_shortname" value="<?php echo $param->blog_shortname; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </div>\r
+\r
+                               <div class="prt">\r
+                                       <h2><?php echo _ADMIN_HEADER; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_user_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD1; ?></span></th>\r
+                                                               <td><input type="text" name="user_realname" value="<?php echo $param->user_realname; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD2; ?></span><span class="sub"><?php echo _ADMIN_FIELD2_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="user_name" value="<?php echo $param->user_name; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD3; ?></span></th>\r
+                                                               <td><input type="password" name="user_password" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD4; ?></span></th>\r
+                                                               <td><input type="password" name="user_password2" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD5; ?></span></th>\r
+                                                               <td><input type="text" name="user_email" value="<?php echo $param->user_email; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                                       <p class="sbt">\r
+                                               <button type="submit" name="action" value="weblog" class="sbt_arw" onclick="OnceSubmit()"><?php echo _INSTALL; ?></button>\r
+                                       </p>\r
+                               </div>\r
+                       </form>\r
+               </div>\r
+<?php\r
+}\r
+\r
+/**\r
+ * Displays a form to the detail settings\r
+ * @param bool $isPostback\r
+ */\r
+function show_detail_setting_form($isPostback)\r
+{\r
+       global $param, $minimum_mysql_version;\r
+\r
+       $mysql_version = getMySqlVersion();\r
+?>\r
+               <div id="container_detailed">\r
+                       <p class="msg">\r
+                               <?php echo _DETAIL_NAVI1; ?>\r
+<?php\r
+       if ( $isPostback && !$param->check_all_parameters() )\r
+       {\r
+               echo '<span class="err">', _VALID_ERROR, "</span>\n";\r
+       }\r
+?>\r
+                       </p>\r
+                       <ul class="msg">\r
+                               <li>PHP: <?php echo phpversion(); ?></li>\r
+                               <li>MySQL:\r
+<?php\r
+       echo ($mysql_version == '0.0.0') ? _DBVERSION_UNKOWN : $mysql_version;\r
+       if ( version_compare($mysql_version, $minimum_mysql_version, '<') )\r
+       {\r
+               echo '<span class="err">', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '</span>';\r
+       }\r
+?></li>\r
+                       </ul>\r
+                       <form method="post" action="">\r
+\r
+                               <div class="prt">\r
+                                       <h2><?php echo _DETAIL_HEADER1; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_mysql_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD1; ?></span><span class="sub"><?php echo _DB_FIELD1_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_host" value="<?php echo $param->mysql_host; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD2; ?></span><span class="sub"><?php echo _DB_FIELD2_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_user" value="<?php echo $param->mysql_user; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD3; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_password" value="<?php echo $param->mysql_password; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD4; ?></span><span class="sub"><?php echo _DB_FIELD4_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_database" value="<?php echo $param->mysql_database; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _DB_FIELD5; ?></span><span class="sub"><?php echo _DB_FIELD5_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="mysql_tablePrefix" value="<?php echo $param->mysql_tablePrefix; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <h2><?php echo _DETAIL_HEADER2; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_uri_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+               $errors = $param->check_path_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD1; ?></span></th>\r
+                                                               <td><input type="text" name="IndexURL" value="<?php echo $param->IndexURL; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD2; ?></span></th>\r
+                                                               <td><input type="text" name="AdminURL" value="<?php echo $param->AdminURL; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD3; ?></span></th>\r
+                                                               <td><input type="text" name="AdminPath" value="<?php echo $param->AdminPath; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD4; ?></span></th>\r
+                                                               <td><input type="text" name="MediaURL" value="<?php echo $param->MediaURL; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD5; ?></span></th>\r
+                                                               <td><input type="text" name="MediaPath" value="<?php echo $param->MediaPath; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD6; ?></span></th>\r
+                                                               <td><input type="text" name="SkinsURL" value="<?php echo $param->SkinsURL; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD7; ?></span></th>\r
+                                                               <td><input type="text" name="SkinsPath" value="<?php echo $param->SkinsPath; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD8; ?></span></th>\r
+                                                               <td><input type="text" name="PluginURL" value="<?php echo $param->PluginURL; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _PATH_FIELD9; ?></span></th>\r
+                                                               <td><input type="text" name="ActionURL" value="<?php echo $param->ActionURL; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                                       <p class="msg">\r
+                                               <?php echo _DETAIL_TEXT3; ?>\r
+                                       </p>\r
+\r
+                                       <h2><?php echo _DETAIL_HEADER3; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       echo _DETAIL_TEXT4;\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_user_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD1; ?></span></th>\r
+                                                               <td><input type="text" name="user_realname" value="<?php echo $param->user_realname; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD2; ?></span><span class="sub"><?php echo _ADMIN_FIELD2_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="user_name" value="<?php echo $param->user_name; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD3; ?></span></th>\r
+                                                               <td><input type="password" name="user_password" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD4; ?></span></th>\r
+                                                               <td><input type="password" name="user_password2" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD5; ?></span></th>\r
+                                                               <td><input type="text" name="user_email" value="<?php echo $param->user_email; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <h2><?php echo _DETAIL_HEADER4; ?></h2>\r
+                                       <p class="msg">\r
+<?php\r
+       echo _DETAIL_TEXT5;\r
+       if ( $isPostback )\r
+       {\r
+               $errors = $param->check_weblog_parameters();\r
+               if ( is_array($errors) )\r
+               {\r
+                       foreach ( $errors as $error )\r
+                       {\r
+                               echo '<span class="err">', $error, "</span>\n";\r
+                       }\r
+               }\r
+       }\r
+?>\r
+                                       </p>\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD1; ?></span></th>\r
+                                                               <td><input type="text" name="blog_name" value="<?php echo $param->blog_name; ?>" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD2; ?></span><span class="sub"><?php echo _BLOG_FIELD2_DESC; ?></span></th>\r
+                                                               <td><input type="text" name="blog_shortname" value="<?php echo $param->blog_shortname; ?>" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <p class="msg">\r
+                                               <?php echo _DETAIL_TEXT6; ?>\r
+                                       </p>\r
+\r
+                                       <p class="sbt">\r
+                                               <button type="submit" name="action" value="detail" class="sbt_arw" onclick="OnceSubmit()"><?php echo _INSTALL; ?></button>\r
+                                       </p>\r
+                               </div>\r
+                       </form>\r
+               </div>\r
+<?php\r
+}\r
+\r
+/**\r
+ * Displays a screen to signal the completion of the installation\r
+ */\r
+function show_install_complete_form()\r
+{\r
+       global $MYSQL_HANDLER, $param;\r
+       $errors = do_install();\r
+?>\r
+               <div id="container">\r
+                       <p class="msg">\r
+<?php\r
+       if ( is_array($errors) && count($errors) > 0 )\r
+       {\r
+               echo _INST_ERROR;\r
+               foreach ( $errors as $error )\r
+               {\r
+                       echo '<span class="err">', $error, "</span>\n";\r
+               }\r
+       }\r
+       else\r
+       {\r
+               echo _INST_TEXT;\r
+               if ( array_key_exists('config_data', $_SESSION) )\r
+               {\r
+                       echo '<span class="err">', _INST_TEXT4, '</span>';\r
+?>\r
+<textarea id="config_text" readonly="readonly" onfocus="SelectText(this);"><?php echo htmlentities($_SESSION['config_data'], null, i18n::get_current_charset()) ?></textarea>\r
+<?php\r
+               }\r
+               else\r
+               {\r
+                       echo '<span class="err">', _INST_TEXT5, '</span>';\r
+               }\r
+?>\r
+                       </p>\r
+                       <form method="post" action="./index.php">\r
+                               <div class="prt">\r
+                                       <h2><?php echo _INST_HEADER1; ?></h2>\r
+                                       <p class="msg">\r
+                                               <?php echo sprintf(_INST_TEXT1, $param->blog_name); ?>\r
+                                       </p>\r
+                                       <p class="sbt">\r
+                                               <button type="button" name="toBlog" onclick="location.href='<?php echo $param->IndexURL; ?>';" class="sbt_arw"><?php echo _INST_BUTTON1; ?></button>\r
+                                       </p>\r
+                               </div>\r
+\r
+                               <div class="prt">\r
+                                       <h2><?php echo _INST_HEADER2; ?></h2>\r
+                                       <p class="msg">\r
+                                               <?php echo _INST_TEXT2; ?>\r
+                                       </p>\r
+                                       <p class="sbt">\r
+                                               <button type="button" name="toMng" onclick="location.href='<?php echo $param->AdminURL; ?>';" class="sbt_arw"><?php echo _INST_BUTTON2; ?></button>\r
+                                       </p>\r
+                               </div>\r
+\r
+                               <div class="prt">\r
+                                       <h2><?php echo _INST_HEADER3; ?></h2>\r
+                                       <p class="msg">\r
+                                               <?php echo _INST_TEXT3; ?>\r
+                                       </p>\r
+                                       <p class="sbt">\r
+                                               <button type="button" name="toAddBlog" onclick="location.href='<?php echo $param->AdminURL; ?>index.php?action=createnewlog';" class="sbt_arw"><?php echo _INST_BUTTON3; ?></button>\r
+                                       </p>\r
+                               </div>\r
+                       </form>\r
+<?php\r
+       }\r
+?>\r
+               </div>\r
+<?php\r
+       unset($param);\r
+}\r
+\r
+/**\r
+ * The installation process itself\r
+ * @return array error messages\r
+ */\r
+function do_install()\r
+{\r
+       global $param;\r
+       global $MYSQL_HANDLER, $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE, $MYSQL_PREFIX, $MYSQL_CONN;\r
+       global $DIR_NUCLEUS, $DIR_MEDIA, $DIR_SKINS, $DIR_PLUGINS, $DIR_LANG, $DIR_LIBS;\r
+       $errors = array();\r
+\r
+       /*\r
+        * 1. put all param-vars into vars\r
+        */\r
+       $MYSQL_HOST             = $param->mysql_host;\r
+       $MYSQL_USER             = $param->mysql_user;\r
+       $MYSQL_PASSWORD = $param->mysql_password;\r
+       $MYSQL_DATABASE = $param->mysql_database;\r
+       $MYSQL_PREFIX   = $param->mysql_tablePrefix;\r
+\r
+       $DIR_NUCLEUS    = $param->AdminPath;\r
+       $DIR_MEDIA              = $param->MediaPath;\r
+       $DIR_SKINS              = $param->SkinsPath;\r
+       $DIR_PLUGINS    = $DIR_NUCLEUS . 'plugins/';\r
+       $DIR_LOCALES    = $DIR_NUCLEUS . 'locales/';\r
+       $DIR_LIBS               = $DIR_NUCLEUS . 'libs/';\r
+\r
+       /*\r
+        * 2.open mySQL connection\r
+        */\r
+       $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD);\r
+       if ( $MYSQL_CONN == FALSE )\r
+       {\r
+               $errors[] = _DBCONNECT_ERROR;\r
+               return $errors;\r
+       }\r
+\r
+       /*\r
+        * 3. try to create database if needed\r
+        */\r
+       if ( DB::execute("CREATE DATABASE IF NOT EXISTS {$MYSQL_DATABASE}") === FALSE )\r
+       {\r
+               $errinfo = DB::getError();\r
+               $errors[] = _INST_ERROR1 . ': ' . $errinfo[2];\r
+       }\r
+\r
+       /*\r
+        * 4. try to select database\r
+        */\r
+       $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE);\r
+       if ( !$MYSQL_CONN )\r
+       {\r
+               $errors[] = _INST_ERROR2;\r
+       }\r
+\r
+       if ( count($errors) > 0 )\r
+       {\r
+               return $errors;\r
+       }\r
+\r
+       /*\r
+        * 5. execute queries\r
+        */\r
+       $table_names = array(\r
+               'nucleus_actionlog',\r
+               'nucleus_ban',\r
+               'nucleus_blog',\r
+               'nucleus_category',\r
+               'nucleus_comment',\r
+               'nucleus_config',\r
+               'nucleus_item',\r
+               'nucleus_karma',\r
+               'nucleus_member',\r
+               'nucleus_plugin',\r
+               'nucleus_skin',\r
+               'nucleus_template',\r
+               'nucleus_team',\r
+               'nucleus_activation',\r
+               'nucleus_tickets'\r
+       );\r
+\r
+       $prefixed_table_names = array();\r
+       foreach ( $table_names as $table_name )\r
+       {\r
+               $prefixed_table_names[] = $MYSQL_PREFIX . $table_name;\r
+       }\r
+\r
+       // table exists check\r
+       $result = DB::getResult('SHOW TABLES');\r
+       foreach ( $result as $row )\r
+       {\r
+               if ( in_array($row[0], $prefixed_table_names) )\r
+               {\r
+                       $errors[] = _INST_ERROR3;\r
+                       break;\r
+               }\r
+       }\r
+       if ( count($errors) > 0 )\r
+       {\r
+               return $errors;\r
+       }\r
+\r
+       $filename = 'install.sql';\r
+       $fd = fopen($filename, 'r');\r
+       $queries = fread($fd, filesize($filename));\r
+       fclose($fd);\r
+\r
+       $queries = preg_split('#(;\n|;\r)#', $queries);\r
+\r
+       foreach ( $queries as $query )\r
+       {\r
+               if ( preg_match('/\w+/', $query) )\r
+               {\r
+                       if ( $MYSQL_PREFIX )\r
+                       {\r
+                               $query = str_replace($table_names, $prefixed_table_names, $query);\r
+                       }\r
+\r
+                       if ( DB::execute($query) === FALSE )\r
+                       {\r
+                               $errinfo = DB::getError();\r
+                               $errors[] = _INST_ERROR4 . ' (<small>' . $query . '</small>): ' . $errinfo[2];\r
+                       }\r
+               }\r
+       }\r
+\r
+       /*\r
+        * 6. put needed records\r
+        */\r
+       /* push first post */\r
+       $query = "INSERT INTO %s VALUES (1, %s, %s, %s, 1, 1, %s, 0, 0, 0, 1, 0, 1)";\r
+       $query = sprintf($query,\r
+               tableName('nucleus_item'),\r
+               DB::quoteValue(_1ST_POST_TITLE),\r
+               DB::quoteValue(_1ST_POST),\r
+               DB::quoteValue(_1ST_POST2),\r
+               DB::formatDateTime()\r
+       );\r
+       if ( DB::execute($query) === FALSE )\r
+       {\r
+               $errinfo = DB::getError();\r
+               $errors[] = _INST_ERROR4 . ' (<small>' . $query . '</small>): ' . $errinfo[2];\r
+       }\r
+\r
+       /* push configurations */\r
+       array_merge($errors, updateConfig('IndexURL', $param->IndexURL));\r
+       array_merge($errors, updateConfig('AdminURL', $param->AdminURL));\r
+       array_merge($errors, updateConfig('MediaURL', $param->MediaURL));\r
+       array_merge($errors, updateConfig('SkinsURL', $param->SkinsURL));\r
+       array_merge($errors, updateConfig('PluginURL', $param->PluginURL));\r
+       array_merge($errors, updateConfig('ActionURL', $param->ActionURL));\r
+       array_merge($errors, updateConfig('AdminEmail', $param->user_email));\r
+       array_merge($errors, updateConfig('SiteName', $param->blog_name));\r
+       array_merge($errors, updateConfig('Locale', i18n::get_current_locale()));\r
+\r
+       /* push super admin */\r
+       $query = "UPDATE %s SET mname = %s, mrealname = %s, mpassword = %s, memail = %s, murl = %s, madmin = 1, mcanlogin = 1 WHERE mnumber = 1";\r
+       $query = sprintf($query,\r
+               tableName('nucleus_member'),\r
+               DB::quoteValue($param->user_name),\r
+               DB::quoteValue($param->user_realname),\r
+               DB::quoteValue(md5($param->user_password)),\r
+               DB::quoteValue($param->user_email),\r
+               DB::quoteValue($param->IndexURL)\r
+       );\r
+       if ( DB::execute($query) === FALSE )\r
+       {\r
+               $errinfo = DB::getError();\r
+               $errors[] = _INST_ERROR5 . ': ' . $errinfo[2];\r
+       }\r
+\r
+       /* push new weblog */\r
+       $query = "UPDATE %s SET bname = %s, bshortname = %s, burl = %s WHERE bnumber = 1";\r
+       $query = sprintf($query,\r
+               tableName('nucleus_blog'),\r
+               DB::quoteValue($param->blog_name),\r
+               DB::quoteValue($param->blog_shortname),\r
+               DB::quoteValue($param->IndexURL)\r
+       );\r
+       if ( DB::execute($query) === FALSE )\r
+       {\r
+               $errinfo = DB::getError();\r
+               $errors[] = _INST_ERROR6 . ': ' . $errinfo[2];\r
+       }\r
+\r
+       /* push default category */\r
+       $query = "UPDATE %s SET cname = %s, cdesc = %s WHERE catid = 1";\r
+       $query = sprintf($query,\r
+               tableName('nucleus_category'),\r
+               DB::quoteValue(_GENERALCAT_NAME),\r
+               DB::quoteValue(_GENERALCAT_DESC)\r
+       );\r
+       if ( DB::execute($query) === FALSE )\r
+       {\r
+               $errinfo = DB::getError();\r
+               $errors[] = _INST_ERROR6 . ': ' . $errinfo[2];\r
+       }\r
+\r
+       /*\r
+        * 7. install default plugins and skins\r
+        */\r
+       global $aConfPlugsToInstall, $aConfSkinsToImport;\r
+       $aSkinErrors = array();\r
+       $aPlugErrors = array();\r
+\r
+       if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) )\r
+       {\r
+               include_once($DIR_LIBS . 'globalfunctions.php');\r
+               global $manager;\r
+               if ( !isset($manager) )\r
+               {\r
+                       $manager = new Manager();\r
+               }\r
+\r
+               include_once($DIR_LIBS . 'skinie.php');\r
+               \r
+               $aSkinErrors = installCustomSkins();\r
+               if ( count($aSkinErrors) > 0 )\r
+               {\r
+                       array_merge($errors, $aSkinErrors);\r
+               }\r
+\r
+               $query          = "SELECT sdnumber FROM %s WHERE sdname='default'";\r
+               $query          = sprintf($query, tableName('nucleus_skin_desc'));\r
+               $defSkinID      = intval(DB::getValue($query));\r
+\r
+               $query = "UPDATE %s SET bdefskin=%d WHERE bnumber=1";\r
+               $query = sprintf($query, tableName('nucleus_blog'), $defSkinID);\r
+               DB::execute($query);\r
+               \r
+               $query = "UPDATE %s SET value=%d WHERE name='BaseSkin'";\r
+               $query = sprintf($query, tableName('nucleus_config'), $defSkinID);\r
+               DB::execute($query);\r
+\r
+               $aPlugErrors = installCustomPlugs();\r
+               if ( count($aPlugErrors) > 0 )\r
+               {\r
+                       array_merge($errors, $aPlugErrors);\r
+               }\r
+       }\r
+\r
+       /*\r
+        * 8. Write config file ourselves (if possible)\r
+        */\r
+       $config_data = '<' . '?php' . "\n";\r
+       $config_data .= "// mySQL connection information\n";\r
+       $config_data .= "\$MYSQL_HOST = '" . $MYSQL_HOST . "';\n";\r
+       $config_data .= "\$MYSQL_USER = '" . $MYSQL_USER . "';\n";\r
+       $config_data .= "\$MYSQL_PASSWORD = '" . $MYSQL_PASSWORD . "';\n";\r
+       $config_data .= "\$MYSQL_DATABASE = '" . $MYSQL_DATABASE . "';\n";\r
+       $config_data .= "\$MYSQL_PREFIX = '" . $MYSQL_PREFIX . "';\n";\r
+       $config_data .= "// new in 3.50. first element is db handler, the second is the db driver used by the handler\n";\r
+       $config_data .= "// default is \$MYSQL_HANDLER = array('mysql','mysql');\n";\r
+       $config_data .= "//\$MYSQL_HANDLER = array('mysql','mysql');\n";\r
+       $config_data .= "//\$MYSQL_HANDLER = array('pdo','mysql');\n";\r
+       $config_data .= "\$MYSQL_HANDLER = array('" . $MYSQL_HANDLER[0] . "','" . $MYSQL_HANDLER[1] . "');\n";\r
+       $config_data .= "\n";\r
+       $config_data .= "// main nucleus directory\n";\r
+       $config_data .= "\$DIR_NUCLEUS = '" . $DIR_NUCLEUS . "';\n";\r
+       $config_data .= "\n";\r
+       $config_data .= "// path to media dir\n";\r
+       $config_data .= "\$DIR_MEDIA = '" . $DIR_MEDIA . "';\n";\r
+       $config_data .= "\n";\r
+       $config_data .= "// extra skin files for imported skins\n";\r
+       $config_data .= "\$DIR_SKINS = '" . $DIR_SKINS . "';\n";\r
+       $config_data .= "\n";\r
+       $config_data .= "// these dirs are normally sub dirs of the nucleus dir, but \n";\r
+       $config_data .= "// you can redefine them if you wish\n";\r
+       $config_data .= "\$DIR_PLUGINS = \$DIR_NUCLEUS . 'plugins/';\n";\r
+       $config_data .= "\$DIR_LOCALES = \$DIR_NUCLEUS . 'locales/';\n";\r
+       $config_data .= "\$DIR_LIBS = \$DIR_NUCLEUS . 'libs/';\n";\r
+       $config_data .= "\n";\r
+       $config_data .= "// include libs\n";\r
+       $config_data .= "include(\$DIR_LIBS.'globalfunctions.php');\n";\r
+       $config_data .= "?" . ">";\r
+\r
+       $result = false;\r
+       if ( @!file_exists('../config.php') || is_writable('../config.php') )\r
+       {\r
+               if ( $fp = @fopen('../config.php', 'w') )\r
+               {\r
+                       $result = @fwrite($fp, $config_data, i18n::strlen($config_data));\r
+                       fclose($fp);\r
+               }\r
+       }\r
+\r
+       if ( $result )\r
+       {\r
+               // try to change the read-only permission.\r
+               if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )\r
+               {\r
+                       @chmod('../config.php', 0444);\r
+               }\r
+       }\r
+       else\r
+       {\r
+               $_SESSION['config_data'] = $config_data;\r
+       }\r
+\r
+       return $errors;\r
+}\r
+\r
+/**\r
+ * Confirm that you can write to the configuration file\r
+ * @return string error message\r
+ */\r
+function canConfigFileWritable()\r
+{\r
+       if ( @file_exists('../config.php') && @!is_writable('../config.php') )\r
+       {\r
+               // try to change the read-write permission.\r
+               if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )\r
+               {\r
+                       @chmod('../config.php', 0666);\r
+               }\r
+\r
+               if ( @!is_writable('../config.php') )\r
+               {\r
+                       return _INST_ERROR8;\r
+               }\r
+       }\r
+       return '';\r
+}\r
+\r
+/**\r
+ * To obtain the version of MySQL\r
+ * @return string\r
+ */\r
+function getMySqlVersion()\r
+{\r
+       global $MYSQL_HANDLER, $minimum_mysql_version, $errors;\r
+       // Turn on output buffer\r
+       // Needed to repress the output of the sql function that are\r
+       // not part of php (in this case the @ operator doesn't work)\r
+       ob_start();\r
+\r
+       // note: this piece of code is taken from phpMyAdmin\r
+       $conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], 'localhost', '', '');\r
+\r
+       if ( $conn )\r
+       {\r
+               $row = DB::getAttribute(PDO::ATTR_SERVER_VERSION);\r
+               $match = preg_split('#\.#', $row);\r
+       }\r
+       else\r
+       {\r
+               $row = @DB::getRow('SHOW VARIABLES LIKE \'version\'');\r
+\r
+               if ( $row )\r
+               {\r
+                       $match = preg_split('#\.#', $row[1]);\r
+               }\r
+               else\r
+               {\r
+                       $output = (function_exists('shell_exec')) ? @shell_exec('mysql -V') : '0.0.0';\r
+                       preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version);\r
+                       $match = preg_split('#\.#', $version[0]);\r
+\r
+                       if ( $match[0] == '' )\r
+                       {\r
+                               $match = array('0', '0', '0');\r
+                       }\r
+               }\r
+       }\r
+\r
+       @DB::disConnect();\r
+\r
+       //End and clean output buffer\r
+       ob_end_clean();\r
+\r
+       return implode($match, '.');\r
+}\r
+\r
+/**\r
+ * Add a table prefix if it is used\r
+ *\r
+ * @param string $input table name with prefix\r
+ * @return string\r
+ */\r
+function tableName($input)\r
+{\r
+       global $MYSQL_PREFIX;\r
+       if ( $MYSQL_PREFIX )\r
+       {\r
+               return $MYSQL_PREFIX . $input;\r
+       }\r
+       else\r
+       {\r
+               return $input;\r
+       }\r
+}\r
+\r
+/**\r
+ * Install custom plugins\r
+ */\r
+function installCustomPlugs()\r
+{\r
+       global $aConfPlugsToInstall, $DIR_LIBS, $manager;\r
+\r
+       $aErrors = array();\r
+       if ( count($aConfPlugsToInstall) == 0 )\r
+       {\r
+               return $aErrors;\r
+       }\r
+\r
+       $query = sprintf('SELECT * FROM %s', tableName('nucleus_plugin'));\r
+       $res = DB::getResult($query);\r
+       $numCurrent = $res->rowCount();\r
+\r
+       foreach ( $aConfPlugsToInstall as $plugName )\r
+       {\r
+               $query = sprintf('INSERT INTO %s (porder, pfile) VALUES (%d, %s)',\r
+                       tableName('nucleus_plugin'),\r
+                       (++$numCurrent),\r
+                       DB::quoteValue($plugName));\r
+               DB::execute($query);\r
+\r
+               $manager->clearCachedInfo('installedPlugins');\r
+               $plugin =& $manager->getPlugin($plugName);\r
+               $plugin->setID($numCurrent);\r
+\r
+               if ( !$plugin )\r
+               {\r
+                       $query = sprintf('DELETE FROM %s WHERE pfile = %s',\r
+                               tableName('nucleus_plugin'),\r
+                               DB::quoteValue($plugName));\r
+                       DB::execute($query);\r
+                       $numCurrent--;\r
+                       array_push($aErrors, sprintf(_INST_ERROR9, $plugName));\r
+                       continue;\r
+               }\r
+               $plugin->install();\r
+       }\r
+\r
+       $query = sprintf('DELETE FROM %s', tableName('nucleus_plugin_event'));\r
+       DB::execute($query);\r
+       $query = sprintf('SELECT pid, pfile FROM %s', tableName('nucleus_plugin'));\r
+       $res = DB::getResult($query);\r
+\r
+       foreach ( $res as $row )\r
+       {\r
+               $plug =& $manager->getPlugin($row['pfile']);\r
+\r
+               if ( $plug )\r
+               {\r
+                       $eventList = $plug->getEventList();\r
+                       foreach ( $eventList as $eventName )\r
+                       {\r
+                               $query = sprintf('INSERT INTO %s (pid, event) VALUES (%d, %s)',\r
+                                       tableName('nucleus_plugin_event'),\r
+                                       intval($row['pid']),\r
+                                       DB::quoteValue($eventName));\r
+                               DB::execute($query);\r
+                       }\r
+               }\r
+       }\r
+       return $aErrors;\r
+}\r
+\r
+/**\r
+ * Install custom skins\r
+ * Prepares the installation of custom skins\r
+ */\r
+function installCustomSkins()\r
+{\r
+       global $aConfSkinsToImport, $DIR_LIBS, $DIR_SKINS;\r
+\r
+       $aErrors = array();\r
+       if ( count($aConfSkinsToImport) == 0 )\r
+       {\r
+               return $aErrors;\r
+       }\r
+\r
+       $importer = new SkinImport();\r
+\r
+       foreach ( $aConfSkinsToImport as $skinName )\r
+       {\r
+               $importer->reset();\r
+               $skinFile = $DIR_SKINS . $skinName . '/skinbackup.xml';\r
+\r
+               if ( !@file_exists($skinFile) )\r
+               {\r
+                       array_push($aErrors, sprintf(_INST_ERROR10, $skinFile));\r
+                       continue;\r
+               }\r
+\r
+               $error = $importer->readFile($skinFile);\r
+\r
+               if ( $error )\r
+               {\r
+                       array_push($aErrors, sprintf(_INST_ERROR11, $skinName) . ' : ' . $error);\r
+                       continue;\r
+               }\r
+\r
+               $error = $importer->writeToDatabase(1);\r
+\r
+               if ( $error )\r
+               {\r
+                       array_push($aErrors, sprintf(_INST_ERROR12, $skinName) . ' : ' . $error);\r
+                       continue;\r
+               }\r
+       }\r
+       return $aErrors;\r
+}\r
+\r
+/**\r
+ * Check if some important files of the Nucleus CMS installation are available\r
+ * Give an error if one or more files are not accessible\r
+ */\r
+function do_check_files()\r
+{\r
+       $missingfiles = array();\r
+       $files = array(\r
+               './install.sql',\r
+               '../index.php',\r
+               '../action.php',\r
+               '../nucleus/index.php',\r
+               '../nucleus/media.php',\r
+               '../nucleus/libs/ACTION.php',\r
+               '../nucleus/libs/ACTIONLOG.php',\r
+               '../nucleus/libs/ACTIONS.php',\r
+               '../nucleus/libs/ADMIN.php',\r
+               '../nucleus/libs/BaseActions.php',\r
+               '../nucleus/libs/BLOG.php',\r
+               '../nucleus/libs/BODYACTIONS.php',\r
+               '../nucleus/libs/COMMENT.php',\r
+               '../nucleus/libs/COMMENTACTIONS.php',\r
+               '../nucleus/libs/COMMENTS.php',\r
+               '../nucleus/libs/ENCAPSULATE.php',\r
+               '../nucleus/libs/ENTITY.php',\r
+               '../nucleus/libs/globalfunctions.php',\r
+               '../nucleus/libs/i18n.php',\r
+               '../nucleus/libs/ITEM.php',\r
+               '../nucleus/libs/ITEMACTIONS.php',\r
+               '../nucleus/libs/LINK.php',\r
+               '../nucleus/libs/MANAGER.php',\r
+               '../nucleus/libs/MEDIA.php',\r
+               '../nucleus/libs/MEMBER.php',\r
+               '../nucleus/libs/NOTIFICATION.php',\r
+               '../nucleus/libs/PAGEFACTORY.php',\r
+               '../nucleus/libs/PARSER.php',\r
+               '../nucleus/libs/PLUGIN.php',\r
+               '../nucleus/libs/PLUGINADMIN.php',\r
+               '../nucleus/libs/SEARCH.php',\r
+               '../nucleus/libs/showlist.php',\r
+               '../nucleus/libs/SKIN.php',\r
+               '../nucleus/libs/TEMPLATE.php',\r
+               '../nucleus/libs/vars4.1.0.php',\r
+               '../nucleus/libs/xmlrpc.inc.php',\r
+               '../nucleus/libs/xmlrpcs.inc.php',\r
+               '../nucleus/libs/sql/DB.php',\r
+               '../nucleus/libs/sql/MYSQLPDO.php'\r
+       );\r
+\r
+       $count = count($files);\r
+       for ( $i = 0; $i < $count; $i++ )\r
+       {\r
+               if ( !is_readable($files[$i]) )\r
+               {\r
+                       array_push($missingfiles, 'File <b>' . $files[$i] . '</b> is missing or not readable.<br />');\r
+               }\r
+       }\r
+\r
+       if ( count($missingfiles) > 0 )\r
+       {\r
+               exit(implode("\n", $missingfiles));\r
+       }\r
+}\r
+\r
+/**\r
+ * Updates the configuration in the database\r
+ *\r
+ * @param string $name name of the config var\r
+ * @param string $value new value of the config var\r
+ * @return array\r
+ */\r
+function updateConfig($name, $value)\r
+{\r
+       $errors = array();\r
+\r
+       $query = "UPDATE %s SET value = %s WHERE name = %s";\r
+       $query = sprintf($query, tableName('nucleus_config'), DB::quoteValue(trim($value)), DB::quoteValue($name));\r
+\r
+       if ( DB::execute($query) === FALSE )\r
+       {\r
+               $errinfo = DB::getError();\r
+               $errors[] = _INST_ERROR4 . ': ' . $errinfo[2];\r
+       }\r
+       return $errors;\r
+}\r
+\r
+class ParamManager\r
+{\r
+       /* process parameter */\r
+       public $state;\r
+       public $locale;\r
+\r
+       /* mysql connection parameters */\r
+       public $mysql_host;\r
+       public $mysql_user;\r
+       public $mysql_password;\r
+       public $mysql_database;\r
+       public $mysql_tablePrefix;\r
+\r
+       /* weblog configuration parameters */\r
+       public $blog_name;\r
+       public $blog_shortname;\r
+\r
+       /* member configuration parameters */\r
+       public $user_name;\r
+       public $user_realname;\r
+       public $user_password;\r
+       private $user_password2;\r
+       public $user_email;\r
+\r
+       /* URI parameters  */\r
+       private $root_url;\r
+       public $IndexURL;\r
+       public $AdminURL;\r
+       public $MediaURL;\r
+       public $SkinsURL;\r
+       public $PluginURL;\r
+       public $ActionURL;\r
+\r
+       /* path parameters */\r
+       private $root_path;\r
+       public $AdminPath;\r
+       public $MediaPath;\r
+       public $SkinsPath;\r
+\r
+       /**\r
+        * constructor\r
+        */\r
+       public function __construct()\r
+       {\r
+               $this->init();\r
+       }\r
+\r
+       public function init()\r
+       {\r
+               // set default values\r
+               $this->state = 'locale';\r
+               $this->install_mode = 'simple';\r
+               $this->locale = 'en_Latn_US';\r
+               $this->mysql_host = @ini_get('mysql.default_host');\r
+               $this->blog_name = 'My Nucleus CMS';\r
+               $this->blog_shortname = 'mynucleuscms';\r
+\r
+               /* root path */\r
+               $directory_separator = preg_quote(DIRECTORY_SEPARATOR, '|');\r
+               $this->root_path = implode('/', preg_split("|$directory_separator|", realpath(dirname(__FILE__) . '/..')));\r
+               if ( substr($this->root_path, -1, 1) !== '/' )\r
+               {\r
+                       $this->root_path .= '/';\r
+               }\r
+               $base_path_pcre = preg_quote($this->root_path, '|');\r
+\r
+               /* current directry name */\r
+               $directory_name = preg_replace("#{$base_path_pcre}#", '', implode('/', preg_split("#{$directory_separator}#", realpath(dirname(__FILE__)))));\r
+               $directory_name_pcre = preg_quote($directory_name, '|');\r
+\r
+               /* root uri */\r
+               $root_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];\r
+               $this->root_url = preg_replace("|$directory_name_pcre(.*)$|", '', $root_url);\r
+\r
+               $this->AdminPath = $this->root_path . 'nucleus/';\r
+               $this->MediaPath = $this->root_path . 'media/';\r
+               $this->SkinsPath = $this->root_path . 'skins/';\r
+\r
+               $this->IndexURL  = $this->root_url;\r
+               $this->AdminURL  = $this->root_url . 'nucleus/';\r
+               $this->MediaURL  = $this->root_url . 'media/';\r
+               $this->SkinsURL  = $this->root_url . 'skins/';\r
+               $this->PluginURL = $this->root_url . 'nucleus/plugins/';\r
+               $this->ActionURL = $this->root_url . 'action.php';\r
+       }\r
+\r
+       private function read_parameter($parameter)\r
+       {\r
+               foreach ( $parameter as $element )\r
+               {\r
+                       if ( array_key_exists($element, $_POST) )\r
+                       {\r
+                               $this->$element = $_POST[$element];\r
+                       }\r
+               }\r
+       }\r
+\r
+       public function set_state($state)\r
+       {\r
+               $states = array('locale', 'mysql', 'weblog', 'detail', 'install');\r
+               if ( in_array($state, $states) )\r
+               {\r
+                       $this->state = $state;\r
+               }\r
+       }\r
+\r
+       public function set_locale()\r
+       {\r
+               $this->read_parameter(array('locale'));\r
+\r
+               if ( !in_array($this->locale, i18n::get_available_locale_list()) )\r
+               {\r
+                       $this->locale = 'en_Latn_US';\r
+               }\r
+       }\r
+\r
+       public function check_mysql_parameters()\r
+       {\r
+               global $MYSQL_HANDLER;\r
+               \r
+               $parameters = array('mysql_host', 'mysql_user', 'mysql_password', 'mysql_database', 'mysql_tablePrefix');\r
+               $this->read_parameter($parameters);\r
+\r
+               $errors = array();\r
+               if ( $this->mysql_host == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD1);\r
+               }\r
+\r
+               if ( $this->mysql_user == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD2);\r
+               }\r
+               \r
+               if ( $this->mysql_user != ''\r
+                       && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_user) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD2);\r
+               }\r
+               \r
+               if ( $this->mysql_database == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD4);\r
+               }\r
+\r
+               if ( $this->mysql_database != ''\r
+                       && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_database) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD4);\r
+               }\r
+\r
+               if ( $this->mysql_tablePrefix != ''\r
+                       && !preg_match('/^[a-z0-9_]+$/i', $this->mysql_tablePrefix) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR3, _DB_FIELD5);\r
+               }\r
+               \r
+               if ( count($errors) == 0 )\r
+               {\r
+                       $mysql_conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], $this->mysql_host, $this->mysql_user, $this->mysql_password);\r
+                       if ( $mysql_conn == false )\r
+                       {\r
+                               $errors[] = _DBCONNECT_ERROR;\r
+                       }\r
+                       else\r
+                       {\r
+                               @DB::disConnect();\r
+                       }\r
+               }\r
+\r
+               return $errors;\r
+       }\r
+\r
+       public function check_user_parameters()\r
+       {\r
+               $parameters = array('user_name', 'user_realname', 'user_password', 'user_password2', 'user_email');\r
+               $this->read_parameter($parameters);\r
+\r
+               $errors = array();\r
+               if ( $this->user_realname == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD1);\r
+               }\r
+\r
+               if ( $this->user_name == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD2);\r
+               }\r
+               elseif ( !preg_match("/^[a-z0-9]+([ a-z0-9]*[a-z0-9]+)?$/i", $this->user_name) )\r
+               {\r
+                       $errors[] = _VALID_ERROR5;\r
+               }\r
+\r
+               if ( $this->user_password == '' || $this->user_password2 == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD3);\r
+                       $this->user_password = '';\r
+               }\r
+               elseif ( $this->user_password != $this->user_password2 )\r
+               {\r
+                       $errors[] = _VALID_ERROR6;\r
+                       $this->user_password = '';\r
+               }\r
+\r
+               if ( !preg_match("/^[a-z0-9\._+\-]+@[a-z0-9\._\-]+\.[a-z]{2,6}$/i", $this->user_email) )\r
+               {\r
+                       $errors[] = _VALID_ERROR7;\r
+               }\r
+\r
+               return $errors;\r
+       }\r
+\r
+       public function check_weblog_parameters()\r
+       {\r
+               $parameters = array('blog_name', 'blog_shortname');\r
+               $this->read_parameter($parameters);\r
+\r
+               $errors = array();\r
+               if ( $this->blog_name == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD1);\r
+               }\r
+\r
+               if ( $this->blog_shortname == '' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD2);\r
+               }\r
+\r
+               if ( !preg_match("/^[a-z0-9]+$/i", $this->blog_shortname) )\r
+               {\r
+                       $errors[] = _VALID_ERROR4;\r
+               }\r
+\r
+               return $errors;\r
+       }\r
+\r
+       public function check_uri_parameters()\r
+       {\r
+               $parameters = array('IndexURL', 'AdminURL', 'MediaURL', 'SkinsURL', 'PluginURL', 'ActionURL');\r
+               $this->read_parameter($parameters);\r
+\r
+               $errors = array();\r
+               if ( substr($this->IndexURL, -1, 1) !== '/' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD1);\r
+               }\r
+\r
+               if ( substr($this->AdminURL, -1, 1) !== '/' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD2);\r
+               }\r
+\r
+               if ( substr($this->MediaURL, -1, 1) !== '/' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD4);\r
+               }\r
+\r
+               if ( substr($this->SkinsURL, -1, 1) !== '/' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD6);\r
+               }\r
+\r
+               if ( substr($this->PluginURL, -1, 1) !== '/' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD8);\r
+               }\r
+\r
+               if ( strrchr($this->ActionURL, '/') != '/action.php' )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR9, _PATH_FIELD9);\r
+               }\r
+\r
+               return $errors;\r
+       }\r
+\r
+       public function check_path_parameters()\r
+       {\r
+               $parameters = array('AdminPath', 'MediaPath', 'SkinsPath');\r
+               $this->read_parameter($parameters);\r
+\r
+               $separators = array('/', DIRECTORY_SEPARATOR);\r
+               $errors = array();\r
+               if ( !in_array(substr($this->AdminPath, -1, 1), $separators) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD3);\r
+               }\r
+               elseif ( !file_exists($this->AdminPath) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD3);\r
+               }\r
+\r
+               if ( !in_array(substr($this->MediaPath, -1, 1), $separators) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD5);\r
+               }\r
+               elseif ( !file_exists($this->MediaPath) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD5);\r
+               }\r
+\r
+               if ( !in_array(substr($this->SkinsPath, -1, 1), $separators) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD7);\r
+               }\r
+               elseif ( !file_exists($this->SkinsPath) )\r
+               {\r
+                       $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD7);\r
+               }\r
+\r
+               return $errors;\r
+       }\r
+\r
+       /**\r
+        * check all parameters\r
+        * @return bool\r
+        */\r
+       public function check_all_parameters()\r
+       {\r
+               $this->set_locale();\r
+\r
+               $isValid = true;\r
+               $isValid &= (count($this->check_mysql_parameters()) == 0);\r
+               $isValid &= (count($this->check_user_parameters()) == 0);\r
+               $isValid &= (count($this->check_weblog_parameters()) == 0);\r
+               $isValid &= (count($this->check_uri_parameters()) == 0);\r
+               $isValid &= (count($this->check_path_parameters()) == 0);\r
+\r
+               return $isValid;\r
+       }\r
+}\r
+=======
 <?php
 /*
  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
- * Copyright (C) 2002-2007 The Nucleus Group
+ * Copyright (C) 2002-2012 The Nucleus Group
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  *
  * This script will install the Nucleus tables in your SQL-database,
  * and initialize the data in those tables.
- *
- * Below is a friendly way of letting users on non-php systems know that Nucleus won't run there.
- * ?><div style="font-size: xx-large;"> Your web server is not properly configured to run PHP scripts and will not be able to install Nucleus. </div> <div style="display: none;"><?php
  */
 
 /**
  * @license http://nucleuscms.org/license.txt GNU General Public License
- * @copyright Copyright (C) 2002-2007 The Nucleus Group
- * @version $Id: index.php 1651 2012-02-03 14:57:11Z sakamocchi $
+ * @copyright Copyright (C) 2002-2012 The Nucleus Group
+ * @version $Id: index.php 1889 2012-06-17 08:46:45Z sakamocchi $
  */
 
+/* global values initialize */
+$CONF = array();
+
+/* reporting all errors for support */
+error_reporting(E_ALL);
+
 $minimum_php_version = '5.0.6';
 $minimum_mysql_version = '3.23';
 
+$page_footer_copyright = '&copy; 2001-2012 The Nucleus Groupe . Running Nucleus CMS v4.00';
+
 // begin if: server's PHP version is below the minimum; halt installation
-if ( phpversion() < $minimum_php_version )
+if ( version_compare(PHP_VERSION, $minimum_php_version, '<') )
 {
-       _doError(_ERROR31);
-} // end if
-
-/**
- * This part of the ./install/index.php code allows for customization of the install process.
- * When distributing plugins or skins together with a Nucleus installation, the
- * configuration below will instruct to install them
- *
- * -- Start Of Configurable Part --
- **/
-
-/**
- * array with names of plugins to install. Plugin files must be present in the nucleus/plugin/ directory
- *
- * example:
- *             array('NP_TrackBack', 'NP_MemberGoodies')
- **/
-$aConfPlugsToInstall = array('NP_SkinFiles', 'NP_SecurityEnforcer', 'NP_Text');
-
-/**
- * array with skins to install. skins must be present under the skins/ directory with
- * a subdirectory having the same name that contains a skinbackup.xml file
- *
- * example:
- *             array('base', 'rsd')
- **/
-$aConfSkinsToImport = array('atom', 'rss2.0', 'rsd', 'default');
-
-/**
- * -- End Of Configurable Part --
- **/
-
-// don't give warnings for uninitialized vars
-error_reporting(E_ERROR | E_WARNING | E_PARSE);
+       exit('<div style="font-size: xx-large;"> Nucleus requires at least PHP version ' . $minimum_php_version . '</div>');
+}
 
 // make sure there's no unnecessary escaping: # set_magic_quotes_runtime(0);
 if ( version_compare(PHP_VERSION, '5.3.0', '<') )
 {
-    ini_set('magic_quotes_runtime', '0');
-} // end if
-
-// if there are some plugins or skins to import, do not include vars in globalfunctions.php again... so set a flag
-if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) )
-{
-       global $CONF;
-       $CONF['installscript'] = 1;
-} // end if
+       ini_set('magic_quotes_runtime', '0');
+}
 
-if ( !class_exists('i18n', FALSE) )
-{
-       include('../nucleus/libs/i18n.php');
+/* default installed plugins and skins */
+$aConfPlugsToInstall = array('NP_SecurityEnforcer', 'NP_SkinFiles', 'NP_Medium');
+$aConfSkinsToImport = array('atom', 'rss2.0', 'rsd', 'default', 'admin/default', 'admin/bookmarklet');
 
-       if ( !i18n::init('UTF-8', './locales') )
-       {
-               exit('Failed to initialize iconv or mbstring extension. Would you please contact the administrator of your PHP server?');
-       } // end if
-} // end if
+// Check if some important files
+do_check_files();
 
-// we will use postVar, getVar, ... methods instead of $_GET, $_POST ...
-include_once('../nucleus/libs/vars4.1.0.php');
+/* i18n class is needed for internationalization */
+include_once('../nucleus/libs/i18n.php');
+if ( !i18n::init('UTF-8', '../nucleus/locales') )
+{
+       exit('<div style="font-size: xx-large;"> Failed to initialize iconv or mbstring extension. Would you please contact the administrator of your PHP server? </div>');
+}
 
 // include core classes that are needed for login & plugin handling
-include_once('../nucleus/libs/mysql.php');
 
-## added for 3.5 sql_* wrapper
+// added for 3.5 sql_* wrapper
 global $MYSQL_HANDLER;
 
-//set the handler if different from mysql (or mysqli) # $MYSQL_HANDLER = array('pdo','mysql');
 if ( !isset($MYSQL_HANDLER) )
 {
        $MYSQL_HANDLER = array('mysql', '');
-} // end if
+       
+       // check if mysql support is installed; this check may not make sense, as is, in a version past 3.5x
+       if ( !function_exists('mysql_query') && !function_exists('mysqli_query') )
+       {
+               exit('<div style="font-size: xx-large;"> Your PHP version does not have support for MySQL :( </div>');
+}
+}
+include_once('../nucleus/libs/sql/sql.php');
 
-include_once('../nucleus/libs/sql/' . $MYSQL_HANDLER[0] . '.php');
-## end new for 3.5 sql_* wrapper
+session_start();
+if ( count($_GET) == 0 && count($_POST) == 0 )
+{
+       unset($_SESSION['param_manager']);
+}
 
-/* TODO: if something input related to locale, sdet it, else set default */
-include('./locales/en_Latn_US.UTF-8.php');
-i18n::set_current_locale('en_Latn_US');
+// restore the $param from the session
+if ( array_key_exists('param_manager', $_SESSION) )
+{
+       $param = $_SESSION['param_manager'];
+}
+else
+{
+       $param = new ParamManager();
+}
 
-/* send HTTP header */
-header('Content-Type: application/xhtml+xml; charset=' . i18n::get_current_charset());
+// include translation file
+$param->set_locale();
 
-// check if mysql support is installed; this check may not make sense, as is, in a version past 3.5x
-if ( !function_exists('mysql_query') )
-{
-       _doError(_ERROR1);
-} // end if
+do_action();
 
-if ( postVar('action') == 'go' )
+// $param is saved to the session
+if ( isset($param) )
 {
-       doInstall();
+       $_SESSION['param_manager'] = $param;
 }
 else
 {
-       showInstallForm();
+       unset($_SESSION['param_manager']);
 }
-
 exit;
 
-
 /**
- * Display the form for installation settings
+ * installer action
  */
-function showInstallForm()
+function do_action()
 {
-       // 0. pre check if all necessary files exist
-       doCheckFiles();
-
-       echo "<?xml version=\"1.0\" encoding=\"" . i18n::get_current_charset() . "\" ?>\n";
-       echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
-       echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\" lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\">\n";
-?>
-       <head>
-               <title><?php echo _TITLE; ?></title>
-               <link rel="stylesheet" type="text/css" href="../nucleus/documentation/styles/manual.css" />
-               <script type="text/javascript">
-               <!--
-                       var submitcount = 0;
-
-                       // function to make sure the submit button only gets pressed once
-                       function checkSubmit()
-                       {
-
-                               if ( submitcount == 0 )
-                               {
-                                       submitcount++;
-                                       return true;
-                               }
-                               else
-                               {
-                                       return false;
-                               }
-
-                       }
-               -->
-               </script>
-       </head>
-       <body>
-               <div style="text-align: center;"><img src="../nucleus/styles/logo.gif" alt="<?php echo _ALT_NUCLEUS_CMS_LOGO; ?>" /></div>
-               <form method="post" action="./index.php">
-
-               <h1><?php echo _HEADER1; ?></h1>
-
-               <?php echo _TEXT1; ?>
-
-               <h1><?php echo _HEADER2; ?></h1>
-
-               <?php echo _TEXT2; ?>
-
-               <ul>
-                       <li> PHP: <?php echo phpversion(); ?> </li>
-                       <li> MySQL:
+       global $param;
 
-<?php
-       // Turn on output buffer
-       // Needed to repress the output of the sql function that are
-       // not part of php (in this case the @ operator doesn't work)
-       ob_start();
-
-       // note: this piece of code is taken from phpMyAdmin
-       $conn = sql_connect_args('localhost', '', '');
-       $result = @sql_query('SELECT VERSION() AS version', $conn);
-
-       if ( $result != FALSE && sql_num_rows($result) > 0 )
+       if ( array_key_exists('action', $_POST) )
        {
-               $row = sql_fetch_array($result);
-               $match = i18n::explode('.', $row['version']);
+               $isPostback = true;
        }
        else
        {
-               $result = @sql_query('SHOW VARIABLES LIKE \'version\'', $conn);
+               $isPostback = false;
+       }
 
-               if ( $result != FALSE && @sql_num_rows($result) > 0 )
+       // mode change
+       if ( array_key_exists('mode', $_REQUEST) )
+       {
+               if ( $_REQUEST['mode'] == 'detail' )
                {
-                       $row = sql_fetch_row($result);
-                       $match = i18n::explode('.', $row[1]);
+                       $param->set_state('detail');
                }
-               else
+               elseif ( $_REQUEST['mode'] == 'simple' )
                {
-                       //$output = shell_exec('mysql -V');
-                       $output = ( function_exists('shell_exec') ) ? @shell_exec('mysql -V') : '0.0.0';
-                       preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version);
-                       $match = i18n::explode('.', $version[0]);
-
-                       if ( $match[0] == '' )
-                       {
-                               $match[0] = '0';
-                               $match[1] = '0';
-                               $match[2] = '0';
-                       } // end if
-
-               } // end if
-
-       } // end if
-
-       @sql_disconnect($conn);
-
-       //End and clean output buffer
-       ob_end_clean();
-
-       $mysqlVersion = implode($match, '.');
-       $minVersion = '3.23';
-
-       if ( $mysqlVersion == '0.0.0' )
-       {
-               echo _NOTIFICATION1;
-       }
-       else
-       {
-               echo $mysqlVersion;
+                       $param->set_state('mysql');
+               }
        }
 
-       if ( $mysqlVersion < $minVersion )
+       // input parameter check
+       if ( $isPostback )
        {
-               echo ' <strong>', _TEXT2_WARN2 , $minVersion, '</strong>';
+               switch ( $param->state )
+               {
+                       case 'locale':
+                               $param->set_state('mysql');
+                               $isPostback = false;
+                               break;
+                       case 'mysql':
+                               if ( count($param->check_mysql_parameters()) == 0 )
+                               {
+                                       $param->set_state('weblog');
+                                       $isPostback = false;
+                               }
+                               break;
+                       case 'weblog':
+                               if ( count($param->check_user_parameters()) == 0
+                                       && count($param->check_weblog_parameters()) == 0 )
+                               {
+                                       $param->set_state('install');
+                                       $isPostback = false;
+                               }
+                               break;
+                       case 'detail':
+                               if ( $param->check_all_parameters() )
+                               {
+                                       $param->set_state('install');
+                                       $isPostback = false;
+                               }
+                               break;
+               }
        }
-?>
-
-                       </li>
-               </ul>
 
-<?php
-       // tell people how they can have their config file filled out automatically
-       if ( @file_exists('../config.php') && @!is_writable('../config.php') )
+       // page render
+       show_header();
+       switch ( $param->state )
        {
-?>
-
-               <h1><?php echo _HEADER3; ?></h1>
+               case 'locale':
+                       show_select_locale_form();
+                       break;
+               case 'mysql':
+                       show_database_setting_form($isPostback);
+                       break;
+               case 'weblog':
+                       show_blog_setting_form($isPostback);
+                       break;
+               case 'detail':
+                       show_detail_setting_form($isPostback);
+                       break;
+               case 'install':
+                       show_install_complete_form();
+                       break;
+       }
+       show_footer();
+}
 
-<?php
-       echo _TEXT3;
+/**
+ * header tag of the installation screens
+ **/
+function show_header()
+{
+       global $param;
 
-       } // end if
+       /* HTTP 1.1 application for no caching */
+       header("Cache-Control: no-cache, must-revalidate");
+       header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
+       header('Content-Type: text/html; charset=' . i18n::get_current_charset());
 ?>
-
-               <h1><?php echo _HEADER4; ?></h1>
-
-               <?php echo _TEXT4; ?>
-
-               <fieldset>
-                       <legend><?php echo _TEXT4_TAB_HEAD; ?></legend>
-                       <table>
-                               <tr>
-                                       <td><label for="if_mySQL_host"><?php echo _TEXT4_TAB_FIELD1; ?>:</label></td>
-                                       <td><input id="if_mySQL_host" name="mySQL_host" value="<?php echo ENTITY::hsc(@ini_get('mysql.default_host') )?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_mySQL_user"><?php echo _TEXT4_TAB_FIELD2; ?>:</label></td>
-                                       <td><input id="if_mySQL_user" name="mySQL_user" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_mySQL_password"><?php echo _TEXT4_TAB_FIELD3; ?>:</label></td>
-                                       <td><input id="if_mySQL_password" name="mySQL_password" type="password" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_mySQL_database"><?php echo _TEXT4_TAB_FIELD4; ?>:</label></td>
-                                       <td><input id="if_mySQL_database" name="mySQL_database" /> (<input name="mySQL_create" value="1" type="checkbox" id="mySQL_create" /><label for="mySQL_create"><?php echo _TEXT4_TAB_FIELD4_ADD; ?></label>)</td>
-                               </tr>
-                       </table>
-               </fieldset>
-
-               <fieldset>
-                       <legend><?php echo _TEXT4_TAB2_HEAD; ?></legend>
-                       <table>
-                               <tr>
-                                       <td><input name="mySQL_usePrefix" value="1" type="checkbox" id="mySQL_usePrefix" /><label for="mySQL_usePrefix"><?php echo _TEXT4_TAB2_FIELD; ?>:</label></td>
-                                       <td><input name="mySQL_tablePrefix" value="" /></td>
-                               </tr>
-                       </table>
-
-                       <?php echo _TEXT4_TAB2_ADD; ?>
-
-               </fieldset>
-
-               <h1><?php echo _HEADER5; ?></h1>
-
-               <?php echo _TEXT5; ?>
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+       <head>
+               <title><?php echo _TITLE; ?></title>
+               <link rel="stylesheet" type="text/css" href="./styles/inst.css" />
+               <style type="text/css">
+               <!--
+               <?php echo _BODYFONTSTYLE; ?>
+               -->
+               </style>
+               <script type="text/javascript">
+                       function SelectText( element ) {
+                               window.setTimeout( function() { element.select() }, 0 );
+                       }
+                       var isSubmit = false;
+                       function OnceSubmit() {
+                               if (!isSubmit) {
+                                       isSubmit = true;
+                                       window.setTimeout( function() { isSubmit = false; }, 10000 );
+                                       return true;
+                               }
+                               return false;
+                       }
+               </script>
+       </head>
+       <body>
+               <div id="header">
+                       <div id="navigation">
+                               <h1><img src="./styles/nucleus_rogo.png" alt="NucleusCMS" /></h1>
+                               <ul>
 <?php
-       // no need to this all! dirname(__FILE__) is all we need -- moraes
-       /*
-       // discover full path
-       $fullPath = serverVar('PATH_TRANSLATED');
-
-       if ($fullPath == '') {
-               $fullPath = serverVar('SCRIPT_FILENAME');
+       echo '<li>';
+       $label = '_LOCALE_' . strtoupper($param->locale);
+       if ( !defined($label) )
+       {
+               echo $param->locale;
        }
-
-       $base_path = str_replace('./index.php', '', $fullPath);
-       $base_path = replace_double_backslash($base_path);
-       $base_path = replace_double_backslash($base_path);
-
-       // add slash at end if necessary
-       if (!ends_with_slash($base_path) ) {
-               $base_path .= '/';
+       else
+       {
+               echo constant($label);
        }
-       */
-
-       /**
-        * In the code below, there used to be if conditions within the form's HTML that conditionally echoed the URLs.
-        *
-        * For example:
-        *              if ($base_path) . . .
-        * Or:
-        *              if ($url) . . .
-        *
-        * I removed this and simplified below, because PHP's type casting will make these always evaluate to TRUE.
-        * At least currently, $base_path will always be non-empty, since the trailing slash is appended to it.
-        * Similarly, $index_url will always be non-empty, since the 'http://' is prepended to it.
-        * Non-empty, non-zero strings evaluated in if conditions are always cast to boolean TRUE.
-        * The if conditions were accomplishing nothing (currently) and we should avoid using such comparisons, anyway.
-        * If we need to check for a blank/empty string, use empty().
-        *
-        * I was initially replacing those if conditions with ternary operators for empty(), but then I realized
-        * they will never be empty.
-        *
-        * In addition, I decided to remove the PHP logic from within the form and set up separate variables (they were
-        * all just $url before), so the form just echos the values as needed.
-        * - gregorlove 7/13/2011 5:56 PM
-        */
-       
-       /* base path */
-       $base_path = realpath(dirname(__FILE__) . '/..');
-       $pwd = preg_replace("#{$base_path}/#", '', dirname(__FILE__));
+       echo "</li>\n";
        
-       # Index URL
-       $index_url = 'http://' . serverVar('HTTP_HOST') . serverVar('PHP_SELF');
-       $index_url = preg_replace("#{$pwd}/index.php#", '', $index_url);
-       $index_url = replace_double_backslash($index_url);
-
-       // add slash at end if necessary
-       if ( !ends_with_slash($base_path) )
+       if ( in_array($param->state, array('mysql', 'weblog', 'install')) )
        {
-               $base_path .= '/';
+               echo '<li>&nbsp; &gt; &nbsp;' . _STEP1, '</li><li';
+               if ( $param->state == 'mysql' )
+               {
+                       echo ' class="gry"';
+               }
+               echo '>&nbsp; &gt; &nbsp;', _STEP2, '</li><li';
+               if ( in_array($param->state, array('mysql', 'weblog')) )
+               {
+                       echo ' class="gry"';
+               }
+               echo '>&nbsp; &gt; &nbsp;', _STEP3, "</li>\n";
        }
-       if ( !ends_with_slash($index_url) )
+       if ( in_array($param->state, array('mysql', 'weblog', 'detail')) )
        {
-               $index_url .= '/';
+               echo '<li class="rightbox">';
+               if ( in_array($param->state, array('mysql', 'weblog')) )
+               {
+                       echo '<a href="./?mode=detail">', _MODE2, '</a>';
+               }
+               else
+               {
+                       echo '<a href="./?mode=simple">', _MODE1, '</a>';
+               }
+               echo '</li>';
        }
-
-       # Admin URL and path
-       $admin_url = $index_url . 'nucleus/';
-       $admin_path = $base_path . 'nucleus/';
-
-       # Media URL and path
-       $media_url = $index_url . 'media/';
-       $media_path = $base_path . 'media/';
-
-       # Skins URL and path
-       $skins_url = $index_url . 'skins/';
-       $skins_path = $base_path . 'skins/';
-
-       # Plugins URL
-       $plugins_url = $admin_url . 'plugins/';
-
-       # Action URL
-       $action_url = $index_url . 'action.php';
-
 ?>
+                               </ul>
+                       </div>
+               </div>
+<?php
+}
 
-               <fieldset>
-                       <legend><?php echo _TEXT5_TAB_HEAD; ?></legend>
-                       <table>
-                               <tr>
-                                       <td><label for="if_IndexURL"><?php echo _TEXT5_TAB_FIELD1;?>:</label></td>
-                                       <td><input id="if_IndexURL" name="IndexURL" size="60" value="<?php echo $index_url; ?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_AdminURL"><?php echo _TEXT5_TAB_FIELD2;?>:</label></td>
-                                       <td><input id="if_AdminURL" name="AdminURL" size="60" value="<?php echo $admin_url; ?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_AdminPath"><?php echo _TEXT5_TAB_FIELD3;?>:</label></td>
-                                       <td><input id="if_AdminPath" name="AdminPath" size="60" value="<?php echo $admin_path; ?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_MediaURL"><?php echo _TEXT5_TAB_FIELD4;?>:</label></td>
-                                       <td><input id="if_MediaURL" name="MediaURL" size="60" value="<?php echo $media_url; ?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_MediaPath"><?php echo _TEXT5_TAB_FIELD5;?>:</label></td>
-                                       <td><input id="if_MediaPath" name="MediaPath" size="60" value="<?php echo $media_path; ?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_SkinsURL"><?php echo _TEXT5_TAB_FIELD6;?>:</label></td>
-                                       <td><input id="if_SkinsURL" name="SkinsURL" size="60" value="<?php echo $skins_url; ?>" />
-                                               <br />(used by imported skins)
-                                       </td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_SkinsPath"><?php echo _TEXT5_TAB_FIELD7;?>:</label></td>
-                                       <td><input id="if_SkinsPath" name="SkinsPath" size="60" value="<?php echo $skins_path; ?>" />
-                                               <br />(<?php echo _TEXT5_TAB_FIELD7_2;?>)
-                                       </td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_PluginURL"><?php echo _TEXT5_TAB_FIELD8;?>:</label></td>
-                                       <td><input id="if_PluginURL" name="PluginURL" size="60" value="<?php echo $plugins_url; ?>" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_ActionURL"><?php echo _TEXT5_TAB_FIELD9;?>:</label></td>
-                                       <td><input id="if_ActionURL" name="ActionURL" size="60" value="<?php echo $action_url; ?>" />
-                                               <br />(<?php echo _TEXT5_TAB_FIELD9_2;?>)
-                                       </td>
-                               </tr>
-                       </table>
-               </fieldset>
-
-               <?php echo _TEXT5_2; ?>
-
-               <h1><?php echo _HEADER6; ?></h1>
-
-               <?php echo _TEXT6; ?>
-
-               <fieldset>
-                       <legend><?php echo _TEXT6_TAB_HEAD; ?></legend>
-                       <table>
-                               <tr>
-                                       <td><label for="if_User_name"><?php echo _TEXT6_TAB_FIELD1; ?>:</label></td>
-                                       <td><input id="if_User_name" name="User_name" value="" /> <small>(<?php echo _TEXT6_TAB_FIELD1_2; ?>)</small></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_User_realname"><?php echo _TEXT6_TAB_FIELD2; ?>:</label></td>
-                                       <td><input id="if_User_realname" name="User_realname" value="" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_User_password"><?php echo _TEXT6_TAB_FIELD3; ?>:</label></td>
-                                       <td><input id="if_User_password" name="User_password" type="password" value="" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_User_password2"><?php echo _TEXT6_TAB_FIELD4; ?>:</label></td>
-                                       <td><input id="if_User_password2" name="User_password2" type="password" value="" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_User_email"><?php echo _TEXT6_TAB_FIELD5; ?>:</label></td>
-                                       <td><input id="if_User_email" name="User_email" value="" /> <small>(<?php echo _TEXT6_TAB_FIELD5_2; ?>)</small></td>
-                               </tr>
-                       </table>
-               </fieldset>
-
-               <h1><?php echo _HEADER7; ?></h1>
-
-               <?php echo _TEXT7; ?>
-
-               <fieldset>
-                       <legend><?php echo _TEXT7_TAB_HEAD; ?></legend>
-                       <table>
-                               <tr>
-                                       <td><label for="if_Blog_name"><?php echo _TEXT7_TAB_FIELD1; ?>:</label></td>
-                                       <td><input id="if_Blog_name" name="Blog_name" size="60" value="My Nucleus CMS" /></td>
-                               </tr>
-                               <tr>
-                                       <td><label for="if_Blog_shortname"><?php echo _TEXT7_TAB_FIELD2; ?>:</label></td>
-                                       <td><input id="if_Blog_shortname" name="Blog_shortname" value="mynucleuscms" /> <small>(<?php echo _TEXT7_TAB_FIELD2_2; ?>)</small></td>
-                               </tr>
-                       </table>
-               </fieldset>
-
-               <h1><?php echo _HEADER8; ?></h1>
-
-               <fieldset>
-                       <legend><?php echo _TEXT8_TAB_HEADER; ?></legend>
-                       <table>
-                               <tr>
-                                       <td><input name="Weblog_ping" value="1" type="checkbox" /><label for="Weblog_ping"><?php echo _TEXT8_TAB_FIELD1; ?></label></td>
-                               </tr>
-                       </table>
-               </fieldset>
-
-               <h1><?php echo _HEADER9; ?></h1>
-
-               <?php echo _TEXT9; ?>
-
-               <p><input name="action" value="go" type="hidden" /> <input type="submit" value="<?php echo _BUTTON1; ?>" onclick="return checkSubmit();" /></p>
-
-               </form>
+/**
+ * footer tag of the installation screens
+ **/
+function show_footer()
+{
+       global $page_footer_copyright;
+?>
+               <div id="footer">
+                       <?php echo $page_footer_copyright; ?>
+               </div>
        </body>
 </html>
-
 <?php
-} // end function showInstallForm()
-
+}
 
 /**
- * Add a table prefix if it is used
- *
- * @param string $input table name with prefix
- * @return string
+ * Display the form for language select
  */
-function tableName($input)
+function show_select_locale_form()
 {
-       global $mysql_usePrefix, $mysql_prefix;
+       global $param;
+       
+?>
+               <div id="container">
+                       <p style="font-size:152%;font-weight:bold;">
+                               <?php echo _LOCALE_HEADER; ?>
+                       </p>
+                       <form method="post" action="./index.php">
+
+                               <div class="prt">
+                                       <select name="locale">
+<?php
+       $locales = i18n::get_available_locale_list();
+       foreach ( $locales as $locale )
+       {
+               if ( $param->locale != $locale )
+               {
+                       echo "<option value=\"{$locale}\">";
+               }
+               else
+               {
+                       echo "<option value=\"{$locale}\" selected=\"selected\">";
+               }
+               
+               $checkfile = "./locales/{$locale}." . i18n::get_current_charset() . '.php';
+               if ( !file_exists($checkfile) )
+               {
+                       echo '*&nbsp;';
+               }
 
-       if ( $mysql_usePrefix == 1 )
+               $label = '_LOCALE_' . strtoupper($locale);
+               if ( !defined($label) )
        {
-               return $mysql_prefix . $input;
+                       echo $locale;
+               }
+               else
+               {
+                       echo constant($label);
+               }
+               echo "</option>\n";
        }
-       else
-       {
-               return $input;
-       } // end if
-
+?>
+                                       </select>
+                                       <p><?php echo _LOCALE_DESC1; ?></p>
+                                       <p><?php echo _LOCALE_DESC2; ?></p>
+                                       <p><?php echo _LOCALE_NEED_HELP;?></p>
+                                       <p class="sbt">
+                                               <button type="submit" name="action" value="locale" class="sbt_arw">START</button>
+                                       </p>
+                               </div>
+                       </form>
+               </div>
+<?php
 }
 
-
 /**
- * The installation process itself
+ * Display the form to set up a database
+ * @param bool $isPostback
  */
-function doInstall()
+function show_database_setting_form($isPostback)
 {
-       global $mysql_usePrefix, $mysql_prefix, $weblog_ping;
-
-       // 0. put all POST-vars into vars
-       $mysql_host = postVar('mySQL_host');
-       $mysql_user = postVar('mySQL_user');
-       $mysql_password = postVar('mySQL_password');
-       $mysql_database = postVar('mySQL_database');
-       $mysql_create = postVar('mySQL_create');
-       $mysql_usePrefix = postVar('mySQL_usePrefix');
-       $mysql_prefix = postVar('mySQL_tablePrefix');
-       $config_indexurl = postVar('IndexURL');
-       $config_adminurl = postVar('AdminURL');
-       $config_adminpath = postVar('AdminPath');
-       $config_mediaurl = postVar('MediaURL');
-       $config_skinsurl = postVar('SkinsURL');
-       $config_pluginurl = postVar('PluginURL');
-       $config_actionurl = postVar('ActionURL');
-       $config_mediapath = postVar('MediaPath');
-       $config_skinspath = postVar('SkinsPath');
-       $user_name = postVar('User_name');
-       $user_realname = postVar('User_realname');
-       $user_password = postVar('User_password');
-       $user_password2 = postVar('User_password2');
-       $user_email = postVar('User_email');
-       $blog_name = postVar('Blog_name');
-       $blog_shortname = postVar('Blog_shortname');
-       $config_adminemail = $user_email;
-       $config_sitename = $blog_name;
-       $weblog_ping = postVar('Weblog_ping');
-
-       $config_indexurl = replace_double_backslash($config_indexurl);
-       $config_adminurl = replace_double_backslash($config_adminurl);
-       $config_mediaurl = replace_double_backslash($config_mediaurl);
-       $config_skinsurl = replace_double_backslash($config_skinsurl);
-       $config_pluginurl = replace_double_backslash($config_pluginurl);
-       $config_actionurl = replace_double_backslash($config_actionurl);
-       $config_adminpath = replace_double_backslash($config_adminpath);
-       $config_skinspath = replace_double_backslash($config_skinspath);
-
-       // 1. check all the data
-       $errors = array();
+       global $param, $minimum_mysql_version;
 
-       if ( !$mysql_database )
+       $config_writable = canConfigFileWritable();
+       $mysql_version = getMySqlVersion();
+?>
+               <div id="container">
+                       <p class="msg">
+<?php
+       echo _SIMPLE_NAVI1;
+       if ( $config_writable != '' )
        {
-               array_push($errors, _ERROR2);
+               echo '<span class="err">', $config_writable, '</span>';
        }
-
-       if ( ($mysql_usePrefix == 1) && (i18n::strlen($mysql_prefix) == 0) )
+       if ( $mysql_version == '0.0.0' )
        {
-               array_push($errors, _ERROR3);
+               echo '<span class="err">', _DBVERSION_UNKOWN, '</span>';
        }
-
-       if ( ($mysql_usePrefix == 1) && (!preg_match('/^[a-zA-Z0-9_]+$/i', $mysql_prefix) ) )
+       elseif ( version_compare($mysql_version, $minimum_mysql_version, '<') )
        {
-               array_push($errors, _ERROR4);
+               echo '<span class="err">', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '</span>';
        }
-
-       // TODO: add action.php check
-       if ( !ends_with_slash($config_indexurl) || !ends_with_slash($config_adminurl) || !ends_with_slash($config_mediaurl) || !ends_with_slash($config_pluginurl) || !ends_with_slash($config_skinsurl) )
+?>
+                       </p>
+                       <form method="post" action="./index.php">
+                               <div class="prt">
+                                       <h2><?php echo _DB_HEADER; ?></h2>
+                                       <p class="msg">
+<?php
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR5);
+               $errors = $param->check_mysql_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD1; ?></span><span class="sub"><?php echo _DB_FIELD1_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_host" value="<?php echo $param->mysql_host; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD2; ?></span><span class="sub"><?php echo _DB_FIELD2_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_user" value="<?php echo $param->mysql_user; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD3; ?></span></th>
+                                                               <td><input type="text" name="mysql_password" value="<?php echo $param->mysql_password; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD4; ?></span><span class="sub"><?php echo _DB_FIELD4_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_database" value="<?php echo $param->mysql_database; ?>" /></td>
+                                               </tr>
+                                       </table>
+                                       <p class="sbt">
+                                               <button type="submit" name="mode" value="detail" class="sbt_sqr"><?php echo _MODE2; ?></button>
+                                               <button type="submit" name="action" value="mysql" class="sbt_arw"><?php echo _NEXT; ?></button>
+                                       </p>
+                                       <p class="msg">
+                                               <?php echo _DB_TEXT1; ?>
+                                       </p>
+                               </div>
+                       </form>
+               </div>
+<?php
+}
 
-       if ( !ends_with_slash($config_adminpath) )
+/**
+ * Displays a form to the blog settings
+ * @param bool $isPostback
+ */
+function show_blog_setting_form($isPostback)
+{
+       global $param;
+?>
+               <div id="container">
+                       <p class="msg">
+                               <?php echo _SIMPLE_NAVI2; ?>
+                       </p>
+                       <form method="post" action="./index.php">
+                               <div class="prt">
+                                       <h2><?php echo _BLOG_HEADER; ?></h2>
+                                       <p class="msg">
+<?php
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR6);
+               $errors = $param->check_weblog_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
-
-       if ( !ends_with_slash($config_mediapath) )
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD1; ?></span></th>
+                                                               <td><input type="text" name="blog_name" value="<?php echo $param->blog_name; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD2; ?></span><span class="sub"><?php echo _BLOG_FIELD2_DESC; ?></span></th>
+                                                               <td><input type="text" name="blog_shortname" value="<?php echo $param->blog_shortname; ?>" /></td>
+                                               </tr>
+                                       </table>
+                               </div>
+
+                               <div class="prt">
+                                       <h2><?php echo _ADMIN_HEADER; ?></h2>
+                                       <p class="msg">
+<?php
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR7);
+               $errors = $param->check_user_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD1; ?></span></th>
+                                                               <td><input type="text" name="user_realname" value="<?php echo $param->user_realname; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD2; ?></span><span class="sub"><?php echo _ADMIN_FIELD2_DESC; ?></span></th>
+                                                               <td><input type="text" name="user_name" value="<?php echo $param->user_name; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD3; ?></span></th>
+                                                               <td><input type="password" name="user_password" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD4; ?></span></th>
+                                                               <td><input type="password" name="user_password2" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD5; ?></span></th>
+                                                               <td><input type="text" name="user_email" value="<?php echo $param->user_email; ?>" /></td>
+                                               </tr>
+                                       </table>
+                                       <p class="sbt">
+                                               <button type="submit" name="action" value="weblog" class="sbt_arw" onclick="OnceSubmit()"><?php echo _INSTALL; ?></button>
+                                       </p>
+                               </div>
+                       </form>
+               </div>
+<?php
+}
 
-       if ( !ends_with_slash($config_skinspath) )
+/**
+ * Displays a form to the detail settings
+ * @param bool $isPostback
+ */
+function show_detail_setting_form($isPostback)
+{
+       global $param, $minimum_mysql_version;
+
+       $mysql_version = getMySqlVersion();
+?>
+               <div id="container_detailed">
+                       <p class="msg">
+                               <?php echo _DETAIL_NAVI1; ?>
+<?php
+       if ( $isPostback && !$param->check_all_parameters() )
        {
-               array_push($errors, _ERROR8);
+               echo '<span class="err">', _VALID_ERROR, "</span>\n";
        }
-
-       if ( !is_dir($config_adminpath) )
+?>
+                       </p>
+                       <ul class="msg">
+                               <li>PHP: <?php echo phpversion(); ?></li>
+                               <li>MySQL:
+<?php
+       echo ($mysql_version == '0.0.0') ? _DBVERSION_UNKOWN : $mysql_version;
+       if ( version_compare($mysql_version, $minimum_mysql_version, '<') )
        {
-               array_push($errors, _ERROR9);
+               echo '<span class="err">', sprintf(_DBVERSION_TOOLOW, $minimum_mysql_version), '</span>';
        }
+?></li>
+                       </ul>
+                       <form method="post" action="">
 
-       if ( !_isValidMailAddress($user_email) )
+                               <div class="prt">
+                                       <h2><?php echo _DETAIL_HEADER1; ?></h2>
+                                       <p class="msg">
+<?php
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR10);
+               $errors = $param->check_mysql_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
-
-       if ( !_isValidDisplayName($user_name) )
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD1; ?></span><span class="sub"><?php echo _DB_FIELD1_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_host" value="<?php echo $param->mysql_host; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD2; ?></span><span class="sub"><?php echo _DB_FIELD2_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_user" value="<?php echo $param->mysql_user; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD3; ?></span></th>
+                                                               <td><input type="text" name="mysql_password" value="<?php echo $param->mysql_password; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD4; ?></span><span class="sub"><?php echo _DB_FIELD4_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_database" value="<?php echo $param->mysql_database; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _DB_FIELD5; ?></span><span class="sub"><?php echo _DB_FIELD5_DESC; ?></span></th>
+                                                               <td><input type="text" name="mysql_tablePrefix" value="<?php echo $param->mysql_tablePrefix; ?>" /></td>
+                                               </tr>
+                                       </table>
+
+                                       <h2><?php echo _DETAIL_HEADER2; ?></h2>
+                                       <p class="msg">
+<?php
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR11);
+               $errors = $param->check_uri_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
+               $errors = $param->check_path_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
-
-       if ( !$user_password || !$user_password2 )
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD1; ?></span></th>
+                                                               <td><input type="text" name="IndexURL" value="<?php echo $param->IndexURL; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD2; ?></span></th>
+                                                               <td><input type="text" name="AdminURL" value="<?php echo $param->AdminURL; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD3; ?></span></th>
+                                                               <td><input type="text" name="AdminPath" value="<?php echo $param->AdminPath; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD4; ?></span></th>
+                                                               <td><input type="text" name="MediaURL" value="<?php echo $param->MediaURL; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD5; ?></span></th>
+                                                               <td><input type="text" name="MediaPath" value="<?php echo $param->MediaPath; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD6; ?></span></th>
+                                                               <td><input type="text" name="SkinsURL" value="<?php echo $param->SkinsURL; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD7; ?></span></th>
+                                                               <td><input type="text" name="SkinsPath" value="<?php echo $param->SkinsPath; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD8; ?></span></th>
+                                                               <td><input type="text" name="PluginURL" value="<?php echo $param->PluginURL; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _PATH_FIELD9; ?></span></th>
+                                                               <td><input type="text" name="ActionURL" value="<?php echo $param->ActionURL; ?>" /></td>
+                                               </tr>
+                                       </table>
+                                       <p class="msg">
+                                               <?php echo _DETAIL_TEXT3; ?>
+                                       </p>
+
+                                       <h2><?php echo _DETAIL_HEADER3; ?></h2>
+                                       <p class="msg">
+<?php
+       echo _DETAIL_TEXT4;
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR12);
+               $errors = $param->check_user_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
-
-       if ( $user_password != $user_password2 )
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD1; ?></span></th>
+                                                               <td><input type="text" name="user_realname" value="<?php echo $param->user_realname; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD2; ?></span><span class="sub"><?php echo _ADMIN_FIELD2_DESC; ?></span></th>
+                                                               <td><input type="text" name="user_name" value="<?php echo $param->user_name; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD3; ?></span></th>
+                                                               <td><input type="password" name="user_password" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD4; ?></span></th>
+                                                               <td><input type="password" name="user_password2" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _ADMIN_FIELD5; ?></span></th>
+                                                               <td><input type="text" name="user_email" value="<?php echo $param->user_email; ?>" /></td>
+                                               </tr>
+                                       </table>
+
+                                       <h2><?php echo _DETAIL_HEADER4; ?></h2>
+                                       <p class="msg">
+<?php
+       echo _DETAIL_TEXT5;
+       if ( $isPostback )
        {
-               array_push($errors, _ERROR13);
+               $errors = $param->check_weblog_parameters();
+               if ( is_array($errors) )
+               {
+                       foreach ( $errors as $error )
+                       {
+                               echo '<span class="err">', $error, "</span>\n";
+                       }
+               }
        }
+?>
+                                       </p>
+                                       <table>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD1; ?></span></th>
+                                                               <td><input type="text" name="blog_name" value="<?php echo $param->blog_name; ?>" /></td>
+                                               </tr>
+                                               <tr>
+                                                       <th><span class="nam"><?php echo _BLOG_FIELD2; ?></span><span class="sub"><?php echo _BLOG_FIELD2_DESC; ?></span></th>
+                                                               <td><input type="text" name="blog_shortname" value="<?php echo $param->blog_shortname; ?>" /></td>
+                                               </tr>
+                                       </table>
+
+                                       <p class="msg">
+                                               <?php echo _DETAIL_TEXT6; ?>
+                                       </p>
+
+                                       <p class="sbt">
+                                               <button type="submit" name="action" value="detail" class="sbt_arw" onclick="OnceSubmit()"><?php echo _INSTALL; ?></button>
+                                       </p>
+                               </div>
+                       </form>
+               </div>
+<?php
+}
 
-       if ( !_isValidShortName($blog_shortname) )
+/**
+ * Displays a screen to signal the completion of the installation
+ */
+function show_install_complete_form()
+{
+       global $MYSQL_HANDLER, $param;
+       $errors = do_install();
+?>
+               <div id="container">
+                       <p class="msg">
+<?php
+       if ( is_array($errors) && count($errors) > 0 )
        {
-               array_push($errors, _ERROR14);
+               echo _INST_ERROR;
+               foreach ( $errors as $error )
+               {
+                       echo '<span class="err">', $error, "</span>\n";
+               }
        }
-
-       if ( sizeof($errors) > 0 )
+       else
        {
-               showErrorMessages($errors);
+               echo _INST_TEXT;
+               if ( array_key_exists('config_data', $_SESSION) )
+               {
+                       echo '<span class="err">', _INST_TEXT4, '</span>';
+?>
+<textarea id="config_text" readonly="readonly" onfocus="SelectText(this);"><?php echo htmlentities($_SESSION['config_data'], null, i18n::get_current_charset()) ?></textarea>
+<?php
+               }
+               else
+               {
+                       echo '<span class="err">', _INST_TEXT5, '</span>';
+               }
+?>
+                       </p>
+                       <form method="post" action="./index.php">
+                               <div class="prt">
+                                       <h2><?php echo _INST_HEADER1; ?></h2>
+                                       <p class="msg">
+                                               <?php echo sprintf(_INST_TEXT1, $param->blog_name); ?>
+                                       </p>
+                                       <p class="sbt">
+                                               <button type="button" name="toBlog" onclick="location.href='<?php echo $param->IndexURL; ?>';" class="sbt_arw"><?php echo _INST_BUTTON1; ?></button>
+                                       </p>
+                               </div>
+
+                               <div class="prt">
+                                       <h2><?php echo _INST_HEADER2; ?></h2>
+                                       <p class="msg">
+                                               <?php echo _INST_TEXT2; ?>
+                                       </p>
+                                       <p class="sbt">
+                                               <button type="button" name="toMng" onclick="location.href='<?php echo $param->AdminURL; ?>';" class="sbt_arw"><?php echo _INST_BUTTON2; ?></button>
+                                       </p>
+                               </div>
+
+                               <div class="prt">
+                                       <h2><?php echo _INST_HEADER3; ?></h2>
+                                       <p class="msg">
+                                               <?php echo _INST_TEXT3; ?>
+                                       </p>
+                                       <p class="sbt">
+                                               <button type="button" name="toAddBlog" onclick="location.href='<?php echo $param->AdminURL; ?>index.php?action=createnewlog';" class="sbt_arw"><?php echo _INST_BUTTON3; ?></button>
+                                       </p>
+                               </div>
+                       </form>
+<?php
        }
+?>
+               </div>
+<?php
+       unset($param);
+}
 
-       // 2. try to log in to mySQL
-
-       global $MYSQL_CONN;
+/**
+ * The installation process itself
+ * @return array error messages
+ */
+function do_install()
+{
+       global $param;
+       global $MYSQL_HANDLER, $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE, $MYSQL_PREFIX, $MYSQL_CONN;
+       global $DIR_NUCLEUS, $DIR_MEDIA, $DIR_SKINS, $DIR_PLUGINS, $DIR_LANG, $DIR_LIBS;
+       $errors = array();
 
-       // this will need to be changed if we ever allow
-       $MYSQL_CONN = @sql_connect_args($mysql_host, $mysql_user, $mysql_password);
+       /*
+        * 1. put all param-vars into vars
+        */
+       $MYSQL_HOST             = $param->mysql_host;
+       $MYSQL_USER             = $param->mysql_user;
+       $MYSQL_PASSWORD = $param->mysql_password;
+       $MYSQL_DATABASE = $param->mysql_database;
+       $MYSQL_PREFIX   = $param->mysql_tablePrefix;
+
+       $DIR_NUCLEUS    = $param->AdminPath;
+       $DIR_MEDIA              = $param->MediaPath;
+       $DIR_SKINS              = $param->SkinsPath;
+       $DIR_PLUGINS    = $DIR_NUCLEUS . 'plugins/';
+       $DIR_LOCALES    = $DIR_NUCLEUS . 'locales/';
+       $DIR_LIBS               = $DIR_NUCLEUS . 'libs/';
 
+       /*
+        * 2.open mySQL connection
+        */
+       $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD);
        if ( $MYSQL_CONN == FALSE )
        {
-               _doError(_ERROR15 . ': ' . sql_error() );
+               $errors[] = _DBCONNECT_ERROR;
+               return $errors;
        }
 
-       // 3. try to create database (if needed)
-       if ( $mysql_create == 1 )
+       /*
+        * 3. try to create database if needed
+        */
+       if ( DB::execute("CREATE DATABASE IF NOT EXISTS {$MYSQL_DATABASE}") === FALSE )
        {
-               sql_query('CREATE DATABASE ' . $mysql_database, $MYSQL_CONN) or _doError(_ERROR16 . ': ' . sql_error($MYSQL_CONN) );
+               $errinfo = DB::getError();
+               $errors[] = _INST_ERROR1 . ': ' . $errinfo[2];
        }
 
-       // 4. try to select database
-       sql_select_db($mysql_database, $MYSQL_CONN) or _doError(_ERROR17);
-
-       // 5. execute queries
-       $filename = 'install.sql';
-       $fd = fopen($filename, 'r');
-       $queries = fread($fd, filesize($filename) );
-       fclose($fd);
+       /*
+        * 4. try to select database
+        */
+       $MYSQL_CONN = @DB::setConnectionInfo($MYSQL_HANDLER[1], $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE);
+       if ( !$MYSQL_CONN )
+       {
+               $errors[] = _INST_ERROR2;
+       }
 
-       $queries = preg_split('#(;\n|;\r)#', $queries);
+       if ( count($errors) > 0 )
+       {
+               return $errors;
+       }
 
-       $aTableNames = array(
+       /*
+        * 5. execute queries
+        */
+       $table_names = array(
                'nucleus_actionlog',
                'nucleus_ban',
                'nucleus_blog',
@@ -699,406 +2626,408 @@ function doInstall()
                'nucleus_tickets'
        );
 
-       // these are unneeded (one of the replacements above takes care of them)
-       //                      'nucleus_plugin_event',
-       //                      'nucleus_plugin_option',
-       //                      'nucleus_plugin_option_desc',
-       //                      'nucleus_skin_desc',
-       //                      'nucleus_template_desc',
-
-       $aTableNamesPrefixed = array(
-               $mysql_prefix . 'nucleus_actionlog',
-               $mysql_prefix . 'nucleus_ban',
-               $mysql_prefix . 'nucleus_blog',
-               $mysql_prefix . 'nucleus_category',
-               $mysql_prefix . 'nucleus_comment',
-               $mysql_prefix . 'nucleus_config',
-               $mysql_prefix . 'nucleus_item',
-               $mysql_prefix . 'nucleus_karma',
-               $mysql_prefix . 'nucleus_member',
-               $mysql_prefix . 'nucleus_plugin',
-               $mysql_prefix . 'nucleus_skin',
-               $mysql_prefix . 'nucleus_template',
-               $mysql_prefix . 'nucleus_team',
-               $mysql_prefix . 'nucleus_activation',
-               $mysql_prefix . 'nucleus_tickets'
-       );
+       $prefixed_table_names = array();
+       foreach ( $table_names as $table_name )
+       {
+               $prefixed_table_names[] = $MYSQL_PREFIX . $table_name;
+       }
+
+       // table exists check
+       $result = DB::getResult('SHOW TABLES');
+       foreach ( $result as $row )
+       {
+               if ( in_array($row[0], $prefixed_table_names) )
+               {
+                       $errors[] = _INST_ERROR3;
+                       break;
+               }
+       }
+       if ( count($errors) > 0 )
+       {
+               return $errors;
+       }
 
-       // these are unneeded (one of the replacements above takes care of them)
-       //                      $mysql_prefix . 'nucleus_plugin_event',
-       //                      $mysql_prefix . 'nucleus_plugin_option',
-       //                      $mysql_prefix . 'nucleus_plugin_option_desc',
-       //                      $mysql_prefix . 'nucleus_skin_desc',
-       //                      $mysql_prefix . 'nucleus_template_desc',
+       $filename = 'install.sql';
+       $fd = fopen($filename, 'r');
+       $queries = fread($fd, filesize($filename));
+       fclose($fd);
 
-       $count = count($queries);
+       $queries = preg_split('#(;\n|;\r)#', $queries);
 
-       for ( $idx = 0; $idx < $count; $idx++ )
+       foreach ( $queries as $query )
        {
-               $query = trim($queries[$idx]);
-               // echo "QUERY = <small>" . ENTITY::hsc($query) . "</small><p>";
-
-               if ( $query )
+               if ( preg_match('/\w+/', $query) )
                {
-
-                       if ( $mysql_usePrefix == 1 )
+                       if ( $MYSQL_PREFIX )
                        {
-                               $query = str_replace($aTableNames, $aTableNamesPrefixed, $query);
-                       } // end if
-
-                       sql_query($query, $MYSQL_CONN) or _doError(_ERROR30 . ' (<small>' . ENTITY::hsc($query) . '</small>): ' . sql_error($MYSQL_CONN) );
-               } // end if
-
-       } // end loop
-
-       // 5a make first post
-       $newpost = "INSERT INTO ". tableName('nucleus_item') ." VALUES (1, '" . _1ST_POST_TITLE . "', '" . _1ST_POST . "', '" . _1ST_POST2 . "', 1, 1, '2005-08-15 11:04:26', 0, 0, 0, 1, 0, 1);";
-       sql_query($newpost,$MYSQL_CONN) or _doError(_ERROR18 . ' (<small>' . ENTITY::hsc($newpost) . '</small>): ' . sql_error($MYSQL_CONN) );
-
-       // 6. update global settings
-       updateConfig('IndexURL', $config_indexurl);
-       updateConfig('AdminURL', $config_adminurl);
-       updateConfig('MediaURL', $config_mediaurl);
-       updateConfig('SkinsURL', $config_skinsurl);
-       updateConfig('PluginURL', $config_pluginurl);
-       updateConfig('ActionURL', $config_actionurl);
-       updateConfig('AdminEmail', $config_adminemail);
-       updateConfig('SiteName', $config_sitename);
-
-       // 7. update GOD member
-       $query = 'UPDATE ' . tableName('nucleus_member')
-                       . " SET mname='" . addslashes($user_name) . "',"
-                       . " mrealname='" . addslashes($user_realname) . "',"
-                       . " mpassword='" . md5(addslashes($user_password) ) . "',"
-                       . " murl='" . addslashes($config_indexurl) . "',"
-                       . " memail='" . addslashes($user_email) . "',"
-                       . " madmin=1, mcanlogin=1"
-                       . " WHERE mnumber=1";
-
-       sql_query($query,$MYSQL_CONN) or _doError(_ERROR19 . ': ' . sql_error($MYSQL_CONN) );
-
-       // 8. update weblog settings
-       $query = 'UPDATE ' . tableName('nucleus_blog')
-                       . " SET bname='" . addslashes($blog_name) . "',"
-                       . " bshortname='" . addslashes($blog_shortname) . "',"
-                       . " burl='" . addslashes($config_indexurl) . "'"
-                       . " WHERE bnumber=1";
-
-       sql_query($query, $MYSQL_CONN) or _doError(_ERROR20 . ': ' . sql_error($MYSQL_CONN) );
-
-       // 9. update item date
-       $query = 'UPDATE ' . tableName('nucleus_item')
-                       . " SET itime='" . date('Y-m-d H:i:s', time() ) ."'"
-                       . " WHERE inumber=1";
-
-       sql_query($query,$MYSQL_CONN) or _doError(_ERROR21 . ': ' . sql_error($MYSQL_CONN) );
+                               $query = str_replace($table_names, $prefixed_table_names, $query);
+                       }
 
-       global $aConfPlugsToInstall, $aConfSkinsToImport;
-       $aSkinErrors = array();
-       $aPlugErrors = array();
+                       if ( DB::execute($query) === FALSE )
+                       {
+                               $errinfo = DB::getError();
+                               $errors[] = _INST_ERROR4 . ' (<small>' . $query . '</small>): ' . $errinfo[2];
+                       }
+               }
+       }
 
-       if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) )
+       /*
+        * 6. put needed records
+        */
+       /* push first post */
+       $query = "INSERT INTO %s VALUES (1, %s, %s, %s, 1, 1, %s, 0, 0, 0, 1, 0, 1)";
+       $query = sprintf($query,
+               tableName('nucleus_item'),
+               DB::quoteValue(_1ST_POST_TITLE),
+               DB::quoteValue(_1ST_POST),
+               DB::quoteValue(_1ST_POST2),
+               DB::formatDateTime()
+       );
+       if ( DB::execute($query) === FALSE )
        {
-               // 10. set global variables
-               global $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASSWORD, $MYSQL_DATABASE, $MYSQL_PREFIX;
+               $errinfo = DB::getError();
+               $errors[] = _INST_ERROR4 . ' (<small>' . $query . '</small>): ' . $errinfo[2];
+       }
 
-               $MYSQL_HOST = $mysql_host;
-               $MYSQL_USER = $mysql_user;
-               $MYSQL_PASSWORD = $mysql_password;
-               $MYSQL_DATABASE = $mysql_database;
-               $MYSQL_PREFIX = ( $mysql_usePrefix == 1 ) ? $mysql_prefix : '';
+       /* push configurations */
+       array_merge($errors, updateConfig('IndexURL', $param->IndexURL));
+       array_merge($errors, updateConfig('AdminURL', $param->AdminURL));
+       array_merge($errors, updateConfig('MediaURL', $param->MediaURL));
+       array_merge($errors, updateConfig('SkinsURL', $param->SkinsURL));
+       array_merge($errors, updateConfig('PluginURL', $param->PluginURL));
+       array_merge($errors, updateConfig('ActionURL', $param->ActionURL));
+       array_merge($errors, updateConfig('AdminEmail', $param->user_email));
+       array_merge($errors, updateConfig('SiteName', $param->blog_name));
+       array_merge($errors, updateConfig('Locale', i18n::get_current_locale()));
+
+       /* push super admin */
+       $query = "UPDATE %s SET mname = %s, mrealname = %s, mpassword = %s, memail = %s, murl = %s, madmin = 1, mcanlogin = 1 WHERE mnumber = 1";
+       $query = sprintf($query,
+               tableName('nucleus_member'),
+               DB::quoteValue($param->user_name),
+               DB::quoteValue($param->user_realname),
+               DB::quoteValue(md5($param->user_password)),
+               DB::quoteValue($param->user_email),
+               DB::quoteValue($param->IndexURL)
+       );
+       if ( DB::execute($query) === FALSE )
+       {
+               $errinfo = DB::getError();
+               $errors[] = _INST_ERROR5 . ': ' . $errinfo[2];
+       }
 
-               global $DIR_NUCLEUS, $DIR_MEDIA, $DIR_SKINS, $DIR_PLUGINS, $DIR_LANG, $DIR_LIBS;
+       /* push new weblog */
+       $query = "UPDATE %s SET bname = %s, bshortname = %s, burl = %s WHERE bnumber = 1";
+       $query = sprintf($query,
+               tableName('nucleus_blog'),
+               DB::quoteValue($param->blog_name),
+               DB::quoteValue($param->blog_shortname),
+               DB::quoteValue($param->IndexURL)
+       );
+       if ( DB::execute($query) === FALSE )
+       {
+               $errinfo = DB::getError();
+               $errors[] = _INST_ERROR6 . ': ' . $errinfo[2];
+       }
 
-               $DIR_NUCLEUS = $config_adminpath;
-               $DIR_MEDIA = $config_mediapath;
-               $DIR_SKINS = $config_skinspath;
-               $DIR_PLUGINS = $DIR_NUCLEUS . 'plugins/';
-               $DIR_LOCALES = $DIR_NUCLEUS . 'locales/';
-               $DIR_LIBS = $DIR_NUCLEUS . 'libs/';
+       /* push default category */
+       $query = "UPDATE %s SET cname = %s, cdesc = %s WHERE catid = 1";
+       $query = sprintf($query,
+               tableName('nucleus_category'),
+               DB::quoteValue(_GENERALCAT_NAME),
+               DB::quoteValue(_GENERALCAT_DESC)
+       );
+       if ( DB::execute($query) === FALSE )
+       {
+               $errinfo = DB::getError();
+               $errors[] = _INST_ERROR6 . ': ' . $errinfo[2];
+       }
 
-               // close database connection (needs to be closed if we want to include globalfunctions.php)
-               sql_close($MYSQL_CONN);
+       /*
+        * 7. install default plugins and skins
+        */
+       global $aConfPlugsToInstall, $aConfSkinsToImport;
+       $aSkinErrors = array();
+       $aPlugErrors = array();
 
-               $manager = '';
+       if ( (count($aConfPlugsToInstall) > 0) || (count($aConfSkinsToImport) > 0) )
+       {
                include_once($DIR_LIBS . 'globalfunctions.php');
+               global $manager;
+               if ( !isset($manager) )
+               {
+                       $manager = new Manager();
+               }
 
-               // 11. install custom skins
-               $aSkinErrors = installCustomSkins($manager);
-               $defskinQue  = 'SELECT `sdnumber` as result FROM ' . sql_table('skin_desc') . ' WHERE `sdname` = "default"';
-               $defSkinID   = quickQuery($defskinQue);
-               $updateQuery = 'UPDATE ' . sql_table('blog') . ' SET `bdefskin` = ' . intval($defSkinID) . ' WHERE `bnumber` = 1';
-               sql_query($updateQuery);
-               $updateQuery = 'UPDATE ' . sql_table('config') . ' SET `value` = ' . intval($defSkinID). ' WHERE `name` = "BaseSkin"';
-               sql_query($updateQuery);
-
-               // 12. install NP_Ping, if decided
-               if ( $weblog_ping == 1 )
-               {
-                       global $aConfPlugsToInstall;
-                       array_push($aConfPlugsToInstall, 'NP_Ping');
-               }
-
-               // 13. install custom plugins
-               $aPlugErrors = installCustomPlugs($manager);
-       }
-
-       // 14. Write config file ourselves (if possible)
-       $bConfigWritten = 0;
-
-       if ( @file_exists('../config.php') && is_writable('../config.php') && $fp = @fopen('../config.php', 'w') )
-       {
-               $config_data = '<' . '?php' . "\n\n";
-               //$config_data .= "\n"; (extraneous, just added extra \n to previous line
-               $config_data .= "       // mySQL connection information\n";
-               $config_data .= "       \$MYSQL_HOST = '" . $mysql_host . "';\n";
-               $config_data .= "       \$MYSQL_USER = '" . $mysql_user . "';\n";
-               $config_data .= "       \$MYSQL_PASSWORD = '" . $mysql_password . "';\n";
-               $config_data .= "       \$MYSQL_DATABASE = '" . $mysql_database . "';\n";
-               $config_data .= "       \$MYSQL_PREFIX = '" . (($mysql_usePrefix == 1)?$mysql_prefix:'') . "';\n";
-               $config_data .= "       // new in 3.50. first element is db handler, the second is the db driver used by the handler\n";
-               $config_data .= "       // default is \$MYSQL_HANDLER = array('mysql','mysql');\n";
-               $config_data .= "       //\$MYSQL_HANDLER = array('mysql','mysql');\n";
-               $config_data .= "       //\$MYSQL_HANDLER = array('pdo','mysql');\n";
-               $config_data .= "       \$MYSQL_HANDLER = array('".$MYSQL_HANDLER[0]."','".$MYSQL_HANDLER[1]."');\n";
-               $config_data .= "\n";
-               $config_data .= "       // main nucleus directory\n";
-               $config_data .= "       \$DIR_NUCLEUS = '" . $config_adminpath . "';\n";
-               $config_data .= "\n";
-               $config_data .= "       // path to media dir\n";
-               $config_data .= "       \$DIR_MEDIA = '" . $config_mediapath . "';\n";
-               $config_data .= "\n";
-               $config_data .= "       // extra skin files for imported skins\n";
-               $config_data .= "       \$DIR_SKINS = '" . $config_skinspath . "';\n";
-               $config_data .= "\n";
-               $config_data .= "       // these dirs are normally sub dirs of the nucleus dir, but \n";
-               $config_data .= "       // you can redefine them if you wish\n";
-               $config_data .= "       \$DIR_PLUGINS = \$DIR_NUCLEUS . 'plugins/';\n";
-               $config_data .= "       \$DIR_LOCALES = \$DIR_NUCLEUS . 'locales/';\n";
-               $config_data .= "       \$DIR_LIBS = \$DIR_NUCLEUS . 'libs/';\n";
-               $config_data .= "\n";
-               $config_data .= "       // include libs\n";
-               $config_data .= "       include(\$DIR_LIBS.'globalfunctions.php');\n";
-               $config_data .= "?" . ">";
-
-               $result = @fputs($fp, $config_data, i18n::strlen($config_data) );
-               fclose($fp);
-
-               if ( $result )
-               {
-                       $bConfigWritten = 1;
-               } // end if
-
-       } // end if
-       echo "<?xml version=\"1.0\" encoding=\"" . i18n::get_current_charset() . "\" ?>\n";
-       echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
-       echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\" lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\">\n";
-?>
-<head>
-       <title><?php echo _TITLE; ?></title>
-       <style>@import url('../nucleus/styles/manual.css');</style>
-</head>
-<body>
-       <div style='text-align:center'><img src='../nucleus/styles/logo.gif' /></div> <!-- Nucleus logo -->
+               include_once($DIR_LIBS . 'skinie.php');
+               
+               $aSkinErrors = installCustomSkins();
+               if ( count($aSkinErrors) > 0 )
+               {
+                       array_merge($errors, $aSkinErrors);
+               }
 
-<?php
-       $aAllErrors = array_merge($aSkinErrors, $aPlugErrors);
+               $query  = "SELECT sdnumber FROM %s WHERE sdname='admin/default'";
+               $query  = sprintf($query, tableName('nucleus_skin_desc'));
+               $res    = intval(DB::getValue($query));
+               array_merge($errors, updateConfig('AdminSkin', $res));
+               
+               $query  = "SELECT sdnumber FROM %s WHERE sdname='admin/bookmarklet'";
+               $query  = sprintf($query, tableName('nucleus_skin_desc'));
+               $res    = intval(DB::getValue($query));
+               array_merge($errors, updateConfig('BookmarkletSkin', $res));
+               
+               $query          = "SELECT sdnumber FROM %s WHERE sdname='default'";
+               $query          = sprintf($query, tableName('nucleus_skin_desc'));
+               $defSkinID      = intval(DB::getValue($query));
+
+               $query = "UPDATE %s SET bdefskin=%d WHERE bnumber=1";
+               $query = sprintf($query, tableName('nucleus_blog'), $defSkinID);
+               DB::execute($query);
+               $query = "UPDATE %s SET value=%d WHERE name='BaseSkin'";
+               $query = sprintf($query, tableName('nucleus_config'), $defSkinID);
+               DB::execute($query);
+
+               $aPlugErrors = installCustomPlugs();
+               if ( count($aPlugErrors) > 0 )
+               {
+                       array_merge($errors, $aPlugErrors);
+               }
+       }
 
-       if ( count($aAllErrors) > 0 )
+       /*
+        * 8. Write config file ourselves (if possible)
+        */
+       $config_data = '<' . '?php' . "\n";
+       $config_data .= "// mySQL connection information\n";
+       $config_data .= "\$MYSQL_HOST = '" . $MYSQL_HOST . "';\n";
+       $config_data .= "\$MYSQL_USER = '" . $MYSQL_USER . "';\n";
+       $config_data .= "\$MYSQL_PASSWORD = '" . $MYSQL_PASSWORD . "';\n";
+       $config_data .= "\$MYSQL_DATABASE = '" . $MYSQL_DATABASE . "';\n";
+       $config_data .= "\$MYSQL_PREFIX = '" . $MYSQL_PREFIX . "';\n";
+       $config_data .= "// new in 3.50. first element is db handler, the second is the db driver used by the handler\n";
+       $config_data .= "// default is \$MYSQL_HANDLER = array('mysql','mysql');\n";
+       $config_data .= "//\$MYSQL_HANDLER = array('mysql','mysql');\n";
+       $config_data .= "//\$MYSQL_HANDLER = array('pdo','mysql');\n";
+       $config_data .= "\$MYSQL_HANDLER = array('" . $MYSQL_HANDLER[0] . "','" . $MYSQL_HANDLER[1] . "');\n";
+       $config_data .= "\n";
+       $config_data .= "// main nucleus directory\n";
+       $config_data .= "\$DIR_NUCLEUS = '" . $DIR_NUCLEUS . "';\n";
+       $config_data .= "\n";
+       $config_data .= "// path to media dir\n";
+       $config_data .= "\$DIR_MEDIA = '" . $DIR_MEDIA . "';\n";
+       $config_data .= "\n";
+       $config_data .= "// extra skin files for imported skins\n";
+       $config_data .= "\$DIR_SKINS = '" . $DIR_SKINS . "';\n";
+       $config_data .= "\n";
+       $config_data .= "// these dirs are normally sub dirs of the nucleus dir, but \n";
+       $config_data .= "// you can redefine them if you wish\n";
+       $config_data .= "\$DIR_PLUGINS = \$DIR_NUCLEUS . 'plugins/';\n";
+       $config_data .= "\$DIR_LOCALES = \$DIR_NUCLEUS . 'locales/';\n";
+       $config_data .= "\$DIR_LIBS = \$DIR_NUCLEUS . 'libs/';\n";
+       $config_data .= "\n";
+       $config_data .= "// include libs\n";
+       $config_data .= "include(\$DIR_LIBS.'globalfunctions.php');\n";
+       $config_data .= "?" . ">";
+
+       $result = false;
+       if ( @!file_exists('../config.php') || is_writable('../config.php') )
        {
-               echo '<h1>' . _TITLE2 . '</h1>';
-               echo '<ul><li>' . implode('</li><li>', $aAllErrors) . '</li></ul>';
+               if ( $fp = @fopen('../config.php', 'w') )
+               {
+                       $result = @fwrite($fp, $config_data, i18n::strlen($config_data));
+                       fclose($fp);
+               }
        }
 
-       // begin if: config file not written
-       if ( !$bConfigWritten )
+       if ( $result )
        {
-?>
-               <h1><?php echo _TITLE3; ?></h1>
-
-               <?php echo _TEXT10; ?>
-
-               <pre><code>&lt;?php
-       // mySQL connection information
-       $MYSQL_HOST = '<b><?php echo $mysql_host?></b>';
-       $MYSQL_USER = '<b><?php echo $mysql_user?></b>';
-       $MYSQL_PASSWORD = '<i><b>xxxxxxxxxxx</b></i>';
-       $MYSQL_DATABASE = '<b><?php echo $mysql_database?></b>';
-       $MYSQL_PREFIX = '<b><?php echo ($mysql_usePrefix == 1)?$mysql_prefix:''?></b>';
-
-       // new in 3.50. first element is db handler, the second is the db driver used by the handler
-       // default is $MYSQL_HANDLER = array('mysql','mysql');
-       //$MYSQL_HANDLER = array('mysql','mysql');
-       //$MYSQL_HANDLER = array('pdo','mysql');
-       $MYSQL_HANDLER = array('mysql','');
-
-       // main nucleus directory
-       $DIR_NUCLEUS = '<b><?php echo $config_adminpath?></b>';
-
-       // path to media dir
-       $DIR_MEDIA = '<b><?php echo $config_mediapath?></b>';
-
-       // extra skin files for imported skins
-       $DIR_SKINS = '<b><?php echo $config_skinspath?></b>';
-
-       // these dirs are normally sub dirs of the nucleus dir, but
-       // you can redefine them if you wish
-       $DIR_PLUGINS = $DIR_NUCLEUS . 'plugins/';
-       $DIR_LOCALES = $DIR_NUCLEUS . 'locales/';
-       $DIR_LIBS = $DIR_NUCLEUS . 'libs/';
-
-       // include libs
-       include($DIR_LIBS.'globalfunctions.php');
-?&gt;</code></pre>
-
-       <?php echo _TEXT11; ?>
-
-       <div class="note">
-       <?php echo _TEXT12; ?>
-       </div>
-
-<?php
+               // try to change the read-only permission.
+               if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )
+               {
+                       @chmod('../config.php', 0444);
+               }
        }
-       // else: config file written
        else
        {
-?>
-
-       <h1><?php echo _TITLE4; ?></h1>
-
-       <?php echo _TEXT13; ?>
-
-<?php
-       } // end if
-?>
+               $_SESSION['config_data'] = $config_data;
+       }
 
-       <h1><?php echo _TITLE5; ?></h1>
+       return $errors;
+}
 
-       <?php echo _TEXT14; ?>
+/**
+ * Confirm that you can write to the configuration file
+ * @return string error message
+ */
+function canConfigFileWritable()
+{
+       if ( @file_exists('../config.php') && @!is_writable('../config.php') )
+       {
+               // try to change the read-write permission.
+               if ( strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' )
+               {
+                       @chmod('../config.php', 0666);
+               }
 
-       <ul>
-               <li><?php echo _TEXT14_L1; ?></li>
-               <li><?php echo _TEXT14_L2; ?></li>
-       </ul>
+               if ( @!is_writable('../config.php') )
+               {
+                       return _INST_ERROR8;
+               }
+       }
+       return '';
+}
 
-       <h1><?php echo _HEADER10; ?></h1>
+/**
+ * To obtain the version of MySQL
+ * @return string
+ */
+function getMySqlVersion()
+{
+       global $MYSQL_HANDLER, $minimum_mysql_version, $errors;
+       // Turn on output buffer
+       // Needed to repress the output of the sql function that are
+       // not part of php (in this case the @ operator doesn't work)
+       ob_start();
 
-       <?php echo _TEXT15; ?>
+       // note: this piece of code is taken from phpMyAdmin
+       $conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], 'localhost', '', '');
 
-       <ul>
-               <li><?php echo _TEXT15_L1; ?></li>
-               <li><?php echo _TEXT15_L2; ?></li>
-       </ul>
+       if ( $conn )
+       {
+               $row = DB::getAttribute(PDO::ATTR_SERVER_VERSION);
+               $match = preg_split('#\.#', $row);
+       }
+       else
+       {
+               $row = @DB::getRow('SHOW VARIABLES LIKE \'version\'');
 
-       <?php echo _TEXT16; ?>
+               if ( $row )
+               {
+                       $match = preg_split('#\.#', $row[1]);
+               }
+               else
+               {
+                       $output = (function_exists('shell_exec')) ? @shell_exec('mysql -V') : '0.0.0';
+                       preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version);
+                       $match = preg_split('#\.#', $version[0]);
 
-       <h1><?php echo _HEADER11; ?></h1>
+                       if ( $match[0] == '' )
+                       {
+                               $match = array('0', '0', '0');
+                       }
+               }
+       }
 
-       <p><?php echo _TEXT16_H; ?>
-               <ul>
-                       <li><a href="<?php echo $config_adminurl?>"><?php echo _TEXT16_L1; ?></a></li>
-                       <li><a href="<?php echo $config_indexurl?>"><?php echo _TEXT16_L2; ?></a></li>
-               </ul>
-       </p>
+       @DB::disConnect();
 
-</body>
-</html>
+       //End and clean output buffer
+       ob_end_clean();
 
-<?php
-} // end function doInstall()
+       return implode($match, '.');
+}
 
+/**
+ * Add a table prefix if it is used
+ *
+ * @param string $input table name with prefix
+ * @return string
+ */
+function tableName($input)
+{
+       global $MYSQL_PREFIX;
+       if ( $MYSQL_PREFIX )
+       {
+               return $MYSQL_PREFIX . $input;
+       }
+       else
+       {
+               return $input;
+       }
+}
 
 /**
  * Install custom plugins
  */
-function installCustomPlugs(&$manager)
+function installCustomPlugs()
 {
-       global $aConfPlugsToInstall, $DIR_LIBS;
+       global $aConfPlugsToInstall, $DIR_LIBS, $manager;
 
        $aErrors = array();
-
        if ( count($aConfPlugsToInstall) == 0 )
        {
                return $aErrors;
        }
 
-       $res = sql_query('SELECT * FROM ' . sql_table('plugin') );
-       $numCurrent = sql_num_rows($res);
+       $query = sprintf('SELECT * FROM %s', tableName('nucleus_plugin'));
+       $res = DB::getResult($query);
+       $numCurrent = $res->rowCount();
 
        foreach ( $aConfPlugsToInstall as $plugName )
        {
-               // do this before calling getPlugin (in case the plugin id is used there)
-               $query = 'INSERT INTO ' . sql_table('plugin') . ' (`porder`, `pfile`) VALUES (' . (++$numCurrent) . ', "' . addslashes($plugName) . '")';
-               sql_query($query);
+               $query = sprintf('INSERT INTO %s (porder, pfile) VALUES (%d, %s)',
+                       tableName('nucleus_plugin'),
+                       (++$numCurrent),
+                       DB::quoteValue($plugName));
+               DB::execute($query);
 
-               // get and install the plugin
                $manager->clearCachedInfo('installedPlugins');
                $plugin =& $manager->getPlugin($plugName);
                $plugin->setID($numCurrent);
-               
+
                if ( !$plugin )
                {
-                       sql_query('DELETE FROM ' . sql_table('plugin') . ' WHERE `pfile` = \'' . addslashes($plugName) . '\'');
+                       $query = sprintf('DELETE FROM %s WHERE pfile = %s',
+                               tableName('nucleus_plugin'),
+                               DB::quoteValue($plugName));
+                       DB::execute($query);
                        $numCurrent--;
-                       array_push($aErrors, _ERROR22 . $plugName);
+                       array_push($aErrors, sprintf(_INST_ERROR9, $plugName));
                        continue;
-               } // end if
-
+               }
                $plugin->install();
-       } // end loop
-
-       // SYNC PLUGIN EVENT LIST
-       sql_query('DELETE FROM ' . sql_table('plugin_event') );
+       }
 
-       // loop over all installed plugins
-       $res = sql_query('SELECT `pid`, `pfile` FROM ' . sql_table('plugin') );
+       $query = sprintf('DELETE FROM %s', tableName('nucleus_plugin_event'));
+       DB::execute($query);
+       $query = sprintf('SELECT pid, pfile FROM %s', tableName('nucleus_plugin'));
+       $res = DB::getResult($query);
 
-       while ( $o = sql_fetch_object($res) )
+       foreach ( $res as $row )
        {
-               $pid = $o->pid;
-               $plug =& $manager->getPlugin($o->pfile);
+               $plug =& $manager->getPlugin($row['pfile']);
 
                if ( $plug )
                {
                        $eventList = $plug->getEventList();
-
                        foreach ( $eventList as $eventName )
                        {
-                               sql_query('INSERT INTO ' . sql_table('plugin_event') . ' (`pid`, `event`) VALUES (' . $pid . ', \'' . $eventName . '\')');
-                       } // end loop
-
-               } // end if
-
-       } // end loop
-
+                               $query = sprintf('INSERT INTO %s (pid, event) VALUES (%d, %s)',
+                                       tableName('nucleus_plugin_event'),
+                                       intval($row['pid']),
+                                       DB::quoteValue($eventName));
+                               DB::execute($query);
+                       }
+               }
+       }
        return $aErrors;
-} // end function installCustomPlugs()
-
+}
 
 /**
  * Install custom skins
  * Prepares the installation of custom skins
  */
-function installCustomSkins(&$manager)
+function installCustomSkins()
 {
-       global $aConfSkinsToImport, $DIR_LIBS, $DIR_SKINS, $manager;
+       global $aConfSkinsToImport, $DIR_LIBS, $DIR_SKINS;
 
        $aErrors = array();
-
-       if ( empty($manager) )
-       {
-               $manager = new MANAGER;
-       }
-
        if ( count($aConfSkinsToImport) == 0 )
        {
                return $aErrors;
        }
 
-       // load skinie class
-       include_once($DIR_LIBS . 'skinie.php');
-
-       $importer = new SKINIMPORT();
+       $importer = new SkinImport();
 
        foreach ( $aConfSkinsToImport as $skinName )
        {
@@ -1107,37 +3036,34 @@ function installCustomSkins(&$manager)
 
                if ( !@file_exists($skinFile) )
                {
-                       array_push($aErrors, _ERROR23_1 . $skinFile . ' : ' . _ERROR23_2);
+                       array_push($aErrors, sprintf(_INST_ERROR10, $skinFile));
                        continue;
-               } // end if
+               }
 
                $error = $importer->readFile($skinFile);
 
                if ( $error )
                {
-                       array_push($aErrors, _ERROR24 . $skinName . ' : ' . $error);
+                       array_push($aErrors, sprintf(_INST_ERROR11, $skinName) . ' : ' . $error);
                        continue;
-               } // end if
+               }
 
                $error = $importer->writeToDatabase(1);
 
                if ( $error )
                {
-                       array_push($aErrors, _ERROR24 . $skinName . ' : ' . $error);
+                       array_push($aErrors, sprintf(_INST_ERROR12, $skinName) . ' : ' . $error);
                        continue;
-               } // end if
-
-       } // end loop
-
+               }
+       }
        return $aErrors;
-} // end function installCustomSkins()
-
+}
 
 /**
  * Check if some important files of the Nucleus CMS installation are available
  * Give an error if one or more files are not accessible
  */
-function doCheckFiles()
+function do_check_files()
 {
        $missingfiles = array();
        $files = array(
@@ -1145,225 +3071,476 @@ function doCheckFiles()
                '../index.php',
                '../action.php',
                '../nucleus/index.php',
-               '../nucleus/libs/globalfunctions.php',
+               '../nucleus/libs/ACTION.php',
+               '../nucleus/libs/ACTIONLOG.php',
+               '../nucleus/libs/ACTIONS.php',
                '../nucleus/libs/ADMIN.php',
+               '../nucleus/libs/BaseActions.php',
                '../nucleus/libs/BLOG.php',
+               '../nucleus/libs/BODYACTIONS.php',
                '../nucleus/libs/COMMENT.php',
+               '../nucleus/libs/COMMENTACTIONS.php',
                '../nucleus/libs/COMMENTS.php',
+               '../nucleus/libs/ENTITY.php',
+               '../nucleus/libs/globalfunctions.php',
+               '../nucleus/libs/i18n.php',
                '../nucleus/libs/ITEM.php',
+               '../nucleus/libs/ITEMACTIONS.php',
+               '../nucleus/libs/LINK.php',
+               '../nucleus/libs/MANAGER.php',
+               '../nucleus/libs/MEDIA.php',
                '../nucleus/libs/MEMBER.php',
+               '../nucleus/libs/NOTIFICATION.php',
+               '../nucleus/libs/PARSER.php',
+               '../nucleus/libs/PLUGIN.php',
+               '../nucleus/libs/PLUGINADMIN.php',
+               '../nucleus/libs/SEARCH.php',
+               '../nucleus/libs/showlist.php',
                '../nucleus/libs/SKIN.php',
                '../nucleus/libs/TEMPLATE.php',
-               '../nucleus/libs/MEDIA.php',
-               '../nucleus/libs/ACTIONLOG.php',
-               '../nucleus/media.php'
+               '../nucleus/libs/vars4.1.0.php',
+               '../nucleus/libs/xmlrpc.inc.php',
+               '../nucleus/libs/xmlrpcs.inc.php',
+               '../nucleus/libs/sql/DB.php',
+               '../nucleus/libs/sql/MYSQLPDO.php'
        );
-       
-       $count = count($files);
 
+       $count = count($files);
        for ( $i = 0; $i < $count; $i++ )
        {
-
                if ( !is_readable($files[$i]) )
                {
-                       array_push($missingfiles, _ERROR25_1 . $files[$i] . _ERROR25_2);
-               } // end if
-
-       } // end loop
+                       array_push($missingfiles, 'File <b>' . $files[$i] . '</b> is missing or not readable.<br />');
+               }
+       }
 
        if ( count($missingfiles) > 0 )
        {
-               showErrorMessages($missingfiles);
-       } // end if
-
-} // end function doCheckFiles()
-
+               exit(implode("\n", $missingfiles));
+       }
+}
 
 /**
  * Updates the configuration in the database
  *
  * @param string $name name of the config var
  * @param string $value new value of the config var
- * @return int
+ * @return array
  */
 function updateConfig($name, $value)
 {
-       global $MYSQL_CONN;
-       $name = addslashes($name);
-       $value = trim(addslashes($value) );
+       $errors = array();
 
-       $query = 'UPDATE ' . tableName('nucleus_config')
-                       . " SET `value` = '$value'"
-                       . " WHERE `name` = '$name'";
+       $query = "UPDATE %s SET value = %s WHERE name = %s";
+       $query = sprintf($query, tableName('nucleus_config'), DB::quoteValue(trim($value)), DB::quoteValue($name));
 
-       sql_query($query, $MYSQL_CONN) or _doError(_ERROR26 . ': ' . sql_error($MYSQL_CONN) );
-       return sql_insert_id($MYSQL_CONN);
+       if ( DB::execute($query) === FALSE )
+       {
+               $errinfo = DB::getError();
+               $errors[] = _INST_ERROR4 . ': ' . $errinfo[2];
+       }
+       return $errors;
 }
 
-
-/**
- * Replaces double backslashs
- *
- * @param string $input string that could have double backslashs
- * @return string
- */
-function replace_double_backslash($input)
+class ParamManager
 {
-       return str_replace('\\', '/', $input);
-}
+       /* process parameter */
+       public $state;
+       public $locale;
+
+       /* mysql connection parameters */
+       public $mysql_host;
+       public $mysql_user;
+       public $mysql_password;
+       public $mysql_database;
+       public $mysql_tablePrefix;
+
+       /* weblog configuration parameters */
+       public $blog_name;
+       public $blog_shortname;
+
+       /* member configuration parameters */
+       public $user_name;
+       public $user_realname;
+       public $user_password;
+       private $user_password2;
+       public $user_email;
+
+       /* URI parameters  */
+       private $root_url;
+       public $IndexURL;
+       public $AdminURL;
+       public $MediaURL;
+       public $SkinsURL;
+       public $PluginURL;
+       public $ActionURL;
+
+       /* path parameters */
+       private $root_path;
+       public $AdminPath;
+       public $MediaPath;
+       public $SkinsPath;
 
+       /**
+        * constructor
+        */
+       public function __construct()
+       {
+               $this->init();
+       }
 
-/**
- * Checks if a string ends with a slash
- *
- * @param string $input
- * @return string
- */
-function ends_with_slash($input)
-{
-       return ( i18n::strrpos($input, '/') == i18n::strlen($input) - 1);
-}
+       public function init()
+       {
+               // set default values
+               $this->state = 'locale';
+               $this->install_mode = 'simple';
+               $this->locale = '';
+               $this->mysql_host = @ini_get('mysql.default_host');
+               $this->blog_name = 'My Nucleus CMS';
+               $this->blog_shortname = 'mynucleuscms';
+
+               /* root path */
+               $directory_separator = preg_quote(DIRECTORY_SEPARATOR, '|');
+               $this->root_path = implode('/', preg_split("|$directory_separator|", realpath(dirname(__FILE__) . '/..')));
+               if ( substr($this->root_path, -1, 1) !== '/' )
+               {
+                       $this->root_path .= '/';
+               }
+               $base_path_pcre = preg_quote($this->root_path, '|');
+
+               /* current directry name */
+               $directory_name = preg_replace("#{$base_path_pcre}#", '', implode('/', preg_split("#{$directory_separator}#", realpath(dirname(__FILE__)))));
+               $directory_name_pcre = preg_quote($directory_name, '|');
+
+               /* root uri */
+               $root_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
+               $this->root_url = preg_replace("|$directory_name_pcre(.*)$|", '', $root_url);
+
+               $this->AdminPath = $this->root_path . 'nucleus/';
+               $this->MediaPath = $this->root_path . 'media/';
+               $this->SkinsPath = $this->root_path . 'skins/';
+
+               $this->IndexURL  = $this->root_url;
+               $this->AdminURL  = $this->root_url . 'nucleus/';
+               $this->MediaURL  = $this->root_url . 'media/';
+               $this->SkinsURL  = $this->root_url . 'skins/';
+               $this->PluginURL = $this->root_url . 'nucleus/plugins/';
+               $this->ActionURL = $this->root_url . 'action.php';
+       }
 
+       private function read_parameter($parameter)
+       {
+               foreach ( $parameter as $element )
+               {
+                       if ( array_key_exists($element, $_POST) )
+                       {
+                               $this->$element = $_POST[$element];
+                       }
+               }
+       }
 
-/**
- * Checks if email address is valid
- *
- * @param string $address address which should be tested
- * @return bool
- */
-function _isValidMailAddress($address)
-{
+       public function set_state($state)
+       {
+               $states = array('locale', 'mysql', 'weblog', 'detail', 'install');
+               if ( in_array($state, $states) )
+               {
+                       $this->state = $state;
+               }
+       }
 
-       if ( preg_match("/^[a-zA-Z0-9\._-]+@+[A-Za-z0-9\._-]+\.+[A-Za-z]{2,4}$/", $address) )
+       public function set_locale()
        {
-               return TRUE;
+               $this->read_parameter(array('locale'));
+
+               if ( !$this->locale )
+               {
+                       /**
+                        * default locale select simple implementation
+                        * 
+                        * NOTE:
+                        * RFC2616: Hypertext Transfer Protocol -- HTTP/1.1
+                        * http://www.ietf.org/rfc/rfc2616.txt
+                        * 
+                        * 14.4 Accept-Language
+                        * 
+                        *    The Accept-Language request-header field is similar to Accept, but
+                        *    restricts the set of natural languages that are preferred as a
+                        *    response to the request. Language tags are defined in section 3.10.
+                        * 
+                        *        Accept-Language = "Accept-Language" ":"
+                        *                          1#( language-range [ ";" "q" "=" qvalue ] )
+                        *        language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
+                        *        
+                        *    Each language-range MAY be given an associated quality value which
+                        *    represents an estimate of the user's preference for the languages
+                        *    specified by that range. The quality value defaults to "q=1". For
+                        *    example,
+                        * 
+                        *        Accept-Language: da, en-gb;q=0.8, en;q=0.7
+                        * 
+                        *    would mean: "I prefer Danish, but will accept British English and
+                        *    other types of English." A language-range matches a language-tag if
+                        *    it exactly equals the tag, or if it exactly equals a prefix of the
+                        *    tag such that the first tag character following the prefix is "-".
+                        *    The special range "*", if present in the Accept-Language field,
+                        *    matches every tag not matched by any other range present in the
+                        *    Accept-Language field.
+                        * 
+                        * TODO: this is appropriate implement or not
+                        */
+                       $languages = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+                       
+                       /* retrieve language token of language tag from first token */
+                       $language = '';
+                       if ( is_array($languages) && count($languages) > 0 )
+                       {
+                               $language = preg_replace('#^([\w]+).*$#', '$1', $languages[0]);
+                       }
+                       
+                       $locales = i18n::get_available_locale_list();
+                       foreach ( $locales as $locale )
+                       {
+                               if ( i18n::strpos($locale, $language) === 0 )
+                               {
+                                       $this->locale = $locale;
+                                       break;
+                               }
+                       }
+               }
+               
+               /* include installer translation messages */
+               $translation_file = "./locales/{$this->locale}." . i18n::get_current_charset() . '.php';
+               if ( !file_exists($translation_file) )
+               {
+                       $translation_file = './locales/en_Latn_US.UTF-8.php';
+               }
+               include($translation_file);
+               
+               /* include global translation messages */
+               $translation_file = "../nucleus/locales/{$this->locale}." . i18n::get_current_charset() . '.php';
+               if ( !file_exists($translation_file) )
+               {
+                       $translation_file = './locales/en_Latn_US.UTF-8.php';
+               }
+               include($translation_file);
+               
+               i18n::set_current_locale($this->locale);
+               
+               return;
        }
-       else
+
+       public function check_mysql_parameters()
        {
-               return FALSE;
-       } // end if
+               global $MYSQL_HANDLER;
+               
+               $parameters = array('mysql_host', 'mysql_user', 'mysql_password', 'mysql_database', 'mysql_tablePrefix');
+               $this->read_parameter($parameters);
 
-}
+               $errors = array();
+               if ( $this->mysql_host == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD1);
+               }
 
+               if ( $this->mysql_user == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD2);
+               }
+               
+               if ( $this->mysql_user != ''
+                       && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_user) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD2);
+               }
+               
+               if ( $this->mysql_database == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _DB_FIELD4);
+               }
 
-/*
- * Check if short blog names and nicknames are allowed
- * Returns true if the given string is a valid shortname
- * logic: only letters and numbers are allowed, no spaces allowed
- *
- * FIX: function eregi is deprecated since PHP 5.3.0
- *
- * @param string $name name which should be tested
- * @return bool
- */
-function _isValidShortName($name)
-{
+               if ( $this->mysql_database != ''
+                       && !preg_match('/^[a-z0-9_\-]+$/i', $this->mysql_database) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR2, _DB_FIELD4);
+               }
 
-       if ( preg_match("/^[a-z0-9]+$/i", $name) )
-       {
-               return TRUE;
+               if ( $this->mysql_tablePrefix != ''
+                       && !preg_match('/^[a-z0-9_]+$/i', $this->mysql_tablePrefix) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR3, _DB_FIELD5);
+               }
+               
+               if ( count($errors) == 0 )
+               {
+                       $mysql_conn = @DB::setConnectionInfo($MYSQL_HANDLER[1], $this->mysql_host, $this->mysql_user, $this->mysql_password);
+                       if ( $mysql_conn == false )
+                       {
+                               $errors[] = _DBCONNECT_ERROR;
+                       }
+                       else
+                       {
+                               @DB::disConnect();
+                       }
+               }
+
+               return $errors;
        }
-       else
+
+       public function check_user_parameters()
        {
-               return FALSE;
-       } // end if
+               $parameters = array('user_name', 'user_realname', 'user_password', 'user_password2', 'user_email');
+               $this->read_parameter($parameters);
 
-}
+               $errors = array();
+               if ( $this->user_realname == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD1);
+               }
 
+               if ( $this->user_name == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD2);
+               }
+               elseif ( !preg_match("/^[a-z0-9]+([ a-z0-9]*[a-z0-9]+)?$/i", $this->user_name) )
+               {
+                       $errors[] = _VALID_ERROR5;
+               }
 
-/*
- * Check if a display name is allowed
- * Returns true if the given string is a valid display name
- *
- * FIX: function eregi is deprecated since PHP 5.3.0
- *
- * @param string $name name which should be tested
- * @return bool
- */
-function _isValidDisplayName($name)
-{
+               if ( $this->user_password == '' || $this->user_password2 == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _ADMIN_FIELD3);
+                       $this->user_password = '';
+               }
+               elseif ( $this->user_password != $this->user_password2 )
+               {
+                       $errors[] = _VALID_ERROR6;
+                       $this->user_password = '';
+               }
+
+               if ( !preg_match("/^[a-z0-9\._+\-]+@[a-z0-9\._\-]+\.[a-z]{2,6}$/i", $this->user_email) )
+               {
+                       $errors[] = _VALID_ERROR7;
+               }
 
-       if ( preg_match("/^[a-z0-9]+[a-z0-9 ]*[a-z0-9]+$/i", $name) )
+               return $errors;
+       }
+
+       public function check_weblog_parameters()
        {
-               return TRUE;
+               $parameters = array('blog_name', 'blog_shortname');
+               $this->read_parameter($parameters);
+
+               $errors = array();
+               if ( $this->blog_name == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD1);
+               }
+
+               if ( $this->blog_shortname == '' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR1, _BLOG_FIELD2);
+               }
+
+               if ( !preg_match("/^[a-z0-9]+$/i", $this->blog_shortname) )
+               {
+                       $errors[] = _VALID_ERROR4;
+               }
+
+               return $errors;
        }
-       else
+
+       public function check_uri_parameters()
        {
-               return FALSE;
-       } // end if
+               $parameters = array('IndexURL', 'AdminURL', 'MediaURL', 'SkinsURL', 'PluginURL', 'ActionURL');
+               $this->read_parameter($parameters);
 
-}
+               $errors = array();
+               if ( substr($this->IndexURL, -1, 1) !== '/' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD1);
+               }
 
+               if ( substr($this->AdminURL, -1, 1) !== '/' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD2);
+               }
 
-/**
- * Shows error message
- *
- * @param string $msg error message
- */
-function _doError($message)
-{
-       echo "<?xml version=\"1.0\" encoding=\"" . i18n::get_current_charset() . "\" ?>\n";
-       echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
-       echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\" lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\">\n";
-?>
-<head>
-       <title><?php echo _TITLE; ?></title>
-       <style>@import url('../nucleus/styles/manual.css');</style>
-</head>
-<body>
-       <div style="text-align: center;"><img src="../nucleus/styles/logo.gif" /></div>
-       <h1><?php echo _ERROR27; ?></h1>
-
-       <p> <?php echo _ERROR28; ?>: "<?php echo $message; ?>" </p>
-       <p> <a href="./index.php" onclick="history.back(); return false;"><?php echo _TEXT17; ?></a> </p>
-</body>
-</html>
+               if ( substr($this->MediaURL, -1, 1) !== '/' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD4);
+               }
 
-<?php
-       exit;
-}
+               if ( substr($this->SkinsURL, -1, 1) !== '/' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD6);
+               }
 
+               if ( substr($this->PluginURL, -1, 1) !== '/' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR8, _PATH_FIELD8);
+               }
 
-/*
- * Shows error messages
- *
- * @param array $errors array with error messages
- */
-function showErrorMessages($errors)
-{
-       echo "<?xml version=\"1.0\" encoding=\"" . i18n::get_current_charset() . "\" ?>\n";
-       echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
-       echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\" lang=\"" . preg_replace('#_#', '-', i18n::get_current_locale()) . "\">\n";
-?>
-<head>
-       <title><?php echo _TITLE; ?></title>
-       <style>@import url('../nucleus/styles/manual.css');</style>
-</head>
-<body>
-       <div style='text-align:center'><img src='../nucleus/styles/logo.gif' /></div> <!-- Nucleus logo -->
-       <h1><?php echo _ERROR27; ?></h1>
+               if ( strrchr($this->ActionURL, '/') != '/action.php' )
+               {
+                       $errors[] = sprintf(_VALID_ERROR9, _PATH_FIELD9);
+               }
 
-       <p><?php echo _ERROR29; ?>:</p>
+               return $errors;
+       }
 
-       <ul>
+       public function check_path_parameters()
+       {
+               $parameters = array('AdminPath', 'MediaPath', 'SkinsPath');
+               $this->read_parameter($parameters);
 
-<?php
-while ( $msg = array_shift($errors) )
-{
-       echo '<li>', $msg, '</li>';
-}
-?>
-       </ul>
-       <p><a href="./index.php" onclick="history.back();return false;"><?php echo _TEXT17; ?></a></p>
-</body>
-</html>
+               $separators = array('/', DIRECTORY_SEPARATOR);
+               $errors = array();
+               if ( !in_array(substr($this->AdminPath, -1, 1), $separators) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD3);
+               }
+               elseif ( !file_exists($this->AdminPath) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD3);
+               }
 
-<?php
-exit;
-}
+               if ( !in_array(substr($this->MediaPath, -1, 1), $separators) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD5);
+               }
+               elseif ( !file_exists($this->MediaPath) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD5);
+               }
 
+               if ( !in_array(substr($this->SkinsPath, -1, 1), $separators) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR10, _PATH_FIELD7);
+               }
+               elseif ( !file_exists($this->SkinsPath) )
+               {
+                       $errors[] = sprintf(_VALID_ERROR11, _PATH_FIELD7);
+               }
 
-/* for the non-php systems that decide to show the contents:
-?></div>
-<?php
-*/
+               return $errors;
+       }
+
+       /**
+        * check all parameters
+        * @return bool
+        */
+       public function check_all_parameters()
+       {
+               $this->set_locale();
+
+               $isValid = true;
+               $isValid &= (count($this->check_mysql_parameters()) == 0);
+               $isValid &= (count($this->check_user_parameters()) == 0);
+               $isValid &= (count($this->check_weblog_parameters()) == 0);
+               $isValid &= (count($this->check_uri_parameters()) == 0);
+               $isValid &= (count($this->check_path_parameters()) == 0);
+
+               return $isValid;
+       }
+}
+>>>>>>> skinnable-master