[pLog-svn] r2038 - in plog/branches/plog-1.0.1: . class/summary/action

reto at devel.plogworld.net reto at devel.plogworld.net
Sat May 21 21:47:40 GMT 2005


Author: reto
Date: 2005-05-21 21:47:40 +0000 (Sat, 21 May 2005)
New Revision: 2038

Modified:
   plog/branches/plog-1.0.1/class/summary/action/summaryaction.class.php
   plog/branches/plog-1.0.1/wizard.php
Log:
Finally! This is the implementation according to issue 462
(http://bugs.plogworld.net/view.php?id=462).
Set HTTP_ACCEPT_LANGUAGE_DETECTION to 1 to get the feature working!

The wizard should update the database for new installs.
@oscar would you mind checking if the added line in the wizard is correct? thanks!

Modified: plog/branches/plog-1.0.1/class/summary/action/summaryaction.class.php
===================================================================
--- plog/branches/plog-1.0.1/class/summary/action/summaryaction.class.php	2005-05-21 21:36:45 UTC (rev 2037)
+++ plog/branches/plog-1.0.1/class/summary/action/summaryaction.class.php	2005-05-21 21:47:40 UTC (rev 2038)
@@ -1,75 +1,144 @@
-<?php
-
-	include_once( PLOG_CLASS_PATH."class/action/action.class.php" );
-	include_once( PLOG_CLASS_PATH."class/summary/view/summaryview.class.php" );
-	include_once( PLOG_CLASS_PATH."class/summary/view/summarycachedview.class.php" );	
-	include_once( PLOG_CLASS_PATH."class/net/http/httpvars.class.php" );
-
-	/**
-	 * Base action that all summary actions should extend
-	 */
-	class SummaryAction extends Action
-	{
-		function SummaryAction( $actionInfo, $request )
-		{
-			$this->Action( $actionInfo, $request );
-			$this->_config   =& Config::getConfig();
-            $this->_locale   =& $this->_loadLocale();
-		}
-		
-		/**
-		 * Loads the current locale. It works so that it tries to fetch the parameter "lang" from the
-		 * request. If it's not available, then it will try to look for it in the session. If it is not
-		 * there either, it will use whatever the value of "default_locale" is and load the
-		 * most suitable Locale object
-		 *
-		 * @private
-		 * @return Returns a reference to a Locale object
-		 */
-		function &_loadLocale()
-		{
-		    $requestLocale = $this->_request->getValue( "lang" );
-		    
-		    $localeCode = "";
-		    
-		    // check if there's something in the request... 
-		    // if not, check the session and as a valid resort, use the default one
-		    if( $requestLocale ) {
-		        // check if it's a valid one
-		        if( Locales::isValidLocale( $requestLocale )) {
-		            $localeCode = $requestLocale;
-		        }
-		    }
-		    else {
-		        $sessionLocale = SessionManager::getSessionValue( "summaryLang" );
-		        if( $sessionLocale ) {		            
-		            $localeCode = $sessionLocale;
-		        }
-		    }
-		    
-		    // check if the locale code is correct
-		    if( !Locales::isValidLocale( $localeCode )) {
-		        $localeCode = $this->_config->getValue( "default_locale" );
-		    }
-		    
-		    // now put whatever locale value back to the session
-		    SessionManager::setSessionValue( "summaryLang", $localeCode );
-		    
-		    // load the correct locale
-		    $locale =& Locales::getLocale( $localeCode );		    
-		    
-		    return( $locale );
-		}
-		
-		/**
-		 * Common things that should be performed by all SummaryAction classes
-		 */
-		function setCommonData( $copyFormValues = false )
-		{
-		    parent::setCommonData( $copyFormValues );
-		    
-		    $this->_view->setValue( "locale", $this->_locale );
-		}
-	}
-	
+<?php
+	include_once( PLOG_CLASS_PATH."class/action/action.class.php" );
+	include_once( PLOG_CLASS_PATH."class/summary/view/summaryview.class.php" );
+	include_once( PLOG_CLASS_PATH."class/summary/view/summarycachedview.class.php" );	
+	include_once( PLOG_CLASS_PATH."class/net/http/httpvars.class.php" );
+
+	define('HTTP_ACCEPT_LANGUAGE_DETECTION', 0);
+
+	/**
+	 * Base action that all summary actions should extend
+	 */
+	class SummaryAction extends Action
+	{
+		
+		function SummaryAction( $actionInfo, $request )
+		{
+			$this->Action( $actionInfo, $request );
+			$this->_config   =& Config::getConfig();
+			$this->_locale   =& $this->_loadLocale();
+		}
+		
+		/**
+		 * Loads the current locale. It works so that it tries to fetch the parameter "lang" from the
+		 * request. If it's not available, then it will try to look for it in the session. If it is not
+		 * there either, it will try to guess the most prefered language according to what the User Agent 
+		 * included in the HTTP_ACCEPT_LANGUAGE string sent with the request. If none matches available 
+		 * languages we have to use the value of "default_locale" and display the default language.
+		 *
+		 * @private
+		 * @return Returns a reference to a Locale object
+		 */
+		function &_loadLocale()
+		{
+		    $requestLocale =& $this->_request->getValue( "lang" );
+		    $localeCode = "";
+			$serverVars =& HttpVars::getServer();
+
+		    // check if there's something in the request... 
+		    // if not, check the session or at least try to 
+			// guess the apropriate languege from the http_accept_lnaguage string
+		    if( $requestLocale ) {
+		        // check if it's a valid one
+		        if( Locales::isValidLocale( $requestLocale )) {
+		            $localeCode = $requestLocale;
+		        }
+		    }
+		    else {
+				$sessionLocale =& SessionManager::getSessionValue( "summaryLang" );
+			    if( $sessionLocale ) {		            
+		            $localeCode = $sessionLocale;
+		        }
+				elseif ( $this->_config->getValue( "use_http_accept_language_detection", HTTP_ACCEPT_LANGUAGE_DETECTION) == 1 )
+				{
+					$localeCode =& $this->_matchHttpAcceptLanguages( $serverVars['HTTP_ACCEPT_LANGUAGE'] );
+				}
+		    }
+		    
+			
+			
+		    // check if the locale code is correct
+			// and as a valid resort, use the default one if the locale ist not valid or 'false'
+		    if( $localeCode === false || !Locales::isValidLocale( $localeCode ) ) {
+		        $localeCode = $this->_config->getValue( "default_locale" );
+		    }
+		    
+		    // now put whatever locale value back to the session
+		    SessionManager::setSessionValue( "summaryLang", $localeCode );
+		    
+		    // load the correct locale
+		    $locale =& Locales::getLocale( $localeCode );		    
+		    
+		    return( $locale );
+		}
+		
+		/**
+		 * Common things that should be performed by all SummaryAction classes
+		 */
+		function setCommonData( $copyFormValues = false )
+		{
+		    parent::setCommonData( $copyFormValues );
+		    
+		    $this->_view->setValue( "locale", $this->_locale );
+		}
+		
+		/**
+		 * Tries to match the prefered language out of the http_accept_language string 
+		 * with one of the available languages.
+		 *
+		 * @private
+		 * @param httpAcceptLanguage the value of $_SERVER['HTTP_ACCEPT_LANGUAGE']
+		 * @return Returns returns prefered language or false if no language matched.
+		 */
+        function _matchHttpAcceptLanguages(&$httpAcceptLanguage)
+        {
+			$acceptedLanguages = explode( ',', $httpAcceptLanguage );
+			$availableLanguages =& Locales::getAvailableLocales();
+			$primaryLanguageMatch = '';
+
+			// we iterate through the array of languages sent by the UA and test every single 
+			// one against the array of available languages
+			foreach($acceptedLanguages as $acceptedLang)
+			{   
+				// clean the string and strip it down to the language value (remove stuff like ";q=0.3")
+				$acceptedLang = substr( $acceptedLang, 0, strcspn($acceptedLang, ';') );
+
+				if (strlen($acceptedLang) > 2)
+				{
+					// cut to primary language
+					$primaryAcceptedLang = substr($acceptedLang, 0, 2);
+				}
+				else
+				{
+					$primaryAcceptedLang = $acceptedLang;
+				}
+				
+				// this is where we start to iterate through available languages
+				foreach($availableLanguages as $availableLang)
+				{ 	
+					if( stristr($availableLang, $acceptedLang) !== false )
+					{
+						// we have a exact language match
+						return $availableLang;
+					}
+					elseif ( stristr($availableLang, $primaryAcceptedLang) !== false && $primaryLanguageMatch == '')
+					{
+						// we found the first primary language match!
+						$primaryLanguageMatch = $availableLang;
+					}
+				}
+			} // foreach
+
+			if ($primaryLanguageMatch != '')
+			{
+				return $primaryLanguageMatch;
+			}
+			else
+			{
+				return false;
+			}
+		}
+
+	}
+	
 ?>
\ No newline at end of file

Modified: plog/branches/plog-1.0.1/wizard.php
===================================================================
--- plog/branches/plog-1.0.1/wizard.php	2005-05-21 21:36:45 UTC (rev 2037)
+++ plog/branches/plog-1.0.1/wizard.php	2005-05-21 21:47:40 UTC (rev 2038)
@@ -1,1819 +1,1819 @@
-<?php
-
-    if (!defined( "PLOG_CLASS_PATH" )) {
-        define( "PLOG_CLASS_PATH", dirname(__FILE__)."/");
-    }
-
-    set_time_limit (5 * 3600);
-
-    //
-    // enable this for debugging purposes
-    //
-    define( "DB_WIZARD_DEBUG", false );
-
-    //
-    // in case you're having problems with time outs while upgrading (probably too
-    // many records) lower this figure
-    //
-    define( "WIZARD_MAX_RECORDS_PER_STEP", 50 );
-
-    //
-    // threshold that defines up to how many records we should not divide the
-    // transformations in more than one step
-    //
-    define( "WIZARD_MAX_RECORDS_THRESHOLD", 100 );
-
-    // many hosts don't have this enabled and we, for the time being, need it...
-    ini_set("arg_seperator.output", "&amp;");
-
-    include_once( PLOG_CLASS_PATH."class/controller/controller.class.php" );
-    include_once( PLOG_CLASS_PATH."class/template/templateservice.class.php" );
-    include_once( PLOG_CLASS_PATH."class/action/action.class.php" );
-    include_once( PLOG_CLASS_PATH."class/template/template.class.php" );
-    include_once( PLOG_CLASS_PATH."class/view/view.class.php" );
-    include_once( PLOG_CLASS_PATH."class/database/adodb/adodb.inc.php" );
-    include_once( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
-    include_once( PLOG_CLASS_PATH."class/data/validator/emailvalidator.class.php" );
-    include_once( PLOG_CLASS_PATH."class/data/validator/passwordvalidator.class.php" );
-    include_once( PLOG_CLASS_PATH."class/dao/users.class.php" );
-    include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
-    include_once( PLOG_CLASS_PATH."class/dao/articlecategories.class.php" );
-    include_once( PLOG_CLASS_PATH."class/dao/articles.class.php" );
-    include_once( PLOG_CLASS_PATH."class/net/http/httpvars.class.php" );
-    include_once( PLOG_CLASS_PATH."class/dao/userpermissions.class.php" );
-    include_once( PLOG_CLASS_PATH."class/misc/version.class.php" );
-    include_once( PLOG_CLASS_PATH."class/file/file.class.php" );
-    include_once( PLOG_CLASS_PATH."class/file/finder/filefinder.class.php" );
-    include_once( PLOG_CLASS_PATH."class/gallery/resizers/gddetector.class.php" );
-    include_once( PLOG_CLASS_PATH."class/config/configfilestorage.class.php" );
-    include_once( PLOG_CLASS_PATH."class/data/textfilter.class.php" );
-    include_once( PLOG_CLASS_PATH."class/locale/locales.class.php" );
-    include_once( PLOG_CLASS_PATH."class/locale/localefinder.class.php" );
-
-    define( "TEMP_FOLDER", "./tmp" );
-
-    // sql querys used to create the tables
-
-    // maps used to map requests with actions
-    $_actionMap["Default"] = "WizardIntro";
-    $_actionMap["Intro"] = "WizardIntro";
-    $_actionMap["Step1"] = "WizardStepOne";
-    $_actionMap["Step2"] = "WizardStepTwo";
-    $_actionMap["Step3"] = "WizardStepThree";
-    $_actionMap["Step4"] = "WizardStepFour";
-    $_actionMap["Step5"] = "WizardStepFive";
-    $_actionMap["Update1"] = "UpdateStepOne";
-    $_actionMap["Update2"] = "UpdateStepTwo";
-    $_actionMap["Update3"] = "UpdateStepThree";
-    $_actionMap["Update4"] = "UpdateStepFour";
-
-
-
-    $Tables[0]["desc"] = "Articles";
-    $Tables[0]["code"] = "CREATE TABLE {dbprefix}articles (
-  id int(10) unsigned NOT NULL auto_increment,
-  category_id int(10) unsigned NOT NULL default '0',
-  date timestamp(14) NOT NULL,
-  modification_date timestamp(14) NOT NULL,
-  user_id int(10) unsigned NOT NULL default '0',
-  blog_id int(10) unsigned NOT NULL default '0',
-  status INTEGER(5) NOT NULL default 1,
-  num_reads int(10) default '0',
-  properties TEXT NOT NULL default '',
-  slug varchar(255) NOT NULL,
-  PRIMARY KEY (id),
-  KEY num_reads (num_reads),
-  KEY category_id (category_id),
-  KEY blog_id (blog_id),
-  KEY user_id (user_id),
-  KEY slug (slug),
-  KEY blog_id_slug (blog_id,slug),
-  KEY blog_id_slug_category_id (blog_id,slug,category_id)
-) TYPE=MyISAM;";
-
-    $Tables[1]["desc"] = "Article categories";
-    $Tables[1]["code"] = "CREATE TABLE {dbprefix}articles_categories (
-  id int(10) unsigned NOT NULL auto_increment,
-  name varchar(255) NOT NULL default '',
-  url varchar(255) NOT NULL default '',
-  blog_id int(10) unsigned NOT NULL default '0',
-  last_modification timestamp(14) NOT NULL,
-  in_main_page TINYINT(1) NOT NULL DEFAULT '1',
-  parent_id INTEGER(10) NOT NULL DEFAULT '0',
-  description TEXT NOT NULL DEFAULT '',
-  properties text NOT NULL default '',
-  mangled_name varchar(255) NOT NULL default '',
-  PRIMARY KEY  (id),
-  KEY parent_id (parent_id),
-  KEY blog_id (blog_id),
-  KEY mangled_name (mangled_name)
-) TYPE=MyISAM;";
-
-    $Tables[2]["desc"] = "Comments";
-    $Tables[2]["code"] = "CREATE TABLE {dbprefix}articles_comments (
-  id int(10) unsigned NOT NULL auto_increment,
-  article_id int(10) unsigned NOT NULL default '0',
-  topic text NOT NULL,
-  text text,
-  date timestamp(14) NOT NULL,
-  user_email varchar(255) default '',
-  user_url varchar(255) default '',
-  user_name varchar(255) NOT NULL default 'Anonymous',
-  parent_id int(10) unsigned default '0',
-  client_ip varchar(15) default '0.0.0.0',
-  send_notification tinyint(1) default '0',
-  status tinyint(2) default '1',
-  spam_rate float default '0',
-  properties TEXT NOT NULL DEFAULT '',
-  normalized_text TEXT NOT NULL DEFAULT '',
-  normalized_topic TEXT NOT NULL DEFAULT '',
-  PRIMARY KEY  (id),
-  KEY parent_id (parent_id),
-  KEY article_id (article_id),
-  FULLTEXT KEY normalized_fields (normalized_text,normalized_topic),
-  FULLTEXT KEY normalized_text (normalized_text),
-  FULLTEXT KEY normalized_topic (normalized_topic)
-) TYPE=MyISAM;";
-
-    $Tables[3]["desc"] = "Notifications";
-    $Tables[3]["code"] = "CREATE TABLE {dbprefix}articles_notifications (
-  id int(10) NOT NULL auto_increment,
-  blog_id int(10) NOT NULL default '0',
-  user_id int(10) NOT NULL default '0',
-  article_id int(10) NOT NULL default '0',
-  PRIMARY KEY  (id),
-  KEY article_id (article_id),
-  KEY user_id (user_id),
-  KEY blog_id (blog_id)
-) TYPE=MyISAM;";
-
-    $Tables[4]["desc"] = "Blogs";
-    $Tables[4]["code"] = "CREATE TABLE {dbprefix}blogs (
-  id int(10) unsigned NOT NULL auto_increment,
-  blog varchar(50) NOT NULL default '',
-  owner_id int(10) unsigned NOT NULL default '0',
-  about text,
-  settings text NOT NULL,
-  mangled_blog varchar(50) NOT NULL default '',
-  status int(4) NOT NULL default '1',
-  show_in_summary int(4) not null default '1',
-  PRIMARY KEY  (id),
-  KEY owner_id (owner_id),
-  KEY mangled_blog (mangled_blog)
-) TYPE=MyISAM;";
-
-    $Tables[5]["desc"] = "MyLinks";
-    $Tables[5]["code"] = "CREATE TABLE {dbprefix}mylinks (
-  id int(10) unsigned NOT NULL auto_increment,
-  category_id int(10) unsigned NOT NULL default '0',
-  url varchar(255) NOT NULL default '',
-  name varchar(100) default '',
-  description text NOT NULL,
-  blog_id int(10) unsigned NOT NULL default '0',
-  rss_feed varchar(255) not null default '',
-  date timestamp(14) not null,
-  properties TEXT NOT NULL DEFAULT '',
-  PRIMARY KEY  (id),
-  KEY blog_id (blog_id),
-  KEY category_id (category_id)
-) TYPE=MyISAM;";
-
-    $Tables[6]["desc"] = "MyLinks Categories";
-    $Tables[6]["code"] = "CREATE TABLE {dbprefix}mylinks_categories (
-  id int(10) NOT NULL auto_increment,
-  name varchar(100) NOT NULL default '',
-  blog_id int(10) NOT NULL default '0',
-  last_modification timestamp(14) NOT NULL,
-  properties TEXT NOT NULL DEFAULT '',
-  PRIMARY KEY  (id),
-  KEY blog_id (blog_id)
-) TYPE=MyISAM;";
-
-    $Tables[7]["desc"] = "MyRecent";
-    $Tables[7]["code"] = "CREATE TABLE {dbprefix}myrecent (
-  id int(10) unsigned NOT NULL auto_increment,
-  category_id int(10) unsigned NOT NULL default '0',
-  name varchar(255) NOT NULL default '',
-  text text NOT NULL,
-  user_id int(10) unsigned NOT NULL default '0',
-  blog_id int(10) unsigned NOT NULL default '0',
-  PRIMARY KEY  (id)
-) TYPE=MyISAM;";
-
-    $Tables[8]["desc"] = "MyRecent categories";
-    $Tables[8]["code"] = "CREATE TABLE {dbprefix}myrecent_categories (
-  id int(10) unsigned NOT NULL auto_increment,
-  name varchar(255) NOT NULL default '',
-  blog_id int(10) unsigned NOT NULL default '0',
-  last_modification timestamp(14) NOT NULL,
-  PRIMARY KEY  (id)
-) TYPE=MyISAM;";
-
-    $Tables[9]["desc"] = "Permissions";
-    $Tables[9]["code"] = "CREATE TABLE {dbprefix}permissions (
-  id int(10) unsigned NOT NULL auto_increment,
-  permission varchar(25) NOT NULL default '',
-  description varchar(100) NOT NULL default '',
-  PRIMARY KEY  (id)
-) TYPE=MyISAM;";
-
-    $Tables[10]["desc"] = "Referrers";
-    $Tables[10]["code"] = "CREATE TABLE {dbprefix}referers (
-  id int(10) NOT NULL auto_increment,
-  url text NOT NULL,
-  article_id int(10) NOT NULL default '0',
-  blog_id int(10) NOT NULL default '0',
-  hits int(10) default '1',
-  last_date timestamp(14),
-  PRIMARY KEY  (id),
-  KEY article_id (article_id),
-  KEY blog_id (blog_id),
-  KEY blog_id_article_id (blog_id, article_id)
-) TYPE=MyISAM;";
-
-    $Tables[11]["desc"] = "Trackbacks";
-    $Tables[11]["code"] = "CREATE TABLE {dbprefix}trackbacks (
-  id int(10) NOT NULL auto_increment,
-  url text NOT NULL,
-  title varchar(255) default '',
-  article_id int(10) NOT NULL default '0',
-  excerpt varchar(255) default '',
-  blog_name varchar(255) default '',
-  date timestamp(14) NOT NULL,
-  properties TEXT NOT NULL DEFAULT '',
-  PRIMARY KEY  (id),
-  KEY article_id (article_id)
-) TYPE=MyISAM;";
-
-    $Tables[12]["desc"] = "Users";
-    $Tables[12]["code"] = "CREATE TABLE {dbprefix}users (
-  id int(10) unsigned NOT NULL auto_increment,
-  user varchar(15) NOT NULL default '',
-  password varchar(32) NOT NULL default '',
-  email varchar(255) NOT NULL default '',
-  full_name varchar(255) NOT NULL default '',
-  about text,
-  properties TEXT NOT NULL default '',
-  status integer(4) NOT NULL DEFAULT 1,
-  resource_picture_id integer(10) NOT NULL DEFAULT 0,
-  PRIMARY KEY  (id),
-  UNIQUE KEY user (user)
-) TYPE=MyISAM;";
-
-    $Tables[13]["desc"] = "Permissions";
-    $Tables[13]["code"] = "CREATE TABLE {dbprefix}users_permissions (
-  id int(10) unsigned NOT NULL auto_increment,
-  user_id int(10) unsigned NOT NULL default '0',
-  blog_id int(10) unsigned NOT NULL default '0',
-  permission_id int(10) unsigned NOT NULL default '0',
-  PRIMARY KEY  (id),
-  KEY user_id (user_id),
-  KEY blog_id (blog_id),
-  KEY user_id_permission_id (user_id,permission_id)
-) TYPE=MyISAM;";
-
-
-   $Tables[14]["desc"] = "Configuration";
-   $Tables[14]["code"] = "CREATE TABLE {dbprefix}config (
-   id int(10) NOT NULL auto_increment,
-   config_key varchar(255) NOT NULL default '',
-   config_value text NOT NULL,
-   value_type int(3) default '0',
-   PRIMARY KEY  (id,config_key)
-   ) TYPE=MyISAM;";
-
-   $Tables[15]["desc"] = "Filtered Content";
-   $Tables[15]["code"] = "CREATE TABLE {dbprefix}filtered_content (
-   id int(10) NOT NULL auto_increment,
-   reg_exp text,
-   blog_id int(10) NOT NULL default '0',
-   reason text,
-   date timestamp(14) NOT NULL,
-   PRIMARY KEY  (id),
-   KEY blog_id (blog_id)
-   ) TYPE=MyISAM;";
-
-   $Tables[16]["desc"] = "Blocked content";
-   $Tables[16]["code"] = "CREATE TABLE {dbprefix}host_blocking_rules (
-   id int(10) NOT NULL auto_increment,
-   reason text,
-   date timestamp(14) NOT NULL,
-   blog_id int(10) NOT NULL default '0',
-   block_type int(1) default '1',
-   list_type int(1) default '1',
-   mask int(2) default '0',
-   host varchar(15) default '0.0.0.0',
-   PRIMARY KEY  (id),
-   KEY blog_id (blog_id)
-   ) TYPE=MyISAM;";
-
-   $Tables[17]["desc"] = "Gallery Resources";
-   $Tables[17]["code"] = "CREATE TABLE {dbprefix}gallery_resources (
-   id int(10) NOT NULL auto_increment,
-   owner_id int(10) NOT NULL default '0',
-   album_id int(10) NOT NULL default '0',
-   description text,
-   date timestamp(14) NOT NULL,
-   flags int(10) default '0',
-   resource_type int(3) default NULL,
-   file_path varchar(255) default '',
-   file_name varchar(255) default '',
-   metadata text,
-   thumbnail_format varchar(4) not null default 'same',
-   normalized_description text NOT NULL default '',
-   properties TEXT NOT NULL DEFAULT '',
-   PRIMARY KEY  (id),
-   KEY album_id (album_id),
-   KEY owner_id (owner_id),
-   KEY file_name (file_name),
-   KEY album_id_owner_id (album_id, owner_id),
-   KEY resource_type (resource_type),
-   FULLTEXT KEY normalized_description (normalized_description)
-   ) TYPE=MyISAM;";
-
-   $Tables[18]["desc"] = "Gallery Albums";
-   $Tables[18]["code"] = "CREATE TABLE {dbprefix}gallery_albums (
-   id int(10) NOT NULL auto_increment,
-   owner_id int(10) NOT NULL default '0',
-   description text NOT NULL,
-   name varchar(255) NOT NULL default '',
-   flags int(10) NOT NULL default '0',
-   parent_id int(10) NOT NULL default '0',
-   date timestamp(14) NOT NULL,
-   properties text NOT NULL DEFAULT '',
-   show_album TINYINT(1) DEFAULT 1,
-   normalized_description text NOT NULL default '',
-   normalized_name varchar(255) NOT NULL default '',
-   mangled_name varchar(255) NOT NULL default '',
-   PRIMARY KEY  (id),
-   KEY parent_id (parent_id),
-   KEY owner_id (owner_id),
-   KEY mangled_name (mangled_name),
-   KEY owner_id_mangled_name (owner_id, mangled_name),
-   FULLTEXT KEY normalized_name (normalized_name),
-   FULLTEXT KEY normalized_description (normalized_description),
-   FULLTEXT KEY normalized_fields (normalized_name, normalized_description)
-   ) TYPE=MyISAM;";
-
-   $Tables[19]["desc"] = "Bayesian Filter data table";
-   $Tables[19]["code"] = "CREATE TABLE {dbprefix}bayesian_filter_info (
-   id int(10) unsigned NOT NULL auto_increment,
-   blog_id int(10) unsigned default NULL,
-   total_spam int(10) unsigned default NULL,
-   total_nonspam int(10) unsigned default NULL,
-   PRIMARY KEY  (id),
-   KEY blog_id (blog_id)
-   ) TYPE=MyISAM;";
-
-   $Tables[20]["desc"] = "Bayesian Filter Information";
-   $Tables[20]["code"] = "CREATE TABLE {dbprefix}bayesian_tokens (
-   id int(10) unsigned NOT NULL auto_increment,
-   blog_id int(10) unsigned default NULL,
-   token char(100) default NULL,
-   spam_occurrences int(10) unsigned default NULL,
-   nonspam_occurrences int(10) unsigned default NULL,
-   prob float default NULL,
-   PRIMARY KEY  (id),
-   KEY blog_id (blog_id),
-   KEY token (token)
-   ) TYPE=MyISAM;";
-
-   $Tables[21]["desc"] = "Map of categories to articles";
-   $Tables[21]["code"] = "CREATE TABLE {dbprefix}article_categories_link(
-   article_id int(10) NOT NULL,
-   category_id int(10) NOT NULL,
-   PRIMARY KEY (article_id, category_id)
-   ) TYPE=MyISAM;";
-
-   $Tables[22]["desc"] = "Definition of custom fields";
-   $Tables[22]["code"] = "CREATE TABLE {dbprefix}custom_fields_definition (
-   id int(10) NOT NULL auto_increment,
-   field_name varchar(255) NOT NULL default '',
-   field_description text NOT NULL,
-   field_type int(2) NOT NULL default '1',
-   blog_id int(10) NOT NULL default '0',
-   date TIMESTAMP(14),
-   searchable TINYINT(1) default 1,
-   hidden TINYINT(1) default 1,
-   PRIMARY KEY  (id,field_name),
-   KEY blog_id (blog_id)
-   ) TYPE=MyISAM;";
-
-   $Tables[23]["desc"] = "Custom fields that have been assigned to articles";
-   $Tables[23]["code"] = "CREATE TABLE {dbprefix}custom_fields_values (
-   id int(10) NOT NULL auto_increment,
-   field_id int(10) NOT NULL default '0',
-   field_value text NOT NULL,
-   normalized_value text NOT NULL,
-   blog_id int(10) default NULL,
-   article_id int(10) default NULL,
-   PRIMARY KEY  (id),
-   FULLTEXT KEY normalized_value (normalized_value),
-   KEY blog_id (blog_id),
-   KEY article_id (article_id),
-   KEY field_id (field_id),
-   KEY blog_id_article_id (blog_id, article_id)
-   ) TYPE=MyISAM;";
-
-   $Tables[24]["desc"] = "Text of the articles";
-   $Tables[24]["code"] = "CREATE TABLE {dbprefix}articles_text (
-   id int(10) NOT NULL auto_increment,
-   article_id int(10) NOT NULL DEFAULT 0,
-   text TEXT NOT NULL DEFAULT '',
-   topic TEXT NOT NULL DEFAULT '',
-   normalized_text TEXT NOT NULL DEFAULT '',
-   normalized_topic TEXT NOT NULL DEFAULT '',
-   mangled_topic text NOT NULL,
-   PRIMARY KEY (id),
-   KEY article_id (article_id),
-   FULLTEXT KEY normalized_text (normalized_text),
-   FULLTEXT KEY normalized_topic (normalized_topic),
-   FULLTEXT KEY normalized_fields (normalized_text, normalized_topic)
-   ) TYPE=MyISAM;";
-
-
-
-   // ---
-   // changes needed to update from 0.3 to 1.0
-   $Changes["Articles"] = Array( "ALTER TABLE {dbprefix}articles CHANGE status old_status ENUM('published', 'draft', 'deleted' )",
-                                 "ALTER TABLE {dbprefix}articles ADD COLUMN status INTEGER(5) NOT NULL DEFAULT 1",
-                                 "ALTER TABLE {dbprefix}articles ADD COLUMN slug VARCHAR(255) NOT NULL DEFAULT ''",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY num_reads(num_reads)",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY category_id(category_id)",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY blog_id(blog_id)",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY slug(slug)",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY user_id(user_id)",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY blog_id_slug(blog_id,slug)",
-                                 "ALTER TABLE {dbprefix}articles ADD KEY blog_id_slug_category_id(blog_id,slug,category_id)");
-
-    $Changes["Article Categories"] = Array( "ALTER TABLE {dbprefix}articles_categories ADD COLUMN parent_id INTEGER(10) NOT NULL DEFAULT 0",
-                                            "ALTER TABLE {dbprefix}articles_categories ADD COLUMN mangled_name VARCHAR(255) NOT NULL DEFAULT ''",
-                                            "ALTER TABLE {dbprefix}articles_categories ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
-                                            "ALTER TABLE {dbprefix}articles_categories ADD COLUMN description TEXT NOT NULL DEFAULT ''",
-                                            "ALTER TABLE {dbprefix}articles_categories ADD KEY parent_id(parent_id)",
-                                            "ALTER TABLE {dbprefix}articles_categories ADD KEY blog_id(blog_id)",
-                                            "ALTER TABLE {dbprefix}articles_categories ADD KEY mangled_name(mangled_name)");
-
-
-    $Changes["User Comments"] = Array( "ALTER TABLE {dbprefix}articles_comments ADD COLUMN normalized_text TEXT NOT NULL DEFAULT ''",
-                                       "ALTER TABLE {dbprefix}articles_comments ADD COLUMN normalized_topic TEXT NOT NULL DEFAULT ''",
-                                       "ALTER TABLE {dbprefix}articles_comments ADD FULLTEXT normalized_text(normalized_text)",
-                                       "ALTER TABLE {dbprefix}articles_comments ADD FULLTEXT normalized_topic(normalized_topic)",
-                                       "ALTER TABLE {dbprefix}articles_comments ADD FULLTEXT normalized_text_topic(normalized_topic,normalized_text)",
-                                       "ALTER TABLE {dbprefix}articles_comments ADD KEY parent_id(parent_id)",
-                                       "ALTER TABLE {dbprefix}articles_comments ADD KEY article_id(article_id)");
-
-    $Changes["Notifications"] = Array( "ALTER TABLE {dbprefix}articles_notifications ADD KEY article_id(article_id)",
-                                       "ALTER TABLE {dbprefix}articles_notifications ADD KEY user_id(user_id)",
-                                       "ALTER TABLE {dbprefix}articles_notifications ADD KEY blog_id(blog_id)");
-
-    $Changes["Blogs"] = Array( "ALTER TABLE {dbprefix}blogs ADD COLUMN mangled_blog VARCHAR(50) NOT NULL DEFAULT ''",
-                               "ALTER TABLE {dbprefix}blogs ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
-                               "ALTER TABLE {dbprefix}blogs ADD COLUMN status INTEGER(4) NOT NULL DEFAULT '1'",
-                               "ALTER TABLE {dbprefix}blogs ADD COLUMN show_in_summary INTEGER(4) NOT NULL DEFAULT '1'",
-                               "ALTER TABLE {dbprefix}blogs ADD KEY owner_id(owner_id)",
-                               "ALTER TABLE {dbprefix}blogs ADD KEY mangled_blog(mangled_blog)");
-
-    $Changes["Referrers"] = Array( "ALTER TABLE {dbprefix}referers ADD KEY article_id(article_id)",
-                                   "ALTER TABLE {dbprefix}referers ADD KEY blog_id(blog_id)",
-                                   "ALTER TABLE {dbprefix}referers ADD   KEY blog_id_article_id (blog_id, article_id)");
-
-    $Changes["Trackbacks"] = Array( "ALTER TABLE {dbprefix}trackbacks ADD KEY article_id(article_id)" );
-
-    $Changes["Filtered Content"] = Array( "ALTER TABLE {dbprefix}filtered_content ADD KEY blog_id(blog_id)" );
-
-    $Changes["Blocked hosts"] = Array( "ALTER TABLE {dbprefix}host_blocking_rules ADD KEY blog_id(blog_id)" );
-
-    $Changes["Gallery Albums"] = Array( "ALTER TABLE {dbprefix}gallery_albums ADD COLUMN normalized_name VARCHAR(255) NOT NULL DEFAULT ''",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD COLUMN normalized_description TEXT NOT NULL DEFAULT ''",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD COLUMN mangled_name VARCHAR(255) NOT NULL DEFAULT ''",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD FULLTEXT normalized_name(normalized_name)",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD FULLTEXT normalized_description(normalized_description)",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD FULLTEXT normalized_name_description(normalized_name, normalized_description)",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY parent_id(parent_id)",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY owner_id(owner_id)",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY mangled_name(mangled_name)",
-                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY owner_id_mangled_name(owner_id,mangled_name)");
-
-    $Changes["Gallery Resources"] = Array( "ALTER TABLE {dbprefix}gallery_resources ADD COLUMN normalized_description TEXT NOT NULL DEFAULT ''",
-                                           "ALTER TABLE {dbprefix}gallery_resources ADD FULLTEXT normalized_description(normalized_description)",
-                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY album_id(album_id)",
-                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY owner_id(owner_id)",
-                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY file_name(file_name)",
-                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY album_id_owner_id(album_id,owner_id)",
-                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY resource_type(resource_type)");
-
-
-    $Changes["Links"] = Array( "ALTER TABLE {dbprefix}mylinks ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
-                               "ALTER TABLE {dbprefix}mylinks ADD COLUMN date TIMESTAMP(14)",
-                               "ALTER TABLE {dbprefix}mylinks ADD COLUMN rss_feed VARCHAR(255) NOT NULL DEFAULT ''",
-                               "ALTER TABLE {dbprefix}mylinks ADD KEY blog_id(blog_id)",
-                               "ALTER TABLE {dbprefix}mylinks ADD KEY category_id(category_id)");
-
-    $Changes["Links Categories"] = Array( "ALTER TABLE {dbprefix}mylinks_categories ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
-                                          "ALTER TABLE {dbprefix}mylinks_categories ADD COLUMN last_modification timestamp(14) NOT NULL",
-                                          "ALTER TABLE {dbprefix}mylinks_categories ADD KEY blog_id(blog_id)");
-
-    $Changes["Users"] = Array( "ALTER TABLE {dbprefix}users ADD COLUMN full_name VARCHAR(255) NOT NULL DEFAULT ''",
-                                "ALTER TABLE {dbprefix}users ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
-                                "ALTER TABLE {dbprefix}users ADD COLUMN resource_picture_id INTEGER(10) NOT NULL DEFAULT 0",
-                                "ALTER TABLE {dbprefix}users ADD COLUMN status INTEGER(4) NOT NULL DEFAULT 1" );
-
-    $Changes["Bayesian Filter data table"] = Array( "ALTER TABLE {dbprefix}bayesian_filter_info ADD KEY blog_id(blog_id)" );
-
-    $Changes["Permissions"] = Array( "ALTER TABLE {dbprefix}users_permissions ADD KEY user_id(user_id)",
-                                     "ALTER TABLE {dbprefix}users_permissions ADD KEY blog_id(blog_id)",
-                                     "ALTER TABLE {dbprefix}users_permissions ADD KEY user_id_permission_id(user_id,permission_id)");
-
-   // ---
-
-   // ---
-   // end of changes needed in 1.0
-   // ---
-
-$Inserts[0] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('comments_enabled','1',1);";
-$Inserts[1] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('rdf_enabled','1',1);";
-$Inserts[2] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('temp_folder','./tmp',3);";
-$Inserts[3] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('base_url','{plog_base_url}',3);";
-$Inserts[4] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('show_posts_max','15',1);";
-$Inserts[5] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('recent_posts_max','10',1);";
-$Inserts[6] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_template','standard',3);";
-$Inserts[7] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('template_folder','./templates',3);";
-$Inserts[8] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_blog_id','1',1);";
-$Inserts[9] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_locale','en_UK',3);";
-$Inserts[10] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('html_allowed_tags_in_comments','<a><i><br><br/><b>',3);";
-$Inserts[11] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('referer_tracker_enabled','1',1);";
-$Inserts[12] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('rss_parser_enabled','1',1);";
-$Inserts[13] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('show_more_enabled','1',1);";
-$Inserts[14] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('show_more_threshold','150',1);";
-$Inserts[15] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('update_article_reads','1',1);";
-$Inserts[16] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('email_service_enabled','1',1);";
-$Inserts[17] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('post_notification_source_address','noreply at your.host.com',3);";
-$Inserts[18] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('request_format_mode','1',1);";
-$Inserts[19] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('xmlrpc_ping_hosts','a:2:{i:0;s:27:\"http://rpc.weblogs.com/RPC2\";i:1;s:0:\"\";}',5);";
-$Inserts[20] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('trackback_server_enabled','1',1);";
-$Inserts[21] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('htmlarea_enabled','1',1);";
-$Inserts[22] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('plugin_manager_enabled','1',1);";
-$Inserts[23] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('check_email_address_validity','0',1);";
-$Inserts[24] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('summary_page_show_max','15',1);";
-$Inserts[25] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('minimum_password_length','4',1);";
-$Inserts[26] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('templates','a:3:{i:0;s:7:\"blueish\";i:1;s:4:\"grey\";i:2;s:8:\"standard\";}',5);";
-$Inserts[27] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('locales','a:0:{}',5)";
-$Inserts[28] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('email_service_type','php',3);";
-$Inserts[29] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_host','your.smtp.host.com',3);";
-$Inserts[30] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_port','25',1);";
-$Inserts[31] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_use_authentication','0',1);";
-$Inserts[32] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_username','',3);";
-$Inserts[33] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_password','',3);";
-$Inserts[34] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('locale_folder','./locale',3);";
-$Inserts[35] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('xmlrpc_ping_enabled','0',1);";
-$Inserts[36] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_tar','{path_to_tar}',3);";
-$Inserts[37] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_gzip','{path_to_gzip}',3);";
-$Inserts[38] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_bz2','{path_to_bz2}',3);";
-$Inserts[39] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_unzip','{path_to_unzip}',3);";
-$Inserts[40] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('users_can_add_templates',1,1);";
-$Inserts[41] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('maximum_file_upload_size', 2000000, 1);";
-$Inserts[42] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('upload_forbidden_files', '*.php *.php3 *.php4 *.phtml *.htm *.html *.exe *.com *.bat .htaccess *.sh', 3);";
-$Inserts[43] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('comments_order', 1, 1);";
-$Inserts[44] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('security_pipeline_enabled', 1, 1);";
-$Inserts[45] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('maximum_comment_size', 0, 1 );";
-$Inserts[46] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('resources_enabled', 1, 1 );";
-$Inserts[47] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnail_method', 'gd', 3);";
-$Inserts[48] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_convert', '{path_to_convert}', 3);";
-$Inserts[49] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnail_height', 120, 1);";
-$Inserts[50] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnail_width', 120, 1);";
-$Inserts[51] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnails_keep_aspect_ratio', 1, 1);";
-$Inserts[52] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('xmlrpc_api_enabled', 1, 1);";
-$Inserts[53] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('uploads_enabled', 1, 1);";
-$Inserts[54] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_rss_profile', 'rss090', 3);";
-$Inserts[55] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_enabled', 1, 2);";
-$Inserts[56] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_spam_probability_treshold', '0.9', 6);";
-$Inserts[57] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_nonspam_probability_treshold', '0.2', 6);";
-$Inserts[58] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_min_length_token', '3', 1);";
-$Inserts[59] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_max_length_token', '100', 1);";
-$Inserts[60] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_number_significant_tokens', 15, 1);";
-$Inserts[61] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_spam_comments_action', 0, 1 );";
-$Inserts[62] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('ip_address_filter_enabled', 1, 1 );";
-$Inserts[63] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('content_filter_enabled', 1, 1 );";
-$Inserts[64] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('thumbnail_format','same',3);";
-$Inserts[65] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resources_folder','./gallery/',3);";
-$Inserts[66] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('beautify_comments_text', '1', 1);";
-$Inserts[67] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('disable_apache_error_handler', '0', 1);";
-$Inserts[68] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('show_future_posts_in_calendar', '0', 1);";
-$Inserts[69] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('xhtml_converter_enabled', '1', 1);";
-$Inserts[70] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('xhtml_converter_aggresive_mode_enabled', '0', 1);";
-$Inserts[71] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('search_engine_enabled', '1', 1);";
-$Inserts[72] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('search_in_custom_fields', '1', 1);";
-$Inserts[73] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('search_in_comments', '1', 1);";
-$Inserts[74] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resources_quota', '0', 1);";
-$Inserts[75] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('category_link_format', '/blog/{blogname}/{catname}$', 3);";
-$Inserts[76] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('blog_link_format', '/blog/{blogname}$', 3);";
-$Inserts[77] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('archive_link_format', '/blog/{blogname}/archives/{year}/?{month}/?{day}', 3);";
-$Inserts[78] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('user_posts_link_format', '/blog/{blogname}/user/{username}$', 3);";
-$Inserts[79] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('post_trackbacks_link_format', '/blog/{blogname}/post/trackbacks/{postname}$', 3);";
-$Inserts[80] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_link_format', '/blog/{blogname}/page/{templatename}$', 3);";
-$Inserts[81] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('album_link_format', '/blog/{blogname}/album/{albumname}$', 3);";
-$Inserts[82] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_link_format', '/blog/{blogname}/resource/{albumname}/{resourcename}$', 3);";
-$Inserts[83] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_preview_link_format', '/blog/{blogname}/resource/{albumname}/preview/{resourcename}$', 3);";
-$Inserts[84] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_download_link_format', '/blog/{blogname}/resource/{albumname}/download/{resourcename}$', 3);";
-$Inserts[85] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('permalink_format', '/blog/{blogname}/{catname}/{year}/{month}/{day}/{postname}$', 3);";
-$Inserts[86] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('script_name', 'index.php', 3);";
-$Inserts[87] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('thumbnail_generator_use_smoothing_algorithm', '0', 1);";
-$Inserts[88] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_server_use_http_caching', '1', 1);";
-$Inserts[89] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('medium_size_thumbnail_width', '640', 1);";
-$Inserts[90] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('medium_size_thumbnail_height', '480', 1);";
-$Inserts[91] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_medium_size_preview_link_format', '/blog/{blogname}/resource/{albumname}/preview-med/{resourcename}$', 3);";
-$Inserts[92] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('subdomains_enabled', '0', 1);";
-$Inserts[93] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('include_blog_id_in_url', '1', 1);";
-$Inserts[94] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('send_xmlrpc_pings_enabled_by_default', '1', 1);";
-$Inserts[95] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('forbidden_usernames', 'admin www blog ftp wiki forums', 3);";
-$Inserts[96] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('force_registration_confirmation', '0', 1);";
-$Inserts[97] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('summary_blogs_per_page', '25', 3);";
-$Inserts[98] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('subdomains_base_url', '', 3);";
-$Inserts[99] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('autosave_new_drafts_time_millis', '300000', 3);";
-$Inserts[100] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('save_drafts_via_xmlhttprequest_enabled', '1', 1);";
-$Inserts[101] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('need_email_confirm_registration', '1', 1);";
-$Inserts[102] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('force_one_blog_per_email_account', '0', 1);";
-$Inserts[103] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('summary_show_agreement', '1', 1);";
-$Inserts[104] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('default_time_offset', '0', 3);";
-$Inserts[105] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_cache_enabled', '1', 1);";
-$Inserts[106] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_http_cache_enabled', '0', 1);";
-$Inserts[107] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_http_cache_enabled', '0', 1);";
-$Inserts[108] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_compile_check', '1', 1);";
-$Inserts[109] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('update_cached_article_reads', '1', 1);";
-$Inserts[110] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('allow_php_code_in_templates', '0', 1);";
-$Inserts[111] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('thumbnail_generator_use_smoothing_algorithm', '1', 1);";
-$Inserts[112] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_cache_lifetime', '-1', 3);";
-
-
-    /**
-     * Open a connection to the database
-     */
-     function connectDb( $ignoreError = false , $selectDatabase = true )
-     {
-        $config = new ConfigFileStorage();
-        // open a connection to the database
-        $db = NewADOConnection( 'mysql' );
-        if ( $selectDatabase ) {
-            $res = $db->Connect($config->getValue( "db_host" ), $config->getValue( "db_username" ), $config->getValue( "db_password" ), $config->getValue( "db_database" ));
-        } else {
-            $res = $db->Connect($config->getValue( "db_host" ), $config->getValue( "db_username" ), $config->getValue( "db_password" ));
-        }
-
-        if( DB_WIZARD_DEBUG )
-            $db->debug = true;
-
-        // return error
-        if( $ignoreError )
-            return $db;
-
-        if( !$res )
-            return false;
-
-        return $db;
-    }
-
-    /**
-     * Returns the database prefix
-     */
-    function getDbPrefix()
-    {
-        $config = new ConfigFileStorage();
-        return $config->getValue( "db_prefix" );
-    }
-
-    /**
-     * some useful little functions
-     */
-    class WizardTools extends Object
-    {
-       /**
-        * returns true if plog has already been installed before or
-        * false otherwise
-        */
-       function isNewInstallation()
-       {
-           $configFile = new ConfigFileStorage();
-           // if plog hasn't been installed, this file will have empty settings
-           if( $configFile->getValue( "db_host") == "" && $configFile->getValue( "db_username") == "" &&
-               $configFile->getValue( "db_database") == "" && $configFile->getValue( "db_prefix" ) == "" &&
-               $configFile->getValue( "db_password" ) == "" )
-               $isNew = true;
-           else
-               $isNew = false;
-
-           return( $isNew );
-       }
-    }
-
-    /**
-     * Renders a template file.
-     */
-    class WizardView extends View
-    {
-
-        var $_templateName;
-
-        function WizardView( $templateName )
-        {
-            $this->View();
-            $this->_templateName = $templateName;
-        }
-
-        function render()
-        {
-            // build the file name
-            $templateFileName = "wizard/".$this->_templateName.".template";
-
-            //$t = new Template( $templateFileName, "" );
-            $t = new Smarty();
-            $v = new Version();
-            $this->_params->setValue( "version", $v->getVersion());
-            $this->_params->setValue( "projectPage", $v->getProjectPage());
-            $this->_params->setValue( "safeMode", ini_get("safe_mode"));
-            $t->assign( $this->_params->getAsArray());
-            $t->template_dir    = "./templates";
-            $t->compile_dir     = TEMP_FOLDER;
-            $t->cache_dir       = TEMP_FOLDER;
-            $t->use_sub_dirs    = false;
-            $t->caching = false;
-
-            print $t->fetch( $templateFileName );
-        }
-    }
-
-    /**
-     * Gets the information about the database from the user.
-     */
-    class WizardIntro extends Action
-    {
-        function WizardIntro( $actionInfo, $request )
-        {
-            $this->Action( $actionInfo, $request );
-        }
-
-        function perform()
-        {
-            // we can detect whether plog is already installed or not and direct users to the right
-            // place
-            if( WizardTools::isNewInstallation())
-                $this->_view = new WizardView( "intro" );
-            else {
-                Controller::setForwardAction( "Update1" );
-                return false;
-            }
-
-            $this->setCommonData();
-            return true;
-        }
-    }
-
-    /**
-     *
-     * Saves data to the configuration file
-     *
-     */
-    class WizardStepOne extends Action
-    {
-
-        var $_dbServer;
-        var $_dbUser;
-        var $_dbPassword;
-        var $_dbName;
-        var $_dbPrefix;
-
-        function WizardStepOne( $actionInfo, $request )
-        {
-            $this->Action( $actionInfo, $request );
-
-            // data validation
-            $this->registerFieldValidator( "dbServer", new StringValidator());
-            $this->registerFieldValidator( "dbUser", new StringValidator());
-            $this->registerFieldValidator( "dbPassword",  new StringValidator(), true );
-            $this->registerFieldValidator( "dbName", new StringValidator());
-            $this->registerFieldValidator( "dbPrefix", new StringValidator(), true );
-            $errorView = new WizardView( "intro" );
-            $errorView->setErrorMessage( "Some data was incorrect or missing." );
-            $this->setValidationErrorView( $errorView );
-        }
-
-        function perform()
-        {
-            // fetch the data needed from the request
-            $this->_dbServer   = $this->_request->getValue( "dbServer" );
-            $this->_dbUser     = $this->_request->getValue( "dbUser" );
-            $this->_dbPassword = $this->_request->getValue( "dbPassword" );
-            $this->_dbName     = $this->_request->getValue( "dbName" );
-            $this->_skipThis   = $this->_request->getValue( "skipDbInfo" );
-            $this->_dbPrefix   = $this->_request->getValue( "dbPrefix", DEFAULT_DB_PREFIX );
-
-            // we should now save the data to the configuration file, just before
-            // we read it
-            $configFile = new ConfigFileStorage();
-
-            // we expect everything to be fine
-            $errors = false;
-
-            // before doing anything, we should check of the configuration file is
-            // writable by this script, or else, throw an error and bail out gracefully
-            $configFileName = $configFile->getConfigFileName();
-            if( !File::exists( $configFileName )) {
-                if (! File::touch( $configFileName ) ) {
-                    $this->_view = new WizardView( "intro" );
-                    $message = "Could not create the pLog configuration file $configFileName. Please make sure
-                                that the file can be created by the user running the webserver. It is needed to
-                                store the database configuration settings.";
-                    $this->_view->setErrorMessage( $message );
-                    $this->setCommonData( true );
-                    return false;
-                } else {
-                    ConfigFileStorage::createConfigFile( $configFileName );
-                }
-            }
-            if( File::exists( $configFileName ) && !File::isWritable( $configFileName )) {
-                $this->_view = new WizardView( "intro" );
-                $message = "Please make sure that the file $configFileName can be written by this script during
-                            the installation process. It is needed to store the database configuration settings. Once the
-                            installation is complete, please revert the permissions to no writing possible.";
-                $this->_view->setErrorMessage( $message );
-                $this->setCommonData( true );
-                return false;
-            }
-
-            // continue if everything went fine
-            if( !$configFile->saveValue( "db_username", $this->_dbUser ) ||
-                !$configFile->saveValue( "db_password", $this->_dbPassword ) ||
-                !$configFile->saveValue( "db_host", $this->_dbServer ) ||
-                !$configFile->saveValue( "db_database", $this->_dbName ) ||
-                !$configFile->saveValue( "db_prefix", $this->_dbPrefix )) {
-                $errors = true;
-            }
-
-            if( $errors ) {
-                $message = "Could not save values to the configuration file. Please make sure it is available and
-                            that has write permissions for the user under your web server is running.";
-                $this->_view = new WizardView( "intro" );
-                $this->_view->setErrorMessage( $message );
-
-                return( false );
-            }
-            else {
-                $this->_view = new WizardView( "step1" );
-
-                // now we better read the information from the config file to make sure that
-                // it has been correctly saved
-                $this->setCommonData( true );
-
-                return true;
-            }
-        }
-    }
-
-    /**
-     *
-     * Second step where we connect to the database and create the tables.
-     *
-     */
-    class WizardStepTwo extends Action
-    {
-
-        var $_db;
-        var $_database;
-        var $_createDatabase;
-
-        function setDbConfigValues( &$view )
-        {
-            $configFile = new ConfigFileStorage();
-            $configFile->reload();
-            $view->setValue( "dbUser", $configFile->getValue( "db_username" ));
-            $view->setValue( "dbPassword", $configFile->getValue( "db_password" ));
-            $view->setValue( "dbServer", $configFile->getValue( "db_host" ));
-            $view->setValue( "dbName", $configFile->getValue( "db_database" ));
-            $view->setValue( "dbPrefix", $configFile->getValue( "db_prefix" ));
-            return true;
-        }
-
-        function perform()
-        {
-            global $Tables;
-            global $Inserts;
-
-            $createDb = $this->_request->getValue( "createDatabase" );
-
-            // only check for errors in case the database table should already exist!
-            if( !$createDb ) {
-                $connectionEsablished = false;
-
-                // Lets check the 'everything is fine' case first..
-                $this->_db = connectDb();
-                if( $this->_db ) {
-                     $connectionEsablished = true;
-                } else {
-                     $connectionEsablished = false;
-                     $message = "There was an error selecting the database. Please verify the database was already created or check the 'Create database' checkbox.";
-                }
-
-                // We were unable to connect to the db and select the right db.. lets try
-                // just to connect.. maybe the database needs to be created (even though the
-                // user did not check the appropriate box).
-                if ( !$connectionEsablished ) {
-                    $this->_db = connectDb( true, false );
-                    if( !$this->_db ) {
-                         $message = "There was an error connecting to the database. Please check your settings.";
-                    }
-                }
-
-                if ( !$connectionEsablished ) {
-                    $this->_view = new WizardView( "step1" );
-                    $this->setDbConfigValues( $this->_view );
-                    $this->_view->setErrorMessage( $message );
-                    $this->setCommonData( true );
-                    return false;
-                }
-            }
-
-            $config = new ConfigFileStorage();
-            $this->_database = $config->getValue( "db_database" );
-            $this->_dbPrefix = $config->getValue( "db_prefix" );
-
-            // create the database
-            if( $createDb ) {
-                $this->_db = connectDb( false, false );
-                if( !$this->_db->Execute( "CREATE DATABASE ".$this->_database )) {
-                    $message = "Error creating the database: ".$this->_db->ErrorMsg();
-                    $this->_view = new WizardView( "step1" );
-                    $this->setDbConfigValues( $this->_view );
-                    $this->_view->setErrorMessage( $message );
-                    $this->setCommonData( true );
-                    return false;
-                } else {
-                    $message = "Database created successfully.<br/>";
-                }
-            }
-
-            // reconnect using the new database.
-            $config = new ConfigFileStorage();
-            $this->_db->Connect($config->getValue( "db_host" ), $config->getValue( "db_username" ), $config->getValue( "db_password" ), $config->getValue( "db_database" ));
-
-            // create the tables
-            $errors = false;
-            foreach( $Tables as $table ) {
-                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $table["code"] );
-                if( $this->_db->Execute( $query ))
-                    $message .= "Table <strong>".$table["desc"]."</strong> created successfully.<br/>";
-                else {
-                    $message .= "Error creating table: ".$this->_db->ErrorMsg()."<br/>";
-                    $errors = true;
-                }
-            }
-
-            if( $errors ) {
-                $message = "There was an error creating the tables in the database. Please make sure that the user chosen to connect to the database has enough permissions to create tables.<br/><br/>$message";
-                $this->_view = new WizardView( "step1" );
-                $this->_view->setErrorMessage( $message );
-                $this->setDbConfigValues( $this->_view );
-                $this->setCommonData();
-                return false;
-            }
-
-            // try to guess the url where plog is running
-             // try to guess the url where plog is running
-             $httpProtocol = (array_key_exists("HTTPS", $_SERVER) && $_SERVER["HTTPS"] == "on") ? "https://" : "http://";
-             $httpHost = $_SERVER["HTTP_HOST"];
-             $requestUrl = $_SERVER["REQUEST_URI"];
-             $requestUrl = str_replace( "/wizard.php", "", $requestUrl );
-             $plogUrl = $httpProtocol.$httpHost.$requestUrl;
-
-            // Find some of the tools we are going to need (last one is for os x, with fink installed)
-            // TBD: support for Windows specific directories
-            $folders = Array( "/bin/", "/usr/bin/", "/usr/local/bin/", "/sw/bin/" );
-            $finder = new FileFinder();
-            $pathToUnzip = $finder->findBinary( "unzip", $folders );
-            $pathToTar = $finder->findBinary( "tar", $folders);
-            $pathToGzip = $finder->findBinary( "gzip", $folders);
-            $pathToBzip2 = $finder->findBinary( "bzip2", $folders);
-            $pathToConvert = $finder->findBinary( "convert", $folders);
-
-            // and execute some insert's
-            foreach( $Inserts as $insert ) {
-                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $insert );
-                $query = str_replace( "{plog_base_url}", $plogUrl, $query );
-                // replace also the placeholders for the paths to the tools
-                $query = str_replace( "{path_to_tar}", $pathToTar, $query );
-                $query = str_replace( "{path_to_unzip}", $pathToUnzip, $query );
-                $query = str_replace( "{path_to_bz2}", $pathToBzip2, $query );
-                $query = str_replace( "{path_to_gzip}", $pathToGzip, $query );
-                $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
-                $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
-                if( !$this->_db->Execute( $query )) {
-                    $message .= "Error executing code: ".$this->_db->ErrorMsg()."<br/>";
-                    $errors = true;
-                }
-            }
-
-            //
-            // show some information regarding the helper tools we're going to need
-            // and wether they were found or not
-            //
-            $message .= "<br/><b>-- Helper tools --</b><br/>";
-            if( $pathToTar == "" )
-                $message .= "The helper tool 'tar' was not found<br/>";
-            else
-                $message .= "The helper tool 'tar' was found in $pathToTar<br/>";
-            if( $pathToGzip == "" )
-                $message .= "The helper tool 'gzip' was not found<br/>";
-            else
-                $message .= "The helper tool 'gzip' was found in $pathToGzip<br/>";
-            if( $pathToUnzip == "" )
-                $message .= "The helper tool 'unzip' was not found<br/>";
-            else
-                $message .= "The helper tool 'unzip' was found in $pathToUnzip<br/>";
-            if( $pathToBzip2 == "" )
-                $message .= "The helper tool 'bzip2' was not found<br/>";
-            else
-                $message .= "The helper tool 'bzip2' was found in $pathToTar<br/>";
-            if( $pathToConvert == "" )
-                $message .= "The helper tool 'convert' (from the ImageMagick package) was not found<br/>";
-            else
-                $message .= "The helper tool 'convert' (from the ImageMagick package) was found in $pathToConvert<br/>";
-
-            if( $errors ) {
-                $this->_view = new WizardView( "step1" );
-                $this->setDbConfigValues( $this->_view );
-                $message = "There was an error initializing some of the tables. Please make sure that the user chosen to connect to the database has enough permissions to add records to the database.<br/><br/>$message";
-                $this->_view->setErrorMessage( $message );
-                $this->setCommonData();
-            }
-            else {
-                $this->_view = new WizardView( "step2" );
-                $this->_view->setValue( "message", $message );
-            }
-
-            // Scan for locales
-            $locales = new Locales();
-            // find all the new locales that we have not yet stored
-            $f = new LocaleFinder();
-            $newLocaleCodes = $f->find();
-
-            foreach( $newLocaleCodes as $newLocaleCode ) {
-                $res = $locales->addLocale( $newLocaleCode );
-            }
-
-            return true;
-        }
-    }
-
-    /**
-     *
-     * this action only shows some feedback
-     *
-     */
-    class WizardStepThree extends Action
-    {
-        function perform()
-        {
-            $this->_view = new WizardView( "step3" );
-            $this->setCommonData();
-        }
-    }
-
-    /**
-     *
-     * Create the first user in the database
-     *
-     */
-    class WizardStepFour extends Action
-    {
-
-        var $_userName;
-        var $_userPassword;
-        var $_confirmPassword;
-        var $_userEmail;
-        var $_userFullName;
-
-        function WizardStepFour( $actionInfo, $request )
-        {
-            $this->Action( $actionInfo, $request );
-
-            $this->registerFieldValidator( "userName", new StringValidator());
-            $this->registerFieldValidator( "userPassword", new PasswordValidator());
-            $this->registerFieldValidator( "userPasswordCheck", new PasswordValidator());
-            $this->registerFieldValidator( "userEmail", new EmailValidator());
-            $this->registerField( "userFullName" );
-            $view = new WizardView( "step3" );
-            $view->setErrorMessage( "Some data is missing or incorrect" );
-            $this->setValidationErrorView( $view );
-        }
-
-        // creates the user
-        function perform()
-        {
-            $this->_userName = $this->_request->getValue( "userName" );
-            $this->_userPassword = $this->_request->getValue( "userPassword" );
-            $this->_confirmPassword = $this->_request->getValue( "userPasswordCheck" );
-            $this->_userEmail = $this->_request->getValue( "userEmail" );
-            $this->_userFullName = $this->_request->getValue( "userFullName" );
-
-            $db = connectDb();
-
-            if( !$db ) {
-                $this->_view = new WizardView( "step3" );
-                $this->_view->setErrorMessage( "There was an error connecting to the database. Please check your settings." );
-                $this->setCommonData();
-                return false;
-            }
-
-            if( $this->_confirmPassword != $this->_userPassword ) {
-                $this->_view = new WizardView( "step3" );
-                $this->_form->setFieldValidationStatus( "userPasswordCheck", false );
-                $this->setCommonData( true );
-                return false;
-            }
-
-            $dbPrefix = Db::getPrefix();
-
-            $users = new Users();
-            $user = new UserInfo( $this->_userName,
-                                  $this->_userPassword,
-                                  $this->_userEmail,
-                                  "",
-                                  $this->_userFullName);
-            $userId = $users->addUser( $user );
-            if( !$userId ) {
-                $this->_view = new WizardView( "step3" );
-                $message = "There was an error adding the user. Make sure that the user does not already exist in the database (".$users->DbError().")";
-                $this->_view->setErrorMessage( $message );
-                $this->setCommonData();
-                return false;
-            }
-
-            // we also have to execute the code to give administrator privileges to this user
-            $query = "INSERT INTO {$dbPrefix}users_permissions(user_id,blog_id,permission_id) VALUES( $userId, 0, 1 );";
-            $db->Execute( $query );
-
-            $this->_view = new Wizardview( "step4" );
-            $this->_view->setValue( "ownerid", $userId );
-            $this->_view->setValue( "siteLocales", Locales::getLocales());
-            $this->_view->setValue( "defaultLocale", Locales::getDefaultLocale());
-            $ts = new TemplateSets();
-            $this->_view->setValue( "siteTemplates", $ts->getGlobalTemplateSets());
-            $this->setCommonData();
-            return true;
-        }
-
-    }
-
-    class WizardStepFive extends Action
-    {
-
-        var $_blogName;
-        var $_ownerId;
-        var $_blogProperties;
-
-        function WizardStepFive( $actionInfo, $request )
-        {
-              $this->Action( $actionInfo, $request );
-
-              $this->registerFieldValidator( "blogName", new StringValidator());
-              $this->registerFieldValidator( "ownerid", new IntegerValidator());
-              $this->registerFieldValidator( "blogTemplate", new StringValidator());
-              $this->registerFieldValidator( "blogLocale", new StringValidator());
-              $view = new WizardView( "step4" );
-              $view->setErrorMessage( "Some data is missing or incorrect" );
-              $view->setValue( "siteLocales", Locales::getLocales());
-              $ts = new TemplateSets();
-              $view->setValue( "siteTemplates", $ts->getGlobalTemplateSets());
-              $this->setValidationErrorView( $view );
-        }
-
-        function perform()
-        {
-            // retrieve the values from the view
-            $this->_blogName = $this->_request->getValue( "blogName" );
-            $this->_ownerId  = $this->_request->getValue( "ownerid" );
-            $this->_blogProperties = $this->_request->getValue( "properties" );
-            $this->_blogTemplate = $this->_request->getValue( "blogTemplate" );
-            $this->_blogLocale = $this->_request->getValue( "blogLocale" );
-
-            // configure the blog
-            $blogs = new Blogs();
-            $blog = new BlogInfo( $this->_blogName, $this->_ownerId, "", "" );
-            $blog->setProperties( $this->_blogProperties );
-            $blog->setStatus( BLOG_STATUS_ACTIVE );
-            $blogSettings = $blog->getSettings();
-            $blogSettings->setValue( "locale", $this->_blogLocale );
-            $blogSettings->setValue( "template", $this->_blogTemplate );
-            $blog->setSettings( $blogSettings );
-
-            // and now save it to the database
-            $newblogId = $blogs->addBlog( $blog );
-            if( !$newblogId ) {
-                $this->_view = new WizardView( "step4" );
-                $this->_view->setValue( "siteLocales", Locales::getLocales());
-                $ts = new TemplateSets();
-                $this->_view->setValue( "siteTemplates", $ts->getGlobalTemplateSets());
-                $this->_view->setErrorMessage( "There was an error creating the new blog" );
-                $this->setCommonData( true );
-                return false;
-            }
-
-            // if the blog was created, we can add some basic information
-            // add a category
-            $articleCategories = new ArticleCategories();
-            $articleCategory = new ArticleCategory( "General", "", $newblogId, true );
-            $catId = $articleCategories->addArticleCategory( $articleCategory );
-
-            // load the right locale
-            $locale =& Locales::getLocale( $this->_blogLocale );
-            // and load the right text
-            $articleTopic = $locale->tr( "register_default_article_topic" );
-            $articleText  = $locale->tr( "register_default_article_text" );
-            $article = new Article( $articleTopic, $articleText, Array( $catId ), $this->_ownerId, $newblogId, POST_STATUS_PUBLISHED, 0, Array(), "welcome" );
-            $t = new Timestamp();
-            $article->setDateObject( $t );
-            $articles = new Articles();
-            $articles->addArticle( $article );
-
-            // save a few things in the default configuration
-            $config =& Config::getConfig();
-            // default blog id
-            $config->saveValue( "default_blog_id", (int)$newblogId );
-            // default locale
-            $config->saveValue( "default_locale", $this->_blogLocale );
-            // and finally, the default template
-            $config->saveValue( "default_template", $this->_blogTemplate );
-
-            //
-            // detect wether we have GD available and set the blog to use it
-            //
-            if( GdDetector::detectGd()) {
-                $config->saveValue( "thumbnail_method", "gd" );
-                $message = "GD has been detected and set as the backend for dealing with images.";
-            }
-            else {
-                $pathToConvert = $config->getValue( "path_to_convert" );
-                if( $pathToConvert ) {
-                    $config->saveValue( "thumbnail_method", "imagemagick" );
-                    $message = "ImageMagick has been detected and set as the backend for dealing with images.";
-                }
-                else {
-                    // nothing was found, so we'll have to do away with the 'null' resizer...
-                    $config->saveValue( "thumbnail_method", "null" );
-                    $message = "Neither GD nor ImageMagick have been detected in this host so it will not be possible to generate thumbnails from images.";
-                }
-            }
-
-            $this->_view = new WizardView( "step5" );
-            $this->_view->setValue( "message", $message );
-            return true;
-        }
-    }
-
-    //
-    // The following classes take care of updating the database to the last release
-    //
-    // Things that need to be done when going from 0.3.x to 1.0:
-    //
-    // - add the new tables:
-    //     plog_article_categories_link
-    //     plog_custom_fields_definition
-    //     plog_custom_fields_values
-    //
-    // - make modifications to some of the old tables:
-    //     plog_articles
-    //          normalized_text: TEXT
-    //          normalized_topic: TEXT
-    //          mangled_topic: TEXT
-    //          category_id: DROP
-    //          FULLTEXT(normalized_text)
-    //          FULLTEXT(normalized_topic)
-    //          FULLTEXT(normalized_text, normalized_topic)
-    //     plog_articles_categories
-    //          parent_id: INTEGER
-    //          mangled_name: TEXT
-    //          properties: TEXT
-    //     plog_articles_comments
-    //          normalized_text: TEXT
-    //          normalized_topic: TEXT
-    //          FULLTEXT(normalized_text)
-    //          FULLTEXT(normalized_topic)
-    //          FULLTEXT(normalized_text, normalized_topic)
-    //     plog_blogs
-    //          mangled_blog: TEXT
-    //          properties: TEXT
-    //     plog_gallery_albums
-    //          normalized_name: VARCHAR
-    //          normalized_description: TEXT
-    //          mangled_name: VARCHAR
-    //          FULLTEXT(normalized_name)
-    //          FULLTEXT(normalized_description)
-    //          FULLTEXT(normalized_name, normalized_description)
-    //     plog_gallery_resources
-    //          normalized_description: TEXT
-    //          FULLTEXT(normalized_description)
-    //     plog_mylinks
-    //          properties: TEXT
-    //     plog_mylinks_categories
-    //          properties: TEXT
-    //     plog_users
-    //          properties: TEXT
-    //          full_name: VARCHAR
-    //
-    // - for all the articles in the db, fill in the normalized_text, normalized_topic and mangled_topic
-    //   fields using the TextFilter class
-    //
-    // - for all articles in the db, change the status from a string ('published', 'draft', 'deleted') to
-    // an integer (POST_STATUS_{PUBLISHED|DELETED|DRAFT}
-    //
-    // - for all articles and categories, arrange the plog_article_categories_link table so that everything works
-    //   as before
-    //
-    // - for all article categories, fill in the mangled_name field
-    //
-    // - for all comments, fill in the normalized_text and normalized_topic fields
-    //
-    // - for all blogs, fill in the mangled_blog field
-    //
-    // - for all albums, fill in the normalized_name, normalized_description and mangled_name fields
-    //
-    // - for all resources, fill in the normalized_description field
-
-
-    class UpdateStepOne extends Action
-    {
-
-        function perform()
-        {
-            $this->_view = new WizardView( "update1" );
-            WizardStepTwo::setDbConfigValues( $this->_view );
-            $this->setCommonData();
-        }
-    }
-
-    class UpdateStepTwo extends Action
-    {
-
-        var $_db;
-        var $_dbPrefix;
-
-        function validate()
-        {
-            $configFile = new ConfigFileStorage();
-            $this->_dbPrefix = $configFile->getValue( "db_prefix" );
-
-            return true;
-        }
-
-        function perform()
-        {
-            // we need to create the new tables here
-            $newTables = Array( 21, 22, 23, 24 );
-
-            global $Tables;
-            global $Changes;
-            global $Inserts;
-
-            // connect to the db
-            $this->_db = connectDb();
-
-            // store error messages in this var
-            $message = "";
-
-            if( !$this->_db ) {
-                $this->_view = new WizardView( "update1" );
-                WizardStepTwo::setDbConfigValues( $this->_view );
-                $this->_view->setErrorMessage( "There was an error connecting to the database. Please check your settings." );
-                return false;
-            }
-
-            // ---
-            // create the new tables in 1.0
-            // ---
-            // loop only through the new tables
-            foreach( $newTables as $tableId ) {
-                // get info about the table we'd like to use
-                $table = $Tables[$tableId];
-                // and run the query
-                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $table["code"] );
-                if( $this->_db->Execute( $query ))
-                    $message .= "New table <strong>".$table["desc"]."</strong> created successfully.<br/>";
-                else {
-                    $message .= "Error creating table: ".$this->_db->ErrorMsg()."<br/>";
-                    $errors = true;
-                }
-            }
-            if( !$errors ) {
-                $message .= "** New tables created successfully **<br/><br/>";
-            }
-
-            // ---
-            // make changes to the tables that need changes
-            // ---
-            foreach( $Changes as $tableId => $changeTable) {
-                foreach( $changeTable as $changeCode ) {
-                    // and run the query
-                    $query = str_replace( "{dbprefix}", $this->_dbPrefix, $changeCode );
-                    if( !$this->_db->Execute( $query )) {
-                        $errors = true;
-                    }
-                }
-
-                if( !$errors )
-                    $message .= "Changes to table <strong>$tableId</strong> executed successfully.<br/>";
-                else {
-                    $message .= "Error modifying table $tableId: ".$this->_db->ErrorMsg()."<br/>";
-                }
-            }
-
-            if( !$errors ) {
-                $message .= "** Modifications to old tables carried out successfully **<br/><br/>";
-            }
-
-            // ---
-            // add the new configuration settings that were added for 1.0
-            // ---
-            $newSettings = range( 71, 112 );
-            foreach( $newSettings as $settingId ) {
-                $setting = $Inserts[$settingId];
-                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $setting );
-                if( !$this->_db->Execute( $query )) {
-                    $message .= "There was an error executing: ".$this->_db->ErrorMsg()."<br/>";
-                    $errors = true;
-                }
-            }
-
-            //
-            // there's nothing left to do so we can quit now!!
-            //
-            if( !$errors ) {
-                $this->_view = new WizardView( "update2" );
-                $this->_view->setValue( "message", $message );
-            }
-            else {
-                $this->_view = new WizardView( "update1" );
-                WizardStepTwo::setDbConfigValues( $this->_view );
-                $this->_view->setErrorMessage( $message );
-            }
-
-            return true;
-        }
-    }
-
-    /**
-     * this is the first step of the transformations to some of the fields in the tables.
-     * Precisely, it is in this step where we regenerate the indexes for the search engine... However, it
-     * could take it a while...
-     */
-    class UpdateStepThree extends Action
-    {
-        function UpdateStepThree( $actionInfo, $httpRequest )
-        {
-            $this->Action( $actionInfo, $httpRequest );
-
-            // load the current step, if any
-            $this->_curStep = $this->_request->getValue( "curStep" );
-            $this->_numPosts = $this->_request->getValue( "numPosts" );
-
-            //print("cur step = ".$this->_curStep." - num posts = ".$this->_numPosts."<br/>");
-        }
-
-        function getStatusId( $statusStr )
-        {
-            if( $statusStr == 'published' ) return POST_STATUS_PUBLISHED;
-            if( $statusStr == 'draft' ) return POST_STATUS_DRAFT;
-            if( $statusStr == 'deleted' ) return POST_STATUS_DELETED;
-
-            return false;
-        }
-
-       function perform()
-       {
-            // get a connection to the db
-            $db = connectDb();
-            $dbPrefix = getDbPrefix();
-            $db->debug=false;
-
-            // no errors here
-            $errors = false;
-
-            // see how many records we have
-            $queryCount = "SELECT COUNT(*) AS total FROM {$dbPrefix}articles";
-            $result = $db->Execute( $queryCount );
-            $row = $result->FetchRow();
-            $numRecords = $row["total"];
-            $this->_totalPosts = $numRecords;
-            // check whether we should use multiple steps
-            $multipleSteps = ( $numRecords > WIZARD_MAX_RECORDS_THRESHOLD );
-            if( $multipleSteps ) {
-                // how many steps do we need?
-                $numSteps = ceil( $numRecords / WIZARD_MAX_RECORDS_PER_STEP );
-                $this->_numSteps = $numSteps;
-                //print("using different steps! numSteps = $numSteps<br/>");
-            }
-
-            // run the query and loop through the results
-            $query = "SELECT * FROM {$dbPrefix}articles";
-            if( $multipleSteps ) {
-                // generate the LIMIT condition for this page
-                $query .= " LIMIT ".$this->_curStep*WIZARD_MAX_RECORDS_PER_STEP.", ".WIZARD_MAX_RECORDS_PER_STEP;
-            }
-
-            //print("query = $query<br/>");
-
-            $result = $db->Execute( $query );
-
-            $tf = new TextFilter();
-
-            $numPosts = $result->RowCount();
-
-            while( $row = $result->FetchRow()) {
-                // for each one of the articles, fill in the mangled_topic, normalized_text and normalized_value
-                $normalizedTopic = Db::qstr($tf->normalizeText( $row["topic"] ));
-                $postTopic       = Db::qstr($row["topic"]);
-                $normalizedText  = Db::qstr($tf->normalizeText( $row["text"] ));
-                $postText        = Db::qstr($row["text"]);
-                $mangledTopic    = Db::qstr($tf->urlize( $row["topic"] ));
-                $status          = $this->getStatusId( $row["old_status"] );
-                $artId           = $row["id"];
-                $catId           = $row["category_id"];
-
-                $query = "UPDATE {$dbPrefix}articles SET slug = '$mangledTopic', date = date, status = $status
-                          WHERE id = $artId";
-
-                $query2= "INSERT INTO {$dbPrefix}article_categories_link(article_id, category_id)
-                          VALUES ( $artId, $catId )";
-
-                $query3= "INSERT INTO {$dbPrefix}articles_text (article_id,text,topic,normalized_text,normalized_topic,mangled_topic)
-                          VALUES('$artId','$postText','$postTopic','$normalizedTopic','$normalizedText','$mangledTopic')";
-
-
-                // execute the two queries
-                $res  = $db->Execute( $query );
-                $res2 = $db->Execute( $query2 );
-                $res3 = $db->Execute( $query3 );
-
-                /*if( !$res || !$res2 || !$res3 )
-                    $errors = true;*/
-            }
-
-            // check whether we've already done the last step or not
-            $lastStepDone = ( $this->_curStep >= $this->_numSteps );
-
-            // if error
-            if( $errors ) {
-                $this->_view = new WizardView( "update2" );
-                $this->_view->setErrorMessage( "There was an error updating the articles table." );
-                $this->setCommonData();
-                return false;
-            }
-
-            //$query1 = "ALTER TABLE {$dbPrefix}articles DROP COLUMN old_status, DROP COLUMN category_id";
-            //$db->Execute( $query1 );
-
-            // if everyhting's fine, say so...
-            if( !$multipleSteps || $lastStepDone ) {
-                $this->_view = new WizardView( "update3" );
-                $this->_view->setValue( "totalPosts", $this->_totalPosts );
-            }
-            else {
-                // if we're using multiple steps, show the same page
-                $this->_view = new WizardView( "update2" );
-                $this->_view->setValue( "numPosts", $numPosts );
-                $this->_view->setValue( "curStep", $this->_curStep+1 );
-                $this->_view->setValue( "totalPosts", $this->_totalPosts );
-                $this->_view->setValue( "numSteps", $this->_numSteps );
-                $this->_view->setValue( "multipleSteps", true );
-            }
-
-            return true;
-        }
-
-    }
-
-    // ---
-    // this action will do the same as before but for the rest of the tables that need some data to
-    // be normalized/mangled
-    // ---
-    class UpdateStepFour extends Action
-    {
-
-        var $dbPrefix;
-        var $db;
-        var $t;
-
-        function validate()
-        {
-            $this->db = connectDb();
-            $this->dbPrefix = getDbPrefix();
-            $this->t = new TextFilter();
-
-            return true;
-        }
-
-        //
-        // process the article categories
-        //
-        function updateArticleCategories()
-        {
-            $dbPrefix = $this->dbPrefix;
-            $query = "SELECT * FROM {$dbPrefix}articles_categories";
-            $result = $this->db->Execute( $query );
-
-            while( $row = $result->FetchRow()) {
-                $catId = $row["id"];
-                $mangledName = $this->t->urlize( $row["name"] );
-                $query = "UPDATE {$dbPrefix}articles_categories
-                          SET mangled_name = '$mangledName', last_modification = last_modification
-                          WHERE id = $catId";
-
-                $res = $this->db->Execute( $query );
-
-                // this is not very nice to see but it works... :)
-                if( !$res ) {
-                    $this->message .= "There was an error updating the article categories table.<br/>";
-                    return false;
-                }
-            }
-
-            $this->message .= "Article Categories table updated successfully!<br/>";
-
-            return true;
-        }
-
-        //
-        // process the comments
-        //
-        function updateArticleComments()
-        {
-            $dbPrefix = $this->dbPrefix;
-            $query = "SELECT * FROM {$dbPrefix}articles_comments";
-            $result = $this->db->Execute( $query );
-
-            while( $row = $result->FetchRow()) {
-                $commentId = $row["id"];
-                $normText = Db::qstr($this->t->normalizeText( $row["text"] ));
-                $normTopic = Db::qstr($this->t->normalizeText( $row["topic"] ));
-                $query = "UPDATE {$dbPrefix}articles_comments
-                          SET normalized_text = '$normText', normalized_topic = '$normTopic', date = date
-                          WHERE id = $commentId";
-
-                $res = $this->db->Execute( $query );
-
-                if( !$res ) {
-                    $this->message .= "There was an error updating the comments table.<br/>";
-                    return false;
-                }
-            }
-
-            $this->message .= "Comments table updated successfully!<br/>";
-
-            return true;
-        }
-
-        //
-        // process the blogs
-        //
-        function updateBlogs()
-        {
-            $dbPrefix = $this->dbPrefix;
-            $query = "SELECT * FROM {$dbPrefix}blogs";
-            $result = $this->db->Execute( $query );
-
-            while( $row = $result->FetchRow()) {
-                $blogId = $row["id"];
-                $mangledBlog = $this->t->urlize( $row["blog"] );
-                $query = "UPDATE {$dbPrefix}blogs
-                          SET mangled_blog = '$mangledBlog' WHERE id = $blogId";
-
-                $res = $this->db->Execute( $query );
-
-                if( !$res ) {
-                    $this->message .= "There wasn an error updaing the blogs table.<br/>";
-                    return false;
-                }
-            }
-
-            $this->message .= "Blogs table updated successfully!<br/>";
-
-            return true;
-        }
-
-        //
-        // process the albums
-        //
-        function updateAlbums()
-        {
-            $dbPrefix = $this->dbPrefix;
-            $query = "SELECT * FROM {$dbPrefix}gallery_albums";
-            $result = $this->db->Execute( $query );
-
-            while( $row = $result->FetchRow()) {
-                $albumId = $row["id"];
-                $mangledName = Db::qstr($this->t->urlize( $row["name"] ));
-                $normName = Db::qstr($this->t->normalizeText( $row["name"] ));
-                $normDescription = Db::qstr($this->t->normalizeText( $row["description"] ));
-                $query = "UPDATE {$dbPrefix}gallery_albums
-                          SET mangled_name = '$mangledName', normalized_name = '$normName',
-                          normalized_description = '$normDescription', date = date
-                          WHERE id = $albumId";
-
-                $res = $this->db->Execute( $query );
-
-                if( !$res ) {
-                    $this->message .= "There was an error updating the albums table.<br/>";
-                    return false;
-                }
-            }
-
-            $this->message .= "Resource Albums table updated successfully!<br/>";
-
-            return true;
-        }
-
-        //
-        // and finally, the resources...
-        //
-        function updateResources()
-        {
-            $dbPrefix = $this->dbPrefix;
-            $query = "SELECT * FROM {$dbPrefix}gallery_resources";
-            $result = $this->db->Execute( $query );
-
-            while( $row = $result->FetchRow()) {
-                $resId = $row["id"];
-                //$normName = $this->t->normalizeText( $row["name"] );
-                $normDescription = Db::qstr($this->t->normalizeText( $row["description"] ));
-                $query = "UPDATE {$dbPrefix}gallery_resources
-                          SET normalized_description = '$normDescription', date = date
-                          WHERE id = $resId";
-
-                $res = $this->db->Execute( $query );
-                if( !$res ) {
-                    $this->message .= "There was an error updating the resources table.<br/>";
-                    return false;
-                }
-            }
-
-            $this->message .= "Resources table updated successfully!<br/>";
-
-            return true;
-
-        }
-
-        //
-        // process the articles' text
-        //
-        function updateArticleText()
-        {
-            $dbPrefix = $this->dbPrefix;
-            // drop unneeded columns from articles table
-            $alter_query[] = "ALTER TABLE ".$dbPrefix."articles DROP COLUMN text";
-            $alter_query[] = "ALTER TABLE ".$dbPrefix."articles DROP COLUMN topic";
-
-            foreach ($alter_query as $value) {
-                $this->db->Execute($value);
-            }
-
-
-            $this->message .= "articles_text table updated successfully!<br/>";
-
-            return true;
-        }
-
-        function perform()
-        {
-            $updaters = Array( "updateArticleCategories", "updateArticleComments",
-                               "updateBlogs", "updateAlbums", "updateResources", "updateArticleText" );
-
-            // loop through each one of the methods to take care of updating one of the tables
-            foreach( $updaters as $method ) {
-                $result = $this->$method();
-
-                if( !$result ) {
-                    $this->_view = new WizardView( "update3" );
-                    $this->_view->setErrorMessage( $this->message );
-                    return false;
-                }
-            }
-
-            // everything went fine so we can show the final page!
-            $this->_view = new WizardView( "update4" );
-            $this->_view->setValue( "message", $this->message );
-
-            return true;
-        }
-
-    }
-
-    // check if the "./tmp" folder is writable by us, otherwise
-    // throw an error before the user gets countless errors
-    // from Smarty
-    if( !File::isWritable( TEMP_FOLDER ) || !File::isDir( TEMP_FOLDER )) {
-        print("<span style=\"color:red; font-size: 14px;\">Error</span><br/><br/>This wizard needs the ".TEMP_FOLDER." folder to be writable by the web server user.<br/><br/>Please correct that and try again.");
-        die();
-    }
-
-    //// main part ////
-    $controller = new Controller( $_actionMap, "nextStep" );
-    $controller->process( HttpVars::getRequest());
-?>
+<?php
+
+    if (!defined( "PLOG_CLASS_PATH" )) {
+        define( "PLOG_CLASS_PATH", dirname(__FILE__)."/");
+    }
+
+    set_time_limit (5 * 3600);
+
+    //
+    // enable this for debugging purposes
+    //
+    define( "DB_WIZARD_DEBUG", false );
+
+    //
+    // in case you're having problems with time outs while upgrading (probably too
+    // many records) lower this figure
+    //
+    define( "WIZARD_MAX_RECORDS_PER_STEP", 50 );
+
+    //
+    // threshold that defines up to how many records we should not divide the
+    // transformations in more than one step
+    //
+    define( "WIZARD_MAX_RECORDS_THRESHOLD", 100 );
+
+    // many hosts don't have this enabled and we, for the time being, need it...
+    ini_set("arg_seperator.output", "&amp;");
+
+    include_once( PLOG_CLASS_PATH."class/controller/controller.class.php" );
+    include_once( PLOG_CLASS_PATH."class/template/templateservice.class.php" );
+    include_once( PLOG_CLASS_PATH."class/action/action.class.php" );
+    include_once( PLOG_CLASS_PATH."class/template/template.class.php" );
+    include_once( PLOG_CLASS_PATH."class/view/view.class.php" );
+    include_once( PLOG_CLASS_PATH."class/database/adodb/adodb.inc.php" );
+    include_once( PLOG_CLASS_PATH."class/data/validator/stringvalidator.class.php" );
+    include_once( PLOG_CLASS_PATH."class/data/validator/emailvalidator.class.php" );
+    include_once( PLOG_CLASS_PATH."class/data/validator/passwordvalidator.class.php" );
+    include_once( PLOG_CLASS_PATH."class/dao/users.class.php" );
+    include_once( PLOG_CLASS_PATH."class/dao/blogs.class.php" );
+    include_once( PLOG_CLASS_PATH."class/dao/articlecategories.class.php" );
+    include_once( PLOG_CLASS_PATH."class/dao/articles.class.php" );
+    include_once( PLOG_CLASS_PATH."class/net/http/httpvars.class.php" );
+    include_once( PLOG_CLASS_PATH."class/dao/userpermissions.class.php" );
+    include_once( PLOG_CLASS_PATH."class/misc/version.class.php" );
+    include_once( PLOG_CLASS_PATH."class/file/file.class.php" );
+    include_once( PLOG_CLASS_PATH."class/file/finder/filefinder.class.php" );
+    include_once( PLOG_CLASS_PATH."class/gallery/resizers/gddetector.class.php" );
+    include_once( PLOG_CLASS_PATH."class/config/configfilestorage.class.php" );
+    include_once( PLOG_CLASS_PATH."class/data/textfilter.class.php" );
+    include_once( PLOG_CLASS_PATH."class/locale/locales.class.php" );
+    include_once( PLOG_CLASS_PATH."class/locale/localefinder.class.php" );
+
+    define( "TEMP_FOLDER", "./tmp" );
+
+    // sql querys used to create the tables
+
+    // maps used to map requests with actions
+    $_actionMap["Default"] = "WizardIntro";
+    $_actionMap["Intro"] = "WizardIntro";
+    $_actionMap["Step1"] = "WizardStepOne";
+    $_actionMap["Step2"] = "WizardStepTwo";
+    $_actionMap["Step3"] = "WizardStepThree";
+    $_actionMap["Step4"] = "WizardStepFour";
+    $_actionMap["Step5"] = "WizardStepFive";
+    $_actionMap["Update1"] = "UpdateStepOne";
+    $_actionMap["Update2"] = "UpdateStepTwo";
+    $_actionMap["Update3"] = "UpdateStepThree";
+    $_actionMap["Update4"] = "UpdateStepFour";
+
+
+
+    $Tables[0]["desc"] = "Articles";
+    $Tables[0]["code"] = "CREATE TABLE {dbprefix}articles (
+  id int(10) unsigned NOT NULL auto_increment,
+  category_id int(10) unsigned NOT NULL default '0',
+  date timestamp(14) NOT NULL,
+  modification_date timestamp(14) NOT NULL,
+  user_id int(10) unsigned NOT NULL default '0',
+  blog_id int(10) unsigned NOT NULL default '0',
+  status INTEGER(5) NOT NULL default 1,
+  num_reads int(10) default '0',
+  properties TEXT NOT NULL default '',
+  slug varchar(255) NOT NULL,
+  PRIMARY KEY (id),
+  KEY num_reads (num_reads),
+  KEY category_id (category_id),
+  KEY blog_id (blog_id),
+  KEY user_id (user_id),
+  KEY slug (slug),
+  KEY blog_id_slug (blog_id,slug),
+  KEY blog_id_slug_category_id (blog_id,slug,category_id)
+) TYPE=MyISAM;";
+
+    $Tables[1]["desc"] = "Article categories";
+    $Tables[1]["code"] = "CREATE TABLE {dbprefix}articles_categories (
+  id int(10) unsigned NOT NULL auto_increment,
+  name varchar(255) NOT NULL default '',
+  url varchar(255) NOT NULL default '',
+  blog_id int(10) unsigned NOT NULL default '0',
+  last_modification timestamp(14) NOT NULL,
+  in_main_page TINYINT(1) NOT NULL DEFAULT '1',
+  parent_id INTEGER(10) NOT NULL DEFAULT '0',
+  description TEXT NOT NULL DEFAULT '',
+  properties text NOT NULL default '',
+  mangled_name varchar(255) NOT NULL default '',
+  PRIMARY KEY  (id),
+  KEY parent_id (parent_id),
+  KEY blog_id (blog_id),
+  KEY mangled_name (mangled_name)
+) TYPE=MyISAM;";
+
+    $Tables[2]["desc"] = "Comments";
+    $Tables[2]["code"] = "CREATE TABLE {dbprefix}articles_comments (
+  id int(10) unsigned NOT NULL auto_increment,
+  article_id int(10) unsigned NOT NULL default '0',
+  topic text NOT NULL,
+  text text,
+  date timestamp(14) NOT NULL,
+  user_email varchar(255) default '',
+  user_url varchar(255) default '',
+  user_name varchar(255) NOT NULL default 'Anonymous',
+  parent_id int(10) unsigned default '0',
+  client_ip varchar(15) default '0.0.0.0',
+  send_notification tinyint(1) default '0',
+  status tinyint(2) default '1',
+  spam_rate float default '0',
+  properties TEXT NOT NULL DEFAULT '',
+  normalized_text TEXT NOT NULL DEFAULT '',
+  normalized_topic TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY  (id),
+  KEY parent_id (parent_id),
+  KEY article_id (article_id),
+  FULLTEXT KEY normalized_fields (normalized_text,normalized_topic),
+  FULLTEXT KEY normalized_text (normalized_text),
+  FULLTEXT KEY normalized_topic (normalized_topic)
+) TYPE=MyISAM;";
+
+    $Tables[3]["desc"] = "Notifications";
+    $Tables[3]["code"] = "CREATE TABLE {dbprefix}articles_notifications (
+  id int(10) NOT NULL auto_increment,
+  blog_id int(10) NOT NULL default '0',
+  user_id int(10) NOT NULL default '0',
+  article_id int(10) NOT NULL default '0',
+  PRIMARY KEY  (id),
+  KEY article_id (article_id),
+  KEY user_id (user_id),
+  KEY blog_id (blog_id)
+) TYPE=MyISAM;";
+
+    $Tables[4]["desc"] = "Blogs";
+    $Tables[4]["code"] = "CREATE TABLE {dbprefix}blogs (
+  id int(10) unsigned NOT NULL auto_increment,
+  blog varchar(50) NOT NULL default '',
+  owner_id int(10) unsigned NOT NULL default '0',
+  about text,
+  settings text NOT NULL,
+  mangled_blog varchar(50) NOT NULL default '',
+  status int(4) NOT NULL default '1',
+  show_in_summary int(4) not null default '1',
+  PRIMARY KEY  (id),
+  KEY owner_id (owner_id),
+  KEY mangled_blog (mangled_blog)
+) TYPE=MyISAM;";
+
+    $Tables[5]["desc"] = "MyLinks";
+    $Tables[5]["code"] = "CREATE TABLE {dbprefix}mylinks (
+  id int(10) unsigned NOT NULL auto_increment,
+  category_id int(10) unsigned NOT NULL default '0',
+  url varchar(255) NOT NULL default '',
+  name varchar(100) default '',
+  description text NOT NULL,
+  blog_id int(10) unsigned NOT NULL default '0',
+  rss_feed varchar(255) not null default '',
+  date timestamp(14) not null,
+  properties TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY  (id),
+  KEY blog_id (blog_id),
+  KEY category_id (category_id)
+) TYPE=MyISAM;";
+
+    $Tables[6]["desc"] = "MyLinks Categories";
+    $Tables[6]["code"] = "CREATE TABLE {dbprefix}mylinks_categories (
+  id int(10) NOT NULL auto_increment,
+  name varchar(100) NOT NULL default '',
+  blog_id int(10) NOT NULL default '0',
+  last_modification timestamp(14) NOT NULL,
+  properties TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY  (id),
+  KEY blog_id (blog_id)
+) TYPE=MyISAM;";
+
+    $Tables[7]["desc"] = "MyRecent";
+    $Tables[7]["code"] = "CREATE TABLE {dbprefix}myrecent (
+  id int(10) unsigned NOT NULL auto_increment,
+  category_id int(10) unsigned NOT NULL default '0',
+  name varchar(255) NOT NULL default '',
+  text text NOT NULL,
+  user_id int(10) unsigned NOT NULL default '0',
+  blog_id int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (id)
+) TYPE=MyISAM;";
+
+    $Tables[8]["desc"] = "MyRecent categories";
+    $Tables[8]["code"] = "CREATE TABLE {dbprefix}myrecent_categories (
+  id int(10) unsigned NOT NULL auto_increment,
+  name varchar(255) NOT NULL default '',
+  blog_id int(10) unsigned NOT NULL default '0',
+  last_modification timestamp(14) NOT NULL,
+  PRIMARY KEY  (id)
+) TYPE=MyISAM;";
+
+    $Tables[9]["desc"] = "Permissions";
+    $Tables[9]["code"] = "CREATE TABLE {dbprefix}permissions (
+  id int(10) unsigned NOT NULL auto_increment,
+  permission varchar(25) NOT NULL default '',
+  description varchar(100) NOT NULL default '',
+  PRIMARY KEY  (id)
+) TYPE=MyISAM;";
+
+    $Tables[10]["desc"] = "Referrers";
+    $Tables[10]["code"] = "CREATE TABLE {dbprefix}referers (
+  id int(10) NOT NULL auto_increment,
+  url text NOT NULL,
+  article_id int(10) NOT NULL default '0',
+  blog_id int(10) NOT NULL default '0',
+  hits int(10) default '1',
+  last_date timestamp(14),
+  PRIMARY KEY  (id),
+  KEY article_id (article_id),
+  KEY blog_id (blog_id),
+  KEY blog_id_article_id (blog_id, article_id)
+) TYPE=MyISAM;";
+
+    $Tables[11]["desc"] = "Trackbacks";
+    $Tables[11]["code"] = "CREATE TABLE {dbprefix}trackbacks (
+  id int(10) NOT NULL auto_increment,
+  url text NOT NULL,
+  title varchar(255) default '',
+  article_id int(10) NOT NULL default '0',
+  excerpt varchar(255) default '',
+  blog_name varchar(255) default '',
+  date timestamp(14) NOT NULL,
+  properties TEXT NOT NULL DEFAULT '',
+  PRIMARY KEY  (id),
+  KEY article_id (article_id)
+) TYPE=MyISAM;";
+
+    $Tables[12]["desc"] = "Users";
+    $Tables[12]["code"] = "CREATE TABLE {dbprefix}users (
+  id int(10) unsigned NOT NULL auto_increment,
+  user varchar(15) NOT NULL default '',
+  password varchar(32) NOT NULL default '',
+  email varchar(255) NOT NULL default '',
+  full_name varchar(255) NOT NULL default '',
+  about text,
+  properties TEXT NOT NULL default '',
+  status integer(4) NOT NULL DEFAULT 1,
+  resource_picture_id integer(10) NOT NULL DEFAULT 0,
+  PRIMARY KEY  (id),
+  UNIQUE KEY user (user)
+) TYPE=MyISAM;";
+
+    $Tables[13]["desc"] = "Permissions";
+    $Tables[13]["code"] = "CREATE TABLE {dbprefix}users_permissions (
+  id int(10) unsigned NOT NULL auto_increment,
+  user_id int(10) unsigned NOT NULL default '0',
+  blog_id int(10) unsigned NOT NULL default '0',
+  permission_id int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (id),
+  KEY user_id (user_id),
+  KEY blog_id (blog_id),
+  KEY user_id_permission_id (user_id,permission_id)
+) TYPE=MyISAM;";
+
+
+   $Tables[14]["desc"] = "Configuration";
+   $Tables[14]["code"] = "CREATE TABLE {dbprefix}config (
+   id int(10) NOT NULL auto_increment,
+   config_key varchar(255) NOT NULL default '',
+   config_value text NOT NULL,
+   value_type int(3) default '0',
+   PRIMARY KEY  (id,config_key)
+   ) TYPE=MyISAM;";
+
+   $Tables[15]["desc"] = "Filtered Content";
+   $Tables[15]["code"] = "CREATE TABLE {dbprefix}filtered_content (
+   id int(10) NOT NULL auto_increment,
+   reg_exp text,
+   blog_id int(10) NOT NULL default '0',
+   reason text,
+   date timestamp(14) NOT NULL,
+   PRIMARY KEY  (id),
+   KEY blog_id (blog_id)
+   ) TYPE=MyISAM;";
+
+   $Tables[16]["desc"] = "Blocked content";
+   $Tables[16]["code"] = "CREATE TABLE {dbprefix}host_blocking_rules (
+   id int(10) NOT NULL auto_increment,
+   reason text,
+   date timestamp(14) NOT NULL,
+   blog_id int(10) NOT NULL default '0',
+   block_type int(1) default '1',
+   list_type int(1) default '1',
+   mask int(2) default '0',
+   host varchar(15) default '0.0.0.0',
+   PRIMARY KEY  (id),
+   KEY blog_id (blog_id)
+   ) TYPE=MyISAM;";
+
+   $Tables[17]["desc"] = "Gallery Resources";
+   $Tables[17]["code"] = "CREATE TABLE {dbprefix}gallery_resources (
+   id int(10) NOT NULL auto_increment,
+   owner_id int(10) NOT NULL default '0',
+   album_id int(10) NOT NULL default '0',
+   description text,
+   date timestamp(14) NOT NULL,
+   flags int(10) default '0',
+   resource_type int(3) default NULL,
+   file_path varchar(255) default '',
+   file_name varchar(255) default '',
+   metadata text,
+   thumbnail_format varchar(4) not null default 'same',
+   normalized_description text NOT NULL default '',
+   properties TEXT NOT NULL DEFAULT '',
+   PRIMARY KEY  (id),
+   KEY album_id (album_id),
+   KEY owner_id (owner_id),
+   KEY file_name (file_name),
+   KEY album_id_owner_id (album_id, owner_id),
+   KEY resource_type (resource_type),
+   FULLTEXT KEY normalized_description (normalized_description)
+   ) TYPE=MyISAM;";
+
+   $Tables[18]["desc"] = "Gallery Albums";
+   $Tables[18]["code"] = "CREATE TABLE {dbprefix}gallery_albums (
+   id int(10) NOT NULL auto_increment,
+   owner_id int(10) NOT NULL default '0',
+   description text NOT NULL,
+   name varchar(255) NOT NULL default '',
+   flags int(10) NOT NULL default '0',
+   parent_id int(10) NOT NULL default '0',
+   date timestamp(14) NOT NULL,
+   properties text NOT NULL DEFAULT '',
+   show_album TINYINT(1) DEFAULT 1,
+   normalized_description text NOT NULL default '',
+   normalized_name varchar(255) NOT NULL default '',
+   mangled_name varchar(255) NOT NULL default '',
+   PRIMARY KEY  (id),
+   KEY parent_id (parent_id),
+   KEY owner_id (owner_id),
+   KEY mangled_name (mangled_name),
+   KEY owner_id_mangled_name (owner_id, mangled_name),
+   FULLTEXT KEY normalized_name (normalized_name),
+   FULLTEXT KEY normalized_description (normalized_description),
+   FULLTEXT KEY normalized_fields (normalized_name, normalized_description)
+   ) TYPE=MyISAM;";
+
+   $Tables[19]["desc"] = "Bayesian Filter data table";
+   $Tables[19]["code"] = "CREATE TABLE {dbprefix}bayesian_filter_info (
+   id int(10) unsigned NOT NULL auto_increment,
+   blog_id int(10) unsigned default NULL,
+   total_spam int(10) unsigned default NULL,
+   total_nonspam int(10) unsigned default NULL,
+   PRIMARY KEY  (id),
+   KEY blog_id (blog_id)
+   ) TYPE=MyISAM;";
+
+   $Tables[20]["desc"] = "Bayesian Filter Information";
+   $Tables[20]["code"] = "CREATE TABLE {dbprefix}bayesian_tokens (
+   id int(10) unsigned NOT NULL auto_increment,
+   blog_id int(10) unsigned default NULL,
+   token char(100) default NULL,
+   spam_occurrences int(10) unsigned default NULL,
+   nonspam_occurrences int(10) unsigned default NULL,
+   prob float default NULL,
+   PRIMARY KEY  (id),
+   KEY blog_id (blog_id),
+   KEY token (token)
+   ) TYPE=MyISAM;";
+
+   $Tables[21]["desc"] = "Map of categories to articles";
+   $Tables[21]["code"] = "CREATE TABLE {dbprefix}article_categories_link(
+   article_id int(10) NOT NULL,
+   category_id int(10) NOT NULL,
+   PRIMARY KEY (article_id, category_id)
+   ) TYPE=MyISAM;";
+
+   $Tables[22]["desc"] = "Definition of custom fields";
+   $Tables[22]["code"] = "CREATE TABLE {dbprefix}custom_fields_definition (
+   id int(10) NOT NULL auto_increment,
+   field_name varchar(255) NOT NULL default '',
+   field_description text NOT NULL,
+   field_type int(2) NOT NULL default '1',
+   blog_id int(10) NOT NULL default '0',
+   date TIMESTAMP(14),
+   searchable TINYINT(1) default 1,
+   hidden TINYINT(1) default 1,
+   PRIMARY KEY  (id,field_name),
+   KEY blog_id (blog_id)
+   ) TYPE=MyISAM;";
+
+   $Tables[23]["desc"] = "Custom fields that have been assigned to articles";
+   $Tables[23]["code"] = "CREATE TABLE {dbprefix}custom_fields_values (
+   id int(10) NOT NULL auto_increment,
+   field_id int(10) NOT NULL default '0',
+   field_value text NOT NULL,
+   normalized_value text NOT NULL,
+   blog_id int(10) default NULL,
+   article_id int(10) default NULL,
+   PRIMARY KEY  (id),
+   FULLTEXT KEY normalized_value (normalized_value),
+   KEY blog_id (blog_id),
+   KEY article_id (article_id),
+   KEY field_id (field_id),
+   KEY blog_id_article_id (blog_id, article_id)
+   ) TYPE=MyISAM;";
+
+   $Tables[24]["desc"] = "Text of the articles";
+   $Tables[24]["code"] = "CREATE TABLE {dbprefix}articles_text (
+   id int(10) NOT NULL auto_increment,
+   article_id int(10) NOT NULL DEFAULT 0,
+   text TEXT NOT NULL DEFAULT '',
+   topic TEXT NOT NULL DEFAULT '',
+   normalized_text TEXT NOT NULL DEFAULT '',
+   normalized_topic TEXT NOT NULL DEFAULT '',
+   mangled_topic text NOT NULL,
+   PRIMARY KEY (id),
+   KEY article_id (article_id),
+   FULLTEXT KEY normalized_text (normalized_text),
+   FULLTEXT KEY normalized_topic (normalized_topic),
+   FULLTEXT KEY normalized_fields (normalized_text, normalized_topic)
+   ) TYPE=MyISAM;";
+
+
+
+   // ---
+   // changes needed to update from 0.3 to 1.0
+   $Changes["Articles"] = Array( "ALTER TABLE {dbprefix}articles CHANGE status old_status ENUM('published', 'draft', 'deleted' )",
+                                 "ALTER TABLE {dbprefix}articles ADD COLUMN status INTEGER(5) NOT NULL DEFAULT 1",
+                                 "ALTER TABLE {dbprefix}articles ADD COLUMN slug VARCHAR(255) NOT NULL DEFAULT ''",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY num_reads(num_reads)",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY category_id(category_id)",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY blog_id(blog_id)",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY slug(slug)",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY user_id(user_id)",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY blog_id_slug(blog_id,slug)",
+                                 "ALTER TABLE {dbprefix}articles ADD KEY blog_id_slug_category_id(blog_id,slug,category_id)");
+
+    $Changes["Article Categories"] = Array( "ALTER TABLE {dbprefix}articles_categories ADD COLUMN parent_id INTEGER(10) NOT NULL DEFAULT 0",
+                                            "ALTER TABLE {dbprefix}articles_categories ADD COLUMN mangled_name VARCHAR(255) NOT NULL DEFAULT ''",
+                                            "ALTER TABLE {dbprefix}articles_categories ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
+                                            "ALTER TABLE {dbprefix}articles_categories ADD COLUMN description TEXT NOT NULL DEFAULT ''",
+                                            "ALTER TABLE {dbprefix}articles_categories ADD KEY parent_id(parent_id)",
+                                            "ALTER TABLE {dbprefix}articles_categories ADD KEY blog_id(blog_id)",
+                                            "ALTER TABLE {dbprefix}articles_categories ADD KEY mangled_name(mangled_name)");
+
+
+    $Changes["User Comments"] = Array( "ALTER TABLE {dbprefix}articles_comments ADD COLUMN normalized_text TEXT NOT NULL DEFAULT ''",
+                                       "ALTER TABLE {dbprefix}articles_comments ADD COLUMN normalized_topic TEXT NOT NULL DEFAULT ''",
+                                       "ALTER TABLE {dbprefix}articles_comments ADD FULLTEXT normalized_text(normalized_text)",
+                                       "ALTER TABLE {dbprefix}articles_comments ADD FULLTEXT normalized_topic(normalized_topic)",
+                                       "ALTER TABLE {dbprefix}articles_comments ADD FULLTEXT normalized_text_topic(normalized_topic,normalized_text)",
+                                       "ALTER TABLE {dbprefix}articles_comments ADD KEY parent_id(parent_id)",
+                                       "ALTER TABLE {dbprefix}articles_comments ADD KEY article_id(article_id)");
+
+    $Changes["Notifications"] = Array( "ALTER TABLE {dbprefix}articles_notifications ADD KEY article_id(article_id)",
+                                       "ALTER TABLE {dbprefix}articles_notifications ADD KEY user_id(user_id)",
+                                       "ALTER TABLE {dbprefix}articles_notifications ADD KEY blog_id(blog_id)");
+
+    $Changes["Blogs"] = Array( "ALTER TABLE {dbprefix}blogs ADD COLUMN mangled_blog VARCHAR(50) NOT NULL DEFAULT ''",
+                               "ALTER TABLE {dbprefix}blogs ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
+                               "ALTER TABLE {dbprefix}blogs ADD COLUMN status INTEGER(4) NOT NULL DEFAULT '1'",
+                               "ALTER TABLE {dbprefix}blogs ADD COLUMN show_in_summary INTEGER(4) NOT NULL DEFAULT '1'",
+                               "ALTER TABLE {dbprefix}blogs ADD KEY owner_id(owner_id)",
+                               "ALTER TABLE {dbprefix}blogs ADD KEY mangled_blog(mangled_blog)");
+
+    $Changes["Referrers"] = Array( "ALTER TABLE {dbprefix}referers ADD KEY article_id(article_id)",
+                                   "ALTER TABLE {dbprefix}referers ADD KEY blog_id(blog_id)",
+                                   "ALTER TABLE {dbprefix}referers ADD   KEY blog_id_article_id (blog_id, article_id)");
+
+    $Changes["Trackbacks"] = Array( "ALTER TABLE {dbprefix}trackbacks ADD KEY article_id(article_id)" );
+
+    $Changes["Filtered Content"] = Array( "ALTER TABLE {dbprefix}filtered_content ADD KEY blog_id(blog_id)" );
+
+    $Changes["Blocked hosts"] = Array( "ALTER TABLE {dbprefix}host_blocking_rules ADD KEY blog_id(blog_id)" );
+
+    $Changes["Gallery Albums"] = Array( "ALTER TABLE {dbprefix}gallery_albums ADD COLUMN normalized_name VARCHAR(255) NOT NULL DEFAULT ''",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD COLUMN normalized_description TEXT NOT NULL DEFAULT ''",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD COLUMN mangled_name VARCHAR(255) NOT NULL DEFAULT ''",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD FULLTEXT normalized_name(normalized_name)",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD FULLTEXT normalized_description(normalized_description)",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD FULLTEXT normalized_name_description(normalized_name, normalized_description)",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY parent_id(parent_id)",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY owner_id(owner_id)",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY mangled_name(mangled_name)",
+                                        "ALTER TABLE {dbprefix}gallery_albums ADD KEY owner_id_mangled_name(owner_id,mangled_name)");
+
+    $Changes["Gallery Resources"] = Array( "ALTER TABLE {dbprefix}gallery_resources ADD COLUMN normalized_description TEXT NOT NULL DEFAULT ''",
+                                           "ALTER TABLE {dbprefix}gallery_resources ADD FULLTEXT normalized_description(normalized_description)",
+                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY album_id(album_id)",
+                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY owner_id(owner_id)",
+                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY file_name(file_name)",
+                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY album_id_owner_id(album_id,owner_id)",
+                                           "ALTER TABLE {dbprefix}gallery_resources ADD KEY resource_type(resource_type)");
+
+
+    $Changes["Links"] = Array( "ALTER TABLE {dbprefix}mylinks ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
+                               "ALTER TABLE {dbprefix}mylinks ADD COLUMN date TIMESTAMP(14)",
+                               "ALTER TABLE {dbprefix}mylinks ADD COLUMN rss_feed VARCHAR(255) NOT NULL DEFAULT ''",
+                               "ALTER TABLE {dbprefix}mylinks ADD KEY blog_id(blog_id)",
+                               "ALTER TABLE {dbprefix}mylinks ADD KEY category_id(category_id)");
+
+    $Changes["Links Categories"] = Array( "ALTER TABLE {dbprefix}mylinks_categories ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
+                                          "ALTER TABLE {dbprefix}mylinks_categories ADD COLUMN last_modification timestamp(14) NOT NULL",
+                                          "ALTER TABLE {dbprefix}mylinks_categories ADD KEY blog_id(blog_id)");
+
+    $Changes["Users"] = Array( "ALTER TABLE {dbprefix}users ADD COLUMN full_name VARCHAR(255) NOT NULL DEFAULT ''",
+                                "ALTER TABLE {dbprefix}users ADD COLUMN properties TEXT NOT NULL DEFAULT ''",
+                                "ALTER TABLE {dbprefix}users ADD COLUMN resource_picture_id INTEGER(10) NOT NULL DEFAULT 0",
+                                "ALTER TABLE {dbprefix}users ADD COLUMN status INTEGER(4) NOT NULL DEFAULT 1" );
+
+    $Changes["Bayesian Filter data table"] = Array( "ALTER TABLE {dbprefix}bayesian_filter_info ADD KEY blog_id(blog_id)" );
+
+    $Changes["Permissions"] = Array( "ALTER TABLE {dbprefix}users_permissions ADD KEY user_id(user_id)",
+                                     "ALTER TABLE {dbprefix}users_permissions ADD KEY blog_id(blog_id)",
+                                     "ALTER TABLE {dbprefix}users_permissions ADD KEY user_id_permission_id(user_id,permission_id)");
+
+   // ---
+
+   // ---
+   // end of changes needed in 1.0
+   // ---
+
+$Inserts[0] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('comments_enabled','1',1);";
+$Inserts[1] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('rdf_enabled','1',1);";
+$Inserts[2] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('temp_folder','./tmp',3);";
+$Inserts[3] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('base_url','{plog_base_url}',3);";
+$Inserts[4] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('show_posts_max','15',1);";
+$Inserts[5] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('recent_posts_max','10',1);";
+$Inserts[6] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_template','standard',3);";
+$Inserts[7] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('template_folder','./templates',3);";
+$Inserts[8] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_blog_id','1',1);";
+$Inserts[9] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_locale','en_UK',3);";
+$Inserts[10] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('html_allowed_tags_in_comments','<a><i><br><br/><b>',3);";
+$Inserts[11] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('referer_tracker_enabled','1',1);";
+$Inserts[12] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('rss_parser_enabled','1',1);";
+$Inserts[13] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('show_more_enabled','1',1);";
+$Inserts[14] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('show_more_threshold','150',1);";
+$Inserts[15] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('update_article_reads','1',1);";
+$Inserts[16] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('email_service_enabled','1',1);";
+$Inserts[17] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('post_notification_source_address','noreply at your.host.com',3);";
+$Inserts[18] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('request_format_mode','1',1);";
+$Inserts[19] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('xmlrpc_ping_hosts','a:2:{i:0;s:27:\"http://rpc.weblogs.com/RPC2\";i:1;s:0:\"\";}',5);";
+$Inserts[20] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('trackback_server_enabled','1',1);";
+$Inserts[21] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('htmlarea_enabled','1',1);";
+$Inserts[22] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('plugin_manager_enabled','1',1);";
+$Inserts[23] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('check_email_address_validity','0',1);";
+$Inserts[24] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('summary_page_show_max','15',1);";
+$Inserts[25] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('minimum_password_length','4',1);";
+$Inserts[26] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('templates','a:3:{i:0;s:7:\"blueish\";i:1;s:4:\"grey\";i:2;s:8:\"standard\";}',5);";
+$Inserts[27] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('locales','a:0:{}',5)";
+$Inserts[28] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('email_service_type','php',3);";
+$Inserts[29] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_host','your.smtp.host.com',3);";
+$Inserts[30] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_port','25',1);";
+$Inserts[31] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_use_authentication','0',1);";
+$Inserts[32] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_username','',3);";
+$Inserts[33] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('smtp_password','',3);";
+$Inserts[34] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('locale_folder','./locale',3);";
+$Inserts[35] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('xmlrpc_ping_enabled','0',1);";
+$Inserts[36] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_tar','{path_to_tar}',3);";
+$Inserts[37] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_gzip','{path_to_gzip}',3);";
+$Inserts[38] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_bz2','{path_to_bz2}',3);";
+$Inserts[39] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_unzip','{path_to_unzip}',3);";
+$Inserts[40] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('users_can_add_templates',1,1);";
+$Inserts[41] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('maximum_file_upload_size', 2000000, 1);";
+$Inserts[42] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('upload_forbidden_files', '*.php *.php3 *.php4 *.phtml *.htm *.html *.exe *.com *.bat .htaccess *.sh', 3);";
+$Inserts[43] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('comments_order', 1, 1);";
+$Inserts[44] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('security_pipeline_enabled', 1, 1);";
+$Inserts[45] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('maximum_comment_size', 0, 1 );";
+$Inserts[46] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('resources_enabled', 1, 1 );";
+$Inserts[47] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnail_method', 'gd', 3);";
+$Inserts[48] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('path_to_convert', '{path_to_convert}', 3);";
+$Inserts[49] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnail_height', 120, 1);";
+$Inserts[50] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnail_width', 120, 1);";
+$Inserts[51] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('thumbnails_keep_aspect_ratio', 1, 1);";
+$Inserts[52] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('xmlrpc_api_enabled', 1, 1);";
+$Inserts[53] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('uploads_enabled', 1, 1);";
+$Inserts[54] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES ('default_rss_profile', 'rss090', 3);";
+$Inserts[55] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_enabled', 1, 2);";
+$Inserts[56] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_spam_probability_treshold', '0.9', 6);";
+$Inserts[57] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_nonspam_probability_treshold', '0.2', 6);";
+$Inserts[58] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_min_length_token', '3', 1);";
+$Inserts[59] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_max_length_token', '100', 1);";
+$Inserts[60] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_number_significant_tokens', 15, 1);";
+$Inserts[61] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('bayesian_filter_spam_comments_action', 0, 1 );";
+$Inserts[62] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('ip_address_filter_enabled', 1, 1 );";
+$Inserts[63] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('content_filter_enabled', 1, 1 );";
+$Inserts[64] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('thumbnail_format','same',3);";
+$Inserts[65] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resources_folder','./gallery/',3);";
+$Inserts[66] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('beautify_comments_text', '1', 1);";
+$Inserts[67] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('disable_apache_error_handler', '0', 1);";
+$Inserts[68] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('show_future_posts_in_calendar', '0', 1);";
+$Inserts[69] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('xhtml_converter_enabled', '1', 1);";
+$Inserts[70] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('xhtml_converter_aggresive_mode_enabled', '0', 1);";
+$Inserts[71] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('search_engine_enabled', '1', 1);";
+$Inserts[72] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('search_in_custom_fields', '1', 1);";
+$Inserts[73] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('search_in_comments', '1', 1);";
+$Inserts[74] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resources_quota', '0', 1);";
+$Inserts[75] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('category_link_format', '/blog/{blogname}/{catname}$', 3);";
+$Inserts[76] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('blog_link_format', '/blog/{blogname}$', 3);";
+$Inserts[77] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('archive_link_format', '/blog/{blogname}/archives/{year}/?{month}/?{day}', 3);";
+$Inserts[78] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('user_posts_link_format', '/blog/{blogname}/user/{username}$', 3);";
+$Inserts[79] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('post_trackbacks_link_format', '/blog/{blogname}/post/trackbacks/{postname}$', 3);";
+$Inserts[80] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_link_format', '/blog/{blogname}/page/{templatename}$', 3);";
+$Inserts[81] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('album_link_format', '/blog/{blogname}/album/{albumname}$', 3);";
+$Inserts[82] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_link_format', '/blog/{blogname}/resource/{albumname}/{resourcename}$', 3);";
+$Inserts[83] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_preview_link_format', '/blog/{blogname}/resource/{albumname}/preview/{resourcename}$', 3);";
+$Inserts[84] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_download_link_format', '/blog/{blogname}/resource/{albumname}/download/{resourcename}$', 3);";
+$Inserts[85] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('permalink_format', '/blog/{blogname}/{catname}/{year}/{month}/{day}/{postname}$', 3);";
+$Inserts[86] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('script_name', 'index.php', 3);";
+$Inserts[87] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('thumbnail_generator_use_smoothing_algorithm', '0', 1);";
+$Inserts[88] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_server_use_http_caching', '1', 1);";
+$Inserts[89] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('medium_size_thumbnail_width', '640', 1);";
+$Inserts[90] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('medium_size_thumbnail_height', '480', 1);";
+$Inserts[91] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('resource_medium_size_preview_link_format', '/blog/{blogname}/resource/{albumname}/preview-med/{resourcename}$', 3);";
+$Inserts[92] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('subdomains_enabled', '0', 1);";
+$Inserts[93] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('include_blog_id_in_url', '1', 1);";
+$Inserts[94] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('send_xmlrpc_pings_enabled_by_default', '1', 1);";
+$Inserts[95] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('forbidden_usernames', 'admin www blog ftp wiki forums', 3);";
+$Inserts[96] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('force_registration_confirmation', '0', 1);";
+$Inserts[97] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('summary_blogs_per_page', '25', 3);";
+$Inserts[98] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('subdomains_base_url', '', 3);";
+$Inserts[99] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('autosave_new_drafts_time_millis', '300000', 3);";
+$Inserts[100] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('save_drafts_via_xmlhttprequest_enabled', '1', 1);";
+$Inserts[101] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('need_email_confirm_registration', '1', 1);";
+$Inserts[102] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('force_one_blog_per_email_account', '0', 1);";
+$Inserts[103] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('summary_show_agreement', '1', 1);";
+$Inserts[104] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('default_time_offset', '0', 3);";
+$Inserts[105] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_cache_enabled', '1', 1);";
+$Inserts[106] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_http_cache_enabled', '0', 1);";
+$Inserts[107] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_http_cache_enabled', '0', 1);";
+$Inserts[108] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_compile_check', '1', 1);";
+$Inserts[109] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('update_cached_article_reads', '1', 1);";
+$Inserts[110] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('allow_php_code_in_templates', '0', 1);";
+$Inserts[111] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('thumbnail_generator_use_smoothing_algorithm', '1', 1);";
+$Inserts[112] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('template_cache_lifetime', '-1', 3);";
+$Inserts[113] = "INSERT INTO {dbprefix}config (config_key, config_value, value_type) VALUES('use_http_accept_language_detection', '0', 1);";
+
+    /**
+     * Open a connection to the database
+     */
+     function connectDb( $ignoreError = false , $selectDatabase = true )
+     {
+        $config = new ConfigFileStorage();
+        // open a connection to the database
+        $db = NewADOConnection( 'mysql' );
+        if ( $selectDatabase ) {
+            $res = $db->Connect($config->getValue( "db_host" ), $config->getValue( "db_username" ), $config->getValue( "db_password" ), $config->getValue( "db_database" ));
+        } else {
+            $res = $db->Connect($config->getValue( "db_host" ), $config->getValue( "db_username" ), $config->getValue( "db_password" ));
+        }
+
+        if( DB_WIZARD_DEBUG )
+            $db->debug = true;
+
+        // return error
+        if( $ignoreError )
+            return $db;
+
+        if( !$res )
+            return false;
+
+        return $db;
+    }
+
+    /**
+     * Returns the database prefix
+     */
+    function getDbPrefix()
+    {
+        $config = new ConfigFileStorage();
+        return $config->getValue( "db_prefix" );
+    }
+
+    /**
+     * some useful little functions
+     */
+    class WizardTools extends Object
+    {
+       /**
+        * returns true if plog has already been installed before or
+        * false otherwise
+        */
+       function isNewInstallation()
+       {
+           $configFile = new ConfigFileStorage();
+           // if plog hasn't been installed, this file will have empty settings
+           if( $configFile->getValue( "db_host") == "" && $configFile->getValue( "db_username") == "" &&
+               $configFile->getValue( "db_database") == "" && $configFile->getValue( "db_prefix" ) == "" &&
+               $configFile->getValue( "db_password" ) == "" )
+               $isNew = true;
+           else
+               $isNew = false;
+
+           return( $isNew );
+       }
+    }
+
+    /**
+     * Renders a template file.
+     */
+    class WizardView extends View
+    {
+
+        var $_templateName;
+
+        function WizardView( $templateName )
+        {
+            $this->View();
+            $this->_templateName = $templateName;
+        }
+
+        function render()
+        {
+            // build the file name
+            $templateFileName = "wizard/".$this->_templateName.".template";
+
+            //$t = new Template( $templateFileName, "" );
+            $t = new Smarty();
+            $v = new Version();
+            $this->_params->setValue( "version", $v->getVersion());
+            $this->_params->setValue( "projectPage", $v->getProjectPage());
+            $this->_params->setValue( "safeMode", ini_get("safe_mode"));
+            $t->assign( $this->_params->getAsArray());
+            $t->template_dir    = "./templates";
+            $t->compile_dir     = TEMP_FOLDER;
+            $t->cache_dir       = TEMP_FOLDER;
+            $t->use_sub_dirs    = false;
+            $t->caching = false;
+
+            print $t->fetch( $templateFileName );
+        }
+    }
+
+    /**
+     * Gets the information about the database from the user.
+     */
+    class WizardIntro extends Action
+    {
+        function WizardIntro( $actionInfo, $request )
+        {
+            $this->Action( $actionInfo, $request );
+        }
+
+        function perform()
+        {
+            // we can detect whether plog is already installed or not and direct users to the right
+            // place
+            if( WizardTools::isNewInstallation())
+                $this->_view = new WizardView( "intro" );
+            else {
+                Controller::setForwardAction( "Update1" );
+                return false;
+            }
+
+            $this->setCommonData();
+            return true;
+        }
+    }
+
+    /**
+     *
+     * Saves data to the configuration file
+     *
+     */
+    class WizardStepOne extends Action
+    {
+
+        var $_dbServer;
+        var $_dbUser;
+        var $_dbPassword;
+        var $_dbName;
+        var $_dbPrefix;
+
+        function WizardStepOne( $actionInfo, $request )
+        {
+            $this->Action( $actionInfo, $request );
+
+            // data validation
+            $this->registerFieldValidator( "dbServer", new StringValidator());
+            $this->registerFieldValidator( "dbUser", new StringValidator());
+            $this->registerFieldValidator( "dbPassword",  new StringValidator(), true );
+            $this->registerFieldValidator( "dbName", new StringValidator());
+            $this->registerFieldValidator( "dbPrefix", new StringValidator(), true );
+            $errorView = new WizardView( "intro" );
+            $errorView->setErrorMessage( "Some data was incorrect or missing." );
+            $this->setValidationErrorView( $errorView );
+        }
+
+        function perform()
+        {
+            // fetch the data needed from the request
+            $this->_dbServer   = $this->_request->getValue( "dbServer" );
+            $this->_dbUser     = $this->_request->getValue( "dbUser" );
+            $this->_dbPassword = $this->_request->getValue( "dbPassword" );
+            $this->_dbName     = $this->_request->getValue( "dbName" );
+            $this->_skipThis   = $this->_request->getValue( "skipDbInfo" );
+            $this->_dbPrefix   = $this->_request->getValue( "dbPrefix", DEFAULT_DB_PREFIX );
+
+            // we should now save the data to the configuration file, just before
+            // we read it
+            $configFile = new ConfigFileStorage();
+
+            // we expect everything to be fine
+            $errors = false;
+
+            // before doing anything, we should check of the configuration file is
+            // writable by this script, or else, throw an error and bail out gracefully
+            $configFileName = $configFile->getConfigFileName();
+            if( !File::exists( $configFileName )) {
+                if (! File::touch( $configFileName ) ) {
+                    $this->_view = new WizardView( "intro" );
+                    $message = "Could not create the pLog configuration file $configFileName. Please make sure
+                                that the file can be created by the user running the webserver. It is needed to
+                                store the database configuration settings.";
+                    $this->_view->setErrorMessage( $message );
+                    $this->setCommonData( true );
+                    return false;
+                } else {
+                    ConfigFileStorage::createConfigFile( $configFileName );
+                }
+            }
+            if( File::exists( $configFileName ) && !File::isWritable( $configFileName )) {
+                $this->_view = new WizardView( "intro" );
+                $message = "Please make sure that the file $configFileName can be written by this script during
+                            the installation process. It is needed to store the database configuration settings. Once the
+                            installation is complete, please revert the permissions to no writing possible.";
+                $this->_view->setErrorMessage( $message );
+                $this->setCommonData( true );
+                return false;
+            }
+
+            // continue if everything went fine
+            if( !$configFile->saveValue( "db_username", $this->_dbUser ) ||
+                !$configFile->saveValue( "db_password", $this->_dbPassword ) ||
+                !$configFile->saveValue( "db_host", $this->_dbServer ) ||
+                !$configFile->saveValue( "db_database", $this->_dbName ) ||
+                !$configFile->saveValue( "db_prefix", $this->_dbPrefix )) {
+                $errors = true;
+            }
+
+            if( $errors ) {
+                $message = "Could not save values to the configuration file. Please make sure it is available and
+                            that has write permissions for the user under your web server is running.";
+                $this->_view = new WizardView( "intro" );
+                $this->_view->setErrorMessage( $message );
+
+                return( false );
+            }
+            else {
+                $this->_view = new WizardView( "step1" );
+
+                // now we better read the information from the config file to make sure that
+                // it has been correctly saved
+                $this->setCommonData( true );
+
+                return true;
+            }
+        }
+    }
+
+    /**
+     *
+     * Second step where we connect to the database and create the tables.
+     *
+     */
+    class WizardStepTwo extends Action
+    {
+
+        var $_db;
+        var $_database;
+        var $_createDatabase;
+
+        function setDbConfigValues( &$view )
+        {
+            $configFile = new ConfigFileStorage();
+            $configFile->reload();
+            $view->setValue( "dbUser", $configFile->getValue( "db_username" ));
+            $view->setValue( "dbPassword", $configFile->getValue( "db_password" ));
+            $view->setValue( "dbServer", $configFile->getValue( "db_host" ));
+            $view->setValue( "dbName", $configFile->getValue( "db_database" ));
+            $view->setValue( "dbPrefix", $configFile->getValue( "db_prefix" ));
+            return true;
+        }
+
+        function perform()
+        {
+            global $Tables;
+            global $Inserts;
+
+            $createDb = $this->_request->getValue( "createDatabase" );
+
+            // only check for errors in case the database table should already exist!
+            if( !$createDb ) {
+                $connectionEsablished = false;
+
+                // Lets check the 'everything is fine' case first..
+                $this->_db = connectDb();
+                if( $this->_db ) {
+                     $connectionEsablished = true;
+                } else {
+                     $connectionEsablished = false;
+                     $message = "There was an error selecting the database. Please verify the database was already created or check the 'Create database' checkbox.";
+                }
+
+                // We were unable to connect to the db and select the right db.. lets try
+                // just to connect.. maybe the database needs to be created (even though the
+                // user did not check the appropriate box).
+                if ( !$connectionEsablished ) {
+                    $this->_db = connectDb( true, false );
+                    if( !$this->_db ) {
+                         $message = "There was an error connecting to the database. Please check your settings.";
+                    }
+                }
+
+                if ( !$connectionEsablished ) {
+                    $this->_view = new WizardView( "step1" );
+                    $this->setDbConfigValues( $this->_view );
+                    $this->_view->setErrorMessage( $message );
+                    $this->setCommonData( true );
+                    return false;
+                }
+            }
+
+            $config = new ConfigFileStorage();
+            $this->_database = $config->getValue( "db_database" );
+            $this->_dbPrefix = $config->getValue( "db_prefix" );
+
+            // create the database
+            if( $createDb ) {
+                $this->_db = connectDb( false, false );
+                if( !$this->_db->Execute( "CREATE DATABASE ".$this->_database )) {
+                    $message = "Error creating the database: ".$this->_db->ErrorMsg();
+                    $this->_view = new WizardView( "step1" );
+                    $this->setDbConfigValues( $this->_view );
+                    $this->_view->setErrorMessage( $message );
+                    $this->setCommonData( true );
+                    return false;
+                } else {
+                    $message = "Database created successfully.<br/>";
+                }
+            }
+
+            // reconnect using the new database.
+            $config = new ConfigFileStorage();
+            $this->_db->Connect($config->getValue( "db_host" ), $config->getValue( "db_username" ), $config->getValue( "db_password" ), $config->getValue( "db_database" ));
+
+            // create the tables
+            $errors = false;
+            foreach( $Tables as $table ) {
+                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $table["code"] );
+                if( $this->_db->Execute( $query ))
+                    $message .= "Table <strong>".$table["desc"]."</strong> created successfully.<br/>";
+                else {
+                    $message .= "Error creating table: ".$this->_db->ErrorMsg()."<br/>";
+                    $errors = true;
+                }
+            }
+
+            if( $errors ) {
+                $message = "There was an error creating the tables in the database. Please make sure that the user chosen to connect to the database has enough permissions to create tables.<br/><br/>$message";
+                $this->_view = new WizardView( "step1" );
+                $this->_view->setErrorMessage( $message );
+                $this->setDbConfigValues( $this->_view );
+                $this->setCommonData();
+                return false;
+            }
+
+            // try to guess the url where plog is running
+             // try to guess the url where plog is running
+             $httpProtocol = (array_key_exists("HTTPS", $_SERVER) && $_SERVER["HTTPS"] == "on") ? "https://" : "http://";
+             $httpHost = $_SERVER["HTTP_HOST"];
+             $requestUrl = $_SERVER["REQUEST_URI"];
+             $requestUrl = str_replace( "/wizard.php", "", $requestUrl );
+             $plogUrl = $httpProtocol.$httpHost.$requestUrl;
+
+            // Find some of the tools we are going to need (last one is for os x, with fink installed)
+            // TBD: support for Windows specific directories
+            $folders = Array( "/bin/", "/usr/bin/", "/usr/local/bin/", "/sw/bin/" );
+            $finder = new FileFinder();
+            $pathToUnzip = $finder->findBinary( "unzip", $folders );
+            $pathToTar = $finder->findBinary( "tar", $folders);
+            $pathToGzip = $finder->findBinary( "gzip", $folders);
+            $pathToBzip2 = $finder->findBinary( "bzip2", $folders);
+            $pathToConvert = $finder->findBinary( "convert", $folders);
+
+            // and execute some insert's
+            foreach( $Inserts as $insert ) {
+                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $insert );
+                $query = str_replace( "{plog_base_url}", $plogUrl, $query );
+                // replace also the placeholders for the paths to the tools
+                $query = str_replace( "{path_to_tar}", $pathToTar, $query );
+                $query = str_replace( "{path_to_unzip}", $pathToUnzip, $query );
+                $query = str_replace( "{path_to_bz2}", $pathToBzip2, $query );
+                $query = str_replace( "{path_to_gzip}", $pathToGzip, $query );
+                $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
+                $query = str_replace( "{path_to_convert}", $pathToConvert, $query );
+                if( !$this->_db->Execute( $query )) {
+                    $message .= "Error executing code: ".$this->_db->ErrorMsg()."<br/>";
+                    $errors = true;
+                }
+            }
+
+            //
+            // show some information regarding the helper tools we're going to need
+            // and wether they were found or not
+            //
+            $message .= "<br/><b>-- Helper tools --</b><br/>";
+            if( $pathToTar == "" )
+                $message .= "The helper tool 'tar' was not found<br/>";
+            else
+                $message .= "The helper tool 'tar' was found in $pathToTar<br/>";
+            if( $pathToGzip == "" )
+                $message .= "The helper tool 'gzip' was not found<br/>";
+            else
+                $message .= "The helper tool 'gzip' was found in $pathToGzip<br/>";
+            if( $pathToUnzip == "" )
+                $message .= "The helper tool 'unzip' was not found<br/>";
+            else
+                $message .= "The helper tool 'unzip' was found in $pathToUnzip<br/>";
+            if( $pathToBzip2 == "" )
+                $message .= "The helper tool 'bzip2' was not found<br/>";
+            else
+                $message .= "The helper tool 'bzip2' was found in $pathToTar<br/>";
+            if( $pathToConvert == "" )
+                $message .= "The helper tool 'convert' (from the ImageMagick package) was not found<br/>";
+            else
+                $message .= "The helper tool 'convert' (from the ImageMagick package) was found in $pathToConvert<br/>";
+
+            if( $errors ) {
+                $this->_view = new WizardView( "step1" );
+                $this->setDbConfigValues( $this->_view );
+                $message = "There was an error initializing some of the tables. Please make sure that the user chosen to connect to the database has enough permissions to add records to the database.<br/><br/>$message";
+                $this->_view->setErrorMessage( $message );
+                $this->setCommonData();
+            }
+            else {
+                $this->_view = new WizardView( "step2" );
+                $this->_view->setValue( "message", $message );
+            }
+
+            // Scan for locales
+            $locales = new Locales();
+            // find all the new locales that we have not yet stored
+            $f = new LocaleFinder();
+            $newLocaleCodes = $f->find();
+
+            foreach( $newLocaleCodes as $newLocaleCode ) {
+                $res = $locales->addLocale( $newLocaleCode );
+            }
+
+            return true;
+        }
+    }
+
+    /**
+     *
+     * this action only shows some feedback
+     *
+     */
+    class WizardStepThree extends Action
+    {
+        function perform()
+        {
+            $this->_view = new WizardView( "step3" );
+            $this->setCommonData();
+        }
+    }
+
+    /**
+     *
+     * Create the first user in the database
+     *
+     */
+    class WizardStepFour extends Action
+    {
+
+        var $_userName;
+        var $_userPassword;
+        var $_confirmPassword;
+        var $_userEmail;
+        var $_userFullName;
+
+        function WizardStepFour( $actionInfo, $request )
+        {
+            $this->Action( $actionInfo, $request );
+
+            $this->registerFieldValidator( "userName", new StringValidator());
+            $this->registerFieldValidator( "userPassword", new PasswordValidator());
+            $this->registerFieldValidator( "userPasswordCheck", new PasswordValidator());
+            $this->registerFieldValidator( "userEmail", new EmailValidator());
+            $this->registerField( "userFullName" );
+            $view = new WizardView( "step3" );
+            $view->setErrorMessage( "Some data is missing or incorrect" );
+            $this->setValidationErrorView( $view );
+        }
+
+        // creates the user
+        function perform()
+        {
+            $this->_userName = $this->_request->getValue( "userName" );
+            $this->_userPassword = $this->_request->getValue( "userPassword" );
+            $this->_confirmPassword = $this->_request->getValue( "userPasswordCheck" );
+            $this->_userEmail = $this->_request->getValue( "userEmail" );
+            $this->_userFullName = $this->_request->getValue( "userFullName" );
+
+            $db = connectDb();
+
+            if( !$db ) {
+                $this->_view = new WizardView( "step3" );
+                $this->_view->setErrorMessage( "There was an error connecting to the database. Please check your settings." );
+                $this->setCommonData();
+                return false;
+            }
+
+            if( $this->_confirmPassword != $this->_userPassword ) {
+                $this->_view = new WizardView( "step3" );
+                $this->_form->setFieldValidationStatus( "userPasswordCheck", false );
+                $this->setCommonData( true );
+                return false;
+            }
+
+            $dbPrefix = Db::getPrefix();
+
+            $users = new Users();
+            $user = new UserInfo( $this->_userName,
+                                  $this->_userPassword,
+                                  $this->_userEmail,
+                                  "",
+                                  $this->_userFullName);
+            $userId = $users->addUser( $user );
+            if( !$userId ) {
+                $this->_view = new WizardView( "step3" );
+                $message = "There was an error adding the user. Make sure that the user does not already exist in the database (".$users->DbError().")";
+                $this->_view->setErrorMessage( $message );
+                $this->setCommonData();
+                return false;
+            }
+
+            // we also have to execute the code to give administrator privileges to this user
+            $query = "INSERT INTO {$dbPrefix}users_permissions(user_id,blog_id,permission_id) VALUES( $userId, 0, 1 );";
+            $db->Execute( $query );
+
+            $this->_view = new Wizardview( "step4" );
+            $this->_view->setValue( "ownerid", $userId );
+            $this->_view->setValue( "siteLocales", Locales::getLocales());
+            $this->_view->setValue( "defaultLocale", Locales::getDefaultLocale());
+            $ts = new TemplateSets();
+            $this->_view->setValue( "siteTemplates", $ts->getGlobalTemplateSets());
+            $this->setCommonData();
+            return true;
+        }
+
+    }
+
+    class WizardStepFive extends Action
+    {
+
+        var $_blogName;
+        var $_ownerId;
+        var $_blogProperties;
+
+        function WizardStepFive( $actionInfo, $request )
+        {
+              $this->Action( $actionInfo, $request );
+
+              $this->registerFieldValidator( "blogName", new StringValidator());
+              $this->registerFieldValidator( "ownerid", new IntegerValidator());
+              $this->registerFieldValidator( "blogTemplate", new StringValidator());
+              $this->registerFieldValidator( "blogLocale", new StringValidator());
+              $view = new WizardView( "step4" );
+              $view->setErrorMessage( "Some data is missing or incorrect" );
+              $view->setValue( "siteLocales", Locales::getLocales());
+              $ts = new TemplateSets();
+              $view->setValue( "siteTemplates", $ts->getGlobalTemplateSets());
+              $this->setValidationErrorView( $view );
+        }
+
+        function perform()
+        {
+            // retrieve the values from the view
+            $this->_blogName = $this->_request->getValue( "blogName" );
+            $this->_ownerId  = $this->_request->getValue( "ownerid" );
+            $this->_blogProperties = $this->_request->getValue( "properties" );
+            $this->_blogTemplate = $this->_request->getValue( "blogTemplate" );
+            $this->_blogLocale = $this->_request->getValue( "blogLocale" );
+
+            // configure the blog
+            $blogs = new Blogs();
+            $blog = new BlogInfo( $this->_blogName, $this->_ownerId, "", "" );
+            $blog->setProperties( $this->_blogProperties );
+            $blog->setStatus( BLOG_STATUS_ACTIVE );
+            $blogSettings = $blog->getSettings();
+            $blogSettings->setValue( "locale", $this->_blogLocale );
+            $blogSettings->setValue( "template", $this->_blogTemplate );
+            $blog->setSettings( $blogSettings );
+
+            // and now save it to the database
+            $newblogId = $blogs->addBlog( $blog );
+            if( !$newblogId ) {
+                $this->_view = new WizardView( "step4" );
+                $this->_view->setValue( "siteLocales", Locales::getLocales());
+                $ts = new TemplateSets();
+                $this->_view->setValue( "siteTemplates", $ts->getGlobalTemplateSets());
+                $this->_view->setErrorMessage( "There was an error creating the new blog" );
+                $this->setCommonData( true );
+                return false;
+            }
+
+            // if the blog was created, we can add some basic information
+            // add a category
+            $articleCategories = new ArticleCategories();
+            $articleCategory = new ArticleCategory( "General", "", $newblogId, true );
+            $catId = $articleCategories->addArticleCategory( $articleCategory );
+
+            // load the right locale
+            $locale =& Locales::getLocale( $this->_blogLocale );
+            // and load the right text
+            $articleTopic = $locale->tr( "register_default_article_topic" );
+            $articleText  = $locale->tr( "register_default_article_text" );
+            $article = new Article( $articleTopic, $articleText, Array( $catId ), $this->_ownerId, $newblogId, POST_STATUS_PUBLISHED, 0, Array(), "welcome" );
+            $t = new Timestamp();
+            $article->setDateObject( $t );
+            $articles = new Articles();
+            $articles->addArticle( $article );
+
+            // save a few things in the default configuration
+            $config =& Config::getConfig();
+            // default blog id
+            $config->saveValue( "default_blog_id", (int)$newblogId );
+            // default locale
+            $config->saveValue( "default_locale", $this->_blogLocale );
+            // and finally, the default template
+            $config->saveValue( "default_template", $this->_blogTemplate );
+
+            //
+            // detect wether we have GD available and set the blog to use it
+            //
+            if( GdDetector::detectGd()) {
+                $config->saveValue( "thumbnail_method", "gd" );
+                $message = "GD has been detected and set as the backend for dealing with images.";
+            }
+            else {
+                $pathToConvert = $config->getValue( "path_to_convert" );
+                if( $pathToConvert ) {
+                    $config->saveValue( "thumbnail_method", "imagemagick" );
+                    $message = "ImageMagick has been detected and set as the backend for dealing with images.";
+                }
+                else {
+                    // nothing was found, so we'll have to do away with the 'null' resizer...
+                    $config->saveValue( "thumbnail_method", "null" );
+                    $message = "Neither GD nor ImageMagick have been detected in this host so it will not be possible to generate thumbnails from images.";
+                }
+            }
+
+            $this->_view = new WizardView( "step5" );
+            $this->_view->setValue( "message", $message );
+            return true;
+        }
+    }
+
+    //
+    // The following classes take care of updating the database to the last release
+    //
+    // Things that need to be done when going from 0.3.x to 1.0:
+    //
+    // - add the new tables:
+    //     plog_article_categories_link
+    //     plog_custom_fields_definition
+    //     plog_custom_fields_values
+    //
+    // - make modifications to some of the old tables:
+    //     plog_articles
+    //          normalized_text: TEXT
+    //          normalized_topic: TEXT
+    //          mangled_topic: TEXT
+    //          category_id: DROP
+    //          FULLTEXT(normalized_text)
+    //          FULLTEXT(normalized_topic)
+    //          FULLTEXT(normalized_text, normalized_topic)
+    //     plog_articles_categories
+    //          parent_id: INTEGER
+    //          mangled_name: TEXT
+    //          properties: TEXT
+    //     plog_articles_comments
+    //          normalized_text: TEXT
+    //          normalized_topic: TEXT
+    //          FULLTEXT(normalized_text)
+    //          FULLTEXT(normalized_topic)
+    //          FULLTEXT(normalized_text, normalized_topic)
+    //     plog_blogs
+    //          mangled_blog: TEXT
+    //          properties: TEXT
+    //     plog_gallery_albums
+    //          normalized_name: VARCHAR
+    //          normalized_description: TEXT
+    //          mangled_name: VARCHAR
+    //          FULLTEXT(normalized_name)
+    //          FULLTEXT(normalized_description)
+    //          FULLTEXT(normalized_name, normalized_description)
+    //     plog_gallery_resources
+    //          normalized_description: TEXT
+    //          FULLTEXT(normalized_description)
+    //     plog_mylinks
+    //          properties: TEXT
+    //     plog_mylinks_categories
+    //          properties: TEXT
+    //     plog_users
+    //          properties: TEXT
+    //          full_name: VARCHAR
+    //
+    // - for all the articles in the db, fill in the normalized_text, normalized_topic and mangled_topic
+    //   fields using the TextFilter class
+    //
+    // - for all articles in the db, change the status from a string ('published', 'draft', 'deleted') to
+    // an integer (POST_STATUS_{PUBLISHED|DELETED|DRAFT}
+    //
+    // - for all articles and categories, arrange the plog_article_categories_link table so that everything works
+    //   as before
+    //
+    // - for all article categories, fill in the mangled_name field
+    //
+    // - for all comments, fill in the normalized_text and normalized_topic fields
+    //
+    // - for all blogs, fill in the mangled_blog field
+    //
+    // - for all albums, fill in the normalized_name, normalized_description and mangled_name fields
+    //
+    // - for all resources, fill in the normalized_description field
+
+
+    class UpdateStepOne extends Action
+    {
+
+        function perform()
+        {
+            $this->_view = new WizardView( "update1" );
+            WizardStepTwo::setDbConfigValues( $this->_view );
+            $this->setCommonData();
+        }
+    }
+
+    class UpdateStepTwo extends Action
+    {
+
+        var $_db;
+        var $_dbPrefix;
+
+        function validate()
+        {
+            $configFile = new ConfigFileStorage();
+            $this->_dbPrefix = $configFile->getValue( "db_prefix" );
+
+            return true;
+        }
+
+        function perform()
+        {
+            // we need to create the new tables here
+            $newTables = Array( 21, 22, 23, 24 );
+
+            global $Tables;
+            global $Changes;
+            global $Inserts;
+
+            // connect to the db
+            $this->_db = connectDb();
+
+            // store error messages in this var
+            $message = "";
+
+            if( !$this->_db ) {
+                $this->_view = new WizardView( "update1" );
+                WizardStepTwo::setDbConfigValues( $this->_view );
+                $this->_view->setErrorMessage( "There was an error connecting to the database. Please check your settings." );
+                return false;
+            }
+
+            // ---
+            // create the new tables in 1.0
+            // ---
+            // loop only through the new tables
+            foreach( $newTables as $tableId ) {
+                // get info about the table we'd like to use
+                $table = $Tables[$tableId];
+                // and run the query
+                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $table["code"] );
+                if( $this->_db->Execute( $query ))
+                    $message .= "New table <strong>".$table["desc"]."</strong> created successfully.<br/>";
+                else {
+                    $message .= "Error creating table: ".$this->_db->ErrorMsg()."<br/>";
+                    $errors = true;
+                }
+            }
+            if( !$errors ) {
+                $message .= "** New tables created successfully **<br/><br/>";
+            }
+
+            // ---
+            // make changes to the tables that need changes
+            // ---
+            foreach( $Changes as $tableId => $changeTable) {
+                foreach( $changeTable as $changeCode ) {
+                    // and run the query
+                    $query = str_replace( "{dbprefix}", $this->_dbPrefix, $changeCode );
+                    if( !$this->_db->Execute( $query )) {
+                        $errors = true;
+                    }
+                }
+
+                if( !$errors )
+                    $message .= "Changes to table <strong>$tableId</strong> executed successfully.<br/>";
+                else {
+                    $message .= "Error modifying table $tableId: ".$this->_db->ErrorMsg()."<br/>";
+                }
+            }
+
+            if( !$errors ) {
+                $message .= "** Modifications to old tables carried out successfully **<br/><br/>";
+            }
+
+            // ---
+            // add the new configuration settings that were added for 1.0
+            // ---
+            $newSettings = range( 71, 112 );
+            foreach( $newSettings as $settingId ) {
+                $setting = $Inserts[$settingId];
+                $query = str_replace( "{dbprefix}", $this->_dbPrefix, $setting );
+                if( !$this->_db->Execute( $query )) {
+                    $message .= "There was an error executing: ".$this->_db->ErrorMsg()."<br/>";
+                    $errors = true;
+                }
+            }
+
+            //
+            // there's nothing left to do so we can quit now!!
+            //
+            if( !$errors ) {
+                $this->_view = new WizardView( "update2" );
+                $this->_view->setValue( "message", $message );
+            }
+            else {
+                $this->_view = new WizardView( "update1" );
+                WizardStepTwo::setDbConfigValues( $this->_view );
+                $this->_view->setErrorMessage( $message );
+            }
+
+            return true;
+        }
+    }
+
+    /**
+     * this is the first step of the transformations to some of the fields in the tables.
+     * Precisely, it is in this step where we regenerate the indexes for the search engine... However, it
+     * could take it a while...
+     */
+    class UpdateStepThree extends Action
+    {
+        function UpdateStepThree( $actionInfo, $httpRequest )
+        {
+            $this->Action( $actionInfo, $httpRequest );
+
+            // load the current step, if any
+            $this->_curStep = $this->_request->getValue( "curStep" );
+            $this->_numPosts = $this->_request->getValue( "numPosts" );
+
+            //print("cur step = ".$this->_curStep." - num posts = ".$this->_numPosts."<br/>");
+        }
+
+        function getStatusId( $statusStr )
+        {
+            if( $statusStr == 'published' ) return POST_STATUS_PUBLISHED;
+            if( $statusStr == 'draft' ) return POST_STATUS_DRAFT;
+            if( $statusStr == 'deleted' ) return POST_STATUS_DELETED;
+
+            return false;
+        }
+
+       function perform()
+       {
+            // get a connection to the db
+            $db = connectDb();
+            $dbPrefix = getDbPrefix();
+            $db->debug=false;
+
+            // no errors here
+            $errors = false;
+
+            // see how many records we have
+            $queryCount = "SELECT COUNT(*) AS total FROM {$dbPrefix}articles";
+            $result = $db->Execute( $queryCount );
+            $row = $result->FetchRow();
+            $numRecords = $row["total"];
+            $this->_totalPosts = $numRecords;
+            // check whether we should use multiple steps
+            $multipleSteps = ( $numRecords > WIZARD_MAX_RECORDS_THRESHOLD );
+            if( $multipleSteps ) {
+                // how many steps do we need?
+                $numSteps = ceil( $numRecords / WIZARD_MAX_RECORDS_PER_STEP );
+                $this->_numSteps = $numSteps;
+                //print("using different steps! numSteps = $numSteps<br/>");
+            }
+
+            // run the query and loop through the results
+            $query = "SELECT * FROM {$dbPrefix}articles";
+            if( $multipleSteps ) {
+                // generate the LIMIT condition for this page
+                $query .= " LIMIT ".$this->_curStep*WIZARD_MAX_RECORDS_PER_STEP.", ".WIZARD_MAX_RECORDS_PER_STEP;
+            }
+
+            //print("query = $query<br/>");
+
+            $result = $db->Execute( $query );
+
+            $tf = new TextFilter();
+
+            $numPosts = $result->RowCount();
+
+            while( $row = $result->FetchRow()) {
+                // for each one of the articles, fill in the mangled_topic, normalized_text and normalized_value
+                $normalizedTopic = Db::qstr($tf->normalizeText( $row["topic"] ));
+                $postTopic       = Db::qstr($row["topic"]);
+                $normalizedText  = Db::qstr($tf->normalizeText( $row["text"] ));
+                $postText        = Db::qstr($row["text"]);
+                $mangledTopic    = Db::qstr($tf->urlize( $row["topic"] ));
+                $status          = $this->getStatusId( $row["old_status"] );
+                $artId           = $row["id"];
+                $catId           = $row["category_id"];
+
+                $query = "UPDATE {$dbPrefix}articles SET slug = '$mangledTopic', date = date, status = $status
+                          WHERE id = $artId";
+
+                $query2= "INSERT INTO {$dbPrefix}article_categories_link(article_id, category_id)
+                          VALUES ( $artId, $catId )";
+
+                $query3= "INSERT INTO {$dbPrefix}articles_text (article_id,text,topic,normalized_text,normalized_topic,mangled_topic)
+                          VALUES('$artId','$postText','$postTopic','$normalizedTopic','$normalizedText','$mangledTopic')";
+
+
+                // execute the two queries
+                $res  = $db->Execute( $query );
+                $res2 = $db->Execute( $query2 );
+                $res3 = $db->Execute( $query3 );
+
+                /*if( !$res || !$res2 || !$res3 )
+                    $errors = true;*/
+            }
+
+            // check whether we've already done the last step or not
+            $lastStepDone = ( $this->_curStep >= $this->_numSteps );
+
+            // if error
+            if( $errors ) {
+                $this->_view = new WizardView( "update2" );
+                $this->_view->setErrorMessage( "There was an error updating the articles table." );
+                $this->setCommonData();
+                return false;
+            }
+
+            //$query1 = "ALTER TABLE {$dbPrefix}articles DROP COLUMN old_status, DROP COLUMN category_id";
+            //$db->Execute( $query1 );
+
+            // if everyhting's fine, say so...
+            if( !$multipleSteps || $lastStepDone ) {
+                $this->_view = new WizardView( "update3" );
+                $this->_view->setValue( "totalPosts", $this->_totalPosts );
+            }
+            else {
+                // if we're using multiple steps, show the same page
+                $this->_view = new WizardView( "update2" );
+                $this->_view->setValue( "numPosts", $numPosts );
+                $this->_view->setValue( "curStep", $this->_curStep+1 );
+                $this->_view->setValue( "totalPosts", $this->_totalPosts );
+                $this->_view->setValue( "numSteps", $this->_numSteps );
+                $this->_view->setValue( "multipleSteps", true );
+            }
+
+            return true;
+        }
+
+    }
+
+    // ---
+    // this action will do the same as before but for the rest of the tables that need some data to
+    // be normalized/mangled
+    // ---
+    class UpdateStepFour extends Action
+    {
+
+        var $dbPrefix;
+        var $db;
+        var $t;
+
+        function validate()
+        {
+            $this->db = connectDb();
+            $this->dbPrefix = getDbPrefix();
+            $this->t = new TextFilter();
+
+            return true;
+        }
+
+        //
+        // process the article categories
+        //
+        function updateArticleCategories()
+        {
+            $dbPrefix = $this->dbPrefix;
+            $query = "SELECT * FROM {$dbPrefix}articles_categories";
+            $result = $this->db->Execute( $query );
+
+            while( $row = $result->FetchRow()) {
+                $catId = $row["id"];
+                $mangledName = $this->t->urlize( $row["name"] );
+                $query = "UPDATE {$dbPrefix}articles_categories
+                          SET mangled_name = '$mangledName', last_modification = last_modification
+                          WHERE id = $catId";
+
+                $res = $this->db->Execute( $query );
+
+                // this is not very nice to see but it works... :)
+                if( !$res ) {
+                    $this->message .= "There was an error updating the article categories table.<br/>";
+                    return false;
+                }
+            }
+
+            $this->message .= "Article Categories table updated successfully!<br/>";
+
+            return true;
+        }
+
+        //
+        // process the comments
+        //
+        function updateArticleComments()
+        {
+            $dbPrefix = $this->dbPrefix;
+            $query = "SELECT * FROM {$dbPrefix}articles_comments";
+            $result = $this->db->Execute( $query );
+
+            while( $row = $result->FetchRow()) {
+                $commentId = $row["id"];
+                $normText = Db::qstr($this->t->normalizeText( $row["text"] ));
+                $normTopic = Db::qstr($this->t->normalizeText( $row["topic"] ));
+                $query = "UPDATE {$dbPrefix}articles_comments
+                          SET normalized_text = '$normText', normalized_topic = '$normTopic', date = date
+                          WHERE id = $commentId";
+
+                $res = $this->db->Execute( $query );
+
+                if( !$res ) {
+                    $this->message .= "There was an error updating the comments table.<br/>";
+                    return false;
+                }
+            }
+
+            $this->message .= "Comments table updated successfully!<br/>";
+
+            return true;
+        }
+
+        //
+        // process the blogs
+        //
+        function updateBlogs()
+        {
+            $dbPrefix = $this->dbPrefix;
+            $query = "SELECT * FROM {$dbPrefix}blogs";
+            $result = $this->db->Execute( $query );
+
+            while( $row = $result->FetchRow()) {
+                $blogId = $row["id"];
+                $mangledBlog = $this->t->urlize( $row["blog"] );
+                $query = "UPDATE {$dbPrefix}blogs
+                          SET mangled_blog = '$mangledBlog' WHERE id = $blogId";
+
+                $res = $this->db->Execute( $query );
+
+                if( !$res ) {
+                    $this->message .= "There wasn an error updaing the blogs table.<br/>";
+                    return false;
+                }
+            }
+
+            $this->message .= "Blogs table updated successfully!<br/>";
+
+            return true;
+        }
+
+        //
+        // process the albums
+        //
+        function updateAlbums()
+        {
+            $dbPrefix = $this->dbPrefix;
+            $query = "SELECT * FROM {$dbPrefix}gallery_albums";
+            $result = $this->db->Execute( $query );
+
+            while( $row = $result->FetchRow()) {
+                $albumId = $row["id"];
+                $mangledName = Db::qstr($this->t->urlize( $row["name"] ));
+                $normName = Db::qstr($this->t->normalizeText( $row["name"] ));
+                $normDescription = Db::qstr($this->t->normalizeText( $row["description"] ));
+                $query = "UPDATE {$dbPrefix}gallery_albums
+                          SET mangled_name = '$mangledName', normalized_name = '$normName',
+                          normalized_description = '$normDescription', date = date
+                          WHERE id = $albumId";
+
+                $res = $this->db->Execute( $query );
+
+                if( !$res ) {
+                    $this->message .= "There was an error updating the albums table.<br/>";
+                    return false;
+                }
+            }
+
+            $this->message .= "Resource Albums table updated successfully!<br/>";
+
+            return true;
+        }
+
+        //
+        // and finally, the resources...
+        //
+        function updateResources()
+        {
+            $dbPrefix = $this->dbPrefix;
+            $query = "SELECT * FROM {$dbPrefix}gallery_resources";
+            $result = $this->db->Execute( $query );
+
+            while( $row = $result->FetchRow()) {
+                $resId = $row["id"];
+                //$normName = $this->t->normalizeText( $row["name"] );
+                $normDescription = Db::qstr($this->t->normalizeText( $row["description"] ));
+                $query = "UPDATE {$dbPrefix}gallery_resources
+                          SET normalized_description = '$normDescription', date = date
+                          WHERE id = $resId";
+
+                $res = $this->db->Execute( $query );
+                if( !$res ) {
+                    $this->message .= "There was an error updating the resources table.<br/>";
+                    return false;
+                }
+            }
+
+            $this->message .= "Resources table updated successfully!<br/>";
+
+            return true;
+
+        }
+
+        //
+        // process the articles' text
+        //
+        function updateArticleText()
+        {
+            $dbPrefix = $this->dbPrefix;
+            // drop unneeded columns from articles table
+            $alter_query[] = "ALTER TABLE ".$dbPrefix."articles DROP COLUMN text";
+            $alter_query[] = "ALTER TABLE ".$dbPrefix."articles DROP COLUMN topic";
+
+            foreach ($alter_query as $value) {
+                $this->db->Execute($value);
+            }
+
+
+            $this->message .= "articles_text table updated successfully!<br/>";
+
+            return true;
+        }
+
+        function perform()
+        {
+            $updaters = Array( "updateArticleCategories", "updateArticleComments",
+                               "updateBlogs", "updateAlbums", "updateResources", "updateArticleText" );
+
+            // loop through each one of the methods to take care of updating one of the tables
+            foreach( $updaters as $method ) {
+                $result = $this->$method();
+
+                if( !$result ) {
+                    $this->_view = new WizardView( "update3" );
+                    $this->_view->setErrorMessage( $this->message );
+                    return false;
+                }
+            }
+
+            // everything went fine so we can show the final page!
+            $this->_view = new WizardView( "update4" );
+            $this->_view->setValue( "message", $this->message );
+
+            return true;
+        }
+
+    }
+
+    // check if the "./tmp" folder is writable by us, otherwise
+    // throw an error before the user gets countless errors
+    // from Smarty
+    if( !File::isWritable( TEMP_FOLDER ) || !File::isDir( TEMP_FOLDER )) {
+        print("<span style=\"color:red; font-size: 14px;\">Error</span><br/><br/>This wizard needs the ".TEMP_FOLDER." folder to be writable by the web server user.<br/><br/>Please correct that and try again.");
+        die();
+    }
+
+    //// main part ////
+    $controller = new Controller( $_actionMap, "nextStep" );
+    $controller->process( HttpVars::getRequest());
+?>




More information about the pLog-svn mailing list