Index: trunk/web/app/data/modules/data_users.php
===================================================================
--- trunk/web/app/data/modules/data_users.php	(revision 10)
+++ trunk/web/app/data/modules/data_users.php	(revision 1)
@@ -99,13 +99,10 @@
        'username=\''.$db->escape($form_username).'\''
       :'LOWER(username)=LOWER(\''.$db->escape($form_username).'\')';
-      $_sql = 
-       'SELECT id, group_id, password'
-      .' FROM '.$db->prefix.'users'
-      .' WHERE '.$username_sql;
       $result = $db->query
-      ( $_sql
+      ( 'SELECT id, group_id, password, save_pass'
+       .' FROM '.$db->prefix.'users'
+       .' WHERE '.$username_sql
       ) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
-      list($user_id, $group_id, $db_password_hash) = $db->fetch_row($result);
-      $save_pass = 1;
+      list($user_id, $group_id, $db_password_hash, $save_pass) = $db->fetch_row($result);
       $authorized = false;
       if(!empty($db_password_hash))
Index: trunk/web/app/out/dist/content/set_artistes/e_add_user_artiste.php
===================================================================
--- trunk/web/app/out/dist/content/set_artistes/e_add_user_artiste.php	(revision 10)
+++ trunk/web/app/out/dist/content/set_artistes/e_add_user_artiste.php	(revision 1)
@@ -32,5 +32,5 @@
     </td>
   </tr>
-  <!-- tr>
+  <tr>
     <td>
       <p><strong>dossier personnel</p></strong>
@@ -38,5 +38,5 @@
       <input type="text" name="dossier_personnel" size="50" value="" />
     </td>
-  </tr -->
+  </tr>
   <tr>
     <td colspan="2" align="right">
Index: trunk/web/app/out/dist/content/set_artistes/e_set_user_artiste.php
===================================================================
--- trunk/web/app/out/dist/content/set_artistes/e_set_user_artiste.php	(revision 10)
+++ trunk/web/app/out/dist/content/set_artistes/e_set_user_artiste.php	(revision 1)
@@ -36,5 +36,5 @@
     </td>
   </tr>
-  <!-- tr>
+  <tr>
     <td>
       <p><strong>dossier personnel</p></strong>
@@ -42,5 +42,5 @@
       <input type="text" name="dossier_personnel" size="50" value="<?= $env->out["artiste"]["dossier_personnel"] ?>" />
     </td>
-  </tr -->
+  </tr>
   <tr>
     <td colspan="2" align="right">
Index: trunk/web/app/out/dist/views/footer.php
===================================================================
--- trunk/web/app/out/dist/views/footer.php	(revision 10)
+++ trunk/web/app/out/dist/views/footer.php	(revision 1)
@@ -42,5 +42,5 @@
     <ul>
       <li><a href="<?= $env->url(array("e" => "contact")) ?>">Contactez-nous</a></li>
-      <li><a href="http://www.revolutionsoundrecords.org/trac">rsr - v.5 (trac)</a></li>
+      <li><a href="http://wiki.rsr.free.fr/wiki">rsr - v.5</a></li>
     </ul>
   </div>
Index: trunk/web/install/app/01_utils.php
===================================================================
--- trunk/web/install/app/01_utils.php	(revision 10)
+++ trunk/web/install/app/01_utils.php	(revision 1)
@@ -13,5 +13,3 @@
   }
 
-  function error($message) {}
-
 ?>
Index: trunk/web/install/dist/sql/champs_content.txt
===================================================================
--- trunk/web/install/dist/sql/champs_content.txt	(revision 1)
+++ trunk/web/install/dist/sql/champs_content.txt	(revision 1)
@@ -0,0 +1,3 @@
+[site_name]
+[email_admin]
+[pun_url]
Index: trunk/web/install/dist/sql/content.sql
===================================================================
--- trunk/web/install/dist/sql/content.sql	(revision 10)
+++ trunk/web/install/dist/sql/content.sql	(revision 1)
@@ -11,5 +11,5 @@
 (143, 'news', 'accueil_droite_bas', 'Les autres news', 'news.php', '', 186, '2009-09-01 19:57:51', 186, '2010-08-05 01:48:55', '2009-09-06 17:16:52', 1, 2),
 (152, 'forum_interne', 'interne_gauche', 'Forum', 'accueil_forum.php', '<p>Ce bloc affiche les 7 derniers messages du forum.</p>', 186, '2009-09-06 19:46:30', 186, '2011-11-12 15:52:34', '2009-09-06 19:48:57', 0, 4),
-(149, '', 'accueil_footer', 'Bloc en bas de la page d''accueil', '', '<p>Plus de docs sur <a href="http://www.revolutionsoundrecords.org/trac">le trac</a>.</p>\r\n<ul>\r\n</ul>\r\n<p>Pour les questions, les retours (...) vous &ecirc;tes invit&eacute;s &agrave; venir en parler sur le <a href="http://www.revolutionsoundrecords.org/punbb">forum de l''association Revolution Sound Records</a>.</p>', 186, '2009-09-06 16:41:15', 186, '2011-11-12 22:36:42', '2009-09-06 19:07:34', 1, 6),
+(149, '', 'accueil_footer', 'Bloc en bas de la page d''accueil', '', '<p>Plus de docs sur <a href="http://wiki.rsr.free.fr/wiki">le wiki</a>.</p>\r\n<ul>\r\n</ul>\r\n<p>Pour les questions, les retours (...) vous &ecirc;tes invit&eacute;s &agrave; venir en parler sur le <a href="http://www.revolutionsoundrecords.org/punbb">forum de l''association Revolution Sound Records</a>.</p>', 186, '2009-09-06 16:41:15', 186, '2011-11-12 22:36:42', '2009-09-06 19:07:34', 1, 6),
 (128, 'administration', NULL, 'Administration', 'admin.php', '', 186, '2009-08-10 10:27:12', 186, '2009-09-06 00:13:40', '2009-09-06 00:13:40', 1, 4),
 (155, '', 'interne_gauche', 'News', 'menu_news.php', '<p>Affiche les 2 derni&egrave;res news et un menu pour acc&eacute;der aux autres news.</p>', 186, '2010-01-15 22:39:32', 186, '2011-11-12 16:10:38', NULL, 1, 1),
@@ -88,4 +88,5 @@
 INSERT INTO `[prefix]contenus` (`id`, `nom`, `categorie`, `titre`, `description`, `contenu`, `auteur_creation`, `date_creation`, `auteur_modification`, `date_modification`, `date_publication`, `public`, `ordre`) VALUES
 (919, '', 1, 'Nouvelle installation', '', '<p>Bienvenue sur votre installation de rsr v.5.</p>\r\n<p>Pensez &agrave; effacer le dossier <strong>install</strong></p>\r\n<p>&nbsp;</p>\r\n<p>Bonnes publications !</p>', 186, '2011-09-04 15:03:09', 186, '2011-11-12 22:07:24', '2011-09-04 00:00:00', 1, NULL);
+
 # --
 INSERT INTO `[prefix]formats` (`id`, `nom`, `content_type`) VALUES
@@ -119,12 +120,12 @@
 # --
 INSERT INTO `[prefix]pun_config` (`conf_name`, `conf_value`) VALUES
-('o_cur_version', '1.4.7'),
+('o_cur_version', '1.2.10'),
 ('o_cur_version_fr', '1.2.10'),
 ('o_board_title', 'Forums'),
 ('o_board_desc', NULL),
-('o_default_timezone', '0'),
+('o_server_timezone', '0'),
 ('o_time_format', 'H:i:s'),
 ('o_date_format', 'd-m-Y'),
-('o_timeout_visit', '1800'),
+('o_timeout_visit', '600'),
 ('o_timeout_online', '300'),
 ('o_redirect_delay', '1'),
@@ -162,5 +163,5 @@
 ('o_admin_email', '[email_admin]'),
 ('o_webmaster_email', '[email_admin]'),
-('o_topic_subscriptions', '1'),
+('o_subscriptions', '1'),
 ('o_smtp_host', NULL),
 ('o_smtp_user', NULL),
@@ -176,5 +177,8 @@
 ('o_maintenance', '0'),
 ('o_maintenance_message', 'Les forums sont temporairement fermÃ©s pour des raisons de maintenance. Nous vous prions de bien vouloir nous excuser pour cette gÃšne. Veuillez essayer Ã  nouveau d''ici quelques minutes.<br />\n<br />\nRevolution Sound Records'),
-('o_forum_subscriptions', '1'),
+('p_mod_edit_users', '1'),
+('p_mod_rename_users', '0'),
+('p_mod_change_passwords', '0'),
+('p_mod_ban_users', '0'),
 ('p_message_bbcode', '1'),
 ('p_message_img_tag', '1'),
@@ -188,16 +192,5 @@
 ('p_allow_banned_email', '1'),
 ('p_allow_dupe_email', '0'),
-('p_force_guest_email', '1'),
-('o_database_revision', '15'),
-('o_searchindex_revision', '2'),
-('o_parser_revision', '2'),
-('o_default_email_setting', '1'),
-('o_topic_views', '1'),
-('o_signatures', '1'),
-('o_smtp_ssl', '0'),
-('o_default_dst', '0'),
-('o_quote_depth', '3'),
-('o_feed_type', '2'),
-('o_feed_ttl', '0');
+('p_force_guest_email', '1');
 # --
 INSERT INTO `[prefix]pun_forum_perms` (`group_id`, `forum_id`, `read_forum`, `post_replies`, `post_topics`) VALUES
@@ -227,14 +220,14 @@
 (6, 80, 0, 0, 0);
 # --
-INSERT INTO `[prefix]pun_groups` (`g_id`, `g_title`, `g_user_title`, `g_moderator`, `g_mod_edit_users`, `g_mod_rename_users`, `g_mod_change_passwords`, `g_mod_ban_users`, `g_read_board`, `g_view_users`, `g_post_replies`, `g_post_topics`, `g_edit_posts`, `g_delete_posts`, `g_delete_topics`, `g_set_title`, `g_search`, `g_search_users`, `g_send_email`, `g_post_flood`, `g_search_flood`, `g_email_flood`, `g_report_flood`) VALUES
-(1, 'Admin', 'Admin', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
-(2, 'ModÃ©rateurs', 'ModÃ©rateur', 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
-(3, 'Touriste', NULL, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0),
-(4, 'Membres', NULL, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 60, 30, 60, 60),
-(5, 'Artiste', 'Artiste', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 10, 10, 60, 60),
-(6, '100 eme Membre', '100 eme Membre', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 60, 30, 60, 60);
-# --
-INSERT INTO `[prefix]pun_online` (`user_id`, `ident`, `logged`, `idle`, `last_post`, `last_search`) VALUES
-(1, '192.168.10.13', 1321306351, 0, NULL, NULL);
+INSERT INTO `[prefix]pun_groups` (`g_id`, `g_title`, `g_user_title`, `g_read_board`, `g_post_replies`, `g_post_topics`, `g_post_polls`, `g_edit_posts`, `g_delete_posts`, `g_delete_topics`, `g_set_title`, `g_search`, `g_search_users`, `g_edit_subjects_interval`, `g_post_flood`, `g_search_flood`) VALUES
+(1, 'Admin', 'Admin', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0),
+(2, 'ModÃ©rateurs', 'ModÃ©rateur', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0),
+(3, 'Touriste', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0),
+(4, 'Membres', NULL, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 300, 60, 30),
+(5, 'Artiste', 'Artiste', 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 10, 10),
+(6, '100 eme Membre', '100 eme Membre', 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 300, 60, 30);
+# --
+INSERT INTO `[prefix]pun_online` (`user_id`, `ident`, `logged`, `idle`) VALUES
+(1, '192.168.10.13', 1321118546, 0);
 # --
 INSERT INTO `[prefix]pun_ranks` (`id`, `rank`, `min_posts`) VALUES
@@ -261,5 +254,5 @@
 (87, 'terminator.png', ':terminator:', 0);
 # --
-INSERT INTO `[prefix]pun_users` (`id`, `group_id`, `username`, `password`, `email`, `title`, `realname`, `url`, `jabber`, `icq`, `msn`, `aim`, `yahoo`, `location`, `signature`, `disp_topics`, `disp_posts`, `email_setting`, `notify_with_post`, `auto_notify`, `show_smilies`, `show_img`, `show_img_sig`, `show_avatars`, `show_sig`, `timezone`, `dst`, `date_format`, `time_format`, `language`, `style`, `num_posts`, `last_post`, `last_search`, `last_email_sent`, `last_report_sent`, `registered`, `registration_ip`, `last_visit`, `admin_note`, `activate_string`, `activate_key`) VALUES
-(186, 1, 'admin', '90f1b3c6cf62b05606b215265803f553e22bc657', '[email_admin]', NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 'French', 'Rsr', 1382, 1321043538, NULL, NULL, NULL, 1156702867, '82.243.194.97', 1321305012, NULL, NULL, NULL),
-(1, 3, 'InvitÃ©', 'InvitÃ©', 'InvitÃ©', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 'English', 'Oxygen', 0, NULL, NULL, NULL, NULL, 0, '0.0.0.0', 0, NULL, NULL, NULL);
+INSERT INTO `[prefix]pun_users` (`id`, `group_id`, `username`, `password`, `email`, `title`, `realname`, `url`, `jabber`, `icq`, `msn`, `aim`, `yahoo`, `location`, `use_avatar`, `signature`, `disp_topics`, `disp_posts`, `email_setting`, `save_pass`, `notify_with_post`, `show_smilies`, `show_img`, `show_img_sig`, `show_avatars`, `show_sig`, `timezone`, `language`, `style`, `num_posts`, `last_post`, `registered`, `registration_ip`, `last_visit`, `admin_note`, `activate_string`, `activate_key`) VALUES
+(186, 1, 'admin', '90f1b3c6cf62b05606b215265803f553e22bc657', '[email_admin]', NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, 1, 1, 0, 1, 1, 1, 1, 1, 0, 'French', 'Rsr', 1382, 1321043538, 1156702867, '82.243.194.97', 1321118443, NULL, NULL, NULL),
+(1, 3, 'InvitÃ©', 'InvitÃ©', 'InvitÃ©', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, 1, 1, 0, 1, 1, 1, 1, 1, 0, 'English', 'Oxygen', 0, NULL, 0, '0.0.0.0', 0, NULL, NULL, NULL);
Index: trunk/web/install/dist/sql/raz.sql
===================================================================
--- trunk/web/install/dist/sql/raz.sql	(revision 10)
+++ trunk/web/install/dist/sql/raz.sql	(revision 1)
@@ -27,5 +27,5 @@
 DROP TABLE IF EXISTS `[prefix]playlists`;
 # --
-DROP TABLE IF EXISTS `[prefix]playlist_download`;
+DROP TABLE IF EXISTS `[prefix]playlis[prefix]download`;
 # --
 DROP TABLE IF EXISTS `[prefix]pun_bans`;
@@ -40,6 +40,4 @@
 # --
 DROP TABLE IF EXISTS `[prefix]pun_forum_perms`;
-# --
-DROP TABLE IF EXISTS `[prefix]pun_forum_subscriptions`;
 # --
 DROP TABLE IF EXISTS `[prefix]pun_groups`;
@@ -61,7 +59,7 @@
 DROP TABLE IF EXISTS `[prefix]pun_smilies`;
 # --
+DROP TABLE IF EXISTS `[prefix]pun_subscriptions`;
+# --
 DROP TABLE IF EXISTS `[prefix]pun_topics`;
-# --
-DROP TABLE IF EXISTS `[prefix]pun_topic_subscriptions`;
 # --
 DROP TABLE IF EXISTS `[prefix]pun_users`;
Index: trunk/web/install/dist/sql/rsr.v5.all.sql
===================================================================
--- trunk/web/install/dist/sql/rsr.v5.all.sql	(revision 10)
+++ 	(revision )
@@ -1,1165 +1,0 @@
--- phpMyAdmin SQL Dump
--- version 3.2.2.1deb1
--- http://www.phpmyadmin.net
---
--- Serveur: localhost
--- GÃ©nÃ©rÃ© le : Lun 14 Novembre 2011 Ã  22:36
--- Version du serveur: 5.1.37
--- Version de PHP: 5.2.10-2ubuntu6.10
-
-SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-
---
--- Base de donnÃ©es: `rsr_v5`
---
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_albums`
---
-
-DROP TABLE IF EXISTS `rsrv5_albums`;
-CREATE TABLE `rsrv5_albums` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `id_artiste` int(11) NOT NULL,
-  `titre` varchar(255) DEFAULT NULL,
-  `image` varchar(255) NOT NULL,
-  `description` text,
-  `url` varchar(255) DEFAULT NULL,
-  `format` int(11) DEFAULT NULL,
-  `taille` int(11) DEFAULT NULL,
-  `date_creation` date DEFAULT NULL,
-  `date_publication` date DEFAULT NULL,
-  `compteur` int(11) NOT NULL DEFAULT '0',
-  `actif` tinyint(4) NOT NULL DEFAULT '1',
-  `ordre` int(11) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_albums`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_artistes`
---
-
-DROP TABLE IF EXISTS `rsrv5_artistes`;
-CREATE TABLE `rsrv5_artistes` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `nom` varchar(255) DEFAULT NULL,
-  `presentation` text,
-  `style` varchar(255) DEFAULT NULL,
-  `image` varchar(255) DEFAULT NULL,
-  `pays` varchar(255) DEFAULT NULL,
-  `site` varchar(255) DEFAULT NULL,
-  `email_contact` varchar(255) DEFAULT NULL,
-  `hide_email` tinyint(4) NOT NULL DEFAULT '1',
-  `contact_form` tinyint(4) NOT NULL DEFAULT '1',
-  `identifiant_paypal` varchar(255) DEFAULT NULL,
-  `lien_boutique` varchar(255) DEFAULT NULL,
-  `pun_forum` int(11) DEFAULT NULL,
-  `pun_user` int(11) DEFAULT NULL,
-  `compteur` int(11) NOT NULL DEFAULT '0',
-  `lien_facebook` varchar(255) DEFAULT NULL,
-  `lien_flickr` varchar(255) DEFAULT NULL,
-  `lien_twitter` varchar(255) DEFAULT NULL,
-  `lien_youtube` varchar(255) DEFAULT NULL,
-  `dossier_personnel` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_artistes`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_artistes_admins`
---
-
-DROP TABLE IF EXISTS `rsrv5_artistes_admins`;
-CREATE TABLE `rsrv5_artistes_admins` (
-  `id_artiste` int(11) NOT NULL,
-  `pun_user` int(11) NOT NULL,
-  PRIMARY KEY (`id_artiste`,`pun_user`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_artistes_admins`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_boxes`
---
-
-DROP TABLE IF EXISTS `rsrv5_boxes`;
-CREATE TABLE `rsrv5_boxes` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `nom` varchar(64) DEFAULT NULL,
-  `emplacement` varchar(255) DEFAULT NULL,
-  `titre` varchar(255) DEFAULT NULL,
-  `fichier` varchar(255) DEFAULT NULL,
-  `contenu` text,
-  `auteur_creation` int(11) DEFAULT NULL,
-  `date_creation` datetime DEFAULT NULL,
-  `auteur_modification` int(11) DEFAULT NULL,
-  `date_modification` datetime DEFAULT NULL,
-  `date_publication` datetime DEFAULT NULL,
-  `public` tinyint(4) DEFAULT NULL,
-  `ordre` int(11) DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=162 ;
-
---
--- Contenu de la table `rsrv5_boxes`
---
-
-INSERT INTO `rsrv5_boxes` (`id`, `nom`, `emplacement`, `titre`, `fichier`, `contenu`, `auteur_creation`, `date_creation`, `auteur_modification`, `date_modification`, `date_publication`, `public`, `ordre`) VALUES
-(141, 'navigation', NULL, '', 'navigation.php', '<p>Affiche le menu principal dans l''ent&ecirc;te du site.</p>\r\n<p>Les &eacute;l&eacute;ments du menu sont &eacute;ditables dans l''administration du site, menu :</p>\r\n<p><strong>Contenus</strong> &gt; <strong>menus</strong></p>', 186, '2009-08-30 21:48:09', 186, '2011-11-12 16:14:42', '2009-09-05 23:35:21', 1, 0),
-(150, 'accueil_forum', 'accueil_gauche', 'Forum : derniers messages', 'accueil_forum.php', '<p>Ce bloc affiche des liens vers les 7 derniers messages du forum.</p>', 186, '2009-09-06 19:08:59', 186, '2011-11-12 15:56:53', '2009-09-06 19:10:21', 1, 3),
-(127, 'spotlight', 'accueil_gauche', 'Spotlight', 'spotlight.php', '<p>Ce bloc affiche le dernier spotlight, &eacute;dit&eacute; dans l''administration :</p>\r\n<p><strong>La redaction</strong> &gt; <strong>spotlights</strong></p>', 186, '2009-08-10 10:26:40', 186, '2011-11-12 16:05:10', '2009-09-06 17:16:40', 0, 2),
-(126, 'playlists_accueil', 'accueil_petite_gauche', 'Playlists', 'playlists.php', '', 186, '2009-08-09 23:15:00', 186, '2010-08-05 01:48:25', '2009-09-06 19:45:23', 1, 1),
-(142, 'edito', 'accueil_gauche', 'Edito', 'edito.php', '<p>Affiche le dernier &eacute;dito.</p>\r\n<p>Pour l''&eacute;dition des &eacute;ditos, menu :</p>\r\n<p><strong>La redaction</strong> &gt; <strong>&eacute;ditos</strong></p>', 186, '2009-09-01 19:49:18', 186, '2011-11-12 16:12:08', '2009-09-06 17:16:14', 1, 1),
-(151, 'playlists_interne', 'interne_gauche', 'Playlists', 'playlists.php', '', 186, '2009-09-06 19:45:02', 186, '2010-08-05 01:48:15', '2009-09-06 19:45:58', 1, 2),
-(124, 'identification', NULL, '', 'login.php', '', 186, '2009-08-09 22:16:57', 186, '2009-09-05 23:39:50', '2009-09-05 23:39:50', 1, 1),
-(130, 'nous_y_etions', 'accueil_petite_droite', 'Nous y Ã©tions', 'nous_y_etions.php', '<p>Ce bloc affiche un lien vers un sujet au hasard pris dans une section du forum. RSR utilise ce bloc pour faire un lien vers son forum des &eacute;v&eacute;nements pass&eacute;s.</p>\r\n<p>Avant d''utiliser ce bloc, modifiez le fichier <strong>data/modules/data_forum.php</strong> pour y renseigner l''identifiant du forum li&eacute; (variable <em>$forum_id</em>, ligne. 37).</p>\r\n<p>pour trouver l''identifiant d''un forum, rendez-vous avec votre navigateur sur le forum en question et regardez son URL, qui devrait se terminer par :</p>\r\n<p><em>viewforum.php?id=<strong>XX</strong></em></p>\r\n<p><em><strong>XX</strong></em> : identifiant du forum &agrave; modifier dans <strong>data/modules/data_forum.php</strong></p>', 186, '2009-08-10 11:49:58', 186, '2011-11-12 17:07:52', '2009-09-06 19:07:21', 0, 2),
-(140, 'artistes_au_hasard', 'accueil_droite_haut', 'Artistes au hasard', 'artistes_au_hasard.php', '', 186, '2009-08-30 21:44:32', 186, '2011-11-12 15:25:33', '2009-09-06 17:16:26', 0, 1),
-(143, 'news', 'accueil_droite_bas', 'Les autres news', 'news.php', '', 186, '2009-09-01 19:57:51', 186, '2010-08-05 01:48:55', '2009-09-06 17:16:52', 1, 2),
-(152, 'forum_interne', 'interne_gauche', 'Forum', 'accueil_forum.php', '<p>Ce bloc affiche les 7 derniers messages du forum.</p>', 186, '2009-09-06 19:46:30', 186, '2011-11-12 15:52:34', '2009-09-06 19:48:57', 0, 4),
-(149, '', 'accueil_footer', 'Bloc en bas de la page d''accueil', '', '<p>Plus de docs sur <a href="http://www.revolutionsoundrecords.org/trac">le trac</a>.</p>\r\n<ul>\r\n</ul>\r\n<p>Pour les questions, les retours (...) vous &ecirc;tes invit&eacute;s &agrave; venir en parler sur le <a href="http://www.revolutionsoundrecords.org/punbb">forum de l''association Revolution Sound Records</a>.</p>', 186, '2009-09-06 16:41:15', 186, '2011-11-12 22:36:42', '2009-09-06 19:07:34', 1, 6),
-(128, 'administration', NULL, 'Administration', 'admin.php', '', 186, '2009-08-10 10:27:12', 186, '2009-09-06 00:13:40', '2009-09-06 00:13:40', 1, 4),
-(155, '', 'interne_gauche', 'News', 'menu_news.php', '<p>Affiche les 2 derni&egrave;res news et un menu pour acc&eacute;der aux autres news.</p>', 186, '2010-01-15 22:39:32', 186, '2011-11-12 16:10:38', NULL, 1, 1),
-(156, 'last_news', 'accueil_droite_bas', 'News', 'last_news.php', '<p>Ce bloc affiche une news au hazard parmis les 5 derni&egrave;res.</p>', 186, '2010-04-06 15:58:29', 186, '2011-11-12 16:07:40', NULL, 1, 1),
-(157, 'last_albums', 'interne_gauche', 'Album au hasard', 'last_albums.php', '<p>Ce bloc affiche un album au hazard.</p>', 186, '2010-04-06 17:19:27', 186, '2011-11-12 15:56:10', NULL, 1, 3),
-(158, '', 'accueil_droite_bas', 'Soutenir notre action', 'soutenir.php', '<p>Ce bloc affiche un bouton de don PayPal et, &eacute;ventuellement, un lien vers une boutique de vente en ligne.</p>\r\n<p>Avant d''utiliser ce bloc, rendez-vous dans l''administration du site, menu :</p>\r\n<p><strong>G&eacute;n&eacute;ral</strong> &gt; <strong>dons et achats</strong></p>\r\n<p>Pour y renseigner votre identifiant s&eacute;curis&eacute; PayPal et/ou le lien vers la boutique en ligne.</p>', 3, '2010-08-03 13:05:44', 186, '2011-11-12 15:54:58', NULL, 0, 3),
-(159, '', 'accueil_droite_haut', 'Administrer le site', '', '<p>Les blocs affich&eacute;s sur cette page sont des exemples d''utilisation.</p>\r\n<p>Identifiez-vous avec votre compte admin et suivez le lien <a title="administration du site" href="index.php?e=set_config">admin</a> pour vous rendre dans l''administration du site et commencer &agrave; &eacute;diter les blocs, les contenus, les comptes artistes...</p>\r\n<p>&nbsp;</p>', 186, '2010-08-04 13:54:50', 186, '2011-11-12 22:17:47', NULL, 1, 0),
-(161, '', 'accueil_gauche', 'En images', 'flickr.php', '<p>Ce bloc affiche 4 images prises au hazard sur un compte Flickr.</p>\r\n<p>Avant d''utiliser ce bloc, modifiez le fichier</p>\r\n<p><strong>boxes/flickr.php</strong></p>\r\n<p>du template pour y indiquer vos informations de connexion sur l''API Flickr.</p>', 186, '2010-08-05 15:19:23', 186, '2011-11-12 15:50:41', NULL, 0, 4);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_categories`
---
-
-DROP TABLE IF EXISTS `rsrv5_categories`;
-CREATE TABLE `rsrv5_categories` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `nom` varchar(64) DEFAULT NULL,
-  `titre` varchar(255) DEFAULT NULL,
-  `icone` varchar(255) DEFAULT NULL,
-  `description` text,
-  `contenu` text,
-  `ordre` int(11) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=103 ;
-
---
--- Contenu de la table `rsrv5_categories`
---
-
-INSERT INTO `rsrv5_categories` (`id`, `nom`, `titre`, `icone`, `description`, `contenu`, `ordre`) VALUES
-(4, 'artistes', NULL, NULL, NULL, NULL, 0),
-(5, 'presentation', NULL, NULL, NULL, NULL, 0),
-(7, 'menus', NULL, NULL, NULL, NULL, 0),
-(22, 'Nav', 'menu top', NULL, NULL, '', 0),
-(30, '', 'Accueil', NULL, NULL, 'index.php?e=edito', 0),
-(29, '', 'Forum', NULL, NULL, 'punbb', 2),
-(33, '', 'Le son', NULL, NULL, '', 1),
-(38, '', 'Les artistes', NULL, NULL, 'index.php?e=artistes', 1),
-(40, '', 'Rechercher...', NULL, NULL, 'index.php?e=rechercher', 2),
-(63, '74', NULL, NULL, NULL, '', 0),
-(1, 'editos', 'Editos', NULL, NULL, NULL, 0),
-(2, 'news', NULL, NULL, NULL, NULL, 0),
-(0, 'root', NULL, NULL, NULL, NULL, 0),
-(6, 'news', NULL, NULL, NULL, NULL, 0),
-(3, 'spotlights', 'Spotlights', NULL, NULL, NULL, 0),
-(79, 'boxes', NULL, NULL, NULL, NULL, 0),
-(80, 'accueil_left', 'accueil - colonne de gauche', NULL, NULL, NULL, 0),
-(81, 'accueil_right', 'accueil - colonne de droite', NULL, NULL, NULL, 0),
-(82, '64', NULL, NULL, NULL, '', 0),
-(83, 'pages', NULL, NULL, NULL, NULL, 0),
-(85, 'links', NULL, NULL, NULL, NULL, 0),
-(93, 'interne_left', 'pages internes - colonne de gauche', NULL, NULL, NULL, 0),
-(94, 'accueil_small_left', 'accueil - petite colonne gauche', NULL, NULL, NULL, 0),
-(95, 'accueil_small_right', 'accueil - petite colonne droite', NULL, NULL, NULL, 0),
-(99, '54', NULL, NULL, NULL, '', 0),
-(100, '3', NULL, NULL, NULL, '', 0),
-(101, '73', NULL, NULL, NULL, '', 0),
-(102, '34', NULL, NULL, NULL, '', 0);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_categories_tree`
---
-
-DROP TABLE IF EXISTS `rsrv5_categories_tree`;
-CREATE TABLE `rsrv5_categories_tree` (
-  `parent` int(11) NOT NULL,
-  `child` int(11) NOT NULL,
-  PRIMARY KEY (`parent`,`child`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_categories_tree`
---
-
-INSERT INTO `rsrv5_categories_tree` (`parent`, `child`) VALUES
-(0, 1),
-(0, 2),
-(0, 3),
-(0, 4),
-(0, 7),
-(0, 79),
-(0, 83),
-(0, 85),
-(4, 5),
-(4, 6),
-(6, 82),
-(6, 99),
-(6, 100),
-(6, 101),
-(6, 102),
-(7, 22),
-(22, 29),
-(22, 30),
-(22, 33),
-(33, 38),
-(33, 40),
-(79, 80),
-(79, 81),
-(79, 93),
-(79, 94),
-(79, 95);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_concerts`
---
-
-DROP TABLE IF EXISTS `rsrv5_concerts`;
-CREATE TABLE `rsrv5_concerts` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `id_artiste` int(11) DEFAULT NULL,
-  `nom` varchar(255) DEFAULT NULL,
-  `date` datetime DEFAULT NULL,
-  `lieu` varchar(255) DEFAULT NULL,
-  `paf` int(11) DEFAULT NULL,
-  `description` text,
-  `pun_forum` int(11) DEFAULT NULL,
-  `affiche` varchar(255) DEFAULT NULL,
-  `flyer` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_concerts`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_configuration`
---
-
-DROP TABLE IF EXISTS `rsrv5_configuration`;
-CREATE TABLE `rsrv5_configuration` (
-  `key` varchar(255) NOT NULL,
-  `value` text NOT NULL,
-  PRIMARY KEY (`key`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_configuration`
---
-
-INSERT INTO `rsrv5_configuration` (`key`, `value`) VALUES
-('site_name', 'rsr - v.5.1.1'),
-('email_contact', 'admin@domain.tld'),
-('out', 'app/out/dist/'),
-('max_list', '10'),
-('identifiant_paypal', ''),
-('lien_boutique', '');
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_contenus`
---
-
-DROP TABLE IF EXISTS `rsrv5_contenus`;
-CREATE TABLE `rsrv5_contenus` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `nom` varchar(64) DEFAULT NULL,
-  `categorie` int(11) DEFAULT NULL,
-  `titre` varchar(255) DEFAULT NULL,
-  `description` text,
-  `contenu` text,
-  `auteur_creation` int(11) DEFAULT NULL,
-  `date_creation` datetime DEFAULT NULL,
-  `auteur_modification` int(11) DEFAULT NULL,
-  `date_modification` datetime DEFAULT NULL,
-  `date_publication` datetime DEFAULT NULL,
-  `public` tinyint(4) DEFAULT NULL,
-  `ordre` int(11) DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=935 ;
-
---
--- Contenu de la table `rsrv5_contenus`
---
-
-INSERT INTO `rsrv5_contenus` (`id`, `nom`, `categorie`, `titre`, `description`, `contenu`, `auteur_creation`, `date_creation`, `auteur_modification`, `date_modification`, `date_publication`, `public`, `ordre`) VALUES
-(919, '', 1, 'Nouvelle installation', '', '<p>Bienvenue sur votre installation de rsr v.5.</p>\r\n<p>Pensez &agrave; effacer le dossier <strong>install</strong></p>\r\n<p>&nbsp;</p>\r\n<p>Bonnes publications !</p>', 186, '2011-09-04 15:03:09', 186, '2011-11-12 22:07:24', '2011-09-04 00:00:00', 1, NULL);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_downloads`
---
-
-DROP TABLE IF EXISTS `rsrv5_downloads`;
-CREATE TABLE `rsrv5_downloads` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `id_artiste` int(11) DEFAULT NULL,
-  `id_album` int(11) DEFAULT NULL,
-  `id_licence` int(11) DEFAULT NULL,
-  `nom` varchar(255) DEFAULT NULL,
-  `date_creation` date DEFAULT NULL,
-  `style` varchar(255) DEFAULT NULL,
-  `description` text,
-  `ordre` int(11) DEFAULT NULL,
-  `actif` tinyint(4) NOT NULL DEFAULT '1',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_downloads`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_download_urls`
---
-
-DROP TABLE IF EXISTS `rsrv5_download_urls`;
-CREATE TABLE `rsrv5_download_urls` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `id_download` int(11) DEFAULT NULL,
-  `id_format` int(11) DEFAULT NULL,
-  `qualite` int(11) DEFAULT NULL,
-  `url` varchar(255) DEFAULT NULL,
-  `taille` int(11) DEFAULT NULL,
-  `date_publication` date DEFAULT NULL,
-  `compteur` int(11) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_download_urls`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_formats`
---
-
-DROP TABLE IF EXISTS `rsrv5_formats`;
-CREATE TABLE `rsrv5_formats` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `nom` varchar(32) DEFAULT NULL,
-  `content_type` varchar(64) NOT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
-
---
--- Contenu de la table `rsrv5_formats`
---
-
-INSERT INTO `rsrv5_formats` (`id`, `nom`, `content_type`) VALUES
-(1, 'ogg', 'audio/ogg'),
-(2, 'mp3', 'audio/mpeg'),
-(3, 'rar', 'application/x-rar-compressed'),
-(4, 'zip', 'application/x-zip'),
-(5, 'jpg', 'image/jpeg'),
-(6, 'pdf', 'application/pdf'),
-(7, 'avi', 'video/avi'),
-(8, 'gz', 'application/x-gzip'),
-(9, 'wav', 'audio/wav');
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_licences`
---
-
-DROP TABLE IF EXISTS `rsrv5_licences`;
-CREATE TABLE `rsrv5_licences` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `nom` varchar(255) NOT NULL DEFAULT '',
-  `lien` varchar(255) NOT NULL DEFAULT '',
-  `icone` varchar(255) NOT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;
-
---
--- Contenu de la table `rsrv5_licences`
---
-
-INSERT INTO `rsrv5_licences` (`id`, `nom`, `lien`, `icone`) VALUES
-(1, 'Creative Commons by-nc-nd 2.0', 'http://creativecommons.org/licenses/by-nc-nd/2.0/', 'icons/licences/cc.by.nc.nd.png'),
-(2, 'Creative Commons by-nc-nd 2.5', 'http://creativecommons.org/licenses/by-nc-nd/2.5/', 'icons/licences/cc.by.nc.nd.png'),
-(3, 'Creative Commons by-nc-sa 2.0', 'http://creativecommons.org/licenses/by-nc-sa/2.0/', 'icons/licences/cc.by.nc.sa.png'),
-(4, 'Creative Commons by-nc-sa 2.5', 'http://creativecommons.org/licenses/by-nc-sa/2.5/', 'icons/licences/cc.by.nc.sa.png'),
-(5, 'Creative Commons by-nc 2.0', 'http://creativecommons.org/licenses/by-nc/2.0/', 'icons/licences/cc.by.nc.png'),
-(6, 'Creative Commons by-nc 2.5', 'http://creativecommons.org/licenses/by-nc/2.5/', 'icons/licences/cc.by.nc.png'),
-(7, 'Creative Commons by-nd 2.0', 'http://creativecommons.org/licenses/by-nd/2.0/', 'icons/licences/cc.by.nd.png'),
-(8, 'Creative Commons by-nd 2.5', 'http://creativecommons.org/licenses/by-nd/2.5/', 'icons/licences/cc.by.nd.png'),
-(9, 'Creative Commons by-sa 2.0', 'http://creativecommons.org/licenses/by-sa/2.0/', 'icons/licences/cc.by.sa.png'),
-(10, 'Creative Commons by-sa 2.5', 'http://creativecommons.org/licenses/by-sa/2.5/', 'icons/licences/cc.by.sa.png'),
-(11, 'Creative Commons by 2.0', 'http://creativecommons.org/licenses/by/2.0/', 'icons/licences/cc.by.png'),
-(12, 'Creative Commons by 2.5', 'http://creativecommons.org/licenses/by/2.5/', 'icons/licences/cc.by.png'),
-(13, 'Licence Art Libre', 'http://artlibre.org/licence/lal/', ''),
-(14, 'Licence C Reaction', 'http://morne.free.fr/Necktar7/creactionfr.htm', ''),
-(15, 'Domaine Public', '', ''),
-(16, 'Licence GNU GPL (GNUArt)', 'http://gnuart.org/francais/gnugpl.html', '');
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_playlists`
---
-
-DROP TABLE IF EXISTS `rsrv5_playlists`;
-CREATE TABLE `rsrv5_playlists` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `pun_user` int(11) NOT NULL,
-  `titre` varchar(255) NOT NULL,
-  `description` text NOT NULL,
-  `creation` datetime NOT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_playlists`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_playlist_download`
---
-
-DROP TABLE IF EXISTS `rsrv5_playlist_download`;
-CREATE TABLE `rsrv5_playlist_download` (
-  `id` int(11) NOT NULL,
-  `id_download` int(11) NOT NULL,
-  PRIMARY KEY (`id`,`id_download`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_playlist_download`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_bans`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_bans`;
-CREATE TABLE `rsrv5_pun_bans` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `username` varchar(200) DEFAULT NULL,
-  `ip` varchar(255) DEFAULT NULL,
-  `email` varchar(80) DEFAULT NULL,
-  `message` varchar(255) DEFAULT NULL,
-  `expire` int(10) unsigned DEFAULT NULL,
-  `ban_creator` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`),
-  KEY `rsrv5_pun_bans_username_idx` (`username`(25))
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
-
---
--- Contenu de la table `rsrv5_pun_bans`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_categories`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_categories`;
-CREATE TABLE `rsrv5_pun_categories` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `cat_name` varchar(80) NOT NULL DEFAULT 'New Category',
-  `disp_position` int(10) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
-
---
--- Contenu de la table `rsrv5_pun_categories`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_censoring`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_censoring`;
-CREATE TABLE `rsrv5_pun_censoring` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `search_for` varchar(60) NOT NULL DEFAULT '',
-  `replace_with` varchar(60) NOT NULL DEFAULT '',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_pun_censoring`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_config`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_config`;
-CREATE TABLE `rsrv5_pun_config` (
-  `conf_name` varchar(255) NOT NULL DEFAULT '',
-  `conf_value` text,
-  PRIMARY KEY (`conf_name`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_config`
---
-
-INSERT INTO `rsrv5_pun_config` (`conf_name`, `conf_value`) VALUES
-('o_cur_version', '1.4.7'),
-('o_cur_version_fr', '1.2.10'),
-('o_board_title', 'Forums'),
-('o_board_desc', NULL),
-('o_default_timezone', '0'),
-('o_time_format', 'H:i:s'),
-('o_date_format', 'd-m-Y'),
-('o_timeout_visit', '1800'),
-('o_timeout_online', '300'),
-('o_redirect_delay', '1'),
-('o_show_version', '1'),
-('o_show_user_info', '1'),
-('o_show_post_count', '1'),
-('o_smilies', '1'),
-('o_smilies_sig', '0'),
-('o_make_links', '1'),
-('o_default_lang', 'French'),
-('o_default_style', 'Rsr'),
-('o_default_user_group', '4'),
-('o_topic_review', '15'),
-('o_disp_topics_default', '30'),
-('o_disp_posts_default', '25'),
-('o_indent_num_spaces', '4'),
-('o_quickpost', '1'),
-('o_users_online', '1'),
-('o_censoring', '0'),
-('o_ranks', '1'),
-('o_show_dot', '0'),
-('o_quickjump', '1'),
-('o_gzip', '0'),
-('o_additional_navlinks', NULL),
-('o_report_method', '2'),
-('o_regs_report', '1'),
-('o_mailing_list', 'admin@domain.tld'),
-('o_avatars', '1'),
-('o_avatars_dir', 'img/avatars'),
-('o_avatars_width', '128'),
-('o_avatars_height', '128'),
-('o_avatars_size', '25000'),
-('o_search_all_forums', '1'),
-('o_base_url', 'http://rsr.v5.dev/punbb'),
-('o_admin_email', 'admin@domain.tld'),
-('o_webmaster_email', 'admin@domain.tld'),
-('o_topic_subscriptions', '1'),
-('o_smtp_host', NULL),
-('o_smtp_user', NULL),
-('o_smtp_pass', NULL),
-('o_regs_allow', '1'),
-('o_regs_verify', '0'),
-('o_announcement', '0'),
-('o_announcement_message', 'Saisissez votre annonce ici.'),
-('o_regs_captchabox', '1'),
-('o_guest_post_captchabox', '0'),
-('o_rules', '0'),
-('o_rules_message', 'Saisissez vos rÃšgles d''utilisation ici.'),
-('o_maintenance', '0'),
-('o_maintenance_message', 'Les forums sont temporairement fermÃ©s pour des raisons de maintenance. Nous vous prions de bien vouloir nous excuser pour cette gÃšne. Veuillez essayer Ã  nouveau d''ici quelques minutes.<br />\n<br />\nRevolution Sound Records'),
-('o_forum_subscriptions', '1'),
-('p_message_bbcode', '1'),
-('p_message_img_tag', '1'),
-('p_message_all_caps', '1'),
-('p_subject_all_caps', '0'),
-('p_sig_all_caps', '0'),
-('p_sig_bbcode', '1'),
-('p_sig_img_tag', '1'),
-('p_sig_length', '400'),
-('p_sig_lines', '4'),
-('p_allow_banned_email', '1'),
-('p_allow_dupe_email', '0'),
-('p_force_guest_email', '1'),
-('o_database_revision', '15'),
-('o_searchindex_revision', '2'),
-('o_parser_revision', '2'),
-('o_default_email_setting', '1'),
-('o_topic_views', '1'),
-('o_signatures', '1'),
-('o_smtp_ssl', '0'),
-('o_default_dst', '0'),
-('o_quote_depth', '3'),
-('o_feed_type', '2'),
-('o_feed_ttl', '0');
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_forums`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_forums`;
-CREATE TABLE `rsrv5_pun_forums` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `forum_name` varchar(80) NOT NULL DEFAULT 'New forum',
-  `forum_desc` text,
-  `redirect_url` varchar(100) DEFAULT NULL,
-  `moderators` text,
-  `num_topics` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  `num_posts` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  `last_post` int(10) unsigned DEFAULT NULL,
-  `last_post_id` int(10) unsigned DEFAULT NULL,
-  `last_poster` varchar(200) DEFAULT NULL,
-  `sort_by` tinyint(1) NOT NULL DEFAULT '0',
-  `disp_position` int(10) NOT NULL DEFAULT '0',
-  `cat_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=103 ;
-
---
--- Contenu de la table `rsrv5_pun_forums`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_forum_perms`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_forum_perms`;
-CREATE TABLE `rsrv5_pun_forum_perms` (
-  `group_id` int(10) NOT NULL DEFAULT '0',
-  `forum_id` int(10) NOT NULL DEFAULT '0',
-  `read_forum` tinyint(1) NOT NULL DEFAULT '1',
-  `post_replies` tinyint(1) NOT NULL DEFAULT '1',
-  `post_topics` tinyint(1) NOT NULL DEFAULT '1',
-  PRIMARY KEY (`group_id`,`forum_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_forum_perms`
---
-
-INSERT INTO `rsrv5_pun_forum_perms` (`group_id`, `forum_id`, `read_forum`, `post_replies`, `post_topics`) VALUES
-(3, 48, 0, 0, 0),
-(4, 48, 0, 0, 0),
-(5, 48, 0, 0, 0),
-(6, 48, 0, 0, 0),
-(3, 75, 0, 0, 0),
-(4, 75, 0, 0, 0),
-(5, 75, 0, 0, 0),
-(6, 75, 0, 0, 0),
-(3, 77, 0, 0, 0),
-(4, 77, 0, 0, 0),
-(5, 77, 0, 0, 0),
-(6, 77, 0, 0, 0),
-(3, 78, 0, 0, 0),
-(4, 78, 0, 0, 0),
-(5, 78, 0, 0, 0),
-(6, 78, 0, 0, 0),
-(3, 79, 0, 0, 0),
-(4, 79, 0, 0, 0),
-(5, 79, 0, 0, 0),
-(6, 79, 0, 0, 0),
-(3, 80, 0, 0, 0),
-(4, 80, 0, 0, 0),
-(5, 80, 0, 0, 0),
-(6, 80, 0, 0, 0);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_forum_subscriptions`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_forum_subscriptions`;
-CREATE TABLE `rsrv5_pun_forum_subscriptions` (
-  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `forum_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`user_id`,`forum_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_forum_subscriptions`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_groups`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_groups`;
-CREATE TABLE `rsrv5_pun_groups` (
-  `g_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `g_title` varchar(50) NOT NULL DEFAULT '',
-  `g_user_title` varchar(50) DEFAULT NULL,
-  `g_moderator` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_edit_users` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_rename_users` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_change_passwords` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_ban_users` tinyint(1) NOT NULL DEFAULT '0',
-  `g_read_board` tinyint(1) NOT NULL DEFAULT '1',
-  `g_view_users` tinyint(1) NOT NULL DEFAULT '1',
-  `g_post_replies` tinyint(1) NOT NULL DEFAULT '1',
-  `g_post_topics` tinyint(1) NOT NULL DEFAULT '1',
-  `g_edit_posts` tinyint(1) NOT NULL DEFAULT '1',
-  `g_delete_posts` tinyint(1) NOT NULL DEFAULT '1',
-  `g_delete_topics` tinyint(1) NOT NULL DEFAULT '1',
-  `g_set_title` tinyint(1) NOT NULL DEFAULT '1',
-  `g_search` tinyint(1) NOT NULL DEFAULT '1',
-  `g_search_users` tinyint(1) NOT NULL DEFAULT '1',
-  `g_send_email` tinyint(1) NOT NULL DEFAULT '1',
-  `g_post_flood` smallint(6) NOT NULL DEFAULT '30',
-  `g_search_flood` smallint(6) NOT NULL DEFAULT '30',
-  `g_email_flood` smallint(6) NOT NULL DEFAULT '60',
-  `g_report_flood` smallint(6) NOT NULL DEFAULT '60',
-  PRIMARY KEY (`g_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
-
---
--- Contenu de la table `rsrv5_pun_groups`
---
-
-INSERT INTO `rsrv5_pun_groups` (`g_id`, `g_title`, `g_user_title`, `g_moderator`, `g_mod_edit_users`, `g_mod_rename_users`, `g_mod_change_passwords`, `g_mod_ban_users`, `g_read_board`, `g_view_users`, `g_post_replies`, `g_post_topics`, `g_edit_posts`, `g_delete_posts`, `g_delete_topics`, `g_set_title`, `g_search`, `g_search_users`, `g_send_email`, `g_post_flood`, `g_search_flood`, `g_email_flood`, `g_report_flood`) VALUES
-(1, 'Admin', 'Admin', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
-(2, 'ModÃ©rateurs', 'ModÃ©rateur', 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0),
-(3, 'Touriste', NULL, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0),
-(4, 'Membres', NULL, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 60, 30, 60, 60),
-(5, 'Artiste', 'Artiste', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 10, 10, 60, 60),
-(6, '100 eme Membre', '100 eme Membre', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 60, 30, 60, 60);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_online`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_online`;
-CREATE TABLE `rsrv5_pun_online` (
-  `user_id` int(10) unsigned NOT NULL DEFAULT '1',
-  `ident` varchar(200) NOT NULL DEFAULT '',
-  `logged` int(10) unsigned NOT NULL DEFAULT '0',
-  `idle` tinyint(1) NOT NULL DEFAULT '0',
-  `last_post` int(10) unsigned DEFAULT NULL,
-  `last_search` int(10) unsigned DEFAULT NULL,
-  UNIQUE KEY `rsrv5_pun_online_user_id_ident_idx` (`user_id`,`ident`(25)),
-  KEY `pun_online_user_id_idx` (`user_id`),
-  KEY `rsrv5_pun_online_ident_idx` (`ident`(25)),
-  KEY `rsrv5_pun_online_logged_idx` (`logged`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_online`
---
-
-INSERT INTO `rsrv5_pun_online` (`user_id`, `ident`, `logged`, `idle`, `last_post`, `last_search`) VALUES
-(1, '192.168.10.13', 1321306351, 0, NULL, NULL);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_posts`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_posts`;
-CREATE TABLE `rsrv5_pun_posts` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `poster` varchar(200) NOT NULL DEFAULT '',
-  `poster_id` int(10) unsigned NOT NULL DEFAULT '1',
-  `poster_ip` varchar(39) DEFAULT NULL,
-  `poster_email` varchar(80) DEFAULT NULL,
-  `message` mediumtext,
-  `hide_smilies` tinyint(1) NOT NULL DEFAULT '0',
-  `posted` int(10) unsigned NOT NULL DEFAULT '0',
-  `edited` int(10) unsigned DEFAULT NULL,
-  `edited_by` varchar(200) DEFAULT NULL,
-  `topic_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`),
-  KEY `pun_posts_topic_id_idx` (`topic_id`),
-  KEY `pun_posts_multi_idx` (`poster_id`,`topic_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21233 ;
-
---
--- Contenu de la table `rsrv5_pun_posts`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_ranks`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_ranks`;
-CREATE TABLE `rsrv5_pun_ranks` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `rank` varchar(50) NOT NULL DEFAULT '',
-  `min_posts` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
-
---
--- Contenu de la table `rsrv5_pun_ranks`
---
-
-INSERT INTO `rsrv5_pun_ranks` (`id`, `rank`, `min_posts`) VALUES
-(1, 'Apprenti posteur', 0),
-(3, 'Posteur', 100),
-(4, 'Posteur chef', 200),
-(5, 'Serial posteur', 300),
-(7, 'Les doigts greffÃ©s au clavier', 1000);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_reports`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_reports`;
-CREATE TABLE `rsrv5_pun_reports` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `post_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `topic_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `forum_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `reported_by` int(10) unsigned NOT NULL DEFAULT '0',
-  `created` int(10) unsigned NOT NULL DEFAULT '0',
-  `message` text NOT NULL,
-  `zapped` int(10) unsigned DEFAULT NULL,
-  `zapped_by` int(10) unsigned DEFAULT NULL,
-  PRIMARY KEY (`id`),
-  KEY `pun_reports_zapped_idx` (`zapped`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
-
---
--- Contenu de la table `rsrv5_pun_reports`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_search_cache`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_search_cache`;
-CREATE TABLE `rsrv5_pun_search_cache` (
-  `id` int(10) unsigned NOT NULL DEFAULT '0',
-  `ident` varchar(200) NOT NULL DEFAULT '',
-  `search_data` mediumtext,
-  PRIMARY KEY (`id`),
-  KEY `pun_search_cache_ident_idx` (`ident`(8))
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_search_cache`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_search_matches`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_search_matches`;
-CREATE TABLE `rsrv5_pun_search_matches` (
-  `post_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `word_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  `subject_match` tinyint(1) NOT NULL DEFAULT '0',
-  KEY `pun_search_matches_word_id_idx` (`word_id`),
-  KEY `pun_search_matches_post_id_idx` (`post_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_search_matches`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_search_words`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_search_words`;
-CREATE TABLE `rsrv5_pun_search_words` (
-  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
-  `word` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
-  PRIMARY KEY (`word`),
-  KEY `pun_search_words_id_idx` (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_pun_search_words`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_smilies`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_smilies`;
-CREATE TABLE `rsrv5_pun_smilies` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `image` varchar(60) NOT NULL DEFAULT '',
-  `text` varchar(60) NOT NULL DEFAULT '',
-  `disp_position` int(10) NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=89 ;
-
---
--- Contenu de la table `rsrv5_pun_smilies`
---
-
-INSERT INTO `rsrv5_pun_smilies` (`id`, `image`, `text`, `disp_position`) VALUES
-(45, 'canon.gif', ':top:', 0),
-(10, 'big_smile.png', ':D', 0),
-(11, 'cool.png', ':cool:', 0),
-(21, 'hmm.png', ':/', 0),
-(24, 'mad.png', ':mad2:', 0),
-(25, 'neutral.png', ':|', 0),
-(26, 'roll.png', ':roll:', 0),
-(29, 'sad.png', ':(', 3),
-(31, 'smile.png', ':)', 4),
-(33, 'tongue.png', ':p', 6),
-(35, 'wink.png', ';)', 7),
-(37, 'yikes.png', ':d', 0),
-(56, 'whaouh6na.gif', 'whaou', 0),
-(87, 'terminator.png', ':terminator:', 0);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_topics`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_topics`;
-CREATE TABLE `rsrv5_pun_topics` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `poster` varchar(200) NOT NULL DEFAULT '',
-  `subject` varchar(255) NOT NULL DEFAULT '',
-  `posted` int(10) unsigned NOT NULL DEFAULT '0',
-  `first_post_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `last_post` int(10) unsigned NOT NULL DEFAULT '0',
-  `last_post_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `last_poster` varchar(200) DEFAULT NULL,
-  `num_views` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  `num_replies` mediumint(8) unsigned NOT NULL DEFAULT '0',
-  `closed` tinyint(1) NOT NULL DEFAULT '0',
-  `sticky` tinyint(1) NOT NULL DEFAULT '0',
-  `moved_to` int(10) unsigned DEFAULT NULL,
-  `forum_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`),
-  KEY `pun_topics_forum_id_idx` (`forum_id`),
-  KEY `pun_topics_moved_to_idx` (`moved_to`),
-  KEY `rsrv5_pun_topics_last_post_idx` (`last_post`),
-  KEY `rsrv5_pun_topics_first_post_id_idx` (`first_post_id`)
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2441 ;
-
---
--- Contenu de la table `rsrv5_pun_topics`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_topic_subscriptions`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_topic_subscriptions`;
-CREATE TABLE `rsrv5_pun_topic_subscriptions` (
-  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `topic_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`user_id`,`topic_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_pun_topic_subscriptions`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_pun_users`
---
-
-DROP TABLE IF EXISTS `rsrv5_pun_users`;
-CREATE TABLE `rsrv5_pun_users` (
-  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-  `group_id` int(10) unsigned NOT NULL DEFAULT '4',
-  `username` varchar(200) NOT NULL DEFAULT '',
-  `password` varchar(40) NOT NULL DEFAULT '',
-  `email` varchar(80) NOT NULL DEFAULT '',
-  `title` varchar(50) DEFAULT NULL,
-  `realname` varchar(40) DEFAULT NULL,
-  `url` varchar(100) DEFAULT NULL,
-  `jabber` varchar(80) DEFAULT NULL,
-  `icq` varchar(12) DEFAULT NULL,
-  `msn` varchar(80) DEFAULT NULL,
-  `aim` varchar(30) DEFAULT NULL,
-  `yahoo` varchar(30) DEFAULT NULL,
-  `location` varchar(30) DEFAULT NULL,
-  `signature` text,
-  `disp_topics` tinyint(3) unsigned DEFAULT NULL,
-  `disp_posts` tinyint(3) unsigned DEFAULT NULL,
-  `email_setting` tinyint(1) NOT NULL DEFAULT '1',
-  `notify_with_post` tinyint(1) NOT NULL DEFAULT '0',
-  `auto_notify` tinyint(1) NOT NULL DEFAULT '0',
-  `show_smilies` tinyint(1) NOT NULL DEFAULT '1',
-  `show_img` tinyint(1) NOT NULL DEFAULT '1',
-  `show_img_sig` tinyint(1) NOT NULL DEFAULT '1',
-  `show_avatars` tinyint(1) NOT NULL DEFAULT '1',
-  `show_sig` tinyint(1) NOT NULL DEFAULT '1',
-  `timezone` float NOT NULL DEFAULT '0',
-  `dst` tinyint(1) NOT NULL DEFAULT '0',
-  `date_format` tinyint(1) NOT NULL DEFAULT '0',
-  `time_format` tinyint(1) NOT NULL DEFAULT '0',
-  `language` varchar(25) NOT NULL DEFAULT 'English',
-  `style` varchar(25) NOT NULL DEFAULT 'Oxygen',
-  `num_posts` int(10) unsigned NOT NULL DEFAULT '0',
-  `last_post` int(10) unsigned DEFAULT NULL,
-  `last_search` int(10) unsigned DEFAULT NULL,
-  `last_email_sent` int(10) unsigned DEFAULT NULL,
-  `last_report_sent` int(10) unsigned DEFAULT NULL,
-  `registered` int(10) unsigned NOT NULL DEFAULT '0',
-  `registration_ip` varchar(39) NOT NULL DEFAULT '0.0.0.0',
-  `last_visit` int(10) unsigned NOT NULL DEFAULT '0',
-  `admin_note` varchar(30) DEFAULT NULL,
-  `activate_string` varchar(80) DEFAULT NULL,
-  `activate_key` varchar(8) DEFAULT NULL,
-  PRIMARY KEY (`id`),
-  UNIQUE KEY `rsrv5_pun_users_username_idx` (`username`(25)),
-  KEY `pun_users_registered_idx` (`registered`),
-  KEY `pun_users_username_idx` (`username`(8))
-) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1559 ;
-
---
--- Contenu de la table `rsrv5_pun_users`
---
-
-INSERT INTO `rsrv5_pun_users` (`id`, `group_id`, `username`, `password`, `email`, `title`, `realname`, `url`, `jabber`, `icq`, `msn`, `aim`, `yahoo`, `location`, `signature`, `disp_topics`, `disp_posts`, `email_setting`, `notify_with_post`, `auto_notify`, `show_smilies`, `show_img`, `show_img_sig`, `show_avatars`, `show_sig`, `timezone`, `dst`, `date_format`, `time_format`, `language`, `style`, `num_posts`, `last_post`, `last_search`, `last_email_sent`, `last_report_sent`, `registered`, `registration_ip`, `last_visit`, `admin_note`, `activate_string`, `activate_key`) VALUES
-(186, 1, 'admin', '90f1b3c6cf62b05606b215265803f553e22bc657', 'admin@domain.tld', NULL, NULL, '', NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 'French', 'Rsr', 1382, 1321043538, NULL, NULL, NULL, 1156702867, '82.243.194.97', 1321305012, NULL, NULL, NULL),
-(1, 3, 'InvitÃ©', 'InvitÃ©', 'InvitÃ©', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', NULL, NULL, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 'English', 'Oxygen', 0, NULL, NULL, NULL, NULL, 0, '0.0.0.0', 0, NULL, NULL, NULL);
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_super_admins`
---
-
-DROP TABLE IF EXISTS `rsrv5_super_admins`;
-CREATE TABLE `rsrv5_super_admins` (
-  `id_pun_user` int(11) NOT NULL,
-  PRIMARY KEY (`id_pun_user`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
---
--- Contenu de la table `rsrv5_super_admins`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_thumbs`
---
-
-DROP TABLE IF EXISTS `rsrv5_thumbs`;
-CREATE TABLE `rsrv5_thumbs` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `src` varchar(255) NOT NULL DEFAULT '',
-  `src_width` int(11) NOT NULL DEFAULT '0',
-  `src_height` int(11) NOT NULL DEFAULT '0',
-  `max_width` int(11) NOT NULL DEFAULT '0',
-  `max_height` int(11) NOT NULL DEFAULT '0',
-  `thumb_file` varchar(255) NOT NULL,
-  `thumb_width` int(11) NOT NULL DEFAULT '0',
-  `thumb_height` int(11) NOT NULL DEFAULT '0',
-  `creation_date` datetime NOT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_thumbs`
---
-
-
--- --------------------------------------------------------
-
---
--- Structure de la table `rsrv5_videos`
---
-
-DROP TABLE IF EXISTS `rsrv5_videos`;
-CREATE TABLE `rsrv5_videos` (
-  `id` int(11) NOT NULL AUTO_INCREMENT,
-  `id_artiste` int(11) DEFAULT NULL,
-  `titre` varchar(255) DEFAULT NULL,
-  `description` text,
-  `url` varchar(255) DEFAULT NULL,
-  `id_licence` int(11) DEFAULT NULL,
-  `date_creation` date DEFAULT NULL,
-  `date_publication` date DEFAULT NULL,
-  PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
-
---
--- Contenu de la table `rsrv5_videos`
---
-
Index: trunk/web/install/dist/sql/tables.sql
===================================================================
--- trunk/web/install/dist/sql/tables.sql	(revision 10)
+++ trunk/web/install/dist/sql/tables.sql	(revision 1)
@@ -1,3 +1,3 @@
-CREATE TABLE `[prefix]albums` (
+CREATE TABLE IF NOT EXISTS `[prefix]albums` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id_artiste` int(11) NOT NULL,
@@ -16,5 +16,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]artistes` (
+CREATE TABLE IF NOT EXISTS `[prefix]artistes` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `nom` varchar(255) DEFAULT NULL,
@@ -40,5 +40,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]artistes_admins` (
+CREATE TABLE IF NOT EXISTS `[prefix]artistes_admins` (
   `id_artiste` int(11) NOT NULL,
   `pun_user` int(11) NOT NULL,
@@ -46,5 +46,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]boxes` (
+CREATE TABLE IF NOT EXISTS `[prefix]boxes` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `nom` varchar(64) DEFAULT NULL,
@@ -63,5 +63,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=162 ;
 # --
-CREATE TABLE `[prefix]categories` (
+CREATE TABLE IF NOT EXISTS `[prefix]categories` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `nom` varchar(64) DEFAULT NULL,
@@ -74,5 +74,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=103 ;
 # --
-CREATE TABLE `[prefix]categories_tree` (
+CREATE TABLE IF NOT EXISTS `[prefix]categories_tree` (
   `parent` int(11) NOT NULL,
   `child` int(11) NOT NULL,
@@ -80,5 +80,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]concerts` (
+CREATE TABLE IF NOT EXISTS `[prefix]concerts` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id_artiste` int(11) DEFAULT NULL,
@@ -94,5 +94,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]configuration` (
+CREATE TABLE IF NOT EXISTS `[prefix]configuration` (
   `key` varchar(255) NOT NULL,
   `value` text NOT NULL,
@@ -100,5 +100,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]contenus` (
+CREATE TABLE IF NOT EXISTS `[prefix]contenus` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `nom` varchar(64) DEFAULT NULL,
@@ -117,5 +117,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=935 ;
 # --
-CREATE TABLE `[prefix]downloads` (
+CREATE TABLE IF NOT EXISTS `[prefix]downloads` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id_artiste` int(11) DEFAULT NULL,
@@ -131,5 +131,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]download_urls` (
+CREATE TABLE IF NOT EXISTS `[prefix]download_urls` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id_download` int(11) DEFAULT NULL,
@@ -143,5 +143,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]formats` (
+CREATE TABLE IF NOT EXISTS `[prefix]formats` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `nom` varchar(32) DEFAULT NULL,
@@ -150,5 +150,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
 # --
-CREATE TABLE `[prefix]licences` (
+CREATE TABLE IF NOT EXISTS `[prefix]licences` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `nom` varchar(255) NOT NULL DEFAULT '',
@@ -158,5 +158,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=17 ;
 # --
-CREATE TABLE `[prefix]playlists` (
+CREATE TABLE IF NOT EXISTS `[prefix]playlists` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `pun_user` int(11) NOT NULL,
@@ -167,5 +167,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]playlist_download` (
+CREATE TABLE IF NOT EXISTS `[prefix]playlist_download` (
   `id` int(11) NOT NULL,
   `id_download` int(11) NOT NULL,
@@ -173,17 +173,15 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]pun_bans` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_bans` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `username` varchar(200) DEFAULT NULL,
   `ip` varchar(255) DEFAULT NULL,
-  `email` varchar(80) DEFAULT NULL,
+  `email` varchar(50) DEFAULT NULL,
   `message` varchar(255) DEFAULT NULL,
   `expire` int(10) unsigned DEFAULT NULL,
-  `ban_creator` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`id`),
-  KEY `[prefix]pun_bans_username_idx` (`username`(25))
+  PRIMARY KEY (`id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
 # --
-CREATE TABLE `[prefix]pun_categories` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_categories` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `cat_name` varchar(80) NOT NULL DEFAULT 'New Category',
@@ -192,5 +190,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=22 ;
 # --
-CREATE TABLE `[prefix]pun_censoring` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_censoring` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `search_for` varchar(60) NOT NULL DEFAULT '',
@@ -199,5 +197,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]pun_config` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_config` (
   `conf_name` varchar(255) NOT NULL DEFAULT '',
   `conf_value` text,
@@ -205,5 +203,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]pun_forums` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_forums` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `forum_name` varchar(80) NOT NULL DEFAULT 'New forum',
@@ -222,5 +220,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=103 ;
 # --
-CREATE TABLE `[prefix]pun_forum_perms` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_forum_perms` (
   `group_id` int(10) NOT NULL DEFAULT '0',
   `forum_id` int(10) NOT NULL DEFAULT '0',
@@ -231,23 +229,12 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]pun_forum_subscriptions` (
-  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `forum_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`user_id`,`forum_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-# --
-CREATE TABLE `[prefix]pun_groups` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_groups` (
   `g_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `g_title` varchar(50) NOT NULL DEFAULT '',
   `g_user_title` varchar(50) DEFAULT NULL,
-  `g_moderator` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_edit_users` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_rename_users` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_change_passwords` tinyint(1) NOT NULL DEFAULT '0',
-  `g_mod_ban_users` tinyint(1) NOT NULL DEFAULT '0',
   `g_read_board` tinyint(1) NOT NULL DEFAULT '1',
-  `g_view_users` tinyint(1) NOT NULL DEFAULT '1',
   `g_post_replies` tinyint(1) NOT NULL DEFAULT '1',
   `g_post_topics` tinyint(1) NOT NULL DEFAULT '1',
+  `g_post_polls` tinyint(1) NOT NULL DEFAULT '1',
   `g_edit_posts` tinyint(1) NOT NULL DEFAULT '1',
   `g_delete_posts` tinyint(1) NOT NULL DEFAULT '1',
@@ -256,32 +243,25 @@
   `g_search` tinyint(1) NOT NULL DEFAULT '1',
   `g_search_users` tinyint(1) NOT NULL DEFAULT '1',
-  `g_send_email` tinyint(1) NOT NULL DEFAULT '1',
+  `g_edit_subjects_interval` smallint(6) NOT NULL DEFAULT '300',
   `g_post_flood` smallint(6) NOT NULL DEFAULT '30',
   `g_search_flood` smallint(6) NOT NULL DEFAULT '30',
-  `g_email_flood` smallint(6) NOT NULL DEFAULT '60',
-  `g_report_flood` smallint(6) NOT NULL DEFAULT '60',
   PRIMARY KEY (`g_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
 # --
-CREATE TABLE `[prefix]pun_online` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_online` (
   `user_id` int(10) unsigned NOT NULL DEFAULT '1',
   `ident` varchar(200) NOT NULL DEFAULT '',
   `logged` int(10) unsigned NOT NULL DEFAULT '0',
   `idle` tinyint(1) NOT NULL DEFAULT '0',
-  `last_post` int(10) unsigned DEFAULT NULL,
-  `last_search` int(10) unsigned DEFAULT NULL,
-  UNIQUE KEY `[prefix]pun_online_user_id_ident_idx` (`user_id`,`ident`(25)),
-  KEY `pun_online_user_id_idx` (`user_id`),
-  KEY `[prefix]pun_online_ident_idx` (`ident`(25)),
-  KEY `[prefix]pun_online_logged_idx` (`logged`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-# --
-CREATE TABLE `[prefix]pun_posts` (
+  KEY `pun_online_user_id_idx` (`user_id`)
+) ENGINE=MEMORY DEFAULT CHARSET=utf8;
+# --
+CREATE TABLE IF NOT EXISTS `[prefix]pun_posts` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `poster` varchar(200) NOT NULL DEFAULT '',
   `poster_id` int(10) unsigned NOT NULL DEFAULT '1',
-  `poster_ip` varchar(39) DEFAULT NULL,
-  `poster_email` varchar(80) DEFAULT NULL,
-  `message` mediumtext,
+  `poster_ip` varchar(15) DEFAULT NULL,
+  `poster_email` varchar(50) DEFAULT NULL,
+  `message` text NOT NULL,
   `hide_smilies` tinyint(1) NOT NULL DEFAULT '0',
   `posted` int(10) unsigned NOT NULL DEFAULT '0',
@@ -294,5 +274,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=21233 ;
 # --
-CREATE TABLE `[prefix]pun_ranks` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_ranks` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `rank` varchar(50) NOT NULL DEFAULT '',
@@ -301,5 +281,5 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
 # --
-CREATE TABLE `[prefix]pun_reports` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_reports` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `post_id` int(10) unsigned NOT NULL DEFAULT '0',
@@ -315,13 +295,13 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 # --
-CREATE TABLE `[prefix]pun_search_cache` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_search_cache` (
   `id` int(10) unsigned NOT NULL DEFAULT '0',
   `ident` varchar(200) NOT NULL DEFAULT '',
-  `search_data` mediumtext,
+  `search_data` text NOT NULL,
   PRIMARY KEY (`id`),
   KEY `pun_search_cache_ident_idx` (`ident`(8))
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]pun_search_matches` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_search_matches` (
   `post_id` int(10) unsigned NOT NULL DEFAULT '0',
   `word_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
@@ -331,5 +311,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]pun_search_words` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_search_words` (
   `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
   `word` varchar(20) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
@@ -338,5 +318,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]pun_smilies` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_smilies` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `image` varchar(60) NOT NULL DEFAULT '',
@@ -346,10 +326,15 @@
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=89 ;
 # --
-CREATE TABLE `[prefix]pun_topics` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_subscriptions` (
+  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
+  `topic_id` int(10) unsigned NOT NULL DEFAULT '0',
+  PRIMARY KEY (`user_id`,`topic_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+# --
+CREATE TABLE IF NOT EXISTS `[prefix]pun_topics` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `poster` varchar(200) NOT NULL DEFAULT '',
   `subject` varchar(255) NOT NULL DEFAULT '',
   `posted` int(10) unsigned NOT NULL DEFAULT '0',
-  `first_post_id` int(10) unsigned NOT NULL DEFAULT '0',
   `last_post` int(10) unsigned NOT NULL DEFAULT '0',
   `last_post_id` int(10) unsigned NOT NULL DEFAULT '0',
@@ -363,36 +348,29 @@
   PRIMARY KEY (`id`),
   KEY `pun_topics_forum_id_idx` (`forum_id`),
-  KEY `pun_topics_moved_to_idx` (`moved_to`),
-  KEY `[prefix]pun_topics_last_post_idx` (`last_post`),
-  KEY `[prefix]pun_topics_first_post_id_idx` (`first_post_id`)
+  KEY `pun_topics_moved_to_idx` (`moved_to`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2441 ;
 # --
-CREATE TABLE `[prefix]pun_topic_subscriptions` (
-  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
-  `topic_id` int(10) unsigned NOT NULL DEFAULT '0',
-  PRIMARY KEY (`user_id`,`topic_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-# --
-CREATE TABLE `[prefix]pun_users` (
+CREATE TABLE IF NOT EXISTS `[prefix]pun_users` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `group_id` int(10) unsigned NOT NULL DEFAULT '4',
   `username` varchar(200) NOT NULL DEFAULT '',
   `password` varchar(40) NOT NULL DEFAULT '',
-  `email` varchar(80) NOT NULL DEFAULT '',
+  `email` varchar(50) NOT NULL DEFAULT '',
   `title` varchar(50) DEFAULT NULL,
   `realname` varchar(40) DEFAULT NULL,
   `url` varchar(100) DEFAULT NULL,
-  `jabber` varchar(80) DEFAULT NULL,
+  `jabber` varchar(75) DEFAULT NULL,
   `icq` varchar(12) DEFAULT NULL,
-  `msn` varchar(80) DEFAULT NULL,
+  `msn` varchar(50) DEFAULT NULL,
   `aim` varchar(30) DEFAULT NULL,
   `yahoo` varchar(30) DEFAULT NULL,
   `location` varchar(30) DEFAULT NULL,
+  `use_avatar` tinyint(1) NOT NULL DEFAULT '0',
   `signature` text,
   `disp_topics` tinyint(3) unsigned DEFAULT NULL,
   `disp_posts` tinyint(3) unsigned DEFAULT NULL,
   `email_setting` tinyint(1) NOT NULL DEFAULT '1',
+  `save_pass` tinyint(1) NOT NULL DEFAULT '1',
   `notify_with_post` tinyint(1) NOT NULL DEFAULT '0',
-  `auto_notify` tinyint(1) NOT NULL DEFAULT '0',
   `show_smilies` tinyint(1) NOT NULL DEFAULT '1',
   `show_img` tinyint(1) NOT NULL DEFAULT '1',
@@ -401,32 +379,25 @@
   `show_sig` tinyint(1) NOT NULL DEFAULT '1',
   `timezone` float NOT NULL DEFAULT '0',
-  `dst` tinyint(1) NOT NULL DEFAULT '0',
-  `date_format` tinyint(1) NOT NULL DEFAULT '0',
-  `time_format` tinyint(1) NOT NULL DEFAULT '0',
   `language` varchar(25) NOT NULL DEFAULT 'English',
   `style` varchar(25) NOT NULL DEFAULT 'Oxygen',
   `num_posts` int(10) unsigned NOT NULL DEFAULT '0',
   `last_post` int(10) unsigned DEFAULT NULL,
-  `last_search` int(10) unsigned DEFAULT NULL,
-  `last_email_sent` int(10) unsigned DEFAULT NULL,
-  `last_report_sent` int(10) unsigned DEFAULT NULL,
   `registered` int(10) unsigned NOT NULL DEFAULT '0',
-  `registration_ip` varchar(39) NOT NULL DEFAULT '0.0.0.0',
+  `registration_ip` varchar(15) NOT NULL DEFAULT '0.0.0.0',
   `last_visit` int(10) unsigned NOT NULL DEFAULT '0',
   `admin_note` varchar(30) DEFAULT NULL,
-  `activate_string` varchar(80) DEFAULT NULL,
+  `activate_string` varchar(50) DEFAULT NULL,
   `activate_key` varchar(8) DEFAULT NULL,
   PRIMARY KEY (`id`),
-  UNIQUE KEY `[prefix]_pun_users_username_idx` (`username`(25)),
   KEY `pun_users_registered_idx` (`registered`),
   KEY `pun_users_username_idx` (`username`(8))
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1559 ;
 # --
-CREATE TABLE `[prefix]super_admins` (
+CREATE TABLE IF NOT EXISTS `[prefix]super_admins` (
   `id_pun_user` int(11) NOT NULL,
   PRIMARY KEY (`id_pun_user`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 # --
-CREATE TABLE `[prefix]thumbs` (
+CREATE TABLE IF NOT EXISTS `[prefix]thumbs` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `src` varchar(255) NOT NULL DEFAULT '',
@@ -442,5 +413,5 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
 # --
-CREATE TABLE `[prefix]videos` (
+CREATE TABLE IF NOT EXISTS `[prefix]videos` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `id_artiste` int(11) DEFAULT NULL,
Index: trunk/web/install/mods/e_install.php
===================================================================
--- trunk/web/install/mods/e_install.php	(revision 10)
+++ trunk/web/install/mods/e_install.php	(revision 1)
@@ -123,34 +123,21 @@
 
   function install_db($env)
-  { $flag = 0;
-    try
-    { $env->data->sql->query("USE ".$_POST["db_base"]);
-      if(($sql = file_get_contents("dist/sql/init.sql")) !== false)
-      { $flag = 1;
-        if($sql) try
-        { $flag = 2;
-          $env->data->sql->query($sql);
-          $flag = 3;
+  { try
+    { if(($sql = file_get_contents("dist/sql/init.sql")) !== false)
+      { if($sql) try
+        { $env->data->sql->query($sql);
           if(($sql = file_get_contents("dist/sql/raz.sql")) !== false)
-          { $flag = 4;
-            if($sql) try
-            { $flag = 5;
-              $sql = str_replace("[prefix]", $_POST["db_prefix"], $sql);
+          { if($sql) try
+            { $sql = str_replace("[prefix]", $_POST["db_prefix"], $sql);
               $v_sql = explode("# --", $sql);
               foreach($v_sql as $_sql) if($_sql) $env->data->sql->query($_sql);
-              $flag = 6;
               if(($sql = file_get_contents("dist/sql/tables.sql")) !== false)
-              { $flag = 7;
-                if($sql) try
-                { $flag = 8;
-                  $sql = str_replace("[prefix]", $_POST["db_prefix"], $sql);
+              { if($sql) try
+                { $sql = str_replace("[prefix]", $_POST["db_prefix"], $sql);
                   $v_sql = explode("# --", $sql);
                   foreach($v_sql as $_sql) if($_sql) $env->data->sql->query($_sql);
-                  $flag = 9;
                   if(($sql = file_get_contents("dist/sql/content.sql")) !== false)
-                  { $flag = 10;
-                    if($sql) try
-                    { $flag = 11;
-                      $punbb_url = "http://".$_SERVER["SERVER_NAME"];
+                  { if($sql) try
+                    { $punbb_url = "http://".$_SERVER["SERVER_NAME"];
                       $v_path = explode("/", $_SERVER["SCRIPT_NAME"]);
                       $path = "";
@@ -174,5 +161,4 @@
                       $v_sql = explode("# --", $sql);
                       foreach($v_sql as $_sql) if($_sql) $env->data->sql->query($_sql);
-                      $flag = 12;
                     }
                     catch(Exception $_e)
@@ -187,10 +173,5 @@
                   ."<br/>v&eacute;rifiez que vous avez bien upload&eacute; tous les fichiers";
                 }
-                catch(Exception $_e)
-                { $env->message =
-                   "Impossible d'executer les requetes du fichier tables.sql"
-                  ."<br/>erreur dans la requete sql:<br/>".$_sql;
-                  return;
-                }
+                catch(Exception $_e) { $env->message = "Impossible d'executer les requetes du fichier tables.sql"; return; }
               }
               else $env->message .=
@@ -204,10 +185,5 @@
           ."<br/>v&eacute;rifiez que vous avez bien upload&eacute; tous les fichiers";
         }
-        catch(Exception $_e)
-        { $env->message =
-           "Impossible d'executer les requetes du fichier init.sql (flag ".$flag.")"
-          ."<br>V&eacute;rifiez que vous avez indiqu&eacute; les bon param&egrave;tres de connection &agrave la base de donn&eacute;es";
-          return;
-        }
+        catch(Exception $_e) { $env->message = "Impossible d'executer les requetes du fichier init.sql"; return; }
       }
       else $env->message .=
@@ -215,10 +191,10 @@
       ."<br/>v&eacute;rifiez que vous avez bien upload&eacute; tous les fichiers";
     }
-    catch(Exception $_e) { $env->message .= "impossible d'acc&eacute;der &agrave; la base de donn&eacute;es"; }
+    catch(Exception $_e) { $env->message .= "<br/>impossible d'acc&eacute;der &agrave; la base de donn&eacute;es"; }
   }
 
   function clear_pun_cache()
   { if(is_dir("../punbb/cache/") && ($dh = opendir("../punbb/cache/")))
-    { while(($file = readdir($dh)) !== false) if(strpos($file, "cache_") === 0) @unlink("../punbb/cache/".$file);
+    { while(($file = readdir($dh)) !== false) if(strpos($file, "cache_") === 0 && $file !== "cache_smilies.php") @unlink("../punbb/cache/".$file);
       closedir($dh);
     }
Index: trunk/web/punbb/COPYING
===================================================================
--- trunk/web/punbb/COPYING	(revision 10)
+++ 	(revision )
@@ -1,345 +1,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
Index: trunk/web/punbb/README
===================================================================
--- trunk/web/punbb/README	(revision 10)
+++ 	(revision )
@@ -1,31 +1,0 @@
-	=====================
-	  FluxBB 1.4 Readme
-	=====================
-
-	   About
-	----------------
-FluxBB is an open source forum application released under the GNU General Public
-Licence. It is free to download and use and will remain so. FluxBB was conceived and
-designed to be fast and light with less of the "not so essential" features that some
-of the other forums have whilst not sacrificing essential functionality or usability.
-
-	  Requirements
-	----------------
- - A webserver
- - PHP 4.4.0 or later
- - A database such as MySQL 4.1.2 or later, PostgreSQL 7.0 or later, or SQLite 2
-
-	  Recommendations
-	-------------------
- - Make use of a PHP accelerator such as APC or XCache
- - Make sure PHP has the zlib module installed to allow FluxBB to gzip output
-
-	  Links
-	---------
-
- - Homepage: http://fluxbb.org
- - Documentation: http://fluxbb.org/docs/
- - Community: http://fluxbb.org/forums/
- - Resources: http://fluxbb.org/resources/
- - IRC: irc://irc.freenode.net/fluxbb
- - Development: http://github.com/fluxbb/fluxbb
Index: trunk/web/punbb/admin_bans.php
===================================================================
--- trunk/web/punbb/admin_bans.php	(revision 10)
+++ trunk/web/punbb/admin_bans.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN && ($pun_user['g_moderator'] != '1' || $pun_user['g_mod_ban_users'] == '0'))
+if ($pun_user['g_id'] > PUN_MOD || ($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_ban_users'] == '0'))
 	message($lang_common['No permission']);
 
-// Load the admin_bans.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_bans.php';
 
 // Add/edit a ban (stage 1)
@@ -26,60 +41,47 @@
 	if (isset($_GET['add_ban']) || isset($_POST['add_ban']))
 	{
-		// If the ID of the user to ban was provided through GET (a link from profile.php)
+		// If the id of the user to ban was provided through GET (a link from profile.php)
 		if (isset($_GET['add_ban']))
 		{
-			$user_id = intval($_GET['add_ban']);
-			if ($user_id < 2)
+			$add_ban = intval($_GET['add_ban']);
+			if ($add_ban < 2)
 				message($lang_common['Bad request']);
 
-			$result = $db->query('SELECT group_id, username, email FROM '.$db->prefix.'users WHERE id='.$user_id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+			$user_id = $add_ban;
+
+			$result = $db->query('SELECT group_id, username, email FROM '.$db->prefix.'users WHERE id='.$user_id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 			if ($db->num_rows($result))
 				list($group_id, $ban_user, $ban_email) = $db->fetch_row($result);
 			else
-				message($lang_admin_bans['No user ID message']);
+				message('Aucun utilisateur enregistrÃ© sous cet identifiant (ID).');
 		}
-		else // Otherwise the username is in POST
+		else	// Otherwise the username is in POST
 		{
-			$ban_user = pun_trim($_POST['new_ban_user']);
+			$ban_user = trim($_POST['new_ban_user']);
 
 			if ($ban_user != '')
 			{
-				$result = $db->query('SELECT id, group_id, username, email FROM '.$db->prefix.'users WHERE username=\''.$db->escape($ban_user).'\' AND id>1') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT id, group_id, username, email FROM '.$db->prefix.'users WHERE username=\''.$db->escape($ban_user).'\' AND id>1') or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 				if ($db->num_rows($result))
 					list($user_id, $group_id, $ban_user, $ban_email) = $db->fetch_row($result);
 				else
-					message($lang_admin_bans['No user message']);
+					message('Aucun utilisateur enregistrÃ© sous ce nom d\'utilisateur. Si vous souhaitez ajouter un bannissement qui ne soit pas liÃ© Ã  un nom d\'utilisateur particulier, laissez la case vide.');
 			}
 		}
 
-		// Make sure we're not banning an admin or moderator
-		if (isset($group_id))
-		{
-			if ($group_id == PUN_ADMIN)
-				message(sprintf($lang_admin_bans['User is admin message'], pun_htmlspecialchars($ban_user)));
-
-			$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
-			$is_moderator_group = $db->result($result);
-
-			if ($is_moderator_group)
-				message(sprintf($lang_admin_bans['User is mod message'], pun_htmlspecialchars($ban_user)));
-		}
+		// Make sure we're not banning an admin
+		if (isset($group_id) && $group_id == PUN_ADMIN)
+			message('L\'utilisateur '.pun_htmlspecialchars($ban_user).' est un administrateur, il ne peut Ãªtre bannis. Si vous souhaitez bannir un administrateur, vous devez d\'abord le rÃ©trograder soit modÃ©rateur soit utilisateur.');
 
 		// If we have a $user_id, we can try to find the last known IP of that user
 		if (isset($user_id))
 		{
-			$result = $db->query('SELECT poster_ip FROM '.$db->prefix.'posts WHERE poster_id='.$user_id.' ORDER BY posted DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+			$result = $db->query('SELECT poster_ip FROM '.$db->prefix.'posts WHERE poster_id='.$user_id.' ORDER BY posted DESC LIMIT 1') or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 			$ban_ip = ($db->num_rows($result)) ? $db->result($result) : '';
-
-			if ($ban_ip == '')
-			{
-				$result = $db->query('SELECT registration_ip FROM '.$db->prefix.'users WHERE id='.$user_id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-				$ban_ip = ($db->num_rows($result)) ? $db->result($result) : '';
-			}
 		}
 
 		$mode = 'add';
 	}
-	else // We are editing a ban
+	else	// We are editing a ban
 	{
 		$ban_id = intval($_GET['edit_ban']);
@@ -87,5 +89,5 @@
 			message($lang_common['Bad request']);
 
-		$result = $db->query('SELECT username, ip, email, message, expire FROM '.$db->prefix.'bans WHERE id='.$ban_id) or error('Unable to fetch ban info', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT username, ip, email, message, expire FROM '.$db->prefix.'bans WHERE id='.$ban_id) or error('Impossible de retrouver les informations de bannissement', __FILE__, __LINE__, $db->error());
 		if ($db->num_rows($result))
 			list($ban_user, $ban_ip, $ban_email, $ban_message, $ban_expire) = $db->fetch_row($result);
@@ -93,20 +95,19 @@
 			message($lang_common['Bad request']);
 
-		$diff = ($pun_user['timezone'] + $pun_user['dst']) * 3600;
-		$ban_expire = ($ban_expire != '') ? gmdate('Y-m-d', $ban_expire + $diff) : '';
+		$ban_expire = ($ban_expire != '') ? date('Y-m-d', $ban_expire) : '';
 
 		$mode = 'edit';
 	}
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Bans']);
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Bannissements';
 	$focus_element = array('bans2', 'ban_user');
-	define('PUN_ACTIVE_PAGE', 'admin');
 	require PUN_ROOT.'header.php';
 
 	generate_admin_menu('bans');
+
 
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_bans['Ban advanced head'] ?></span></h2>
+		<h2><span>RÃ©glages de bannissement avancÃ©s</span></h2>
 		<div class="box">
 			<form id="bans2" method="post" action="admin_bans.php">
@@ -115,30 +116,30 @@
 <?php if ($mode == 'edit'): ?>				<input type="hidden" name="ban_id" value="<?php echo $ban_id ?>" />
 <?php endif; ?>				<fieldset>
-						<legend><?php echo $lang_admin_bans['Ban advanced subhead'] ?></legend>
+						<legend>Bannissement supplÃ©mentaire avec <acronym title="Internet Protocol" lang="en">IP</acronym> est adresse e-mail</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Username label'] ?></th>
+									<th scope="row">Nom d'utilisateur</th>
 									<td>
 										<input type="text" name="ban_user" size="25" maxlength="25" value="<?php if (isset($ban_user)) echo pun_htmlspecialchars($ban_user); ?>" tabindex="1" />
-										<span><?php echo $lang_admin_bans['Username help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['IP label'] ?></th>
+										<span>Le nom d'utilisateur Ã  bannir.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Adresses <acronym title="Internet Protocol" lang="en">IP</acronym></th>
 									<td>
 										<input type="text" name="ban_ip" size="45" maxlength="255" value="<?php if (isset($ban_ip)) echo $ban_ip; ?>" tabindex="2" />
-										<span><?php echo $lang_admin_bans['IP help'] ?><?php if ($ban_user != '' && isset($user_id)) printf(' '.$lang_admin_bans['IP help link'], '<a href="admin_users.php?ip_stats='.$user_id.'">'.$lang_admin_common['here'].'</a>') ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['E-mail label'] ?></th>
-									<td>
-										<input type="text" name="ban_email" size="40" maxlength="80" value="<?php if (isset($ban_email)) echo $ban_email; ?>" tabindex="3" />
-										<span><?php echo $lang_admin_bans['E-mail help'] ?></span>
+										<span>Une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> ou une plage d'adresses <acronym title="Internet Protocol" lang="en">IP</acronym> que vous souhaitez bannir (<abbr title="exemple">ex.</abbr> 150.11.110.1 ou 150.11.110). SÃ©parez les adresses par des espaces. Si une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> apparaÃ®t dÃ©jÃ , il s'agit de la derniÃšre adresse IP connue de l'utilisateur dans la base de donnÃ©es.<?php if ($ban_user != '' && isset($user_id)) echo ' <a href="admin_users.php?ip_stats='.$user_id.'">Cliquez ici</a> pour voir les statistiques <acronym title="Internet Protocol" lang="en">IP</acronym> de cet utilisateur.' ?></span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">E-mail/domaine</th>
+									<td>
+										<input type="text" name="ban_email" size="40" maxlength="50" value="<?php if (isset($ban_email)) echo strtolower($ban_email); ?>" tabindex="3" />
+										<span>L'adresse e-mail ou le domaine e-mail que vous souhaitez bannir (<abbr title="exemple">ex.</abbr> utilisateur@domaine.com ou domaine.com). Pour plus d'informations, voir "Autoriser les adresses e-mail bannies" Ã  la page des Permissions.</span>
 									</td>
 								</tr>
 							</table>
-							<p class="topspace"><strong class="warntext"><?php echo $lang_admin_bans['Ban IP range info'] ?></strong></p>
+							<p class="topspace"><strong class="warntext">Vous devez Ãªtres trÃšs vigilant lorsque vous bannissez une plage d'<acronym title="Internet Protocol" lang="en">IP</acronym> car il y a fort probablement plusieurs utilisateurs qui correspondent Ã  la mÃªme <acronym title="Internet Protocol" lang="en">IP</acronym> partielle.</strong></p>
 						</div>
 					</fieldset>
@@ -146,19 +147,19 @@
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_bans['Message expiry subhead'] ?></legend>
+						<legend>Message et Ã©chÃ©ance d'interdiction</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Ban message label'] ?></th>
+									<th scope="row">Message d'interdiction</th>
 									<td>
 										<input type="text" name="ban_message" size="50" maxlength="255" value="<?php if (isset($ban_message)) echo pun_htmlspecialchars($ban_message); ?>" tabindex="4" />
-										<span><?php echo $lang_admin_bans['Ban message help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Expire date label'] ?></th>
+										<span>Le  message qui sera affichÃ© Ã  l'utilisateur banni lorsqu'il visitera les forums.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">ÃchÃ©ance d'interdiction</th>
 									<td>
 										<input type="text" name="ban_expire" size="17" maxlength="10" value="<?php if (isset($ban_expire)) echo $ban_expire; ?>" tabindex="5" />
-										<span><?php echo $lang_admin_bans['Expire date help'] ?></span>
+										<span>La date Ã  laquelle ce bannissement sera automatiquement supprimÃ© (format: AAAA-MM-JJ). Pour supprimer manuellement, laissez ce champ vide.</span>
 									</td>
 								</tr>
@@ -167,5 +168,5 @@
 					</fieldset>
 				</div>
-				<p class="submitend"><input type="submit" name="add_edit_ban" value="<?php echo $lang_admin_common['Save'] ?>" tabindex="6" /></p>
+				<p class="submitend"><input type="submit" name="add_edit_ban" value=" Enregistrer " tabindex="6" /></p>
 			</form>
 		</div>
@@ -178,4 +179,5 @@
 }
 
+
 // Add/edit a ban (stage 2)
 else if (isset($_POST['add_edit_ban']))
@@ -183,73 +185,34 @@
 	confirm_referrer('admin_bans.php');
 
-	$ban_user = pun_trim($_POST['ban_user']);
+	$ban_user = trim($_POST['ban_user']);
 	$ban_ip = trim($_POST['ban_ip']);
 	$ban_email = strtolower(trim($_POST['ban_email']));
-	$ban_message = pun_trim($_POST['ban_message']);
+	$ban_message = trim($_POST['ban_message']);
 	$ban_expire = trim($_POST['ban_expire']);
 
 	if ($ban_user == '' && $ban_ip == '' && $ban_email == '')
-		message($lang_admin_bans['Must enter message']);
-	else if (strtolower($ban_user) == 'guest')
-		message($lang_admin_bans['Cannot ban guest message']);
-
-	// Make sure we're not banning an admin or moderator
-	if (!empty($ban_user))
-	{
-		$result = $db->query('SELECT group_id FROM '.$db->prefix.'users WHERE username=\''.$db->escape($ban_user).'\' AND id>1') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-		if ($db->num_rows($result))
-		{
-			$group_id = $db->result($result);
-
-			if ($group_id == PUN_ADMIN)
-				message(sprintf($lang_admin_bans['User is admin message'], pun_htmlspecialchars($ban_user)));
-
-			$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
-			$is_moderator_group = $db->result($result);
-
-			if ($is_moderator_group)
-				message(sprintf($lang_admin_bans['User is mod message'], pun_htmlspecialchars($ban_user)));
-		}
-	}
+		message('Vous devez saisir au moins soit un nom d\'utilisateur, soit une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> ou une adresse e-mail.');
 
 	// Validate IP/IP range (it's overkill, I know)
 	if ($ban_ip != '')
 	{
-		$ban_ip = preg_replace('%\s{2,}%S', ' ', $ban_ip);
+		$ban_ip = preg_replace('/[\s]{2,}/', ' ', $ban_ip);
 		$addresses = explode(' ', $ban_ip);
-		$addresses = array_map('pun_trim', $addresses);
+		$addresses = array_map('trim', $addresses);
 
 		for ($i = 0; $i < count($addresses); ++$i)
 		{
-			if (strpos($addresses[$i], ':') !== false)
+			$octets = explode('.', $addresses[$i]);
+
+			for ($c = 0; $c < count($octets); ++$c)
 			{
-				$octets = explode(':', $addresses[$i]);
-
-				for ($c = 0; $c < count($octets); ++$c)
-				{
-					$octets[$c] = ltrim($octets[$c], "0");
-
-					if ($c > 7 || (!empty($octets[$c]) && !ctype_xdigit($octets[$c])) || intval($octets[$c], 16) > 65535)
-						message($lang_admin_bans['Invalid IP message']);
-				}
-
-				$cur_address = implode(':', $octets);
-				$addresses[$i] = $cur_address;
+				$octets[$c] = (strlen($octets[$c]) > 1) ? ltrim($octets[$c], "0") : $octets[$c];
+
+				if ($c > 3 || preg_match('/[^0-9]/', $octets[$c]) || intval($octets[$c]) > 255)
+					message('Vous avez saisi une <acronym title="Internet Protocol" lang="en">IP</acronym>/plage d\'<acronym title="Internet Protocol" lang="en">IP</acronym> incorrecte.');
 			}
-			else
-			{
-				$octets = explode('.', $addresses[$i]);
-
-				for ($c = 0; $c < count($octets); ++$c)
-				{
-					$octets[$c] = (strlen($octets[$c]) > 1) ? ltrim($octets[$c], "0") : $octets[$c];
-
-					if ($c > 3 || preg_match('%[^0-9]%', $octets[$c]) || intval($octets[$c]) > 255)
-						message($lang_admin_bans['Invalid IP message']);
-				}
-
-				$cur_address = implode('.', $octets);
-				$addresses[$i] = $cur_address;
-			}
+
+			$cur_address = implode('.', $octets);
+			$addresses[$i] = $cur_address;
 		}
 
@@ -260,20 +223,14 @@
 	if ($ban_email != '' && !is_valid_email($ban_email))
 	{
-		if (!preg_match('%^[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$%', $ban_email))
-			message($lang_admin_bans['Invalid e-mail message']);
+		if (!preg_match('/^[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/', $ban_email))
+			message('L\'adresse e-mail (<abbr title="exemple">ex.</abbr> utilisateur@domaine.com) ou le domaine d\'adresse e-mail (<abbr title="exemple">ex.</abbr> domaine.com) que vous avez saisi est incorrect.');
 	}
 
 	if ($ban_expire != '' && $ban_expire != 'Never')
 	{
-		$ban_expire = strtotime($ban_expire.' GMT');
-
-		if ($ban_expire == -1 || !$ban_expire)
-			message($lang_admin_bans['Invalid date message'].' '.$lang_admin_bans['Invalid date reasons']);
-
-		$diff = ($pun_user['timezone'] + $pun_user['dst']) * 3600;
-		$ban_expire -= $diff;
-
-		if ($ban_expire <= time())
-			message($lang_admin_bans['Invalid date message'].' '.$lang_admin_bans['Invalid date reasons']);
+		$ban_expire = strtotime($ban_expire);
+
+		if ($ban_expire == -1 || $ban_expire <= time())
+			message('Vous avez saisi une date d\'Ã©chÃ©ance incorrecte. Le format doit Ãªtre AAAA-MM-JJ et la date doit-Ãªtre d\'au moins un jour dans le futur.');
 	}
 	else
@@ -286,19 +243,15 @@
 
 	if ($_POST['mode'] == 'add')
-		$db->query('INSERT INTO '.$db->prefix.'bans (username, ip, email, message, expire, ban_creator) VALUES('.$ban_user.', '.$ban_ip.', '.$ban_email.', '.$ban_message.', '.$ban_expire.', '.$pun_user['id'].')') or error('Unable to add ban', __FILE__, __LINE__, $db->error());
+		$db->query('INSERT INTO '.$db->prefix.'bans (username, ip, email, message, expire) VALUES('.$ban_user.', '.$ban_ip.', '.$ban_email.', '.$ban_message.', '.$ban_expire.')') or error('Impossible d\'ajouter le bannissement', __FILE__, __LINE__, $db->error());
 	else
-		$db->query('UPDATE '.$db->prefix.'bans SET username='.$ban_user.', ip='.$ban_ip.', email='.$ban_email.', message='.$ban_message.', expire='.$ban_expire.' WHERE id='.intval($_POST['ban_id'])) or error('Unable to update ban', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'bans SET username='.$ban_user.', ip='.$ban_ip.', email='.$ban_email.', message='.$ban_message.', expire='.$ban_expire.' WHERE id='.intval($_POST['ban_id'])) or error('Impossible de modifier le bannissement', __FILE__, __LINE__, $db->error());
 
 	// Regenerate the bans cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_bans_cache();
 
-	if ($_POST['mode'] == 'edit')
-		redirect('admin_bans.php', $lang_admin_bans['Ban edited redirect']);
-	else
-		redirect('admin_bans.php', $lang_admin_bans['Ban added redirect']);
+	redirect('admin_bans.php', 'Bannissement '.(($_POST['mode'] == 'edit') ? 'modifiÃ©' : 'ajoutÃ©').'. Redirection ...');
 }
+
 
 // Remove a ban
@@ -311,170 +264,16 @@
 		message($lang_common['Bad request']);
 
-	$db->query('DELETE FROM '.$db->prefix.'bans WHERE id='.$ban_id) or error('Unable to delete ban', __FILE__, __LINE__, $db->error());
+	$db->query('DELETE FROM '.$db->prefix.'bans WHERE id='.$ban_id) or error('Impossible de supprimer le bannissement', __FILE__, __LINE__, $db->error());
 
 	// Regenerate the bans cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_bans_cache();
 
-	redirect('admin_bans.php', $lang_admin_bans['Ban removed redirect']);
+	redirect('admin_bans.php', 'Bannissement supprimÃ©. Redirection ...');
 }
 
-// Find bans
-else if (isset($_GET['find_ban']))
-{
-	$form = isset($_GET['form']) ? $_GET['form'] : array();
-
-	// trim() all elements in $form
-	$form = array_map('pun_trim', $form);
-	$conditions = $query_str = array();
-
-	$expire_after = isset($_GET['expire_after']) ? trim($_GET['expire_after']) : '';
-	$expire_before = isset($_GET['expire_before']) ? trim($_GET['expire_before']) : '';
-	$order_by = isset($_GET['order_by']) && in_array($_GET['order_by'], array('username', 'ip', 'email', 'expire')) ? 'b.'.$_GET['order_by'] : 'b.username';
-	$direction = isset($_GET['direction']) && $_GET['direction'] == 'DESC' ? 'DESC' : 'ASC';
-
-	$query_str[] = 'order_by='.$order_by;
-	$query_str[] = 'direction='.$direction;
-
-	// Try to convert date/time to timestamps
-	if ($expire_after != '')
-	{
-		$query_str[] = 'expire_after='.$expire_after;
-
-		$expire_after = strtotime($expire_after);
-		if ($expire_after === false || $expire_after == -1)
-			message($lang_admin_bans['Invalid date message']);
-
-		$conditions[] = 'b.expire>'.$expire_after;
-	}
-	if ($expire_before != '')
-	{
-		$query_str[] = 'expire_before='.$expire_before;
-
-		$expire_before = strtotime($expire_before);
-		if ($expire_before === false || $expire_before == -1)
-			message($lang_admin_bans['Invalid date message']);
-
-		$conditions[] = 'b.expire<'.$expire_before;
-	}
-
-	$like_command = ($db_type == 'pgsql') ? 'ILIKE' : 'LIKE';
-	foreach ($form as $key => $input)
-	{
-		if ($input != '' && in_array($key, array('username', 'ip', 'email', 'message')))
-		{
-			$conditions[] = 'b.'.$db->escape($key).' '.$like_command.' \''.$db->escape(str_replace('*', '%', $input)).'\'';
-			$query_str[] = 'form%5B'.$key.'%5D='.urlencode($input);
-		}
-	}
-
-	// Fetch ban count
-	$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'bans as b WHERE b.id>0'.(!empty($conditions) ? ' AND '.implode(' AND ', $conditions) : '')) or error('Unable to fetch ban list', __FILE__, __LINE__, $db->error());
-	$num_bans = $db->result($result);
-
-	// Determine the ban offset (based on $_GET['p'])
-	$num_pages = ceil($num_bans / 50);
-
-	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
-	$start_from = 50 * ($p - 1);
-
-	// Generate paging links
-	$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'admin_bans.php?find_ban=&amp;'.implode('&amp;', $query_str));
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Bans'], $lang_admin_bans['Results head']);
-	define('PUN_ACTIVE_PAGE', 'admin');
-	require PUN_ROOT.'header.php';
-
-?>
-<div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_bans.php"><?php echo $lang_admin_common['Bans'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_bans['Results head'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<div class="clearer"></div>
-	</div>
-</div>
-
-
-<div id="bans1" class="blocktable">
-	<h2><span><?php echo $lang_admin_bans['Results head'] ?></span></h2>
-	<div class="box">
-		<div class="inbox">
-			<table cellspacing="0">
-			<thead>
-				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_admin_bans['Results username head'] ?></th>
-					<th class="tc2" scope="col"><?php echo $lang_admin_bans['Results e-mail head'] ?></th>
-					<th class="tc3" scope="col"><?php echo $lang_admin_bans['Results IP address head'] ?></th>
-					<th class="tc4" scope="col"><?php echo $lang_admin_bans['Results expire head'] ?></th>
-					<th class="tc5" scope="col"><?php echo $lang_admin_bans['Results message head'] ?></th>
-					<th class="tc6" scope="col"><?php echo $lang_admin_bans['Results banned by head'] ?></th>
-					<th class="tcr" scope="col"><?php echo $lang_admin_bans['Results actions head'] ?></th>
-				</tr>
-			</thead>
-			<tbody>
-<?php
-
-	$result = $db->query('SELECT b.id, b.username, b.ip, b.email, b.message, b.expire, b.ban_creator, u.username AS ban_creator_username FROM '.$db->prefix.'bans AS b LEFT JOIN '.$db->prefix.'users AS u ON b.ban_creator=u.id WHERE b.id>0'.(!empty($conditions) ? ' AND '.implode(' AND ', $conditions) : '').' ORDER BY '.$db->escape($order_by).' '.$db->escape($direction).' LIMIT '.$start_from.', 50') or error('Unable to fetch ban list', __FILE__, __LINE__, $db->error());
-	if ($db->num_rows($result))
-	{
-		while ($ban_data = $db->fetch_assoc($result))
-		{
-
-			$actions = '<a href="admin_bans.php?edit_ban='.$ban_data['id'].'">'.$lang_admin_common['Edit'].'</a> | <a href="admin_bans.php?del_ban='.$ban_data['id'].'">'.$lang_admin_common['Remove'].'</a>';
-			$expire = format_time($ban_data['expire'], true);
-
-?>
-				<tr>
-					<td class="tcl"><?php echo ($ban_data['username'] != '') ? pun_htmlspecialchars($ban_data['username']) : '&#160;' ?></td>
-					<td class="tc2"><?php echo ($ban_data['email'] != '') ? $ban_data['email'] : '&#160;' ?></td>
-					<td class="tc3"><?php echo ($ban_data['ip'] != '') ? $ban_data['ip'] : '&#160;' ?></td>
-					<td class="tc4"><?php echo $expire ?></td>
-					<td class="tc5"><?php echo ($ban_data['message'] != '') ? pun_htmlspecialchars($ban_data['message']) : '&#160;' ?></td>
-					<td class="tc6"><?php echo ($ban_data['ban_creator_username'] != '') ? '<a href="profile.php?id='.$ban_data['ban_creator'].'">'.pun_htmlspecialchars($ban_data['ban_creator_username']).'</a>' : $lang_admin_bans['Unknown'] ?></td>
-					<td class="tcr"><?php echo $actions ?></td>
-				</tr>
-<?php
-
-		}
-	}
-	else
-		echo "\t\t\t\t".'<tr><td class="tcl" colspan="7">'.$lang_admin_bans['No match'].'</td></tr>'."\n";
-
-?>
-			</tbody>
-			</table>
-		</div>
-	</div>
-</div>
-
-<div class="linksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_bans.php"><?php echo $lang_admin_common['Bans'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_bans['Results head'] ?></strong></li>
-		</ul>
-		<div class="clearer"></div>
-	</div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-}
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Bans']);
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Bannissement';
 $focus_element = array('bans', 'new_ban_user');
-define('PUN_ACTIVE_PAGE', 'admin');
 require PUN_ROOT.'header.php';
 
@@ -483,17 +282,17 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_bans['New ban head'] ?></span></h2>
+		<h2><span>Nouveau bannissement</span></h2>
 		<div class="box">
 			<form id="bans" method="post" action="admin_bans.php?action=more">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_bans['Add ban subhead'] ?></legend>
+						<legend>Ajouter un bannissement</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Username label'] ?><div><input type="submit" name="add_ban" value="<?php echo $lang_admin_common['Add'] ?>" tabindex="2" /></div></th>
+									<th scope="row">Nom d'utilisateur<div><input type="submit" name="add_ban" value=" Ajouter " tabindex="2" /></div></th>
 									<td>
 										<input type="text" name="new_ban_user" size="25" maxlength="25" tabindex="1" />
-										<span><?php echo $lang_admin_bans['Username advanced help'] ?></span>
+										<span>Le nom d'utilisateur Ã  bannir (insensible Ã  la casse). La page suivante vous permettra d'entrer une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> et/ou une adresse e-mail de votre choix. Si vous souhaitez bannir une adresse <acronym title="Internet Protocol" lang="en">IP</acronym>, une plage d'adresses <acronym title="Internet Protocol" lang="en">IP</acronym> ou une adresse e-mail, laissez simplement ce champ vide.</span>
 									</td>
 								</tr>
@@ -505,60 +304,52 @@
 		</div>
 
-		<h2 class="block2"><span><?php echo $lang_admin_bans['Ban search head'] ?></span></h2>
+		<h2 class="block2"><span>Bannissements actuels</span></h2>
 		<div class="box">
-			<form id="find_band" method="get" action="admin_bans.php">
-				<p class="submittop"><input type="submit" name="find_ban" value="<?php echo $lang_admin_bans['Submit search'] ?>" tabindex="3" /></p>
+			<div class="fakeform">
+<?php
+
+$result = $db->query('SELECT id, username, ip, email, message, expire FROM '.$db->prefix.'bans ORDER BY id') or error('Impossible de retrouver la liste des bannissements', __FILE__, __LINE__, $db->error());
+if ($db->num_rows($result))
+{
+	while ($cur_ban = $db->fetch_assoc($result))
+	{
+		$expire = format_time($cur_ban['expire'], true);
+
+?>
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_bans['Ban search subhead'] ?></legend>
+						<legend>Date d'Ã©chÃ©ance&#160;: <?php echo $expire ?></legend>
 						<div class="infldset">
-							<p><?php echo $lang_admin_bans['Ban search info'] ?></p>
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Username label'] ?></th>
-									<td><input type="text" name="form[username]" size="25" maxlength="25" tabindex="4" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['IP label'] ?></th>
-									<td><input type="text" name="form[ip]" size="30" maxlength="255" tabindex="5" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['E-mail label'] ?></th>
-									<td><input type="text" name="form[email]" size="30" maxlength="80" tabindex="6" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Message label'] ?></th>
-									<td><input type="text" name="form[message]" size="30" maxlength="255" tabindex="7" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Expire after label'] ?></th>
-									<td><input type="text" name="expire_after" size="10" maxlength="10" tabindex="8" />
-									<span><?php echo $lang_admin_bans['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Expire before label'] ?></th>
-									<td><input type="text" name="expire_before" size="10" maxlength="10" tabindex="9" />
-									<span><?php echo $lang_admin_bans['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_bans['Order by label'] ?></th>
-									<td>
-										<select name="order_by" tabindex="10">
-											<option value="username" selected="selected"><?php echo $lang_admin_bans['Order by username'] ?></option>
-											<option value="ip"><?php echo $lang_admin_bans['Order by ip'] ?></option>
-											<option value="email"><?php echo $lang_admin_bans['Order by e-mail'] ?></option>
-											<option value="expire"><?php echo $lang_admin_bans['Order by expire'] ?></option>
-										</select>&#160;&#160;&#160;<select name="direction" tabindex="11">
-											<option value="ASC" selected="selected"><?php echo $lang_admin_bans['Ascending'] ?></option>
-											<option value="DESC"><?php echo $lang_admin_bans['Descending'] ?></option>
-										</select>
-									</td>
-								</tr>
-							</table>
+							<table cellspacing="0">
+<?php if ($cur_ban['username'] != ''): ?>								<tr>
+									<th>Nom d'utilisateur</th>
+									<td><?php echo pun_htmlspecialchars($cur_ban['username']) ?></td>
+								</tr>
+<?php endif; ?><?php if ($cur_ban['email'] != ''): ?>								<tr>
+									<th>E-mail</th>
+									<td><?php echo $cur_ban['email'] ?></td>
+								</tr>
+<?php endif; ?><?php if ($cur_ban['ip'] != ''): ?>								<tr>
+									<th><acronym title="Internet Protocol" lang="en">IP</acronym>/plage d'<acronym title="Internet Protocol" lang="en">IP</acronym></th>
+									<td><?php echo $cur_ban['ip'] ?></td>
+								</tr>
+<?php endif; ?><?php if ($cur_ban['message'] != ''): ?>								<tr>
+									<th>Motif</th>
+									<td><?php echo pun_htmlspecialchars($cur_ban['message']) ?></td>
+								</tr>
+<?php endif; ?>							</table>
+							<p class="linkactions"><a href="admin_bans.php?edit_ban=<?php echo $cur_ban['id'] ?>">Modifier</a> - <a href="admin_bans.php?del_ban=<?php echo $cur_ban['id'] ?>">Supprimer</a></p>
 						</div>
 					</fieldset>
 				</div>
-				<p class="submitend"><input type="submit" name="find_ban" value="<?php echo $lang_admin_bans['Submit search'] ?>" tabindex="12" /></p>
-			</form>
+<?php
+
+	}
+}
+else
+	echo "\t\t\t\t".'<p>Aucun bannissement Ã  lister.</p>'."\n";
+
+?>
+			</div>
 		</div>
 	</div>
Index: trunk/web/punbb/admin_categories.php
===================================================================
--- trunk/web/punbb/admin_categories.php	(revision 10)
+++ trunk/web/punbb/admin_categories.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_categories.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_categories.php';
 
 // Add a new category
@@ -26,12 +41,13 @@
 	confirm_referrer('admin_categories.php');
 
-	$new_cat_name = pun_trim($_POST['new_cat_name']);
+	$new_cat_name = trim($_POST['new_cat_name']);
 	if ($new_cat_name == '')
-		message($lang_admin_categories['Must enter name message']);
-
-	$db->query('INSERT INTO '.$db->prefix.'categories (cat_name) VALUES(\''.$db->escape($new_cat_name).'\')') or error('Unable to create category', __FILE__, __LINE__, $db->error());
-
-	redirect('admin_categories.php', $lang_admin_categories['Category added redirect']);
+		message('Vous devez saisir un nom pour la nouvelle catÃ©gorie.');
+
+	$db->query('INSERT INTO '.$db->prefix.'categories (cat_name) VALUES(\''.$db->escape($new_cat_name).'\')') or error('Impossible de crÃ©er la catÃ©gorie', __FILE__, __LINE__, $db->error());
+
+	redirect('admin_categories.php', 'CatÃ©gorie ajoutÃ©e. Redirection ...');
 }
+
 
 // Delete a category
@@ -44,9 +60,9 @@
 		message($lang_common['Bad request']);
 
-	if (isset($_POST['del_cat_comply'])) // Delete a category with all forums and posts
+	if (isset($_POST['del_cat_comply']))	// Delete a category with all forums and posts
 	{
 		@set_time_limit(0);
 
-		$result = $db->query('SELECT id FROM '.$db->prefix.'forums WHERE cat_id='.$cat_to_delete) or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT id FROM '.$db->prefix.'forums WHERE cat_id='.$cat_to_delete) or error('Impossible de retrouver la liste des forums', __FILE__, __LINE__, $db->error());
 		$num_forums = $db->num_rows($result);
 
@@ -59,9 +75,9 @@
 
 			// Delete the forum
-			$db->query('DELETE FROM '.$db->prefix.'forums WHERE id='.$cur_forum) or error('Unable to delete forum', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'forums WHERE id='.$cur_forum) or error('Impossible de supprimer le forum', __FILE__, __LINE__, $db->error());
 		}
 
 		// Locate any "orphaned redirect topics" and delete them
-		$result = $db->query('SELECT t1.id FROM '.$db->prefix.'topics AS t1 LEFT JOIN '.$db->prefix.'topics AS t2 ON t1.moved_to=t2.id WHERE t2.id IS NULL AND t1.moved_to IS NOT NULL') or error('Unable to fetch redirect topics', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT t1.id FROM '.$db->prefix.'topics AS t1 LEFT JOIN '.$db->prefix.'topics AS t2 ON t1.moved_to=t2.id WHERE t2.id IS NULL AND t1.moved_to IS NOT NULL') or error('Impossible de retrouver les sujets de redirection', __FILE__, __LINE__, $db->error());
 		$num_orphans = $db->num_rows($result);
 
@@ -71,25 +87,22 @@
 				$orphans[] = $db->result($result, $i);
 
-			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $orphans).')') or error('Unable to delete redirect topics', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $orphans).')') or error('Impossible de supprimer les sujets de redirection', __FILE__, __LINE__, $db->error());
 		}
 
 		// Delete the category
-		$db->query('DELETE FROM '.$db->prefix.'categories WHERE id='.$cat_to_delete) or error('Unable to delete category', __FILE__, __LINE__, $db->error());
-
-		// Regenerate the quick jump cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
+		$db->query('DELETE FROM '.$db->prefix.'categories WHERE id='.$cat_to_delete) or error('Impossible de supprimer la catÃ©gorie', __FILE__, __LINE__, $db->error());
+
+		// Regenerate the quickjump cache
+		require_once PUN_ROOT.'include/cache.php';
 		generate_quickjump_cache();
 
-		redirect('admin_categories.php', $lang_admin_categories['Category deleted redirect']);
-	}
-	else // If the user hasn't comfirmed the delete
-	{
-		$result = $db->query('SELECT cat_name FROM '.$db->prefix.'categories WHERE id='.$cat_to_delete) or error('Unable to fetch category info', __FILE__, __LINE__, $db->error());
+		redirect('admin_categories.php', 'CatÃ©gorie supprimÃ©e. Redirection ...');
+	}
+	else	// If the user hasn't comfirmed the delete
+	{
+		$result = $db->query('SELECT cat_name FROM '.$db->prefix.'categories WHERE id='.$cat_to_delete) or error('Impossible de retrouver les informations de la catÃ©gorie', __FILE__, __LINE__, $db->error());
 		$cat_name = $db->result($result);
 
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Categories']);
-		define('PUN_ACTIVE_PAGE', 'admin');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / CatÃ©gories';
 		require PUN_ROOT.'header.php';
 
@@ -98,5 +111,5 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_categories['Delete category head'] ?></span></h2>
+		<h2><span>Supprimer une catÃ©gorie</span></h2>
 		<div class="box">
 			<form method="post" action="admin_categories.php">
@@ -104,12 +117,12 @@
 				<input type="hidden" name="cat_to_delete" value="<?php echo $cat_to_delete ?>" />
 					<fieldset>
-						<legend><?php echo $lang_admin_categories['Confirm delete subhead'] ?></legend>
+						<legend>Confirmez la supression de la catÃ©gorie</legend>
 						<div class="infldset">
-							<p><?php printf($lang_admin_categories['Confirm delete info'], pun_htmlspecialchars($cat_name)) ?></p>
-							<p class="warntext"><?php echo $lang_admin_categories['Delete category warn'] ?></p>
+							<p>Ãtes vous sÃ»r de vouloir supprimer la catÃ©gorie "<?php echo $cat_name ?>"&#160;?</p>
+							<p>ATTENTION ! Supprimer cette catÃ©gorie supprimera en mÃªme temps tous les forums et messages (s'il y en a) prÃ©sents dans cette catÃ©gorie&#160;!</p>
 						</div>
 					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="del_cat_comply" value="<?php echo $lang_admin_common['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_admin_common['Go back'] ?></a></p>
+				<p><input type="submit" name="del_cat_comply" value=" Supprimer " /><a href="javascript:history.go(-1)">Retour</a></p>
 			</form>
 		</div>
@@ -123,44 +136,45 @@
 }
 
-else if (isset($_POST['update'])) // Change position and name of the categories
+
+else if (isset($_POST['update']))	// Change position and name of the categories
 {
 	confirm_referrer('admin_categories.php');
 
-	$categories = $_POST['cat'];
-	if (empty($categories))
-		message($lang_common['Bad request']);
-
-	foreach ($categories as $cat_id => $cur_cat)
-	{
-		$cur_cat['name'] = pun_trim($cur_cat['name']);
-		$cur_cat['order'] = trim($cur_cat['order']);
-
-		if ($cur_cat['name'] == '')
-			message($lang_admin_categories['Must enter name message']);
-
-		if ($cur_cat['order'] == '' || preg_match('%[^0-9]%', $cur_cat['order']))
-			message($lang_admin_categories['Must enter integer message']);
-
-		$db->query('UPDATE '.$db->prefix.'categories SET cat_name=\''.$db->escape($cur_cat['name']).'\', disp_position='.$cur_cat['order'].' WHERE id='.intval($cat_id)) or error('Unable to update category', __FILE__, __LINE__, $db->error());
-	}
-
-	// Regenerate the quick jump cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	$cat_order = $_POST['cat_order'];
+	$cat_name = $_POST['cat_name'];
+
+	$result = $db->query('SELECT id, disp_position FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Impossible de retrouver la liste des catÃ©gories', __FILE__, __LINE__, $db->error());
+	$num_cats = $db->num_rows($result);
+
+	for ($i = 0; $i < $num_cats; ++$i)
+	{
+		if ($cat_name[$i] == '')
+			message('Vous devez saisir un nom de catÃ©gorie.');
+
+		if (!preg_match('#^\d+$#', $cat_order[$i]))
+			message('La position doit Ãªtre un nombre entier.');
+
+		list($cat_id, $position) = $db->fetch_row($result);
+
+		$db->query('UPDATE '.$db->prefix.'categories SET cat_name=\''.$db->escape($cat_name[$i]).'\', disp_position='.$cat_order[$i].' WHERE id='.$cat_id) or error('Impossible de modifier les catÃ©gories', __FILE__, __LINE__, $db->error());
+	}
+
+	// Regenerate the quickjump cache
+	require_once PUN_ROOT.'include/cache.php';
 	generate_quickjump_cache();
 
-	redirect('admin_categories.php', $lang_admin_categories['Categories updated redirect']);
+	redirect('admin_categories.php', 'CatÃ©gories modifiÃ©es. Redirection ...');
 }
 
+
 // Generate an array with all categories
-$result = $db->query('SELECT id, cat_name, disp_position FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Unable to fetch category list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT id, cat_name, disp_position FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Impossible de retrouver la liste des catÃ©gories', __FILE__, __LINE__, $db->error());
 $num_cats = $db->num_rows($result);
 
 for ($i = 0; $i < $num_cats; ++$i)
-	$cat_list[] = $db->fetch_assoc($result);
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Categories']);
-define('PUN_ACTIVE_PAGE', 'admin');
+	$cat_list[] = $db->fetch_row($result);
+
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / CatÃ©gories';
 require PUN_ROOT.'header.php';
 
@@ -169,95 +183,73 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_categories['Add categories head'] ?></span></h2>
+		<h2><span>Ajouter/supprimer/modifier les catÃ©gories</span></h2>
 		<div class="box">
-			<form method="post" action="admin_categories.php">
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_categories['Add categories subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_categories['Add category label'] ?><div><input type="submit" name="add_cat" value="<?php echo $lang_admin_categories['Add new submit'] ?>" tabindex="2" /></div></th>
-									<td>
-										<input type="text" name="new_cat_name" size="35" maxlength="80" tabindex="1" />
-										<span><?php printf($lang_admin_categories['Add category help'], '<a href="admin_forums.php">'.$lang_admin_common['Forums'].'</a>') ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-			</form>
+		<form method="post" action="admin_categories.php?action=foo">
+			<div class="inform">
+				<fieldset>
+					<legend>Ajouter/supprimer une catÃ©gorie</legend>
+					<div class="infldset">
+						<table class="aligntop" cellspacing="0">
+							<tr>
+								<th scope="row">Ajouter une catÃ©gorie<div><input type="submit" name="add_cat" value=" Ajouter " tabindex="2" /></div></th>
+								<td>
+									<input type="text" name="new_cat_name" size="35" maxlength="80" tabindex="1" />
+									<span>Saisissez le nom de la catÃ©gorie que vous souhaitez ajouter. Vous pourrez modifier ce nom plus tard (voir ci-dessous). Pour ajouter des forums Ã  une nouvelle catÃ©gorie, allez Ã  la page de gestion des <a href="admin_forums.php">Forums</a>.</span>
+								</td>
+							</tr>
+<?php if ($num_cats): ?>							<tr>
+								<th scope="row">Supprimer une catÃ©gorie<div><input type="submit" name="del_cat" value=" Supprimer " tabindex="4" /></div></th>
+								<td>
+									<select name="cat_to_delete" tabindex="3">
+<?php
+
+	while (list(, list($cat_id, $cat_name, ,)) = @each($cat_list))
+		echo "\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cat_id.'">'.pun_htmlspecialchars($cat_name).'</option>'."\n";
+
+?>
+									</select>
+									<span>Choisissez le nom de la catÃ©gorie que vous souhaitez supprimer. Vous serez invitÃ©s Ã  confirmer votre choix de catÃ©gorie Ã  supprimer avant qu'elle ne soit effectivement supprimÃ©e.</span>
+								</td>
+							</tr>
+<?php endif; ?>						</table>
+					</div>
+				</fieldset>
+			</div>
+<?php if ($num_cats): ?>			<div class="inform">
+				<fieldset>
+					<legend>Modifier les catÃ©gories</legend>
+					<div class="infldset">
+						<table id="categoryedit" cellspacing="0" >
+						<thead>
+							<tr>
+								<th class="tcl" scope="col">Nom</th>
+								<th scope="col">Position</th>
+								<th>&#160;</th>
+							</tr>
+						</thead>
+						<tbody>
+<?php
+
+	@reset($cat_list);
+	for ($i = 0; $i < $num_cats; ++$i)
+	{
+		list(, list($cat_id, $cat_name, $position)) = @each($cat_list);
+
+?>
+							<tr><td><input type="text" name="cat_name[<?php echo $i ?>]" value="<?php echo pun_htmlspecialchars($cat_name) ?>" size="35" maxlength="80" /></td><td><input type="text" name="cat_order[<?php echo $i ?>]" value="<?php echo $position ?>" size="3" maxlength="3" /></td><td>&#160;</td></tr>
+<?php
+
+	}
+
+?>
+						</tbody>
+						</table>
+						<div class="fsetsubmit"><input type="submit" name="update" value=" Modifier " /></div>
+					</div>
+				</fieldset>
+			</div>
+<?php endif; ?>		</form>
 		</div>
-
-<?php if ($num_cats): ?>		<h2 class="block2"><span><?php echo $lang_admin_categories['Delete categories head'] ?></span></h2>
-		<div class="box">
-			<form method="post" action="admin_categories.php">
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_categories['Delete categories subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_categories['Delete category label'] ?><div><input type="submit" name="del_cat" value="<?php echo $lang_admin_common['Delete'] ?>" tabindex="4" /></div></th>
-									<td>
-										<select name="cat_to_delete" tabindex="3">
-<?php
-
-	foreach ($cat_list as $cur_cat)
-		echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_cat['id'].'">'.pun_htmlspecialchars($cur_cat['cat_name']).'</option>'."\n";
-
-?>
-										</select>
-										<span><?php echo $lang_admin_categories['Delete category help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-			</form>
-		</div>
-<?php endif; ?>
-
-<?php if ($num_cats): ?>		<h2 class="block2"><span><?php echo $lang_admin_categories['Edit categories head'] ?></span></h2>
-		<div class="box">
-			<form method="post" action="admin_categories.php">
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_categories['Edit categories subhead'] ?></legend>
-						<div class="infldset">
-							<table id="categoryedit" cellspacing="0" >
-							<thead>
-								<tr>
-									<th class="tcl" scope="col"><?php echo $lang_admin_categories['Category name label'] ?></th>
-									<th scope="col"><?php echo $lang_admin_categories['Category position label'] ?></th>
-								</tr>
-							</thead>
-							<tbody>
-<?php
-
-	foreach ($cat_list as $cur_cat)
-	{
-
-?>
-								<tr>
-									<td class="tcl"><input type="text" name="cat[<?php echo $cur_cat['id'] ?>][name]" value="<?php echo pun_htmlspecialchars($cur_cat['cat_name']) ?>" size="35" maxlength="80" /></td>
-									<td><input type="text" name="cat[<?php echo $cur_cat['id'] ?>][order]" value="<?php echo $cur_cat['disp_position'] ?>" size="3" maxlength="3" /></td>
-								</tr>
-<?php
-
-	}
-
-?>
-							</tbody>
-							</table>
-							<div class="fsetsubmit"><input type="submit" name="update" value="<?php echo $lang_admin_common['Update'] ?>" /></div>
-						</div>
-					</fieldset>
-				</div>
-			</form>
-		</div>
-<?php endif; ?>	</div>
+	</div>
 	<div class="clearer"></div>
 </div>
Index: trunk/web/punbb/admin_censoring.php
===================================================================
--- trunk/web/punbb/admin_censoring.php	(revision 10)
+++ trunk/web/punbb/admin_censoring.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_MOD)
 	message($lang_common['No permission']);
 
-// Load the admin_censoring.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_censoring.php';
 
 // Add a censor word
@@ -26,20 +41,15 @@
 	confirm_referrer('admin_censoring.php');
 
-	$search_for = pun_trim($_POST['new_search_for']);
-	$replace_with = pun_trim($_POST['new_replace_with']);
+	$search_for = trim($_POST['new_search_for']);
+	$replace_with = trim($_POST['new_replace_with']);
 
-	if ($search_for == '')
-		message($lang_admin_censoring['Must enter word message']);
+	if ($search_for == '' || $replace_with == '')
+		message('Vous devez saisir Ã  la fois un mot Ã  censurer et un texte pour le remplacer.');
 
-	$db->query('INSERT INTO '.$db->prefix.'censoring (search_for, replace_with) VALUES (\''.$db->escape($search_for).'\', \''.$db->escape($replace_with).'\')') or error('Unable to add censor word', __FILE__, __LINE__, $db->error());
+	$db->query('INSERT INTO '.$db->prefix.'censoring (search_for, replace_with) VALUES (\''.$db->escape($search_for).'\', \''.$db->escape($replace_with).'\')') or error('Impossible d\'ajouter un mot Ã  censurer', __FILE__, __LINE__, $db->error());
 
-	// Regenerate the censoring cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
+	redirect('admin_censoring.php', 'Mot Ã  censurer ajoutÃ©. Redirection ...');
+}
 
-	generate_censoring_cache();
-
-	redirect('admin_censoring.php', $lang_admin_censoring['Word added redirect']);
-}
 
 // Update a censor word
@@ -50,20 +60,15 @@
 	$id = intval(key($_POST['update']));
 
-	$search_for = pun_trim($_POST['search_for'][$id]);
-	$replace_with = pun_trim($_POST['replace_with'][$id]);
+	$search_for = trim($_POST['search_for'][$id]);
+	$replace_with = trim($_POST['replace_with'][$id]);
 
-	if ($search_for == '')
-		message($lang_admin_censoring['Must enter word message']);
+	if ($search_for == '' || $replace_with == '')
+		message('Vous devez saisir Ã  la fois un mot Ã  censurer et un texte pour le remplacer.');
 
-	$db->query('UPDATE '.$db->prefix.'censoring SET search_for=\''.$db->escape($search_for).'\', replace_with=\''.$db->escape($replace_with).'\' WHERE id='.$id) or error('Unable to update censor word', __FILE__, __LINE__, $db->error());
+	$db->query('UPDATE '.$db->prefix.'censoring SET search_for=\''.$db->escape($search_for).'\', replace_with=\''.$db->escape($replace_with).'\' WHERE id='.$id) or error('Impossible de mettre Ã  jour le mot Ã  censurer', __FILE__, __LINE__, $db->error());
 
-	// Regenerate the censoring cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
+	redirect('admin_censoring.php', 'Mot Ã  censurer modifiÃ©. Redirection ...');
+}
 
-	generate_censoring_cache();
-
-	redirect('admin_censoring.php', $lang_admin_censoring['Word updated redirect']);
-}
 
 // Remove a censor word
@@ -74,18 +79,12 @@
 	$id = intval(key($_POST['remove']));
 
-	$db->query('DELETE FROM '.$db->prefix.'censoring WHERE id='.$id) or error('Unable to delete censor word', __FILE__, __LINE__, $db->error());
+	$db->query('DELETE FROM '.$db->prefix.'censoring WHERE id='.$id) or error('Impossible de supprimer le mot Ã  censurer', __FILE__, __LINE__, $db->error());
 
-	// Regenerate the censoring cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
-	generate_censoring_cache();
-
-	redirect('admin_censoring.php',  $lang_admin_censoring['Word removed redirect']);
+	redirect('admin_censoring.php', 'Mot Ã  censurer supprimÃ©. Redirection ...');
 }
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Censoring']);
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Mots Ã  censurer';
 $focus_element = array('censoring', 'new_search_for');
-define('PUN_ACTIVE_PAGE', 'admin');
 require PUN_ROOT.'header.php';
 
@@ -94,25 +93,25 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_censoring['Censoring head'] ?></span></h2>
+		<h2><span>Mots Ã  censurer</span></h2>
 		<div class="box">
-			<form id="censoring" method="post" action="admin_censoring.php">
+			<form id="censoring" method="post" action="admin_censoring.php?action=foo">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_censoring['Add word subhead'] ?></legend>
+						<legend>Ajouter un mot Ã  censurer</legend>
 						<div class="infldset">
-							<p><?php echo $lang_admin_censoring['Add word info'].' '.($pun_config['o_censoring'] == '1' ? sprintf($lang_admin_censoring['Censoring enabled'], '<a href="admin_options.php#censoring">'.$lang_admin_common['Options'].'</a>') : sprintf($lang_admin_censoring['Censoring disabled'], '<a href="admin_options.php#censoring">'.$lang_admin_common['Options'].'</a>')) ?></p>
-							<table cellspacing="0">
+							<p>Saisissez le mot que vous voulez censurer ainsi que le texte qui le remplacera. Les caractÃšres joker sont permis  (ex: *fleur* vÃ©rifiera Â«&#160;fleurette&#160;Â» et Â«&#160;gonfleur&#160;Â» ). Les mots censurÃ©s affectent Ã©galement les noms d'utilisateurs. Un nouvel utilisateur ne pourrait s'inscrire avec un nom d'utilisateur qui contiendrait un des mots censurÃ©s. La recherche est insensible Ã  la casse. <strong>Les mots censurÃ©s doivent Ãªtres activÃ©s Ã  la page <a href="admin_options.php#censoring">Options</a> pour qu'ils aient un quelconque effet.</strong></p>
+							<table  cellspacing="0">
 							<thead>
 								<tr>
-									<th class="tcl" scope="col"><?php echo $lang_admin_censoring['Censored word label'] ?></th>
-									<th class="tc2" scope="col"><?php echo $lang_admin_censoring['Replacement label'] ?></th>
-									<th class="hidehead" scope="col"><?php echo $lang_admin_censoring['Action label'] ?></th>
+									<th class="tcl" scope="col">Mot Ã  censurer</th>
+									<th class="tc2" scope="col">Texte de remplacement</th>
+									<th class="hidehead" scope="col">Action</th>
 								</tr>
 							</thead>
 							<tbody>
 								<tr>
-									<td class="tcl"><input type="text" name="new_search_for" size="24" maxlength="60" tabindex="1" /></td>
-									<td class="tc2"><input type="text" name="new_replace_with" size="24" maxlength="60" tabindex="2" /></td>
-									<td><input type="submit" name="add_word" value="<?php echo $lang_admin_common['Add'] ?>" tabindex="3" /></td>
+									<td><input type="text" name="new_search_for" size="24" maxlength="60" tabindex="1" /></td>
+									<td><input type="text" name="new_replace_with" size="24" maxlength="60" tabindex="2" /></td>
+									<td><input type="submit" name="add_word" value=" Add " tabindex="3" /></td>
 								</tr>
 							</tbody>
@@ -123,9 +122,9 @@
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_censoring['Edit remove subhead'] ?></legend>
+						<legend>Modifier/supprimer des mots Ã  censurer</legend>
 						<div class="infldset">
 <?php
 
-$result = $db->query('SELECT id, search_for, replace_with FROM '.$db->prefix.'censoring ORDER BY id') or error('Unable to fetch censor word list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT id, search_for, replace_with FROM '.$db->prefix.'censoring ORDER BY id') or error('Impossible de retrouver la liste des mots Ã  censurer', __FILE__, __LINE__, $db->error());
 if ($db->num_rows($result))
 {
@@ -135,7 +134,7 @@
 							<thead>
 								<tr>
-									<th class="tcl" scope="col"><?php echo $lang_admin_censoring['Censored word label'] ?></th>
-									<th class="tc2" scope="col"><?php echo $lang_admin_censoring['Replacement label'] ?></th>
-									<th class="hidehead" scope="col"><?php echo $lang_admin_censoring['Action label'] ?></th>
+									<th class="tcl" scope="col">Mots Ã  censurer</th>
+									<th class="tc2" scope="col">Texte de remplacement</th>
+									<th class="hidehead" scope="col">Actions</th>
 								</tr>
 							</thead>
@@ -144,5 +143,5 @@
 
 	while ($cur_word = $db->fetch_assoc($result))
-		echo "\t\t\t\t\t\t\t\t".'<tr><td class="tcl"><input type="text" name="search_for['.$cur_word['id'].']" value="'.pun_htmlspecialchars($cur_word['search_for']).'" size="24" maxlength="60" /></td><td class="tc2"><input type="text" name="replace_with['.$cur_word['id'].']" value="'.pun_htmlspecialchars($cur_word['replace_with']).'" size="24" maxlength="60" /></td><td><input type="submit" name="update['.$cur_word['id'].']" value="'.$lang_admin_common['Update'].'" />&#160;<input type="submit" name="remove['.$cur_word['id'].']" value="'.$lang_admin_common['Remove'].'" /></td></tr>'."\n";
+		echo "\t\t\t\t\t\t\t\t".'<tr><td><input type="text" name="search_for['.$cur_word['id'].']" value="'.pun_htmlspecialchars($cur_word['search_for']).'" size="24" maxlength="60" /></td><td><input type="text" name="replace_with['.$cur_word['id'].']" value="'.pun_htmlspecialchars($cur_word['replace_with']).'" size="24" maxlength="60" /></td><td><input type="submit" name="update['.$cur_word['id'].']" value=" Modifier " />&#160;<input type="submit" name="remove['.$cur_word['id'].']" value=" Supprimer " /></td></tr>'."\n";
 
 ?>
@@ -153,5 +152,5 @@
 }
 else
-	echo "\t\t\t\t\t\t\t".'<p>'.$lang_admin_censoring['No words in list'].'</p>'."\n";
+	echo "\t\t\t\t\t\t\t".'<p>Aucun mot Ã  censurer dans la liste.</p>'."\n";
 
 ?>
Index: trunk/web/punbb/admin_forums.php
===================================================================
--- trunk/web/punbb/admin_forums.php	(revision 10)
+++ trunk/web/punbb/admin_forums.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_forums.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_forums.php';
 
 // Add a "default" forum
@@ -30,14 +45,13 @@
 		message($lang_common['Bad request']);
 
-	$db->query('INSERT INTO '.$db->prefix.'forums (forum_name, cat_id) VALUES(\''.$db->escape($lang_admin_forums['New forum']).'\', '.$add_to_cat.')') or error('Unable to create forum', __FILE__, __LINE__, $db->error());
-
-	// Regenerate the quick jump cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	$db->query('INSERT INTO '.$db->prefix.'forums (cat_id) VALUES('.$add_to_cat.')') or error('Impossible de crÃ©er un nouveau forum', __FILE__, __LINE__, $db->error());
+
+	// Regenerate the quickjump cache
+	require_once PUN_ROOT.'include/cache.php';
 	generate_quickjump_cache();
 
-	redirect('admin_forums.php', $lang_admin_forums['Forum added redirect']);
+	redirect('admin_forums.php', 'Forum ajoutÃ©. Redirection ...');
 }
+
 
 // Delete a forum
@@ -50,5 +64,5 @@
 		message($lang_common['Bad request']);
 
-	if (isset($_POST['del_forum_comply'])) // Delete a forum with all posts
+	if (isset($_POST['del_forum_comply']))	// Delete a forum with all posts
 	{
 		@set_time_limit(0);
@@ -58,5 +72,5 @@
 
 		// Locate any "orphaned redirect topics" and delete them
-		$result = $db->query('SELECT t1.id FROM '.$db->prefix.'topics AS t1 LEFT JOIN '.$db->prefix.'topics AS t2 ON t1.moved_to=t2.id WHERE t2.id IS NULL AND t1.moved_to IS NOT NULL') or error('Unable to fetch redirect topics', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT t1.id FROM '.$db->prefix.'topics AS t1 LEFT JOIN '.$db->prefix.'topics AS t2 ON t1.moved_to=t2.id WHERE t2.id IS NULL AND t1.moved_to IS NOT NULL') or error('Impossible de retrouver les sujets de redirection', __FILE__, __LINE__, $db->error());
 		$num_orphans = $db->num_rows($result);
 
@@ -66,29 +80,24 @@
 				$orphans[] = $db->result($result, $i);
 
-			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $orphans).')') or error('Unable to delete redirect topics', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $orphans).')') or error('Impossible de supprimer les sujets de redirection', __FILE__, __LINE__, $db->error());
 		}
 
 		// Delete the forum and any forum specific group permissions
-		$db->query('DELETE FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to delete forum', __FILE__, __LINE__, $db->error());
-		$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE forum_id='.$forum_id) or error('Unable to delete group forum permissions', __FILE__, __LINE__, $db->error());
-
-		// Delete any subscriptions for this forum
-		$db->query('DELETE FROM '.$db->prefix.'forum_subscriptions WHERE forum_id='.$forum_id) or error('Unable to delete subscriptions', __FILE__, __LINE__, $db->error());
-
-		// Regenerate the quick jump cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
+		$db->query('DELETE FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Impossible de supprimer un forum', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE forum_id='.$forum_id) or error('Impossible de supprimer les permissions de groupe du forum', __FILE__, __LINE__, $db->error());
+
+		// Regenerate the quickjump cache
+		require_once PUN_ROOT.'include/cache.php';
 		generate_quickjump_cache();
 
-		redirect('admin_forums.php', $lang_admin_forums['Forum deleted redirect']);
-	}
-	else // If the user hasn't confirmed the delete
-	{
-		$result = $db->query('SELECT forum_name FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
+		redirect('admin_forums.php', 'Forum supprimÃ©. Redirection ...');
+	}
+	else	// If the user hasn't confirmed the delete
+	{
+		$result = $db->query('SELECT forum_name FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Impossible de retrouver les informations du forum', __FILE__, __LINE__, $db->error());
 		$forum_name = pun_htmlspecialchars($db->result($result));
 
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Forums']);
-		define('PUN_ACTIVE_PAGE', 'admin');
+
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Forums';
 		require PUN_ROOT.'header.php';
 
@@ -97,17 +106,17 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_forums['Confirm delete head'] ?></span></h2>
+		<h2><span>Confirmez la suppresion du forum</span></h2>
 		<div class="box">
 			<form method="post" action="admin_forums.php?del_forum=<?php echo $forum_id ?>">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_forums['Confirm delete subhead'] ?></legend>
+						<legend>Important ! Lire attentivement avant de procÃ©der Ã  la suppression.</legend>
 						<div class="infldset">
-							<p><?php printf($lang_admin_forums['Confirm delete info'], $forum_name) ?></p>
-							<p class="warntext"><?php echo $lang_admin_forums['Confirm delete warn'] ?></p>
+							<p>Ãtes vous sÃ»r de vouloir supprimer le forum "<?php echo $forum_name ?>"&#160;?</p>
+							<p>ATTENTION ! Supprimer un forum effacera tous les messages (s'il y en a) prÃ©sent dans ce forum&#160;!</p>
 						</div>
 					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="del_forum_comply" value="<?php echo $lang_admin_common['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_admin_common['Go back'] ?></a></p>
+				<p><input type="submit" name="del_forum_comply" value=" Supprimer " /><a href="javascript:history.go(-1)">Retour</a></p>
 			</form>
 		</div>
@@ -121,4 +130,5 @@
 }
 
+
 // Update forum positions
 else if (isset($_POST['update_positions']))
@@ -126,21 +136,19 @@
 	confirm_referrer('admin_forums.php');
 
-	foreach ($_POST['position'] as $forum_id => $disp_position)
-	{
-		$disp_position = trim($disp_position);
-		if ($disp_position == '' || preg_match('%[^0-9]%', $disp_position))
-			message($lang_admin_forums['Must be integer message']);
-
-		$db->query('UPDATE '.$db->prefix.'forums SET disp_position='.$disp_position.' WHERE id='.intval($forum_id)) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
-	}
-
-	// Regenerate the quick jump cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	while (list($forum_id, $disp_position) = @each($_POST['position']))
+	{
+		if (!preg_match('#^\d+$#', $disp_position))
+			message('La position doit Ãªtre un nombre entier.');
+
+		$db->query('UPDATE '.$db->prefix.'forums SET disp_position='.$disp_position.' WHERE id='.$forum_id) or error('Impossible de mettre Ã  jour les forums', __FILE__, __LINE__, $db->error());
+	}
+
+	// Regenerate the quickjump cache
+	require_once PUN_ROOT.'include/cache.php';
 	generate_quickjump_cache();
 
-	redirect('admin_forums.php', $lang_admin_forums['Forums updated redirect']);
+	redirect('admin_forums.php', 'Forums modifiÃ©s. Redirection ...');
 }
+
 
 else if (isset($_GET['edit_forum']))
@@ -156,6 +164,6 @@
 
 		// Start with the forum details
-		$forum_name = pun_trim($_POST['forum_name']);
-		$forum_desc = pun_linebreaks(pun_trim($_POST['forum_desc']));
+		$forum_name = trim($_POST['forum_name']);
+		$forum_desc = pun_linebreaks(trim($_POST['forum_desc']));
 		$cat_id = intval($_POST['cat_id']);
 		$sort_by = intval($_POST['sort_by']);
@@ -163,5 +171,5 @@
 
 		if ($forum_name == '')
-			message($lang_admin_forums['Must enter name message']);
+			message('Vous devez saisir un nom de forum.');
 
 		if ($cat_id < 1)
@@ -171,15 +179,15 @@
 		$redirect_url = ($redirect_url != '') ? '\''.$db->escape($redirect_url).'\'' : 'NULL';
 
-		$db->query('UPDATE '.$db->prefix.'forums SET forum_name=\''.$db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', cat_id='.$cat_id.' WHERE id='.$forum_id) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'forums SET forum_name=\''.$db->escape($forum_name).'\', forum_desc='.$forum_desc.', redirect_url='.$redirect_url.', sort_by='.$sort_by.', cat_id='.$cat_id.' WHERE id='.$forum_id) or error('Impossible de modifier le forum', __FILE__, __LINE__, $db->error());
 
 		// Now let's deal with the permissions
 		if (isset($_POST['read_forum_old']))
 		{
-			$result = $db->query('SELECT g_id, g_read_board, g_post_replies, g_post_topics FROM '.$db->prefix.'groups WHERE g_id!='.PUN_ADMIN) or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+			$result = $db->query('SELECT g_id, g_read_board, g_post_replies, g_post_topics FROM '.$db->prefix.'groups WHERE g_id!='.PUN_ADMIN) or error('Impossible de retrouver la liste des groupes d\'utilisateurs', __FILE__, __LINE__, $db->error());
 			while ($cur_group = $db->fetch_assoc($result))
 			{
-				$read_forum_new = ($cur_group['g_read_board'] == '1') ? isset($_POST['read_forum_new'][$cur_group['g_id']]) ? '1' : '0' : intval($_POST['read_forum_old'][$cur_group['g_id']]);
-				$post_replies_new = isset($_POST['post_replies_new'][$cur_group['g_id']]) ? '1' : '0';
-				$post_topics_new = isset($_POST['post_topics_new'][$cur_group['g_id']]) ? '1' : '0';
+				$read_forum_new = ($cur_group['g_read_board'] == '1') ? isset($_POST['read_forum_new'][$cur_group['g_id']]) ? $_POST['read_forum_new'][$cur_group['g_id']] : '0' : $_POST['read_forum_old'][$cur_group['g_id']];
+				$post_replies_new = isset($_POST['post_replies_new'][$cur_group['g_id']]) ? $_POST['post_replies_new'][$cur_group['g_id']] : '0';
+				$post_topics_new = isset($_POST['post_topics_new'][$cur_group['g_id']]) ? $_POST['post_topics_new'][$cur_group['g_id']] : '0';
 
 				// Check if the new settings differ from the old
@@ -188,11 +196,11 @@
 					// If the new settings are identical to the default settings for this group, delete it's row in forum_perms
 					if ($read_forum_new == '1' && $post_replies_new == $cur_group['g_post_replies'] && $post_topics_new == $cur_group['g_post_topics'])
-						$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE group_id='.$cur_group['g_id'].' AND forum_id='.$forum_id) or error('Unable to delete group forum permissions', __FILE__, __LINE__, $db->error());
+						$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE group_id='.$cur_group['g_id'].' AND forum_id='.$forum_id) or error('Impossible de supprimer les permissions de groupes du forum', __FILE__, __LINE__, $db->error());
 					else
 					{
 						// Run an UPDATE and see if it affected a row, if not, INSERT
-						$db->query('UPDATE '.$db->prefix.'forum_perms SET read_forum='.$read_forum_new.', post_replies='.$post_replies_new.', post_topics='.$post_topics_new.' WHERE group_id='.$cur_group['g_id'].' AND forum_id='.$forum_id) or error('Unable to insert group forum permissions', __FILE__, __LINE__, $db->error());
+						$db->query('UPDATE '.$db->prefix.'forum_perms SET read_forum='.$read_forum_new.', post_replies='.$post_replies_new.', post_topics='.$post_topics_new.' WHERE group_id='.$cur_group['g_id'].' AND forum_id='.$forum_id) or error('Impossible d\'insÃ©rer les permissions de groupes du forum', __FILE__, __LINE__, $db->error());
 						if (!$db->affected_rows())
-							$db->query('INSERT INTO '.$db->prefix.'forum_perms (group_id, forum_id, read_forum, post_replies, post_topics) VALUES('.$cur_group['g_id'].', '.$forum_id.', '.$read_forum_new.', '.$post_replies_new.', '.$post_topics_new.')') or error('Unable to insert group forum permissions', __FILE__, __LINE__, $db->error());
+							$db->query('INSERT INTO '.$db->prefix.'forum_perms (group_id, forum_id, read_forum, post_replies, post_topics) VALUES('.$cur_group['g_id'].', '.$forum_id.', '.$read_forum_new.', '.$post_replies_new.', '.$post_topics_new.')') or error('Impossible d\'insÃ©rer les permissions de groupes du forum', __FILE__, __LINE__, $db->error());
 					}
 				}
@@ -200,11 +208,9 @@
 		}
 
-		// Regenerate the quick jump cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
+		// Regenerate the quickjump cache
+		require_once PUN_ROOT.'include/cache.php';
 		generate_quickjump_cache();
 
-		redirect('admin_forums.php', $lang_admin_forums['Forum updated redirect']);
+		redirect('admin_forums.php', 'Forum modifiÃ©. Redirection ...');
 	}
 	else if (isset($_POST['revert_perms']))
@@ -212,17 +218,16 @@
 		confirm_referrer('admin_forums.php');
 
-		$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE forum_id='.$forum_id) or error('Unable to delete group forum permissions', __FILE__, __LINE__, $db->error());
-
-		// Regenerate the quick jump cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
+		$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE forum_id='.$forum_id) or error('Impossible de supprimer les permissions de groupes du forum', __FILE__, __LINE__, $db->error());
+
+		// Regenerate the quickjump cache
+		require_once PUN_ROOT.'include/cache.php';
 		generate_quickjump_cache();
 
-		redirect('admin_forums.php?edit_forum='.$forum_id, $lang_admin_forums['Perms reverted redirect']);
-	}
+		redirect('admin_forums.php?edit_forum='.$forum_id, 'Permissions remises Ã  leurs valeurs par dÃ©faut. Redirection ...');
+	}
+
 
 	// Fetch forum info
-	$result = $db->query('SELECT id, forum_name, forum_desc, redirect_url, num_topics, sort_by, cat_id FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id, forum_name, forum_desc, redirect_url, num_topics, sort_by, cat_id FROM '.$db->prefix.'forums WHERE id='.$forum_id) or error('Impossible de retrouver les informations du forum', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
 		message($lang_common['Bad request']);
@@ -230,6 +235,6 @@
 	$cur_forum = $db->fetch_assoc($result);
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Forums']);
-	define('PUN_ACTIVE_PAGE', 'admin');
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Forums';
 	require PUN_ROOT.'header.php';
 
@@ -238,28 +243,28 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_forums['Edit forum head'] ?></span></h2>
+		<h2><span>Modifier forum</span></h2>
 		<div class="box">
 			<form id="edit_forum" method="post" action="admin_forums.php?edit_forum=<?php echo $forum_id ?>">
-				<p class="submittop"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" tabindex="6" /></p>
+				<p class="submittop"><input type="submit" name="save" value=" Enregistrer modifications " tabindex="6" /></p>
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_forums['Edit details subhead'] ?></legend>
+						<legend>Modifier les dÃ©tails du forum</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_forums['Forum name label'] ?></th>
+									<th scope="row">Nom du forum</th>
 									<td><input type="text" name="forum_name" size="35" maxlength="80" value="<?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?>" tabindex="1" /></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_forums['Forum description label'] ?></th>
+									<th scope="row">Description (<acronym title="HyperText Markup Language" lang="en">HTML</acronym>)</th>
 									<td><textarea name="forum_desc" rows="3" cols="50" tabindex="2"><?php echo pun_htmlspecialchars($cur_forum['forum_desc']) ?></textarea></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_forums['Category label'] ?></th>
+									<th scope="row">CatÃ©gorie</th>
 									<td>
 										<select name="cat_id" tabindex="3">
 <?php
 
-	$result = $db->query('SELECT id, cat_name FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Unable to fetch category list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id, cat_name FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Impossible de retrouver la liste des catÃ©gories', __FILE__, __LINE__, $db->error());
 	while ($cur_cat = $db->fetch_assoc($result))
 	{
@@ -273,16 +278,15 @@
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_forums['Sort by label'] ?></th>
+									<th scope="row">Trier les discussions par</th>
 									<td>
 										<select name="sort_by" tabindex="4">
-											<option value="0"<?php if ($cur_forum['sort_by'] == '0') echo ' selected="selected"' ?>><?php echo $lang_admin_forums['Last post'] ?></option>
-											<option value="1"<?php if ($cur_forum['sort_by'] == '1') echo ' selected="selected"' ?>><?php echo $lang_admin_forums['Topic start'] ?></option>
-											<option value="2"<?php if ($cur_forum['sort_by'] == '2') echo ' selected="selected"' ?>><?php echo $lang_admin_forums['Subject'] ?></option>
+											<option value="0"<?php if ($cur_forum['sort_by'] == '0') echo ' selected="selected"' ?>>Derniers messages</option>
+											<option value="1"<?php if ($cur_forum['sort_by'] == '1') echo ' selected="selected"' ?>>Dates des discussions</option>
 										</select>
 									</td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_forums['Redirect label'] ?></th>
-									<td><?php echo ($cur_forum['num_topics']) ? $lang_admin_forums['Redirect help'] : '<input type="text" name="redirect_url" size="45" maxlength="100" value="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" tabindex="5" />'; ?></td>
+									<th scope="row"><acronym title="Uniform Resource Locator" lang="en">URL</acronym> de redirection</th>
+									<td><?php echo ($cur_forum['num_topics']) ? 'Disponible uniquement pour les forums vides' : '<input type="text" name="redirect_url" size="45" maxlength="100" value="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" tabindex="5" />'; ?></td>
 								</tr>
 							</table>
@@ -292,14 +296,14 @@
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_forums['Group permissions subhead'] ?></legend>
+						<legend>Modifier les permissions de groupes de ce forum</legend>
 						<div class="infldset">
-							<p><?php printf($lang_admin_forums['Group permissions info'], '<a href="admin_groups.php">'.$lang_admin_common['User groups'].'</a>') ?></p>
+							<p>Avec ce formulaire vous pouvez rÃ©gler les permissions de ce forum spÃ©cifiques aux diffÃ©rents groupes d'utilisateurs. Si vous n'avez effectuÃ© aucune modification Ã  ces permissions de groupes, ce que vous voyez ci-dessous sont les permissions par dÃ©faut basÃ©es sur les paramÃštres des <a href="admin_groups.php">Groupes d'utilisateurs</a>. Les administrateurs ont toujours toutes les permissions et sont donc Ã©cartÃ©s. Les paramÃštres de permission qui diffÃšrent des permissions par dÃ©faut pour le groupe d'utilisateur sont signalÃ©s en rouge. La permission Â«&#160;Lire&#160;Â» pourra Ãªtre dÃ©sactivÃ©e si le groupe en question ne possÃšde pas la permission globale Â«&#160;Lire forums&#160;Â». Pour les forums de redirection seule la permission Â«&#160;Lire&#160;Â» est modifiable.</p>
 							<table id="forumperms" cellspacing="0">
 							<thead>
 								<tr>
 									<th class="atcl">&#160;</th>
-									<th><?php echo $lang_admin_forums['Read forum label'] ?></th>
-									<th><?php echo $lang_admin_forums['Post replies label'] ?></th>
-									<th><?php echo $lang_admin_forums['Post topics label'] ?></th>
+									<th>Lire le forum</th>
+									<th>Ãcrire des rÃ©ponses</th>
+									<th>Lancer des discussions</th>
 								</tr>
 							</thead>
@@ -307,7 +311,5 @@
 <?php
 
-	$result = $db->query('SELECT g.g_id, g.g_title, g.g_read_board, g.g_post_replies, g.g_post_topics, fp.read_forum, fp.post_replies, fp.post_topics FROM '.$db->prefix.'groups AS g LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (g.g_id=fp.group_id AND fp.forum_id='.$forum_id.') WHERE g.g_id!='.PUN_ADMIN.' ORDER BY g.g_id') or error('Unable to fetch group forum permission list', __FILE__, __LINE__, $db->error());
-
-	$cur_index = 7;
+	$result = $db->query('SELECT g.g_id, g.g_title, g.g_read_board, g.g_post_replies, g.g_post_topics, fp.read_forum, fp.post_replies, fp.post_topics FROM '.$db->prefix.'groups AS g LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (g.g_id=fp.group_id AND fp.forum_id='.$forum_id.') WHERE g.g_id!='.PUN_ADMIN.' ORDER BY g.g_id') or error('Impossible de retrouver la liste des permissions de groupe du forum', __FILE__, __LINE__, $db->error());
 
 	while ($cur_perm = $db->fetch_assoc($result))
@@ -317,5 +319,5 @@
 		$post_topics = (($cur_perm['g_post_topics'] == '0' && $cur_perm['post_topics'] == '1') || ($cur_perm['g_post_topics'] == '1' && $cur_perm['post_topics'] != '0')) ? true : false;
 
-		// Determine if the current settings differ from the default or not
+		// Determine if the current sittings differ from the default or not
 		$read_forum_def = ($cur_perm['read_forum'] == '0') ? false : true;
 		$post_replies_def = (($post_replies && $cur_perm['g_post_replies'] == '0') || (!$post_replies && ($cur_perm['g_post_replies'] == '' || $cur_perm['g_post_replies'] == '1'))) ? false : true;
@@ -327,13 +329,13 @@
 									<td<?php if (!$read_forum_def) echo ' class="nodefault"'; ?>>
 										<input type="hidden" name="read_forum_old[<?php echo $cur_perm['g_id'] ?>]" value="<?php echo ($read_forum) ? '1' : '0'; ?>" />
-										<input type="checkbox" name="read_forum_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php echo ($read_forum) ? ' checked="checked"' : ''; ?><?php echo ($cur_perm['g_read_board'] == '0') ? ' disabled="disabled"' : ''; ?> tabindex="<?php echo $cur_index++ ?>" />
+										<input type="checkbox" name="read_forum_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php echo ($read_forum) ? ' checked="checked"' : ''; ?><?php echo ($cur_perm['g_read_board'] == '0') ? ' disabled="disabled"' : ''; ?> />
 									</td>
 									<td<?php if (!$post_replies_def && $cur_forum['redirect_url'] == '') echo ' class="nodefault"'; ?>>
 										<input type="hidden" name="post_replies_old[<?php echo $cur_perm['g_id'] ?>]" value="<?php echo ($post_replies) ? '1' : '0'; ?>" />
-										<input type="checkbox" name="post_replies_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php echo ($post_replies) ? ' checked="checked"' : ''; ?><?php echo ($cur_forum['redirect_url'] != '') ? ' disabled="disabled"' : ''; ?> tabindex="<?php echo $cur_index++ ?>" />
+										<input type="checkbox" name="post_replies_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php echo ($post_replies) ? ' checked="checked"' : ''; ?><?php echo ($cur_forum['redirect_url'] != '') ? ' disabled="disabled"' : ''; ?> />
 									</td>
 									<td<?php if (!$post_topics_def && $cur_forum['redirect_url'] == '') echo ' class="nodefault"'; ?>>
 										<input type="hidden" name="post_topics_old[<?php echo $cur_perm['g_id'] ?>]" value="<?php echo ($post_topics) ? '1' : '0'; ?>" />
-										<input type="checkbox" name="post_topics_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php echo ($post_topics) ? ' checked="checked"' : ''; ?><?php echo ($cur_forum['redirect_url'] != '') ? ' disabled="disabled"' : ''; ?> tabindex="<?php echo $cur_index++ ?>" />
+										<input type="checkbox" name="post_topics_new[<?php echo $cur_perm['g_id'] ?>]" value="1"<?php echo ($post_topics) ? ' checked="checked"' : ''; ?><?php echo ($cur_forum['redirect_url'] != '') ? ' disabled="disabled"' : ''; ?> />
 									</td>
 								</tr>
@@ -345,9 +347,9 @@
 							</tbody>
 							</table>
-							<div class="fsetsubmit"><input type="submit" name="revert_perms" value="<?php echo $lang_admin_forums['Revert to default'] ?>" tabindex="<?php echo $cur_index++ ?>" /></div>
+							<div class="fsetsubmit"><input type="submit" name="revert_perms" value=" RÃ©tablir les permissions par dÃ©faut " /></div>
 						</div>
 					</fieldset>
 				</div>
-				<p class="submitend"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" tabindex="<?php echo $cur_index++ ?>" /></p>
+				<p class="submitend"><input type="submit" name="save" value=" Enregistrer modifications " /></p>
 			</form>
 		</div>
@@ -361,6 +363,6 @@
 }
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Forums']);
-define('PUN_ACTIVE_PAGE', 'admin');
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Forums';
 require PUN_ROOT.'header.php';
 
@@ -369,30 +371,25 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_forums['Add forum head'] ?></span></h2>
+		<h2><span>Ajouter forum</span></h2>
 		<div class="box">
 			<form method="post" action="admin_forums.php?action=adddel">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_forums['Create new subhead'] ?></legend>
+						<legend>CrÃ©er un forum</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_forums['Add forum label'] ?><div><input type="submit" name="add_forum" value="<?php echo $lang_admin_forums['Add forum'] ?>" tabindex="2" /></div></th>
+									<th scope="row">Ajouter un forum Ã  la catÃ©gorie<div><input type="submit" name="add_forum" value=" Ajouter " tabindex="2" /></div></th>
 									<td>
 										<select name="add_to_cat" tabindex="1">
 <?php
 
-	$result = $db->query('SELECT id, cat_name FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Unable to fetch category list', __FILE__, __LINE__, $db->error());
-	if ($db->num_rows($result) > 0)
-	{
-		while ($cur_cat = $db->fetch_assoc($result))
-			echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_cat['id'].'">'.pun_htmlspecialchars($cur_cat['cat_name']).'</option>'."\n";
-	}
-	else
-		echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="0" disabled="disabled">'.$lang_admin_forums['No categories exist'].'</option>'."\n";
+	$result = $db->query('SELECT id, cat_name FROM '.$db->prefix.'categories ORDER BY disp_position') or error('Impossible de retrouver la liste des catÃ©gories', __FILE__, __LINE__, $db->error());
+	while ($cur_cat = $db->fetch_assoc($result))
+		echo "\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_cat['id'].'">'.pun_htmlspecialchars($cur_cat['cat_name']).'</option>'."\n";
 
 ?>
 										</select>
-										<span><?php echo $lang_admin_forums['Add forum help'] ?></span>
+										<span>Choisissez la catÃ©gorie dans laquelle vous souhaitez ajouter un nouveau forum.</span>
 									</td>
 								</tr>
@@ -403,43 +400,31 @@
 			</form>
 		</div>
-<?php
-
-// Display all the categories and forums
-$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.disp_position FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
-
-if ($db->num_rows($result) > 0)
-{
-
-?>
-		<h2 class="block2"><span><?php echo $lang_admin_forums['Edit forums head'] ?></span></h2>
+
+		<h2 class="block2"><span>Modifier les forums</span></h2>
 		<div class="box">
 			<form id="edforum" method="post" action="admin_forums.php?action=edit">
-				<p class="submittop"><input type="submit" name="update_positions" value="<?php echo $lang_admin_forums['Update positions'] ?>" tabindex="3" /></p>
-<?php
-
-$cur_index = 4;
-
+				<p class="submittop"><input type="submit" name="update_positions" value=" Modifier positions " tabindex="3" /></p>
+<?php
+
+$tabindex_count = 4;
+
+// Display all the categories and forums
+$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.disp_position FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id ORDER BY c.disp_position, c.id, f.disp_position') or error('Impossible de retrouver la liste des catÃ©gories et des forums', __FILE__, __LINE__, $db->error());
+
+if($db->num_rows($result)) :
 $cur_category = 0;
 while ($cur_forum = $db->fetch_assoc($result))
 {
-	if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
+	if ($cur_forum['cid'] != $cur_category)	// A new category since last iteration?
 	{
 		if ($cur_category != 0)
-			echo "\t\t\t\t\t\t\t".'</tbody>'."\n\t\t\t\t\t\t\t".'</table>'."\n\t\t\t\t\t\t".'</div>'."\n\t\t\t\t\t".'</fieldset>'."\n\t\t\t\t".'</div>'."\n";
+			echo "\t\t\t\t\t\t\t".'</table>'."\n\t\t\t\t\t\t".'</div>'."\n\t\t\t\t\t".'</fieldset>'."\n\t\t\t\t".'</div>'."\n";
 
 ?>
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_forums['Category subhead'] ?> <?php echo pun_htmlspecialchars($cur_forum['cat_name']) ?></legend>
+						<legend>CatÃ©gorie&#160;: <?php echo pun_htmlspecialchars($cur_forum['cat_name']) ?></legend>
 						<div class="infldset">
 							<table cellspacing="0">
-							<thead>
-								<tr>
-									<th class="tcl"><?php echo $lang_admin_common['Action'] ?></th>
-									<th class="tc2"><?php echo $lang_admin_forums['Position label'] ?></th>
-									<th class="tcr"><?php echo $lang_admin_forums['Forum label'] ?></th>
-								</tr>
-							</thead>
-							<tbody>
 <?php
 
@@ -449,26 +434,22 @@
 ?>
 								<tr>
-									<td class="tcl"><a href="admin_forums.php?edit_forum=<?php echo $cur_forum['fid'] ?>" tabindex="<?php echo $cur_index++ ?>"><?php echo $lang_admin_forums['Edit link'] ?></a> | <a href="admin_forums.php?del_forum=<?php echo $cur_forum['fid'] ?>" tabindex="<?php echo $cur_index++ ?>"><?php echo $lang_admin_forums['Delete link'] ?></a></td>
-									<td class="tc2"><input type="text" name="position[<?php echo $cur_forum['fid'] ?>]" size="3" maxlength="3" value="<?php echo $cur_forum['disp_position'] ?>" tabindex="<?php echo $cur_index++ ?>" /></td>
-									<td class="tcr"><strong><?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></strong></td>
-								</tr>
-<?php
-
+									<th><a href="admin_forums.php?edit_forum=<?php echo $cur_forum['fid'] ?>">Modifier</a> - <a href="admin_forums.php?del_forum=<?php echo $cur_forum['fid'] ?>">Supprimer</a></th>
+									<td>Position&#160;&#160;<input type="text" name="position[<?php echo $cur_forum['fid'] ?>]" size="3" maxlength="3" value="<?php echo $cur_forum['disp_position'] ?>" tabindex="<?php echo $tabindex_count ?>" />
+									&#160;&#160;<strong><?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></strong></td>
+								</tr>
+<?php
+
+	$tabindex_count += 2;
 }
 
 ?>
-							</tbody>
 							</table>
 						</div>
 					</fieldset>
 				</div>
-				<p class="submitend"><input type="submit" name="update_positions" value="<?php echo $lang_admin_forums['Update positions'] ?>" tabindex="<?php echo $cur_index++ ?>" /></p>
+<?php endif; ?>
+				<p class="submitend"><input type="submit" name="update_positions" value=" Modifier positions " tabindex="<?php echo $tabindex_count ?>" /></p>
 			</form>
 		</div>
-<?php
-
-}
-
-?>
 	</div>
 	<div class="clearer"></div>
Index: trunk/web/punbb/admin_groups.php
===================================================================
--- trunk/web/punbb/admin_groups.php	(revision 10)
+++ trunk/web/punbb/admin_groups.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_censoring.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_groups.php';
 
 // Add/edit a group (stage 1)
@@ -28,10 +43,10 @@
 		$base_group = intval($_POST['base_group']);
 
-		$result = $db->query('SELECT * FROM '.$db->prefix.'groups WHERE g_id='.$base_group) or error('Unable to fetch user group info', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT * FROM '.$db->prefix.'groups WHERE g_id='.$base_group) or error('Impossible de retrouver les informations de groupes utilisateurs', __FILE__, __LINE__, $db->error());
 		$group = $db->fetch_assoc($result);
 
 		$mode = 'add';
 	}
-	else // We are editing a group
+	else	// We are editing a group
 	{
 		$group_id = intval($_GET['edit_group']);
@@ -39,5 +54,5 @@
 			message($lang_common['Bad request']);
 
-		$result = $db->query('SELECT * FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch user group info', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT * FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Impossible de retrouver les informations de groupes utilisateurs', __FILE__, __LINE__, $db->error());
 		if (!$db->num_rows($result))
 			message($lang_common['Bad request']);
@@ -49,8 +64,7 @@
 
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['User groups']);
-	$required_fields = array('req_title' => $lang_admin_groups['Group title label']);
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Groupes';
+	$required_fields = array('req_title' => 'Nom groupe');
 	$focus_element = array('groups2', 'req_title');
-	define('PUN_ACTIVE_PAGE', 'admin');
 	require PUN_ROOT.'header.php';
 
@@ -59,19 +73,19 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_groups['Group settings head'] ?></span></h2>
+		<h2><span>RÃ©glages du groupe</span></h2>
 		<div class="box">
 			<form id="groups2" method="post" action="admin_groups.php" onsubmit="return process_form(this)">
-				<p class="submittop"><input type="submit" name="add_edit_group" value="<?php echo $lang_admin_common['Save'] ?>" /></p>
+				<p class="submittop"><input type="submit" name="add_edit_group" value=" Enregistrer " /></p>
 				<div class="inform">
 					<input type="hidden" name="mode" value="<?php echo $mode ?>" />
-<?php if ($mode == 'edit'): ?>					<input type="hidden" name="group_id" value="<?php echo $group_id ?>" />
-<?php endif; ?><?php if ($mode == 'add'): ?>					<input type="hidden" name="base_group" value="<?php echo $base_group ?>" />
+<?php if ($mode == 'edit'): ?>				<input type="hidden" name="group_id" value="<?php echo $group_id ?>" />
+<?php endif; ?><?php if ($mode == 'add'): ?>				<input type="hidden" name="base_group" value="<?php echo $base_group ?>" />
 <?php endif; ?>					<fieldset>
-						<legend><?php echo $lang_admin_groups['Group settings subhead'] ?></legend>
+						<legend>RÃ©glages des options et des permissions de groupe</legend>
 						<div class="infldset">
-							<p><?php echo $lang_admin_groups['Group settings info'] ?></p>
+							<p>Les options et permissions ci-dessous sont les permissions par dÃ©faut pour le groupe. Ces options s'appliquent s'il n'y a pas de rÃ©glages de permissions spÃ©cifiques Ã  un forum.</p>
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Group title label'] ?></th>
+									<th scope="row">Nom groupe</th>
 									<td>
 										<input type="text" name="req_title" size="25" maxlength="50" value="<?php if ($mode == 'edit') echo pun_htmlspecialchars($group['g_title']); ?>" tabindex="1" />
@@ -79,156 +93,101 @@
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['User title label'] ?></th>
+									<th scope="row">Titre utilisateur</th>
 									<td>
 										<input type="text" name="user_title" size="25" maxlength="50" value="<?php echo pun_htmlspecialchars($group['g_user_title']) ?>" tabindex="2" />
-										<span><?php echo $lang_admin_groups['User title help'] ?></span>
-									</td>
-								</tr>
-<?php if ($group['g_id'] != PUN_ADMIN): if ($group['g_id'] != PUN_GUEST): if ($mode != 'edit' || $pun_config['o_default_user_group'] != $group['g_id']): ?>								<tr>
-									<th scope="row"> <?php echo $lang_admin_groups['Mod privileges label'] ?></th>
-									<td>
-										<input type="radio" name="moderator" value="1"<?php if ($group['g_moderator'] == '1') echo ' checked="checked"' ?> tabindex="3" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="moderator" value="0"<?php if ($group['g_moderator'] == '0') echo ' checked="checked"' ?> tabindex="4" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Mod privileges help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Edit profile label'] ?></th>
-									<td>
-										<input type="radio" name="mod_edit_users" value="1"<?php if ($group['g_mod_edit_users'] == '1') echo ' checked="checked"' ?> tabindex="5" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="mod_edit_users" value="0"<?php if ($group['g_mod_edit_users'] == '0') echo ' checked="checked"' ?> tabindex="6" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Edit profile help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Rename users label'] ?></th>
-									<td>
-										<input type="radio" name="mod_rename_users" value="1"<?php if ($group['g_mod_rename_users'] == '1') echo ' checked="checked"' ?> tabindex="7" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="mod_rename_users" value="0"<?php if ($group['g_mod_rename_users'] == '0') echo ' checked="checked"' ?> tabindex="8" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Rename users help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Change passwords label'] ?></th>
-									<td>
-										<input type="radio" name="mod_change_passwords" value="1"<?php if ($group['g_mod_change_passwords'] == '1') echo ' checked="checked"' ?> tabindex="9" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="mod_change_passwords" value="0"<?php if ($group['g_mod_change_passwords'] == '0') echo ' checked="checked"' ?> tabindex="10" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Change passwords help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Ban users label'] ?></th>
-									<td>
-										<input type="radio" name="mod_ban_users" value="1"<?php if ($group['g_mod_ban_users'] == '1') echo ' checked="checked"' ?> tabindex="11" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="mod_ban_users" value="0"<?php if ($group['g_mod_ban_users'] == '0') echo ' checked="checked"' ?> tabindex="12" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Ban users help'] ?></span>
-									</td>
-								</tr>
-<?php endif; endif; ?>								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Read board label'] ?></th>
-									<td>
-										<input type="radio" name="read_board" value="1"<?php if ($group['g_read_board'] == '1') echo ' checked="checked"' ?> tabindex="13" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="read_board" value="0"<?php if ($group['g_read_board'] == '0') echo ' checked="checked"' ?> tabindex="14" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Read board help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['View user info label'] ?></th>
-									<td>
-										<input type="radio" name="view_users" value="1"<?php if ($group['g_view_users'] == '1') echo ' checked="checked"' ?> tabindex="15" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="view_users" value="0"<?php if ($group['g_view_users'] == '0') echo ' checked="checked"' ?> tabindex="16" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['View user info help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Post replies label'] ?></th>
-									<td>
-										<input type="radio" name="post_replies" value="1"<?php if ($group['g_post_replies'] == '1') echo ' checked="checked"' ?> tabindex="17" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="post_replies" value="0"<?php if ($group['g_post_replies'] == '0') echo ' checked="checked"' ?> tabindex="18" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Post replies help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Post topics label'] ?></th>
-									<td>
-										<input type="radio" name="post_topics" value="1"<?php if ($group['g_post_topics'] == '1') echo ' checked="checked"' ?> tabindex="19" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="post_topics" value="0"<?php if ($group['g_post_topics'] == '0') echo ' checked="checked"' ?> tabindex="20" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Post topics help'] ?></span>
+										<span>Ce titre remplacera n'importe quel nom de rang que les utilisateurs de ce groupe auront atteint. Laissez vide pour utiliser le titre par dÃ©faut ou le rang.</span>
+									</td>
+								</tr>
+<?php if ($group['g_id'] != PUN_ADMIN): ?>								<tr>
+									<th scope="row">Lire forums</th>
+									<td>
+										<input type="radio" name="read_board" value="1"<?php if ($group['g_read_board'] == '1') echo ' checked="checked"' ?> tabindex="3" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="read_board" value="0"<?php if ($group['g_read_board'] == '0') echo ' checked="checked"' ?> tabindex="4" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  voir les forums. Ce rÃ©glage s'applique Ã  tous les aspects des forums et ne peut Ãªtre outrepassÃ© par les permissions spÃ©cifiques aux forums. Avec cette option Ã  non les utilisateurs de ce groupe ne pourront que s'identifier/se dÃ©connecter.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Ãcrire des rÃ©ponses</th>
+									<td>
+										<input type="radio" name="post_replies" value="1"<?php if ($group['g_post_replies'] == '1') echo ' checked="checked"' ?> tabindex="5" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="post_replies" value="0"<?php if ($group['g_post_replies'] == '0') echo ' checked="checked"' ?> tabindex="6" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  Ã©crire des rÃ©ponses aux discussions.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Lancer des discussions</th>
+									<td>
+										<input type="radio" name="post_topics" value="1"<?php if ($group['g_post_topics'] == '1') echo ' checked="checked"' ?> tabindex="7" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="post_topics" value="0"<?php if ($group['g_post_topics'] == '0') echo ' checked="checked"' ?> tabindex="8" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  lancer des nouveaux sujets.</span>
 									</td>
 								</tr>
 <?php if ($group['g_id'] != PUN_GUEST): ?>								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Edit posts label'] ?></th>
-									<td>
-										<input type="radio" name="edit_posts" value="1"<?php if ($group['g_edit_posts'] == '1') echo ' checked="checked"' ?> tabindex="21" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="edit_posts" value="0"<?php if ($group['g_edit_posts'] == '0') echo ' checked="checked"' ?> tabindex="22" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Edit posts help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Delete posts label'] ?></th>
-									<td>
-										<input type="radio" name="delete_posts" value="1"<?php if ($group['g_delete_posts'] == '1') echo ' checked="checked"' ?> tabindex="23" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="delete_posts" value="0"<?php if ($group['g_delete_posts'] == '0') echo ' checked="checked"' ?> tabindex="24" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Delete posts help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Delete topics label'] ?></th>
-									<td>
-										<input type="radio" name="delete_topics" value="1"<?php if ($group['g_delete_topics'] == '1') echo ' checked="checked"' ?> tabindex="25" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="delete_topics" value="0"<?php if ($group['g_delete_topics'] == '0') echo ' checked="checked"' ?> tabindex="26" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Delete topics help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Set own title label'] ?></th>
-									<td>
-										<input type="radio" name="set_title" value="1"<?php if ($group['g_set_title'] == '1') echo ' checked="checked"' ?> tabindex="27" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="set_title" value="0"<?php if ($group['g_set_title'] == '0') echo ' checked="checked"' ?> tabindex="28" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Set own title help'] ?></span>
+									<th scope="row">Modifier messages</th>
+									<td>
+										<input type="radio" name="edit_posts" value="1"<?php if ($group['g_edit_posts'] == '1') echo ' checked="checked"' ?> tabindex="11" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="edit_posts" value="0"<?php if ($group['g_edit_posts'] == '0') echo ' checked="checked"' ?> tabindex="12" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  modifier leurs propres messages.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Effacer les messages</th>
+									<td>
+										<input type="radio" name="delete_posts" value="1"<?php if ($group['g_delete_posts'] == '1') echo ' checked="checked"' ?> tabindex="13" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="delete_posts" value="0"<?php if ($group['g_delete_posts'] == '0') echo ' checked="checked"' ?> tabindex="14" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  effacer leurs propres messages.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Effacer les discussions</th>
+									<td>
+										<input type="radio" name="delete_topics" value="1"<?php if ($group['g_delete_topics'] == '1') echo ' checked="checked"' ?> tabindex="15" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="delete_topics" value="0"<?php if ($group['g_delete_topics'] == '0') echo ' checked="checked"' ?> tabindex="16" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  effacer leurs propres sujets (y compris toutes les rÃ©ponses).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Titre personnalisÃ©</th>
+									<td>
+										<input type="radio" name="set_title" value="1"<?php if ($group['g_set_title'] == '1') echo ' checked="checked"' ?> tabindex="17" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="set_title" value="0"<?php if ($group['g_set_title'] == '0') echo ' checked="checked"' ?> tabindex="18" />
+										&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  modifier leur propre titre utilisateur.</span>
 									</td>
 								</tr>
 <?php endif; ?>								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['User search label'] ?></th>
-									<td>
-										<input type="radio" name="search" value="1"<?php if ($group['g_search'] == '1') echo ' checked="checked"' ?> tabindex="29" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="search" value="0"<?php if ($group['g_search'] == '0') echo ' checked="checked"' ?> tabindex="30" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['User search help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['User list search label'] ?></th>
-									<td>
-										<input type="radio" name="search_users" value="1"<?php if ($group['g_search_users'] == '1') echo ' checked="checked"' ?> tabindex="31" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="search_users" value="0"<?php if ($group['g_search_users'] == '0') echo ' checked="checked"' ?> tabindex="32" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['User list search help'] ?></span>
+									<th scope="row">Utiliser la recherche</th>
+									<td>
+										<input type="radio" name="search" value="1"<?php if ($group['g_search'] == '1') echo ' checked="checked"' ?> tabindex="19" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="search" value="0"<?php if ($group['g_search'] == '0') echo ' checked="checked"' ?> tabindex="20" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  utiliser la fonction de recherche sur les forums.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Recherche d'utilisateur</th>
+									<td>
+										<input type="radio" name="search_users" value="1"<?php if ($group['g_search_users'] == '1') echo ' checked="checked"' ?> tabindex="21" />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="search_users" value="0"<?php if ($group['g_search_users'] == '0') echo ' checked="checked"' ?> tabindex="22" />&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs de ce groupe Ã  utiliser	un texte libre pour rechercher dans la liste des utilisateurs.</span>
 									</td>
 								</tr>
 <?php if ($group['g_id'] != PUN_GUEST): ?>								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Send e-mails label'] ?></th>
-									<td>
-										<input type="radio" name="send_email" value="1"<?php if ($group['g_send_email'] == '1') echo ' checked="checked"' ?> tabindex="33" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="send_email" value="0"<?php if ($group['g_send_email'] == '0') echo ' checked="checked"' ?> tabindex="34" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_groups['Send e-mails help'] ?></span>
-									</td>
-								</tr>
-<?php endif; ?>								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Post flood label'] ?></th>
-									<td>
-										<input type="text" name="post_flood" size="5" maxlength="4" value="<?php echo $group['g_post_flood'] ?>" tabindex="35" />
-										<span><?php echo $lang_admin_groups['Post flood help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Search flood label'] ?></th>
-									<td>
-										<input type="text" name="search_flood" size="5" maxlength="4" value="<?php echo $group['g_search_flood'] ?>" tabindex="36" />
-										<span><?php echo $lang_admin_groups['Search flood help'] ?></span>
-									</td>
-								</tr>
-<?php if ($group['g_id'] != PUN_GUEST): ?>								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['E-mail flood label'] ?></th>
-									<td>
-										<input type="text" name="email_flood" size="5" maxlength="4" value="<?php echo $group['g_email_flood'] ?>" tabindex="37" />
-										<span><?php echo $lang_admin_groups['E-mail flood help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Report flood label'] ?></th>
-									<td>
-										<input type="text" name="report_flood" size="5" maxlength="4" value="<?php echo $group['g_report_flood'] ?>" tabindex="38" />
-										<span><?php echo $lang_admin_groups['Report flood help'] ?></span>
-									</td>
-								</tr>
-<?php endif; endif; ?>							</table>
-<?php if ($group['g_moderator'] == '1' ): ?>							<p class="warntext"><?php echo $lang_admin_groups['Moderator info'] ?></p>
+									<th scope="row">Intervalle pour modifier le sujet d'une discussion</th>
+									<td>
+										<input type="text" name="edit_subjects_interval" size="5" maxlength="5" value="<?php echo $group['g_edit_subjects_interval'] ?>" tabindex="23" />
+										<span>Nombre de secondes aprÃšs que le message ait Ã©tÃ© envoyÃ© pendant lesquelles les utilisateurs de ce groupe pourront modifier le sujet d'une discussion qu'ils viennent de lancer. Mettre Ã  0 pour permettre la modification du sujet des discussions sans restriction dans le temps.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Intervalle de contrÃŽle de flood sur les messages</th>
+									<td>
+										<input type="text" name="post_flood" size="5" maxlength="4" value="<?php echo $group['g_post_flood'] ?>" tabindex="24" />
+										<span>Nombre de secondes pendant lesquelles les utilisateurs de ce groupe devront patienter entre deux messages. Mettre Ã  0 pour dÃ©sactiver le contrÃŽle de flood sur les messages.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Intervalle de contrÃŽle de flood sur les recherches</th>
+									<td>
+										<input type="text" name="search_flood" size="5" maxlength="4" value="<?php echo $group['g_search_flood'] ?>" tabindex="25" />
+										<span>Nombre de secondes pendant lesquelles les utilisateurs de ce groupe devront patienter entre deux recherches. Mettre Ã  0 pour dÃ©sactiver le contrÃŽle de flood sur les recherches.</span>
+									</td>
+								</tr>
+<?php endif; ?><?php endif; ?>							</table>
+<?php if ($group['g_id'] == PUN_MOD ): ?>							<p class="warntext">Pour qu'un utilisateur de ce groupe acquiÃšre les compÃ©tences de modÃ©rateur, il devra nÃ©cessairement Ãªtre dÃ©signÃ© comme modÃ©rateur d'un ou de plusieurs forums. Ceci est possible depuis la page d'administration du profil de l'utilisateur.</p>
 <?php endif; ?>						</div>
 					</fieldset>
 				</div>
-				<p class="submitend"><input type="submit" name="add_edit_group" value="<?php echo $lang_admin_common['Save'] ?>" tabindex="39" /></p>
+				<p class="submitend"><input type="submit" name="add_edit_group" value=" Enregistrer " tabindex="26" /></p>
 			</form>
 		</div>
@@ -250,13 +209,7 @@
 	$is_admin_group = (isset($_POST['group_id']) && $_POST['group_id'] == PUN_ADMIN) ? true : false;
 
-	$title = pun_trim($_POST['req_title']);
-	$user_title = pun_trim($_POST['user_title']);
-	$moderator = isset($_POST['moderator']) && $_POST['moderator'] == '1' ? '1' : '0';
-	$mod_edit_users = $moderator == '1' && isset($_POST['mod_edit_users']) && $_POST['mod_edit_users'] == '1' ? '1' : '0';
-	$mod_rename_users = $moderator == '1' && isset($_POST['mod_rename_users']) && $_POST['mod_rename_users'] == '1' ? '1' : '0';
-	$mod_change_passwords = $moderator == '1' && isset($_POST['mod_change_passwords']) && $_POST['mod_change_passwords'] == '1' ? '1' : '0';
-	$mod_ban_users = $moderator == '1' && isset($_POST['mod_ban_users']) && $_POST['mod_ban_users'] == '1' ? '1' : '0';
+	$title = trim($_POST['req_title']);
+	$user_title = trim($_POST['user_title']);
 	$read_board = isset($_POST['read_board']) ? intval($_POST['read_board']) : '1';
-	$view_users = (isset($_POST['view_users']) && $_POST['view_users'] == '1') || $is_admin_group ? '1' : '0';
 	$post_replies = isset($_POST['post_replies']) ? intval($_POST['post_replies']) : '1';
 	$post_topics = isset($_POST['post_topics']) ? intval($_POST['post_topics']) : '1';
@@ -267,12 +220,10 @@
 	$search = isset($_POST['search']) ? intval($_POST['search']) : '1';
 	$search_users = isset($_POST['search_users']) ? intval($_POST['search_users']) : '1';
-	$send_email = (isset($_POST['send_email']) && $_POST['send_email'] == '1') || $is_admin_group ? '1' : '0';
+	$edit_subjects_interval = isset($_POST['edit_subjects_interval']) ? intval($_POST['edit_subjects_interval']) : '0';
 	$post_flood = isset($_POST['post_flood']) ? intval($_POST['post_flood']) : '0';
 	$search_flood = isset($_POST['search_flood']) ? intval($_POST['search_flood']) : '0';
-	$email_flood = isset($_POST['email_flood']) ? intval($_POST['email_flood']) : '0';
-	$report_flood = isset($_POST['report_flood']) ? intval($_POST['report_flood']) : '0';
 
 	if ($title == '')
-		message($lang_admin_groups['Must enter title message']);
+		message('Vous devez saisir un nom de groupe.');
 
 	$user_title = ($user_title != '') ? '\''.$db->escape($user_title).'\'' : 'NULL';
@@ -280,36 +231,30 @@
 	if ($_POST['mode'] == 'add')
 	{
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'groups WHERE g_title=\''.$db->escape($title).'\'') or error('Unable to check group title collision', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT 1 FROM '.$db->prefix.'groups WHERE g_title=\''.$db->escape($title).'\'') or error('Impossible de vÃ©rifier si un groupe porte dÃ©jÃ  ce nom', __FILE__, __LINE__, $db->error());
 		if ($db->num_rows($result))
-			message(sprintf($lang_admin_groups['Title already exists message'], pun_htmlspecialchars($title)));
-
-		$db->query('INSERT INTO '.$db->prefix.'groups (g_title, g_user_title, g_moderator, g_mod_edit_users, g_mod_rename_users, g_mod_change_passwords, g_mod_ban_users, g_read_board, g_view_users, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_send_email, g_post_flood, g_search_flood, g_email_flood, g_report_flood) VALUES(\''.$db->escape($title).'\', '.$user_title.', '.$moderator.', '.$mod_edit_users.', '.$mod_rename_users.', '.$mod_change_passwords.', '.$mod_ban_users.', '.$read_board.', '.$view_users.', '.$post_replies.', '.$post_topics.', '.$edit_posts.', '.$delete_posts.', '.$delete_topics.', '.$set_title.', '.$search.', '.$search_users.', '.$send_email.', '.$post_flood.', '.$search_flood.', '.$email_flood.', '.$report_flood.')') or error('Unable to add group', __FILE__, __LINE__, $db->error());
+			message('Il existe dÃ©jÃ  un groupe nommÃ© \''.pun_htmlspecialchars($title).'\'.');
+
+		$db->query('INSERT INTO '.$db->prefix.'groups (g_title, g_user_title, g_read_board, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_edit_subjects_interval, g_post_flood, g_search_flood) VALUES(\''.$db->escape($title).'\', '.$user_title.', '.$read_board.', '.$post_replies.', '.$post_topics.', '.$edit_posts.', '.$delete_posts.', '.$delete_topics.', '.$set_title.', '.$search.', '.$search_users.', '.$edit_subjects_interval.', '.$post_flood.', '.$search_flood.')') or error('Impossible d\'ajouter le groupe', __FILE__, __LINE__, $db->error());
 		$new_group_id = $db->insert_id();
 
 		// Now lets copy the forum specific permissions from the group which this group is based on
-		$result = $db->query('SELECT forum_id, read_forum, post_replies, post_topics FROM '.$db->prefix.'forum_perms WHERE group_id='.intval($_POST['base_group'])) or error('Unable to fetch group forum permission list', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT forum_id, read_forum, post_replies, post_topics FROM '.$db->prefix.'forum_perms WHERE group_id='.intval($_POST['base_group'])) or error('Impossible de retrouver la liste des permissions de groupes du forum', __FILE__, __LINE__, $db->error());
 		while ($cur_forum_perm = $db->fetch_assoc($result))
-			$db->query('INSERT INTO '.$db->prefix.'forum_perms (group_id, forum_id, read_forum, post_replies, post_topics) VALUES('.$new_group_id.', '.$cur_forum_perm['forum_id'].', '.$cur_forum_perm['read_forum'].', '.$cur_forum_perm['post_replies'].', '.$cur_forum_perm['post_topics'].')') or error('Unable to insert group forum permissions', __FILE__, __LINE__, $db->error());
+			$db->query('INSERT INTO '.$db->prefix.'forum_perms (group_id, forum_id, read_forum, post_replies, post_topics) VALUES('.$new_group_id.', '.$cur_forum_perm['forum_id'].', '.$cur_forum_perm['read_forum'].', '.$cur_forum_perm['post_replies'].', '.$cur_forum_perm['post_topics'].')') or error('Impossible d\'insÃ©rer les permissions de groupes du forum', __FILE__, __LINE__, $db->error());
 	}
 	else
 	{
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'groups WHERE g_title=\''.$db->escape($title).'\' AND g_id!='.intval($_POST['group_id'])) or error('Unable to check group title collision', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT 1 FROM '.$db->prefix.'groups WHERE g_title=\''.$db->escape($title).'\' AND g_id!='.intval($_POST['group_id'])) or error('impossible de vÃ©rifier une Ã©ventuelle collision des titres de groupes', __FILE__, __LINE__, $db->error());
 		if ($db->num_rows($result))
-			message(sprintf($lang_admin_groups['Title already exists message'], pun_htmlspecialchars($title)));
-
-		$db->query('UPDATE '.$db->prefix.'groups SET g_title=\''.$db->escape($title).'\', g_user_title='.$user_title.', g_moderator='.$moderator.', g_mod_edit_users='.$mod_edit_users.', g_mod_rename_users='.$mod_rename_users.', g_mod_change_passwords='.$mod_change_passwords.', g_mod_ban_users='.$mod_ban_users.', g_read_board='.$read_board.', g_view_users='.$view_users.', g_post_replies='.$post_replies.', g_post_topics='.$post_topics.', g_edit_posts='.$edit_posts.', g_delete_posts='.$delete_posts.', g_delete_topics='.$delete_topics.', g_set_title='.$set_title.', g_search='.$search.', g_search_users='.$search_users.', g_send_email='.$send_email.', g_post_flood='.$post_flood.', g_search_flood='.$search_flood.', g_email_flood='.$email_flood.', g_report_flood='.$report_flood.' WHERE g_id='.intval($_POST['group_id'])) or error('Unable to update group', __FILE__, __LINE__, $db->error());
-	}
-
-	// Regenerate the quick jump cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
-	$group_id = $_POST['mode'] == 'add' ? $new_group_id : intval($_POST['group_id']);
-	generate_quickjump_cache($group_id);
-
-	if ($_POST['mode'] == 'edit')
-		redirect('admin_groups.php', $lang_admin_groups['Group edited redirect']);
-	else
-		redirect('admin_groups.php', $lang_admin_groups['Group added redirect']);
+			message('Il existe dÃ©jÃ  un groupe nommÃ© \''.pun_htmlspecialchars($title).'\'.');
+
+		$db->query('UPDATE '.$db->prefix.'groups SET g_title=\''.$db->escape($title).'\', g_user_title='.$user_title.', g_read_board='.$read_board.', g_post_replies='.$post_replies.', g_post_topics='.$post_topics.', g_edit_posts='.$edit_posts.', g_delete_posts='.$delete_posts.', g_delete_topics='.$delete_topics.', g_set_title='.$set_title.', g_search='.$search.', g_search_users='.$search_users.', g_edit_subjects_interval='.$edit_subjects_interval.', g_post_flood='.$post_flood.', g_search_flood='.$search_flood.' WHERE g_id='.intval($_POST['group_id'])) or error('Impossible de modifier le groupe', __FILE__, __LINE__, $db->error());
+	}
+
+	// Regenerate the quickjump cache
+	require_once PUN_ROOT.'include/cache.php';
+	generate_quickjump_cache();
+
+	redirect('admin_groups.php', 'Groupe '.(($_POST['mode'] == 'edit') ? 'modifiÃ©' : 'ajoutÃ©').'. Redirection ...');
 }
 
@@ -321,23 +266,14 @@
 
 	$group_id = intval($_POST['default_group']);
-
-	// Make sure it's not the admin or guest groups
-	if ($group_id == PUN_ADMIN || $group_id == PUN_GUEST)
+	if ($group_id < 1)
 		message($lang_common['Bad request']);
 
-	// Make sure it's not a moderator group
-	$result = $db->query('SELECT 1 FROM '.$db->prefix.'groups WHERE g_id='.$group_id.' AND g_moderator=0') or error('Unable to check group moderator status', __FILE__, __LINE__, $db->error());
-	if (!$db->num_rows($result))
-		message($lang_common['Bad request']);
-
-	$db->query('UPDATE '.$db->prefix.'config SET conf_value='.$group_id.' WHERE conf_name=\'o_default_user_group\'') or error('Unable to update board config', __FILE__, __LINE__, $db->error());
+	$db->query('UPDATE '.$db->prefix.'config SET conf_value='.$group_id.' WHERE conf_name=\'o_default_user_group\'') or error('Impossible de modifier la configuration des forums', __FILE__, __LINE__, $db->error());
 
 	// Regenerate the config cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_config_cache();
 
-	redirect('admin_groups.php', $lang_admin_groups['Default group redirect']);
+	redirect('admin_groups.php', 'Groupe par dÃ©faut rÃ©glÃ©. Redirection ...');
 }
 
@@ -348,5 +284,5 @@
 	confirm_referrer('admin_groups.php');
 
-	$group_id = isset($_POST['group_to_delete']) ? intval($_POST['group_to_delete']) : intval($_GET['del_group']);
+	$group_id = intval($_GET['del_group']);
 	if ($group_id < 5)
 		message($lang_common['Bad request']);
@@ -354,53 +290,69 @@
 	// Make sure we don't remove the default group
 	if ($group_id == $pun_config['o_default_user_group'])
-		message($lang_admin_groups['Cannot remove default message']);
+		message('Le groupe par dÃ©faut ne peut Ãªtre supprimÃ©. Vous devez d\'abord dÃ©finir un groupe par dÃ©faut diffÃ©rent.');
+
 
 	// Check if this group has any members
-	$result = $db->query('SELECT g.g_title, COUNT(u.id) FROM '.$db->prefix.'groups AS g INNER JOIN '.$db->prefix.'users AS u ON g.g_id=u.group_id WHERE g.g_id='.$group_id.' GROUP BY g.g_id, g_title') or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT g.g_title, COUNT(u.id) FROM '.$db->prefix.'groups AS g INNER JOIN '.$db->prefix.'users AS u ON g.g_id=u.group_id WHERE g.g_id='.$group_id.' GROUP BY g.g_id, g_title') or error('Impossible de retrouver les informations du groupe', __FILE__, __LINE__, $db->error());
 
 	// If the group doesn't have any members or if we've already selected a group to move the members to
 	if (!$db->num_rows($result) || isset($_POST['del_group']))
 	{
-		if (isset($_POST['del_group_comply']) || isset($_POST['del_group']))
+		if (isset($_POST['del_group']))
 		{
-			if (isset($_POST['del_group']))
-			{
-				$move_to_group = intval($_POST['move_to_group']);
-				$db->query('UPDATE '.$db->prefix.'users SET group_id='.$move_to_group.' WHERE group_id='.$group_id) or error('Unable to move users into group', __FILE__, __LINE__, $db->error());
-			}
-
-			// Delete the group and any forum specific permissions
-			$db->query('DELETE FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to delete group', __FILE__, __LINE__, $db->error());
-			$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE group_id='.$group_id) or error('Unable to delete group forum permissions', __FILE__, __LINE__, $db->error());
-
-			redirect('admin_groups.php', $lang_admin_groups['Group removed redirect']);
+			$move_to_group = intval($_POST['move_to_group']);
+			$db->query('UPDATE '.$db->prefix.'users SET group_id='.$move_to_group.' WHERE group_id='.$group_id) or error('Impossible de dÃ©placer les utilisateurs dans le groupe', __FILE__, __LINE__, $db->error());
 		}
+
+		// Delete the group and any forum specific permissions
+		$db->query('DELETE FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Impossible de supprimer le groupe', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'forum_perms WHERE group_id='.$group_id) or error('Impossible de supprimer les permissions de groupe du forum', __FILE__, __LINE__, $db->error());
+
+		// Regenerate the quickjump cache
+		require_once PUN_ROOT.'include/cache.php';
+		generate_quickjump_cache();
+
+		redirect('admin_groups.php', 'Groupe supprimÃ©. Redirection ...');
+	}
+
+
+	list($group_title, $group_members) = $db->fetch_row($result);
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Groupes';
+	require PUN_ROOT.'header.php';
+
+	generate_admin_menu('groups');
+
+?>
+	<div class="blockform">
+		<h2><span>Supprimer groupe</span></h2>
+		<div class="box">
+			<form id="groups" method="post" action="admin_groups.php?del_group=<?php echo $group_id ?>">
+				<div class="inform">
+					<fieldset>
+						<legend>DÃ©placer les utilisateur de ce groupe</legend>
+						<div class="infldset">
+							<p>Il y a actuellement <?php echo $group_members ?> membres dans le groupe "<?php echo pun_htmlspecialchars($group_title) ?>". Veuillez sÃ©lectionner un groupe dans lequel ces utilisateurs seront dÃ©placÃ©s.</p>
+							<label>DÃ©placer les utilisateurs dans
+							<select name="move_to_group">
+<?php
+
+	$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' AND g_id!='.$group_id.' ORDER BY g_title') or error('Impossible de retrouver la liste des groupes', __FILE__, __LINE__, $db->error());
+
+	while ($cur_group = $db->fetch_assoc($result))
+	{
+		if ($cur_group['g_id'] == PUN_MEMBER)	// Pre-select the pre-defined Members group
+			echo "\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'" selected="selected">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
 		else
-		{
-			$result = $db->query('SELECT g_title FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch group title', __FILE__, __LINE__, $db->error());
-			$group_title = $db->result($result);
-
-			$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['User groups']);
-			define('PUN_ACTIVE_PAGE', 'admin');
-			require PUN_ROOT.'header.php';
-
-			generate_admin_menu('groups');
-
-?>
-	<div class="blockform">
-		<h2><span><?php echo $lang_admin_groups['Group delete head'] ?></span></h2>
-		<div class="box">
-			<form method="post" action="admin_groups.php?del_group=<?php echo $group_id ?>">
-				<div class="inform">
-				<input type="hidden" name="group_to_delete" value="<?php echo $group_id ?>" />
-					<fieldset>
-						<legend><?php echo $lang_admin_groups['Confirm delete subhead'] ?></legend>
-						<div class="infldset">
-							<p><?php printf($lang_admin_groups['Confirm delete info'], pun_htmlspecialchars($group_title)) ?></p>
-							<p class="warntext"><?php echo $lang_admin_groups['Confirm delete warn'] ?></p>
+			echo "\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
+	}
+
+?>
+							</select>
+							</br></label>
 						</div>
 					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="del_group_comply" value="<?php echo $lang_admin_common['Delete'] ?>" tabindex="1" /><a href="javascript:history.go(-1)" tabindex="2"><?php echo $lang_admin_common['Go back'] ?></a></p>
+				<p><input type="submit" name="del_group" value=" Supprimer groupe " /></p>
 			</form>
 		</div>
@@ -410,81 +362,30 @@
 <?php
 
-			require PUN_ROOT.'footer.php';
-		}
-	}
-
-	list($group_title, $group_members) = $db->fetch_row($result);
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['User groups']);
-	define('PUN_ACTIVE_PAGE', 'admin');
-	require PUN_ROOT.'header.php';
-
-	generate_admin_menu('groups');
+	require PUN_ROOT.'footer.php';
+}
+
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Groupes';
+require PUN_ROOT.'header.php';
+
+generate_admin_menu('groups');
 
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_groups['Delete group head'] ?></span></h2>
+		<h2><span>Ajouter/rÃ©gler groupes</span></h2>
 		<div class="box">
-			<form id="groups" method="post" action="admin_groups.php?del_group=<?php echo $group_id ?>">
+			<form id="groups" method="post" action="admin_groups.php?action=foo">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_groups['Move users subhead'] ?></legend>
-						<div class="infldset">
-							<p><?php printf($lang_admin_groups['Move users info'], pun_htmlspecialchars($group_title), forum_number_format($group_members)) ?></p>
-							<label><?php echo $lang_admin_groups['Move users label'] ?>
-							<select name="move_to_group">
-<?php
-
-	$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' AND g_id!='.$group_id.' ORDER BY g_title') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
-
-	while ($cur_group = $db->fetch_assoc($result))
-	{
-		if ($cur_group['g_id'] == PUN_MEMBER) // Pre-select the pre-defined Members group
-			echo "\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'" selected="selected">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
-		else
-			echo "\t\t\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
-	}
-
-?>
-							</select>
-							<br /></label>
-						</div>
-					</fieldset>
-				</div>
-				<p class="buttons"><input type="submit" name="del_group" value="<?php echo $lang_admin_groups['Delete group'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_admin_common['Go back'] ?></a></p>
-			</form>
-		</div>
-	</div>
-	<div class="clearer"></div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-}
-
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['User groups']);
-define('PUN_ACTIVE_PAGE', 'admin');
-require PUN_ROOT.'header.php';
-
-generate_admin_menu('groups');
-
-?>
-	<div class="blockform">
-		<h2><span><?php echo $lang_admin_groups['Add groups head'] ?></span></h2>
-		<div class="box">
-			<form id="groups" method="post" action="admin_groups.php">
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_groups['Add group subhead'] ?></legend>
+						<legend>Ajouter un groupe</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['New group label'] ?><div><input type="submit" name="add_group" value="<?php echo $lang_admin_common['Add'] ?>" tabindex="2" /></div></th>
+									<th scope="row">Nouveau groupe basÃ© sur le groupe<div><input type="submit" name="add_group" value=" Ajouter " tabindex="2" /></div></th>
 									<td>
 										<select id="base_group" name="base_group" tabindex="1">
 <?php
 
-$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_ADMIN.' AND g_id!='.PUN_GUEST.' ORDER BY g_title') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id>'.PUN_GUEST.' ORDER BY g_title') or error('Impossible de retrouver la liste des groupes', __FILE__, __LINE__, $db->error());
 
 while ($cur_group = $db->fetch_assoc($result))
@@ -498,5 +399,5 @@
 ?>
 										</select>
-										<span><?php echo $lang_admin_groups['New group help'] ?></span>
+										<span>Choisissez un groupe d'utilisateurs duquel le nouveau groupe hÃ©ritera les propriÃ©tÃ©s. La page suivante vous permettra d'affiner ces rÃ©glages.</span>
 									</td>
 								</tr>
@@ -507,14 +408,14 @@
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_groups['Default group subhead'] ?></legend>
+						<legend>DÃ©finir le groupe par dÃ©faut</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_groups['Default group label'] ?><div><input type="submit" name="set_default_group" value="<?php echo $lang_admin_common['Save'] ?>" tabindex="4" /></div></th>
+									<th scope="row">Groupe par dÃ©faut<div><input type="submit" name="set_default_group" value=" Enregistrer " tabindex="4" /></div></th>
 									<td>
 										<select id="default_group" name="default_group" tabindex="3">
 <?php
 
-$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id>'.PUN_GUEST.' AND g_moderator=0 ORDER BY g_title') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id>'.PUN_GUEST.' ORDER BY g_title') or error('Impossible de retrouver la liste des groupes', __FILE__, __LINE__, $db->error());
 
 while ($cur_group = $db->fetch_assoc($result))
@@ -528,5 +429,5 @@
 ?>
 										</select>
-										<span><?php echo $lang_admin_groups['Default group help'] ?></span>
+										<span>Choisissez le groupe que vous voulez dÃ©finir par dÃ©faut. C'est Ã  dire le groupe oÃ¹ les utilisateurs seront placÃ©s quand ils s'inscriront. Pour des raisons de sÃ©curitÃ©, par dÃ©faut les utilisateurs ne peuvent Ãªtre mis ni dans le groupe modÃ©rateur ni dans le groupe administrateur.</span>
 									</td>
 								</tr>
@@ -538,21 +439,19 @@
 		</div>
 
-		<h2 class="block2"><span><?php echo $lang_admin_groups['Existing groups head'] ?></span></h2>
+		<h2 class="block2"><span>Groupes existants</span></h2>
 		<div class="box">
 			<div class="fakeform">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_groups['Edit groups subhead'] ?></legend>
+						<legend>Modifier/supprimer les groupes</legend>
 						<div class="infldset">
-							<p><?php echo $lang_admin_groups['Edit groups info'] ?></p>
+							<p>Les groupes prÃ©-dÃ©finis InvitÃ©s, Administrateurs, ModÃ©rateurs et Membres ne peuvent Ãªtre supprimÃ©s. Il peuvent par contre Ãªtre modifiÃ©s. Mais suivant le groupe certaines options ne sont pas disponibles (<abbr title="exemple">ex.</abbr> la permission <em>modifier messages</em> pour les invitÃ©s). Les Administrateurs ont toujours toutes les permisssions.</p>
 							<table cellspacing="0">
 <?php
 
-$cur_index = 5;
-
-$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups ORDER BY g_id') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups ORDER BY g_id') or error('Impossible de retrouver la liste des groupes', __FILE__, __LINE__, $db->error());
 
 while ($cur_group = $db->fetch_assoc($result))
-	echo "\t\t\t\t\t\t\t\t".'<tr><th scope="row"><a href="admin_groups.php?edit_group='.$cur_group['g_id'].'" tabindex="'.$cur_index++.'">'.$lang_admin_groups['Edit link'].'</a>'.(($cur_group['g_id'] > PUN_MEMBER) ? ' | <a href="admin_groups.php?del_group='.$cur_group['g_id'].'" tabindex="'.$cur_index++.'">'.$lang_admin_groups['Delete link'].'</a>' : '').'</th><td>'.pun_htmlspecialchars($cur_group['g_title']).'</td></tr>'."\n";
+	echo "\t\t\t\t\t\t\t\t".'<tr><th scope="row"><a href="admin_groups.php?edit_group='.$cur_group['g_id'].'">Modifier</a>'.(($cur_group['g_id'] > PUN_MEMBER) ? ' - <a href="admin_groups.php?del_group='.$cur_group['g_id'].'">Supprimer</a>' : '').'</th><td>'.pun_htmlspecialchars($cur_group['g_title']).'</td></tr>'."\n";
 
 ?>
Index: trunk/web/punbb/admin_index.php
===================================================================
--- trunk/web/punbb/admin_index.php	(revision 10)
+++ trunk/web/punbb/admin_index.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if (!$pun_user['is_admmod'])
+if ($pun_user['g_id'] > PUN_MOD)
 	message($lang_common['No permission']);
 
-// Load the admin_index.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_index.php';
 
 $action = isset($_GET['action']) ? $_GET['action'] : null;
@@ -27,14 +42,48 @@
 {
 	if (!ini_get('allow_url_fopen'))
-		message($lang_admin_index['fopen disabled message']);
-
-	$latest_version = trim(@file_get_contents('http://fluxbb.org/latest_version'));
-	if (empty($latest_version))
-		message($lang_admin_index['Upgrade check failed message']);
-
-	if (version_compare($pun_config['o_cur_version'], $latest_version, '>='))
-		message($lang_admin_index['Running latest version message']);
+		message('Impossible de vÃ©rifier les mises Ã  jour tant que \'allow_url_fopen\' est dÃ©sactivÃ© sur ce systÃšme.');
+
+	$fp = @fopen('http://www.punbb.org/latest_version', 'r');
+	$latest_version = trim(@fread($fp, 16));
+	@fclose($fp);
+
+	if ($latest_version == '')
+		message('La vÃ©rification de mise Ã  jour a Ã©chouÃ©e pour une raison inconnue.');
+
+	$cur_version = str_replace(array('.', 'dev', 'beta', ' '), '', strtolower($pun_config['o_cur_version']));
+	$cur_version = (strlen($cur_version) == 2) ? intval($cur_version) * 10 : intval($cur_version);
+
+	$latest_version = str_replace('.', '', strtolower($latest_version));
+	$latest_version = (strlen($latest_version) == 2) ? intval($latest_version) * 10 : intval($latest_version);
+
+	if ($cur_version >= $latest_version)
+		message('Vous utilisez la derniÃšre version de PunBB.');
 	else
-		message(sprintf($lang_admin_index['New version available message'], '<a href="http://fluxbb.org/">FluxBB.org</a>'));
+		message('Une nouvelle version de PunBB est sortie ! Vous pouvez tÃ©lÃ©charger cette derniÃšre version sur <a href="http://www.punbb.org/">PunBB.org</a>.');
+}
+
+// Check for french upgrade
+if ($action == 'check_upgrade_fr')
+{
+	if (!ini_get('allow_url_fopen'))
+		message('Impossible de vÃ©rifier les mises Ã  jour tant que \'allow_url_fopen\' est dÃ©sactivÃ© sur ce systÃšme.');
+
+	$fp = @fopen('http://www.punbb.fr/latest_version', 'r');
+	$latest_version = trim(@fread($fp, 16));
+	@fclose($fp);
+
+	if ($latest_version == '')
+		message('La vÃ©rification de mise Ã  jour a Ã©chouÃ©e pour une raison inconnue.');
+
+	$cur_version = str_replace(array('.', 'dev', 'beta', ' '), '', strtolower($pun_config['o_cur_version_fr']));
+	$cur_version = (strlen($cur_version) == 2) ? intval($cur_version) * 10 : intval($cur_version);
+
+	$latest_version = str_replace('.', '', strtolower($latest_version));
+	$latest_version = (strlen($latest_version) == 2) ? intval($latest_version) * 10 : intval($latest_version);
+
+	if ($cur_version >= $latest_version)
+		message('Vous utilisez la derniÃšre version de PunBB en franÃ§ais.');
+	else
+		message('Une nouvelle version de PunBB en franÃ§ais est sortie ! Vous pouvez tÃ©lÃ©charger cette derniÃšre version sur <a href="http://www.punbb.fr/">PunBB.fr</a>.');
 }
 
@@ -44,6 +93,6 @@
 {
 	// Is phpinfo() a disabled function?
-	if (strpos(strtolower((string) ini_get('disable_functions')), 'phpinfo') !== false)
-		message($lang_admin_index['PHPinfo disabled message']);
+	if (strpos(strtolower((string)@ini_get('disable_functions')), 'phpinfo') !== false)
+		message('La fonction phpinfo() de PHP est dÃ©sactivÃ©e sur ce serveur.');
 
 	phpinfo();
@@ -60,31 +109,39 @@
 	@fclose($fh);
 
-	if (($fh = @fopen('/proc/loadavg', 'r')))
-	{
-		$load_averages = fread($fh, 64);
-		fclose($fh);
-	}
-	else
-		$load_averages = '';
-
 	$load_averages = @explode(' ', $load_averages);
-	$server_load = isset($load_averages[2]) ? $load_averages[0].' '.$load_averages[1].' '.$load_averages[2] : $lang_admin_index['Not available'];
-}
-else if (!in_array(PHP_OS, array('WINNT', 'WIN32')) && preg_match('%averages?: ([0-9\.]+),?\s+([0-9\.]+),?\s+([0-9\.]+)%i', @exec('uptime'), $load_averages))
+	$server_load = isset($load_averages[2]) ? $load_averages[0].' '.$load_averages[1].' '.$load_averages[2] : 'Indisponible';
+}
+else if (!in_array(PHP_OS, array('WINNT', 'WIN32')) && preg_match('/averages?: ([0-9\.]+),[\s]+([0-9\.]+),[\s]+([0-9\.]+)/i', @exec('uptime'), $load_averages))
 	$server_load = $load_averages[1].' '.$load_averages[2].' '.$load_averages[3];
 else
-	$server_load = $lang_admin_index['Not available'];
+	$server_load = 'Indisponible';
 
 
 // Get number of current visitors
-$result = $db->query('SELECT COUNT(user_id) FROM '.$db->prefix.'online WHERE idle=0') or error('Unable to fetch online count', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT COUNT(user_id) FROM '.$db->prefix.'online WHERE idle=0') or error('Impossible de retrouver le total d\'utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 $num_online = $db->result($result);
 
 
+// Get the database system version
+switch ($db_type)
+{
+	case 'sqlite':
+		$db_version = 'SQLite '.sqlite_libversion();
+		break;
+
+	default:
+		$result = $db->query('SELECT VERSION()') or error('Impossible de retrouver les informations utilisateurs', __FILE__, __LINE__, $db->error());
+		$db_version = $db->result($result);
+		break;
+}
+
+
 // Collect some additional info about MySQL
-if ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-{
+if ($db_type == 'mysql' || $db_type == 'mysqli')
+{
+	$db_version = 'MySQL '.$db_version;
+
 	// Calculate total db size/row count
-	$result = $db->query('SHOW TABLE STATUS LIKE \''.$db->prefix.'%\'') or error('Unable to fetch table status', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SHOW TABLE STATUS FROM `'.$db_name.'`') or error('Impossible de retrouver le statut des tables', __FILE__, __LINE__, $db->error());
 
 	$total_records = $total_size = 0;
@@ -95,27 +152,23 @@
 	}
 
-	$total_size = file_size($total_size);
-}
-
-
-// Check for the existence of various PHP opcode caches/optimizers
+	$total_size = $total_size / 1024;
+
+	if ($total_size > 1024)
+		$total_size = round($total_size / 1024, 2).' MB';
+	else
+		$total_size = round($total_size, 2).' KB';
+}
+
+
+// See if MMCache or PHPA is loaded
 if (function_exists('mmcache'))
-	$php_accelerator = '<a href="http://'.$lang_admin_index['Turck MMCache link'].'">'.$lang_admin_index['Turck MMCache'].'</a>';
+	$php_accelerator = '<a href="http://turck-mmcache.sourceforge.net/">Turck MMCache</a>';
 else if (isset($_PHPA))
-	$php_accelerator = '<a href="http://'.$lang_admin_index['ionCube PHP Accelerator link'].'">'.$lang_admin_index['ionCube PHP Accelerator'].'</a>';
-else if (ini_get('apc.enabled'))
-	$php_accelerator ='<a href="http://'.$lang_admin_index['Alternative PHP Cache (APC) link'].'">'.$lang_admin_index['Alternative PHP Cache (APC)'].'</a>';
-else if (ini_get('zend_optimizer.optimization_level'))
-	$php_accelerator = '<a href="http://'.$lang_admin_index['Zend Optimizer link'].'">'.$lang_admin_index['Zend Optimizer'].'</a>';
-else if (ini_get('eaccelerator.enable'))
-	$php_accelerator = '<a href="http://'.$lang_admin_index['eAccelerator link'].'">'.$lang_admin_index['eAccelerator'].'</a>';
-else if (ini_get('xcache.cacher'))
-	$php_accelerator = '<a href="http://'.$lang_admin_index['XCache link'].'">'.$lang_admin_index['XCache'].'</a>';
+	$php_accelerator = '<a href="http://www.php-accelerator.co.uk/">ionCube PHP Accelerator</a>';
 else
-	$php_accelerator = $lang_admin_index['NA'];
-
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Index']);
-define('PUN_ACTIVE_PAGE', 'admin');
+	$php_accelerator = 'N/A';
+
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin';
 require PUN_ROOT.'header.php';
 
@@ -124,47 +177,47 @@
 ?>
 	<div class="block">
-		<h2><span><?php echo $lang_admin_index['Forum admin head'] ?></span></h2>
+		<h2>Administration Forum</h2>
 		<div id="adintro" class="box">
 			<div class="inbox">
-				<p><?php echo $lang_admin_index['Welcome to admin'] ?></p>
-				<ul>
-					<li><span><?php echo $lang_admin_index['Welcome 1'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 2'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 3'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 4'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 5'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 6'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 7'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 8'] ?></span></li>
-					<li><span><?php echo $lang_admin_index['Welcome 9'] ?></span></li>
-				</ul>
+				<p>Bienvenue sur le panneau de contrÃŽles de  PunBB. Depuis cet espace vous pouvez contrÃŽler les points essentiels de votre forum. Selon que vous Ãªtes un administrateur ou un modÃ©rateur vous pouvez&#160;:<br /><br />
+					&#160;- organiser les catÃ©gories et les forums.<br />
+					&#160;- rÃ©gler les principales options et prÃ©fÃ©rences.<br />
+					&#160;- contrÃŽler les permissions pour les utilisateurs et les visiteurs.<br />
+					&#160;- voir les statistiques des IP pour les utilisateurs.<br />
+					&#160;- bannir des utilisateurs.<br />
+					&#160;- censurer des mots.<br />
+					&#160;- rÃ©gler les rangs des utilisateurs.<br />
+					&#160;- Ã©laguer les anciens messages.<br />
+					&#160;- traiter les messages signalÃ©s.
+				</p>
 			</div>
 		</div>
 
-		<h2 class="block2"><span><?php echo $lang_admin_index['Statistics head'] ?></span></h2>
+		<h2 class="block2"><span>Statistiques</span></h2>
 		<div id="adstats" class="box">
 			<div class="inbox">
 				<dl>
-					<dt><?php echo $lang_admin_index['FluxBB version label'] ?></dt>
-					<dd>
-						<?php printf($lang_admin_index['FluxBB version data']."\n", $pun_config['o_cur_version'], '<a href="admin_index.php?action=check_upgrade">'.$lang_admin_index['Check for upgrade'].'</a>') ?>
+					<dt>PunBB version</dt>
+					<dd>
+						PunBB version franÃ§aise <?php echo $pun_config['o_cur_version_fr'] ?> basÃ©e sur PunBB <?php echo $pun_config['o_cur_version'] ?><br />
+						<a href="admin_index.php?action=check_upgrade">VÃ©rifier la version officielle</a> - <a href="admin_index.php?action=check_upgrade_fr">VÃ©rifier la version franÃ§aise</a> <br />
+						&copy; Copyright 2002, 2003, 2004, 2005 Rickard Andersson
 					</dd>
-					<dt><?php echo $lang_admin_index['Server load label'] ?></dt>
-					<dd>
-						<?php printf($lang_admin_index['Server load data']."\n", $server_load, $num_online) ?>
+					<dt>ExÃ©cution serveur</dt>
+					<dd>
+						<?php echo $server_load ?> (<?php echo $num_online ?> utilisateurs en ligne)
 					</dd>
-<?php if ($pun_user['g_id'] == PUN_ADMIN): ?>					<dt><?php echo $lang_admin_index['Environment label'] ?></dt>
-					<dd>
-						<?php printf($lang_admin_index['Environment data OS'], PHP_OS) ?><br />
-						<?php printf($lang_admin_index['Environment data version'], phpversion(), '<a href="admin_index.php?action=phpinfo">'.$lang_admin_index['Show info'].'</a>') ?><br />
-						<?php printf($lang_admin_index['Environment data acc']."\n", $php_accelerator) ?>
+<?php if ($pun_user['g_id'] == PUN_ADMIN): ?>					<dt>Environnement</dt>
+					<dd>
+						SystÃšme d'exploitation&#160;: <?php echo PHP_OS ?><br />
+						PHP&#160;: <?php echo phpversion() ?> - <a href="admin_index.php?action=phpinfo">Afficher infos</a><br />
+						AccÃ©lÃ©rateur PHP&#160;: <?php echo $php_accelerator."\n" ?>
 					</dd>
-					<dt><?php echo $lang_admin_index['Database label'] ?></dt>
-					<dd>
-						<?php echo implode(' ', $db->get_version())."\n" ?>
-<?php if (isset($total_records) && isset($total_size)): ?>						<br /><?php printf($lang_admin_index['Database data rows']."\n", forum_number_format($total_records)) ?>
-						<br /><?php printf($lang_admin_index['Database data size']."\n", $total_size) ?>
-<?php endif; ?>					</dd>
-<?php endif; ?>
+					<dt>Base de donnÃ©es</dt>
+					<dd>
+						<?php echo $db_version."\n" ?>
+<?php if (isset($total_records) && isset($total_size)): ?>						<br />Lignes&#160;: <?php echo $total_records."\n" ?>
+						<br />Taille&#160;: <?php echo $total_size."\n" ?>
+<?php endif; endif; ?>					</dd>
 				</dl>
 			</div>
Index: trunk/web/punbb/admin_loader.php
===================================================================
--- trunk/web/punbb/admin_loader.php	(revision 10)
+++ trunk/web/punbb/admin_loader.php	(revision 1)
@@ -1,34 +1,52 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if (!$pun_user['is_admmod'])
+if ($pun_user['g_id'] > PUN_MOD)
 	message($lang_common['No permission']);
+
 
 // The plugin to load should be supplied via GET
 $plugin = isset($_GET['plugin']) ? $_GET['plugin'] : '';
-if (!preg_match('%^AM?P_(\w*?)\.php$%i', $plugin))
+if (!preg_match('/^AM?P_(\w*?)\.php$/i', $plugin))
 	message($lang_common['Bad request']);
 
 // AP_ == Admins only, AMP_ == admins and moderators
 $prefix = substr($plugin, 0, strpos($plugin, '_'));
-if ($pun_user['g_moderator'] == '1' && $prefix == 'AP')
+if ($pun_user['g_id'] == PUN_MOD && $prefix == 'AP')
 	message($lang_common['No permission']);
 
 // Make sure the file actually exists
 if (!file_exists(PUN_ROOT.'plugins/'.$plugin))
-	message(sprintf($lang_admin_common['No plugin message'], $plugin));
+	message('Il n\'y a pas de plugin nommÃ© \''.$plugin.'\' dans le rÃ©pertoire de plugin.');
 
 // Construct REQUEST_URI if it isn't set
@@ -36,14 +54,13 @@
 	$_SERVER['REQUEST_URI'] = (isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : '').'?'.(isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : '');
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Admin'], str_replace('_', ' ', substr($plugin, strpos($plugin, '_') + 1, -4)));
-define('PUN_ACTIVE_PAGE', 'admin');
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / '.$plugin;
 require PUN_ROOT.'header.php';
 
 // Attempt to load the plugin. We don't use @ here to supress error messages,
 // because if we did and a parse error occurred in the plugin, we would only
-// get the "blank page of death"
+// get the "blank page of death".
 include PUN_ROOT.'plugins/'.$plugin;
 if (!defined('PUN_PLUGIN_LOADED'))
-	message(sprintf($lang_admin_common['Plugin failed message'], $plugin));
+	message('Le chargement du plugin \''.$plugin.'\' a Ã©chouÃ©.');
 
 // Output the clearer div
Index: trunk/web/punbb/admin_maintenance.php
===================================================================
--- trunk/web/punbb/admin_maintenance.php	(revision 10)
+++ trunk/web/punbb/admin_maintenance.php	(revision 1)
@@ -1,9 +1,27 @@
 <?php
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
@@ -12,25 +30,18 @@
 define('PUN_DISABLE_BUFFERING', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
-
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_maintenance.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_maintenance.php';
+if (isset($_GET['i_per_page']) && isset($_GET['i_start_at']))
+{
 
-$action = isset($_REQUEST['action']) ? trim($_REQUEST['action']) : '';
-
-if ($action == 'rebuild')
-{
-	$per_page = isset($_GET['i_per_page']) ? intval($_GET['i_per_page']) : 0;
-	$start_at = isset($_GET['i_start_at']) ? intval($_GET['i_start_at']) : 0;
-
-	// Check per page is > 0
-	if ($per_page < 1)
-		message($lang_admin_maintenance['Posts must be integer message']);
+	$per_page = intval($_GET['i_per_page']);
+	$start_at = intval($_GET['i_start_at']);
+	if ($per_page < 1 || $start_at < 1)
+		message($lang_common['Bad request']);
 
 	@set_time_limit(0);
@@ -42,6 +53,7 @@
 		confirm_referrer('admin_maintenance.php');
 
-		$db->truncate_table('search_matches') or error('Unable to empty search index match table', __FILE__, __LINE__, $db->error());
-		$db->truncate_table('search_words') or error('Unable to empty search index words table', __FILE__, __LINE__, $db->error());
+		$truncate_sql = ($db_type != 'sqlite') ? 'TRUNCATE TABLE ' : 'DELETE FROM ';
+		$db->query($truncate_sql.$db->prefix.'search_matches') or error('Impossible de vider la table search index match', __FILE__, __LINE__, $db->error());
+		$db->query($truncate_sql.$db->prefix.'search_words') or error('Impossible de vider la table search index words', __FILE__, __LINE__, $db->error());
 
 		// Reset the sequence for the search words (not needed for SQLite)
@@ -50,15 +62,13 @@
 			case 'mysql':
 			case 'mysqli':
-			case 'mysql_innodb':
-			case 'mysqli_innodb':
-				$result = $db->query('ALTER TABLE '.$db->prefix.'search_words auto_increment=1') or error('Unable to update table auto_increment', __FILE__, __LINE__, $db->error());
+				$result = $db->query('ALTER TABLE '.$db->prefix.'search_words auto_increment=1') or error('Impossible de modifier l\'auto-incrÃ©mentation', __FILE__, __LINE__, $db->error());
 				break;
 
 			case 'pgsql';
-				$result = $db->query('SELECT setval(\''.$db->prefix.'search_words_id_seq\', 1, false)') or error('Unable to update sequence', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT setval(\'search_words_id_seq\', 1, false)') or error('Impossible de modifier la sÃ©quence', __FILE__, __LINE__, $db->error());
 		}
 	}
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_maintenance['Rebuilding search index']);
+	$end_at = $start_at + $per_page;
 
 ?>
@@ -67,16 +77,11 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo generate_page_title($page_title) ?></title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title><?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?> / Reconstruction des index de recherches ...</title>
 <style type="text/css">
 body {
-	font: 12px Verdana, Arial, Helvetica, sans-serif;
+	font: 10px Verdana, Arial, Helvetica, sans-serif;
 	color: #333333;
 	background-color: #FFFFFF
-}
-
-h1 {
-	font-size: 16px;
-	font-weight: normal;
 }
 </style>
@@ -84,168 +89,51 @@
 <body>
 
-<h1><?php echo $lang_admin_maintenance['Rebuilding index info'] ?></h1>
-<hr />
+Reconstruction des index ... C'est peut Ãªtre le bon moment pour aller prendre un cafÃ© :-)<br /><br />
 
 <?php
 
-	$query_str = '';
-
 	require PUN_ROOT.'include/search_idx.php';
 
-	// Fetch posts to process this cycle
-	$result = $db->query('SELECT p.id, p.message, t.subject, t.first_post_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE p.id >= '.$start_at.' ORDER BY p.id ASC LIMIT '.$per_page) or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
+	// Fetch posts to process
+	$result = $db->query('SELECT DISTINCT t.id, p.id, p.message FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id WHERE t.id>='.$start_at.' AND t.id<'.$end_at.' ORDER BY t.id') or error('Impossible de retrouver les informations des discussions et des messages', __FILE__, __LINE__, $db->error());
 
-	$end_at = 0;
-	while ($cur_item = $db->fetch_assoc($result))
+	$cur_topic = 0;
+	while ($cur_post = $db->fetch_row($result))
 	{
-		echo '<p><span>'.sprintf($lang_admin_maintenance['Processing post'], $cur_item['id']).'</span></p>'."\n";
+		if ($cur_post[0] <> $cur_topic)
+		{
+			// Fetch subject and ID of first post in topic
+			$result2 = $db->query('SELECT p.id, t.subject, MIN(p.posted) AS first FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE t.id='.$cur_post[0].' GROUP BY p.id, t.subject ORDER BY first LIMIT 1') or error('Impossible de retrouver les informations des discussions', __FILE__, __LINE__, $db->error());
+			list($first_post, $subject) = $db->fetch_row($result2);
 
-		if ($cur_item['id'] == $cur_item['first_post_id'])
-			update_search_index('post', $cur_item['id'], $cur_item['message'], $cur_item['subject']);
+			$cur_topic = $cur_post[0];
+		}
+
+		echo 'Traitement du message <strong>'.$cur_post[1].'</strong> de la discussion <strong>'.$cur_post[0].'</strong><br />'."\n";
+
+		if ($cur_post[1] == $first_post)	// This is the "topic post" so we have to index the subject as well
+			update_search_index('post', $cur_post[1], $cur_post[2], $subject);
 		else
-			update_search_index('post', $cur_item['id'], $cur_item['message']);
-
-		$end_at = $cur_item['id'];
+			update_search_index('post', $cur_post[1], $cur_post[2]);
 	}
 
 	// Check if there is more work to do
-	if ($end_at > 0)
-	{
-		$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE id > '.$end_at.' ORDER BY id ASC LIMIT 1') or error('Unable to fetch next ID', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE id>'.$end_at) or error('Impossible de retrouver les informations de discussions', __FILE__, __LINE__, $db->error());
 
-		if ($db->num_rows($result) > 0)
-			$query_str = '?action=rebuild&i_per_page='.$per_page.'&i_start_at='.$db->result($result);
-	}
+	$query_str = ($db->num_rows($result)) ? '?i_per_page='.$per_page.'&i_start_at='.$end_at : '';
 
 	$db->end_transaction();
 	$db->close();
 
-	exit('<script type="text/javascript">window.location="admin_maintenance.php'.$query_str.'"</script><hr /><p>'.sprintf($lang_admin_maintenance['Javascript redirect failed'], '<a href="admin_maintenance.php'.$query_str.'">'.$lang_admin_maintenance['Click here'].'</a>').'</p>');
-}
-
-if ($action == 'prune')
-{
-	$prune_from = trim($_POST['prune_from']);
-	$prune_sticky = intval($_POST['prune_sticky']);
-
-	if (isset($_POST['prune_comply']))
-	{
-		confirm_referrer('admin_maintenance.php');
-
-		$prune_days = intval($_POST['prune_days']);
-		$prune_date = ($prune_days) ? time() - ($prune_days * 86400) : -1;
-
-		@set_time_limit(0);
-
-		if ($prune_from == 'all')
-		{
-			$result = $db->query('SELECT id FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
-			$num_forums = $db->num_rows($result);
-
-			for ($i = 0; $i < $num_forums; ++$i)
-			{
-				$fid = $db->result($result, $i);
-
-				prune($fid, $prune_sticky, $prune_date);
-				update_forum($fid);
-			}
-		}
-		else
-		{
-			$prune_from = intval($prune_from);
-			prune($prune_from, $prune_sticky, $prune_date);
-			update_forum($prune_from);
-		}
-
-		// Locate any "orphaned redirect topics" and delete them
-		$result = $db->query('SELECT t1.id FROM '.$db->prefix.'topics AS t1 LEFT JOIN '.$db->prefix.'topics AS t2 ON t1.moved_to=t2.id WHERE t2.id IS NULL AND t1.moved_to IS NOT NULL') or error('Unable to fetch redirect topics', __FILE__, __LINE__, $db->error());
-		$num_orphans = $db->num_rows($result);
-
-		if ($num_orphans)
-		{
-			for ($i = 0; $i < $num_orphans; ++$i)
-				$orphans[] = $db->result($result, $i);
-
-			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $orphans).')') or error('Unable to delete redirect topics', __FILE__, __LINE__, $db->error());
-		}
-
-		redirect('admin_maintenance.php', $lang_admin_maintenance['Posts pruned redirect']);
-	}
-
-	$prune_days = trim($_POST['req_prune_days']);
-	if ($prune_days == '' || preg_match('%[^0-9]%', $prune_days))
-		message($lang_admin_maintenance['Days must be integer message']);
-
-	$prune_date = time() - ($prune_days * 86400);
-
-	// Concatenate together the query for counting number of topics to prune
-	$sql = 'SELECT COUNT(id) FROM '.$db->prefix.'topics WHERE last_post<'.$prune_date.' AND moved_to IS NULL';
-
-	if ($prune_sticky == '0')
-		$sql .= ' AND sticky=0';
-
-	if ($prune_from != 'all')
-	{
-		$prune_from = intval($prune_from);
-		$sql .= ' AND forum_id='.$prune_from;
-
-		// Fetch the forum name (just for cosmetic reasons)
-		$result = $db->query('SELECT forum_name FROM '.$db->prefix.'forums WHERE id='.$prune_from) or error('Unable to fetch forum name', __FILE__, __LINE__, $db->error());
-		$forum = '"'.pun_htmlspecialchars($db->result($result)).'"';
-	}
-	else
-		$forum = $lang_admin_maintenance['All forums'];
-
-	$result = $db->query($sql) or error('Unable to fetch topic prune count', __FILE__, __LINE__, $db->error());
-	$num_topics = $db->result($result);
-
-	if (!$num_topics)
-		message(sprintf($lang_admin_maintenance['No old topics message'], $prune_days));
-
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Prune']);
-	define('PUN_ACTIVE_PAGE', 'admin');
-	require PUN_ROOT.'header.php';
-
-	generate_admin_menu('maintenance');
-
-?>
-	<div class="blockform">
-		<h2><span><?php echo $lang_admin_maintenance['Prune head'] ?></span></h2>
-		<div class="box">
-			<form method="post" action="admin_maintenance.php">
-				<div class="inform">
-					<input type="hidden" name="action" value="prune" />
-					<input type="hidden" name="prune_days" value="<?php echo $prune_days ?>" />
-					<input type="hidden" name="prune_sticky" value="<?php echo $prune_sticky ?>" />
-					<input type="hidden" name="prune_from" value="<?php echo $prune_from ?>" />
-					<fieldset>
-						<legend><?php echo $lang_admin_maintenance['Confirm prune subhead'] ?></legend>
-						<div class="infldset">
-							<p><?php printf($lang_admin_maintenance['Confirm prune info'], $prune_days, $forum, forum_number_format($num_topics)) ?></p>
-							<p class="warntext"><?php echo $lang_admin_maintenance['Confirm prune warn'] ?></p>
-						</div>
-					</fieldset>
-				</div>
-				<p class="buttons"><input type="submit" name="prune_comply" value="<?php echo $lang_admin_common['Prune'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_admin_common['Go back'] ?></a></p>
-			</form>
-		</div>
-	</div>
-	<div class="clearer"></div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-	exit;
+	exit('<script type="text/javascript">window.location="admin_maintenance.php'.$query_str.'"</script><br />La redirection javaScript a Ã©chouÃ©e. <a href="admin_maintenance.php'.$query_str.'">Cliquez ici</a> pour continuer.');
 }
 
 
 // Get the first post ID from the db
-$result = $db->query('SELECT id FROM '.$db->prefix.'posts ORDER BY id ASC LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT id FROM '.$db->prefix.'topics ORDER BY id LIMIT 1') or error('Impossible de retrouver les informations de discussions', __FILE__, __LINE__, $db->error());
 if ($db->num_rows($result))
 	$first_id = $db->result($result);
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Maintenance']);
-define('PUN_ACTIVE_PAGE', 'admin');
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Maintenance';
 require PUN_ROOT.'header.php';
 
@@ -254,96 +142,36 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_maintenance['Maintenance head'] ?></span></h2>
+		<h2><span>Maintenance des Forums</span></h2>
 		<div class="box">
 			<form method="get" action="admin_maintenance.php">
 				<div class="inform">
-					<input type="hidden" name="action" value="rebuild" />
 					<fieldset>
-						<legend><?php echo $lang_admin_maintenance['Rebuild index subhead'] ?></legend>
+						<legend>Reconstruction des index de recherches</legend>
 						<div class="infldset">
-							<p><?php printf($lang_admin_maintenance['Rebuild index info'], '<a href="admin_options.php#maintenance">'.$lang_admin_common['Maintenance mode'].'</a>') ?></p>
+							<p>Si vous avez ajoutÃ©, modifiÃ© ou supprimÃ© manuellement des messages dans la base de donnÃ©es ou si vous avez des problÃšmes avec la  recherche vous devriez reconstruire les index de recherche (supprime les mots inutiles). Pour de meilleures performances, pendant la reconstruction des index, vous devriez mettre vos forums en mode maintenance. <strong>La reconstruction des index de recherches peut prendre beaucoup de temps et augmenter considÃ©rablement la charge serveur au cours du processus de reconstruction&#160;!</strong></p>
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_maintenance['Posts per cycle label'] ?></th>
+									<th scope="row">Discussions par cycle</th>
 									<td>
-										<input type="text" name="i_per_page" size="7" maxlength="7" value="300" tabindex="1" />
-										<span><?php echo $lang_admin_maintenance['Posts per cycle help'] ?></span>
+										<input type="text" name="i_per_page" size="7" maxlength="7" value="100" tabindex="1" />
+										<span>Le nombre de discussions Ã  traiter par cycle. Si vous saisissez 100, une centaine de discussions sera traitÃ©e et ensuite la page sera actualisÃ©e. Cela permet d'Ã©viter que le script n'atteigne le temps limite d'exÃ©cution pendant le processus de recontruction.</span>
 									</td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_maintenance['Starting post label'] ?></th>
+									<th scope="row">ID de la discussion de dÃ©part</th>
 									<td>
 										<input type="text" name="i_start_at" size="7" maxlength="7" value="<?php echo (isset($first_id)) ? $first_id : 0 ?>" tabindex="2" />
-										<span><?php echo $lang_admin_maintenance['Starting post help'] ?></span>
+										<span>L'ID de discussion de laquelle vous souhaitez lancer la reconstruction. La valeur par dÃ©faut est le premier ID diponible dans la base de donnÃ©es. Normalement vous ne devriez pas avoir Ã  changer ceci.</span>
 									</td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_maintenance['Empty index label'] ?></th>
+									<th scope="row">Vider index</th>
 									<td class="inputadmin">
-										<span><input type="checkbox" name="i_empty_index" value="1" tabindex="3" checked="checked" />&#160;&#160;<?php echo $lang_admin_maintenance['Empty index help'] ?></span>
+										<span><input type="checkbox" name="i_empty_index" value="1" tabindex="3" checked="checked" />&#160;&#160;Cochez cette option si vous souhaitez que les index de recherches soient vidÃ©s avant la reconstruction (voir ci-dessous).</span>
 									</td>
 								</tr>
 							</table>
-							<p class="topspace"><?php echo $lang_admin_maintenance['Rebuild completed info'] ?></p>
-							<div class="fsetsubmit"><input type="submit" name="rebuild_index" value="<?php echo $lang_admin_maintenance['Rebuild index'] ?>" tabindex="4" /></div>
-						</div>
-					</fieldset>
-				</div>
-			</form>
-
-			<form method="post" action="admin_maintenance.php" onsubmit="return process_form(this)">
-				<div class="inform">
-					<input type="hidden" name="action" value="prune" />
-					<fieldset>
-						<legend><?php echo $lang_admin_maintenance['Prune subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_maintenance['Days old label'] ?></th>
-									<td>
-										<input type="text" name="req_prune_days" size="3" maxlength="3" tabindex="5" />
-										<span><?php echo $lang_admin_maintenance['Days old help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_maintenance['Prune sticky label'] ?></th>
-									<td>
-										<input type="radio" name="prune_sticky" value="1" tabindex="6" checked="checked" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="prune_sticky" value="0" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_maintenance['Prune sticky help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_maintenance['Prune from label'] ?></th>
-									<td>
-										<select name="prune_from" tabindex="7">
-											<option value="all"><?php echo $lang_admin_maintenance['All forums'] ?></option>
-<?php
-
-	$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id WHERE f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
-
-	$cur_category = 0;
-	while ($forum = $db->fetch_assoc($result))
-	{
-		if ($forum['cid'] != $cur_category) // Are we still in the same category?
-		{
-			if ($cur_category)
-				echo "\t\t\t\t\t\t\t\t\t\t\t".'</optgroup>'."\n";
-
-			echo "\t\t\t\t\t\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($forum['cat_name']).'">'."\n";
-			$cur_category = $forum['cid'];
-		}
-
-		echo "\t\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$forum['fid'].'">'.pun_htmlspecialchars($forum['forum_name']).'</option>'."\n";
-	}
-
-?>
-											</optgroup>
-										</select>
-										<span><?php echo $lang_admin_maintenance['Prune from help'] ?></span>
-									</td>
-								</tr>
-							</table>
-							<p class="topspace"><?php printf($lang_admin_maintenance['Prune info'], '<a href="admin_options.php#maintenance">'.$lang_admin_common['Maintenance mode'].'</a>') ?></p>
-							<div class="fsetsubmit"><input type="submit" name="prune" value="<?php echo $lang_admin_common['Prune'] ?>" tabindex="8" /></div>
+							<p class="topspace">Lorsque le processus sera terminÃ© vous serez redirigÃ© sur cette page. Il est fortement recommandÃ© que Javascript soit activÃ© sur votre navigateur pour effectuer la reconstruction (pour une redirection automatique lorsqu'un cycle est achevÃ©). Si vous Ãªtes obligÃ© d'abandonner le processus de reconstruction, notez l'ID du dernier sujet traitÃ© et saisissez cet ID+1 dans le champ "ID de la discussion de dÃ©part" quand/si vous reprennez le processus  ("Vider index" ne doit pas Ãªtre cochÃ©).</p>
+							<div class="fsetsubmit"><input type="submit" name="rebuild_index" value=" Reconstruire index " tabindex="4" /></div>
 						</div>
 					</fieldset>
Index: trunk/web/punbb/admin_options.php
===================================================================
--- trunk/web/punbb/admin_options.php	(revision 10)
+++ trunk/web/punbb/admin_options.php	(revision 1)
@@ -1,93 +1,62 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_options.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_options.php';
 
 if (isset($_POST['form_sent']))
 {
-	confirm_referrer('admin_options.php', $lang_admin_options['Bad HTTP Referer message']);
-
-	$form = array(
-		'board_title'			=> pun_trim($_POST['form']['board_title']),
-		'board_desc'			=> pun_trim($_POST['form']['board_desc']),
-		'base_url'				=> pun_trim($_POST['form']['base_url']),
-		'default_timezone'		=> floatval($_POST['form']['default_timezone']),
-		'default_dst'			=> $_POST['form']['default_dst'] != '1' ? '0' : '1',
-		'default_lang'			=> pun_trim($_POST['form']['default_lang']),
-		'default_style'			=> pun_trim($_POST['form']['default_style']),
-		'time_format'			=> pun_trim($_POST['form']['time_format']),
-		'date_format'			=> pun_trim($_POST['form']['date_format']),
-		'timeout_visit'			=> intval($_POST['form']['timeout_visit']),
-		'timeout_online'		=> intval($_POST['form']['timeout_online']),
-		'redirect_delay'		=> intval($_POST['form']['redirect_delay']),
-		'show_version'			=> $_POST['form']['show_version'] != '1' ? '0' : '1',
-		'show_user_info'		=> $_POST['form']['show_user_info'] != '1' ? '0' : '1',
-		'show_post_count'		=> $_POST['form']['show_post_count'] != '1' ? '0' : '1',
-		'smilies'				=> $_POST['form']['smilies'] != '1' ? '0' : '1',
-		'smilies_sig'			=> $_POST['form']['smilies_sig'] != '1' ? '0' : '1',
-		'make_links'			=> $_POST['form']['make_links'] != '1' ? '0' : '1',
-		'topic_review'			=> intval($_POST['form']['topic_review']),
-		'disp_topics_default'	=> intval($_POST['form']['disp_topics_default']),
-		'disp_posts_default'	=> intval($_POST['form']['disp_posts_default']),
-		'indent_num_spaces'		=> intval($_POST['form']['indent_num_spaces']),
-		'quote_depth'			=> intval($_POST['form']['quote_depth']),
-		'quickpost'				=> $_POST['form']['quickpost'] != '1' ? '0' : '1',
-		'users_online'			=> $_POST['form']['users_online'] != '1' ? '0' : '1',
-		'censoring'				=> $_POST['form']['censoring'] != '1' ? '0' : '1',
-		'signatures'			=> $_POST['form']['signatures'] != '1' ? '0' : '1',
-		'ranks'					=> $_POST['form']['ranks'] != '1' ? '0' : '1',
-		'show_dot'				=> $_POST['form']['show_dot'] != '1' ? '0' : '1',
-		'topic_views'			=> $_POST['form']['topic_views'] != '1' ? '0' : '1',
-		'quickjump'				=> $_POST['form']['quickjump'] != '1' ? '0' : '1',
-		'gzip'					=> $_POST['form']['gzip'] != '1' ? '0' : '1',
-		'search_all_forums'		=> $_POST['form']['search_all_forums'] != '1' ? '0' : '1',
-		'additional_navlinks'	=> pun_trim($_POST['form']['additional_navlinks']),
-		'feed_type'				=> intval($_POST['form']['feed_type']),
-		'feed_ttl'				=> intval($_POST['form']['feed_ttl']),
-		'report_method'			=> intval($_POST['form']['report_method']),
-		'mailing_list'			=> pun_trim($_POST['form']['mailing_list']),
-		'avatars'				=> $_POST['form']['avatars'] != '1' ? '0' : '1',
-		'avatars_dir'			=> pun_trim($_POST['form']['avatars_dir']),
-		'avatars_width'			=> intval($_POST['form']['avatars_width']),
-		'avatars_height'		=> intval($_POST['form']['avatars_height']),
-		'avatars_size'			=> intval($_POST['form']['avatars_size']),
-		'admin_email'			=> strtolower(pun_trim($_POST['form']['admin_email'])),
-		'webmaster_email'		=> strtolower(pun_trim($_POST['form']['webmaster_email'])),
-		'forum_subscriptions'	=> $_POST['form']['forum_subscriptions'] != '1' ? '0' : '1',
-		'topic_subscriptions'	=> $_POST['form']['topic_subscriptions'] != '1' ? '0' : '1',
-		'smtp_host'				=> pun_trim($_POST['form']['smtp_host']),
-		'smtp_user'				=> pun_trim($_POST['form']['smtp_user']),
-		'smtp_ssl'				=> $_POST['form']['smtp_ssl'] != '1' ? '0' : '1',
-		'regs_allow'			=> $_POST['form']['regs_allow'] != '1' ? '0' : '1',
-		'regs_verify'			=> $_POST['form']['regs_verify'] != '1' ? '0' : '1',
-		'regs_report'			=> $_POST['form']['regs_report'] != '1' ? '0' : '1',
-		'rules'					=> $_POST['form']['rules'] != '1' ? '0' : '1',
-		'rules_message'			=> pun_trim($_POST['form']['rules_message']),
-		'default_email_setting'	=> intval($_POST['form']['default_email_setting']),
-		'announcement'			=> $_POST['form']['announcement'] != '1' ? '0' : '1',
-		'announcement_message'	=> pun_trim($_POST['form']['announcement_message']),
-		'maintenance'			=> $_POST['form']['maintenance'] != '1' ? '0' : '1',
-		'maintenance_message'	=> pun_trim($_POST['form']['maintenance_message']),
-	);
+	// Lazy referer check (in case base_url isn't correct)
+	if (!isset($_SERVER['HTTP_REFERER']) || !preg_match('#/admin_options\.php#i', $_SERVER['HTTP_REFERER']))
+		message($lang_common['Bad referrer']);
+
+	$form = array_map('trim', $_POST['form']);
 
 	if ($form['board_title'] == '')
-		message($lang_admin_options['Must enter title message']);
+		message('Vous devez saisir un titre pour vos forums.');
+
+	require PUN_ROOT.'include/email.php';
+
+	$form['admin_email'] = strtolower($form['admin_email']);
+	if (!is_valid_email($form['admin_email']))
+		message('L\'adresse email administrateur que vous avez saisi est incorrecte.');
+
+	$form['webmaster_email'] = strtolower($form['webmaster_email']);
+	if (!is_valid_email($form['webmaster_email']))
+		message('L\'adresse email webmaster que vous avez saisi est incorrecte.');
+
+	if ($form['mailing_list'] != '')
+		$form['mailing_list'] = strtolower(preg_replace('/[\s]/', '', $form['mailing_list']));
 
 	// Make sure base_url doesn't end with a slash
@@ -95,30 +64,4 @@
 		$form['base_url'] = substr($form['base_url'], 0, -1);
 
-	$languages = forum_list_langs();
-	if (!in_array($form['default_lang'], $languages))
-		message($lang_common['Bad request']);
-
-	$styles = forum_list_styles();
-	if (!in_array($form['default_style'], $styles))
-		message($lang_common['Bad request']);
-
-	if ($form['time_format'] == '')
-		$form['time_format'] = 'H:i:s';
-
-	if ($form['date_format'] == '')
-		$form['date_format'] = 'Y-m-d';
-
-
-	require PUN_ROOT.'include/email.php';
-
-	if (!is_valid_email($form['admin_email']))
-		message($lang_admin_options['Invalid e-mail message']);
-
-	if (!is_valid_email($form['webmaster_email']))
-		message($lang_admin_options['Invalid webmaster e-mail message']);
-
-	if ($form['mailing_list'] != '')
-		$form['mailing_list'] = strtolower(preg_replace('%\s%S', '', $form['mailing_list']));
-
 	// Make sure avatars_dir doesn't end with a slash
 	if (substr($form['avatars_dir'], -1) == '/')
@@ -126,17 +69,5 @@
 
 	if ($form['additional_navlinks'] != '')
-		$form['additional_navlinks'] = pun_trim(pun_linebreaks($form['additional_navlinks']));
-
-	// Change or enter a SMTP password
-	if (isset($_POST['form']['smtp_change_pass']))
-	{
-		$smtp_pass1 = isset($_POST['form']['smtp_pass1']) ? pun_trim($_POST['form']['smtp_pass1']) : '';
-		$smtp_pass2 = isset($_POST['form']['smtp_pass2']) ? pun_trim($_POST['form']['smtp_pass2']) : '';
-
-		if ($smtp_pass1 == $smtp_pass2)
-			$form['smtp_pass'] = $smtp_pass1;
-		else
-			message($lang_admin_options['SMTP passwords did not match']);
-	}
+		$form['additional_navlinks'] = trim(pun_linebreaks($form['additional_navlinks']));
 
 	if ($form['announcement_message'] != '')
@@ -144,6 +75,8 @@
 	else
 	{
-		$form['announcement_message'] = $lang_admin_options['Enter announcement here'];
-		$form['announcement'] = '0';
+		$form['announcement_message'] = 'Saisissez votre annonce ici.';
+
+		if ($form['announcement'] == '1')
+			$form['announcement'] = '0';
 	}
 
@@ -152,6 +85,8 @@
 	else
 	{
-		$form['rules_message'] = $lang_admin_options['Enter rules here'];
-		$form['rules'] = '0';
+		$form['rules_message'] = 'Saisissez les rÃšgles d\'utilisation ici.';
+
+		if ($form['rules'] == '1')
+			$form['rules'] = '0';
 	}
 
@@ -160,35 +95,25 @@
 	else
 	{
-		$form['maintenance_message'] = $lang_admin_options['Default maintenance message'];
-		$form['maintenance'] = '0';
+		$form['maintenance_message'] = 'Les forums sont temporairement fermÃ©s pour des raisons de maintenance. Veuillez essayer Ã  nouveau d\'ici quelques minutes.<br />\\n<br />\\n/Administrateur';
+
+		if ($form['maintenance'] == '1')
+			$form['maintenance'] = '0';
 	}
 
-	// Make sure the number of displayed topics and posts is between 3 and 75
-	if ($form['disp_topics_default'] < 3)
-		$form['disp_topics_default'] = 3;
-	else if ($form['disp_topics_default'] > 75)
-		$form['disp_topics_default'] = 75;
-
-	if ($form['disp_posts_default'] < 3)
-		$form['disp_posts_default'] = 3;
-	else if ($form['disp_posts_default'] > 75)
-		$form['disp_posts_default'] = 75;
-
-	if ($form['feed_type'] < 0 || $form['feed_type'] > 2)
-		message($lang_common['Bad request']);
-
-	if ($form['feed_ttl'] < 0)
-		message($lang_common['Bad request']);
-
-	if ($form['report_method'] < 0 || $form['report_method'] > 2)
-		message($lang_common['Bad request']);
-
-	if ($form['default_email_setting'] < 0 || $form['default_email_setting'] > 2)
-		message($lang_common['Bad request']);
+	$form['timeout_visit'] = intval($form['timeout_visit']);
+	$form['timeout_online'] = intval($form['timeout_online']);
+	$form['redirect_delay'] = intval($form['redirect_delay']);
+	$form['topic_review'] = intval($form['topic_review']);
+	$form['disp_topics_default'] = intval($form['disp_topics_default']);
+	$form['disp_posts_default'] = intval($form['disp_posts_default']);
+	$form['indent_num_spaces'] = intval($form['indent_num_spaces']);
+	$form['avatars_width'] = intval($form['avatars_width']);
+	$form['avatars_height'] = intval($form['avatars_height']);
+	$form['avatars_size'] = intval($form['avatars_size']);
 
 	if ($form['timeout_online'] >= $form['timeout_visit'])
-		message($lang_admin_options['Timeout error message']);
-
-	foreach ($form as $key => $input)
+		message('La valeur de "Temps mort en ligne" doit Ãªtre infÃ©rieur Ã  la valeur de "Temps mort de visite".');
+
+	while (list($key, $input) = @each($form))
 	{
 		// Only update values that have changed
@@ -200,20 +125,18 @@
 				$value = 'NULL';
 
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value='.$value.' WHERE conf_name=\'o_'.$db->escape($key).'\'') or error('Unable to update board config', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'config SET conf_value='.$value.' WHERE conf_name=\'o_'.$db->escape($key).'\'') or error('Impossible de mettre Ã  jour la configuration des forums', __FILE__, __LINE__, $db->error());
 		}
 	}
 
 	// Regenerate the config cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_config_cache();
-	clear_feed_cache();
-
-	redirect('admin_options.php', $lang_admin_options['Options updated redirect']);
+
+	redirect('admin_options.php', 'Options modifiÃ©es. Redirection ...');
 }
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Options']);
-define('PUN_ACTIVE_PAGE', 'admin');
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Options';
+$form_name = 'update_options';
 require PUN_ROOT.'header.php';
 
@@ -222,99 +145,97 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_options['Options head'] ?></span></h2>
+		<h2><span>Options</span></h2>
 		<div class="box">
-			<form method="post" action="admin_options.php">
-				<p class="submittop"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" /></p>
-				<div class="inform">
-					<input type="hidden" name="form_sent" value="1" />
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Essentials subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Board title label'] ?></th>
+			<form method="post" action="admin_options.php?action=foo">
+				<p class="submittop"><input type="submit" name="save" value=" Enregistrer " /></p>
+				<div class="inform">
+				<input type="hidden" name="form_sent" value="1" />
+					<fieldset>
+						<legend>Essentiel</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Titre forums</th>
 									<td>
 										<input type="text" name="form[board_title]" size="50" maxlength="255" value="<?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?>" />
-										<span><?php echo $lang_admin_options['Board title help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Board desc label'] ?></th>
+										<span>Le titre de ces forums (affichÃ© en haut de chaques pages). Ce champ ne peut <strong>pas</strong> contenir d'<acronym title="HyperText Markup Language" lang="en">HTML</acronym>.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Description forums</th>
 									<td>
 										<input type="text" name="form[board_desc]" size="50" maxlength="255" value="<?php echo pun_htmlspecialchars($pun_config['o_board_desc']) ?>" />
-										<span><?php echo $lang_admin_options['Board desc help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Base URL label'] ?></th>
-									<td>
-										<input type="text" name="form[base_url]" size="50" maxlength="100" value="<?php echo pun_htmlspecialchars($pun_config['o_base_url']) ?>" />
-										<span><?php echo $lang_admin_options['Base URL help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Timezone label'] ?></th>
-									<td>
-										<select name="form[default_timezone]">
-											<option value="-12"<?php if ($pun_config['o_default_timezone'] == -12) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-12:00'] ?></option>
-											<option value="-11"<?php if ($pun_config['o_default_timezone'] == -11) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-11:00'] ?></option>
-											<option value="-10"<?php if ($pun_config['o_default_timezone'] == -10) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-10:00'] ?></option>
-											<option value="-9.5"<?php if ($pun_config['o_default_timezone'] == -9.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-09:30'] ?></option>
-											<option value="-9"<?php if ($pun_config['o_default_timezone'] == -9) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-09:00'] ?></option>
-											<option value="-8.5"<?php if ($pun_config['o_default_timezone'] == -8.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-08:30'] ?></option>
-											<option value="-8"<?php if ($pun_config['o_default_timezone'] == -8) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-08:00'] ?></option>
-											<option value="-7"<?php if ($pun_config['o_default_timezone'] == -7) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-07:00'] ?></option>
-											<option value="-6"<?php if ($pun_config['o_default_timezone'] == -6) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-06:00'] ?></option>
-											<option value="-5"<?php if ($pun_config['o_default_timezone'] == -5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-05:00'] ?></option>
-											<option value="-4"<?php if ($pun_config['o_default_timezone'] == -4) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-04:00'] ?></option>
-											<option value="-3.5"<?php if ($pun_config['o_default_timezone'] == -3.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-03:30'] ?></option>
-											<option value="-3"<?php if ($pun_config['o_default_timezone'] == -3) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-03:00'] ?></option>
-											<option value="-2"<?php if ($pun_config['o_default_timezone'] == -2) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-02:00'] ?></option>
-											<option value="-1"<?php if ($pun_config['o_default_timezone'] == -1) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC-01:00'] ?></option>
-											<option value="0"<?php if ($pun_config['o_default_timezone'] == 0) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC'] ?></option>
-											<option value="1"<?php if ($pun_config['o_default_timezone'] == 1) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+01:00'] ?></option>
-											<option value="2"<?php if ($pun_config['o_default_timezone'] == 2) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+02:00'] ?></option>
-											<option value="3"<?php if ($pun_config['o_default_timezone'] == 3) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+03:00'] ?></option>
-											<option value="3.5"<?php if ($pun_config['o_default_timezone'] == 3.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+03:30'] ?></option>
-											<option value="4"<?php if ($pun_config['o_default_timezone'] == 4) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+04:00'] ?></option>
-											<option value="4.5"<?php if ($pun_config['o_default_timezone'] == 4.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+04:30'] ?></option>
-											<option value="5"<?php if ($pun_config['o_default_timezone'] == 5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+05:00'] ?></option>
-											<option value="5.5"<?php if ($pun_config['o_default_timezone'] == 5.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+05:30'] ?></option>
-											<option value="5.75"<?php if ($pun_config['o_default_timezone'] == 5.75) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+05:45'] ?></option>
-											<option value="6"<?php if ($pun_config['o_default_timezone'] == 6) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+06:00'] ?></option>
-											<option value="6.5"<?php if ($pun_config['o_default_timezone'] == 6.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+06:30'] ?></option>
-											<option value="7"<?php if ($pun_config['o_default_timezone'] == 7) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+07:00'] ?></option>
-											<option value="8"<?php if ($pun_config['o_default_timezone'] == 8) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+08:00'] ?></option>
-											<option value="8.75"<?php if ($pun_config['o_default_timezone'] == 8.75) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+08:45'] ?></option>
-											<option value="9"<?php if ($pun_config['o_default_timezone'] == 9) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+09:00'] ?></option>
-											<option value="9.5"<?php if ($pun_config['o_default_timezone'] == 9.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+09:30'] ?></option>
-											<option value="10"<?php if ($pun_config['o_default_timezone'] == 10) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+10:00'] ?></option>
-											<option value="10.5"<?php if ($pun_config['o_default_timezone'] == 10.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+10:30'] ?></option>
-											<option value="11"<?php if ($pun_config['o_default_timezone'] == 11) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+11:00'] ?></option>
-											<option value="11.5"<?php if ($pun_config['o_default_timezone'] == 11.5) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+11:30'] ?></option>
-											<option value="12"<?php if ($pun_config['o_default_timezone'] == 12) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+12:00'] ?></option>
-											<option value="12.75"<?php if ($pun_config['o_default_timezone'] == 12.75) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+12:45'] ?></option>
-											<option value="13"<?php if ($pun_config['o_default_timezone'] == 13) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+13:00'] ?></option>
-											<option value="14"<?php if ($pun_config['o_default_timezone'] == 14) echo ' selected="selected"' ?>><?php echo $lang_admin_options['UTC+14:00'] ?></option>
+										<span>Une courte description de vos forums (affichÃ© en haut de chaques pages). Ce champ peut contenir du <acronym title="HyperText Markup Language" lang="en">HTML</acronym>.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row"><acronym title="Uniform Resource Locator" lang="en">URL</acronym> de base</th>
+									<td>
+										<input type="text" name="form[base_url]" size="50" maxlength="100" value="<?php echo $pun_config['o_base_url'] ?>" />
+										<span>L'<acronym title="Uniform Resource Locator" lang="en">URL</acronym> de ces forums sans slash Ã  la fin (ex :  http://www.mon-domaine.com/forums). Ce champ <strong>doit</strong> Ãªtre correct pour que toutes les fonctions administrateurs et modÃ©rateurs soient opÃ©rationnelles. Si vous optenez une erreur "Bad referer", il est probablement incorrect.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Fuseau horaire serveur</th>
+									<td>
+										<select name="form[server_timezone]">
+											<option value="-12"<?php if ($pun_config['o_server_timezone'] == -12 ) echo ' selected="selected"' ?>>-12</option>
+											<option value="-11"<?php if ($pun_config['o_server_timezone'] == -11) echo ' selected="selected"' ?>>-11</option>
+											<option value="-10"<?php if ($pun_config['o_server_timezone'] == -10) echo ' selected="selected"' ?>>-10</option>
+											<option value="-9.5"<?php if ($pun_config['o_server_timezone'] == -9.5) echo ' selected="selected"' ?>>-09.5</option>
+											<option value="-9"<?php if ($pun_config['o_server_timezone'] == -9 ) echo ' selected="selected"' ?>>-09</option>
+											<option value="-8.5"<?php if ($pun_config['o_server_timezone'] == -8.5) echo ' selected="selected"' ?>>-08.5</option>
+											<option value="-8"<?php if ($pun_config['o_server_timezone'] == -8 ) echo ' selected="selected"' ?>>-08 PST</option>
+											<option value="-7"<?php if ($pun_config['o_server_timezone'] == -7 ) echo ' selected="selected"' ?>>-07 MST</option>
+											<option value="-6"<?php if ($pun_config['o_server_timezone'] == -6 ) echo ' selected="selected"' ?>>-06 CST</option>
+											<option value="-5"<?php if ($pun_config['o_server_timezone'] == -5 ) echo ' selected="selected"' ?>>-05 EST</option>
+											<option value="-4"<?php if ($pun_config['o_server_timezone'] == -4 ) echo ' selected="selected"' ?>>-04 AST</option>
+											<option value="-3.5"<?php if ($pun_config['o_server_timezone'] == -3.5) echo ' selected="selected"' ?>>-03.5</option>
+											<option value="-3"<?php if ($pun_config['o_server_timezone'] == -3 ) echo ' selected="selected"' ?>>-03 ADT</option>
+											<option value="-2"<?php if ($pun_config['o_server_timezone'] == -2 ) echo ' selected="selected"' ?>>-02</option>
+											<option value="-1"<?php if ($pun_config['o_server_timezone'] == -1) echo ' selected="selected"' ?>>-01</option>
+											<option value="0"<?php if ($pun_config['o_server_timezone'] == 0) echo ' selected="selected"' ?>>00 GMT</option>
+											<option value="1"<?php if ($pun_config['o_server_timezone'] == 1) echo ' selected="selected"' ?>>+01 CET</option>
+											<option value="2"<?php if ($pun_config['o_server_timezone'] == 2 ) echo ' selected="selected"' ?>>+02</option>
+											<option value="3"<?php if ($pun_config['o_server_timezone'] == 3 ) echo ' selected="selected"' ?>>+03</option>
+											<option value="3.5"<?php if ($pun_config['o_server_timezone'] == 3.5) echo ' selected="selected"' ?>>+03.5</option>
+											<option value="4"<?php if ($pun_config['o_server_timezone'] == 4 ) echo ' selected="selected"' ?>>+04</option>
+											<option value="4.5"<?php if ($pun_config['o_server_timezone'] == 4.5) echo ' selected="selected"' ?>>+04.5</option>
+											<option value="5"<?php if ($pun_config['o_server_timezone'] == 5 ) echo ' selected="selected"' ?>>+05</option>
+											<option value="5.5"<?php if ($pun_config['o_server_timezone'] == 5.5) echo ' selected="selected"' ?>>+05.5</option>
+											<option value="6"<?php if ($pun_config['o_server_timezone'] == 6 ) echo ' selected="selected"' ?>>+06</option>
+											<option value="6.5"<?php if ($pun_config['o_server_timezone'] == 6.5) echo ' selected="selected"' ?>>+06.5</option>
+											<option value="7"<?php if ($pun_config['o_server_timezone'] == 7 ) echo ' selected="selected"' ?>>+07</option>
+											<option value="8"<?php if ($pun_config['o_server_timezone'] == 8 ) echo ' selected="selected"' ?>>+08</option>
+											<option value="9"<?php if ($pun_config['o_server_timezone'] == 9 ) echo ' selected="selected"' ?>>+09</option>
+											<option value="9.5"<?php if ($pun_config['o_server_timezone'] == 9.5) echo ' selected="selected"' ?>>+09.5</option>
+											<option value="10"<?php if ($pun_config['o_server_timezone'] == 10) echo ' selected="selected"' ?>>+10</option>
+											<option value="10.5"<?php if ($pun_config['o_server_timezone'] == 10.5) echo ' selected="selected"' ?>>+10.5</option>
+											<option value="11"<?php if ($pun_config['o_server_timezone'] == 11) echo ' selected="selected"' ?>>+11</option>
+											<option value="11.5"<?php if ($pun_config['o_server_timezone'] == 11.5) echo ' selected="selected"' ?>>+11.5</option>
+											<option value="12"<?php if ($pun_config['o_server_timezone'] == 12 ) echo ' selected="selected"' ?>>+12</option>
+											<option value="13"<?php if ($pun_config['o_server_timezone'] == 13 ) echo ' selected="selected"' ?>>+13</option>
 										</select>
-										<span><?php echo $lang_admin_options['Timezone help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['DST label'] ?></th>
-									<td>
-										<input type="radio" name="form[default_dst]" value="1"<?php if ($pun_config['o_default_dst'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[default_dst]" value="0"<?php if ($pun_config['o_default_dst'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['DST help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Language label'] ?></th>
+										<span>Le fuseau horaire du serveur oÃ¹ est installÃ© PunBB.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Langage par dÃ©faut</th>
 									<td>
 										<select name="form[default_lang]">
 <?php
 
-		$languages = forum_list_langs();
-
-		foreach ($languages as $temp)
+		$languages = array();
+		$d = dir(PUN_ROOT.'lang');
+		while (($entry = $d->read()) !== false)
+		{
+			 if ($entry != '.' && $entry != '..' && is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/common.php'))
+				$languages[] = $entry;
+		}
+		$d->close();
+		
+		@natsort($languages);
+
+		while (list(, $temp) = @each($languages))
 		{
 			if ($pun_config['o_default_lang'] == $temp)
@@ -326,522 +247,449 @@
 ?>
 										</select>
-										<span><?php echo $lang_admin_options['Language help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Default style label'] ?></th>
+										<span>Choisissez la langue par dÃ©faut qui sera utilisÃ©e si l'utilisateur est un invitÃ© ou pour les utilisateurs qui n'auront pas changÃ© de langage dans leur profil. Si vous supprimez un pack de langage vous devrez mettre Ã  jour ce rÃ©glage.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Style par dÃ©faut</th>
 									<td>
 										<select name="form[default_style]">
 <?php
 
-		$styles = forum_list_styles();
-
-		foreach ($styles as $temp)
+		$styles = array();
+		$d = dir(PUN_ROOT.'style');
+		while (($entry = $d->read()) !== false)
+		{
+			if (substr($entry, strlen($entry)-4) == '.css')
+				$styles[] = substr($entry, 0, strlen($entry)-4);
+		}
+		$d->close();
+		
+		@natsort($styles);
+
+		while (list(, $temp) = @each($styles))
 		{
 			if ($pun_config['o_default_style'] == $temp)
-				echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.str_replace('_', ' ', $temp).'</option>'."\n";
+				echo "\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.str_replace('_', ' ', $temp).'</option>'."\n";
 			else
-				echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'">'.str_replace('_', ' ', $temp).'</option>'."\n";
+				echo "\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'">'.str_replace('_', ' ', $temp).'</option>'."\n";
 		}
 
 ?>
 										</select>
-										<span><?php echo $lang_admin_options['Default style help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-<?php
-
-	$diff = ($pun_user['timezone'] + $pun_user['dst']) * 3600;
-	$timestamp = time() + $diff;
-
-?>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Timeouts subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Time format label'] ?></th>
+										<span>SÃ©lÃ©ctionnez le style par dÃ©faut qui sera utilisÃ© par les visiteurs ou les utilisateurs qui n'ont pas changÃ©s de style dans leur profil.</span></td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Dates, heures et limites de temps</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Format heure</th>
 									<td>
 										<input type="text" name="form[time_format]" size="25" maxlength="25" value="<?php echo pun_htmlspecialchars($pun_config['o_time_format']) ?>" />
-										<span><?php printf($lang_admin_options['Time format help'], gmdate($pun_config['o_time_format'], $timestamp), '<a href="http://www.php.net/manual/en/function.date.php">'.$lang_admin_options['PHP manual'].'</a>') ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Date format label'] ?></th>
+										<span>[Format actuel : <?php echo date($pun_config['o_time_format']) ?>]&#160;Voir <a href="http://www.php.net/manual/fr/function.date.php">ici</a> pour les options de formatage.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Date format</th>
 									<td>
 										<input type="text" name="form[date_format]" size="25" maxlength="25" value="<?php echo pun_htmlspecialchars($pun_config['o_date_format']) ?>" />
-										<span><?php printf($lang_admin_options['Date format help'], gmdate($pun_config['o_date_format'], $timestamp), '<a href="http://www.php.net/manual/en/function.date.php">'.$lang_admin_options['PHP manual'].'</a>') ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Visit timeout label'] ?></th>
+										<span>[Format actuel : <?php echo date($pun_config['o_date_format']) ?>]&#160;Voir <a href="http://www.php.net/manual/fr/function.date.php">ici</a> pour les options de formatage.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Temps mort de visite</th>
 									<td>
 										<input type="text" name="form[timeout_visit]" size="5" maxlength="5" value="<?php echo $pun_config['o_timeout_visit'] ?>" />
-										<span><?php echo $lang_admin_options['Visit timeout help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Online timeout label'] ?></th>
+										<span>Nombre de secondes qu'un utilisateur devra rester inactif avant que les donnÃ©es de sa derniÃšre visite soient mises Ã  jours (affecte principalement les indicateurs de nouveaux messages).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Temps mort en ligne</th>
 									<td>
 										<input type="text" name="form[timeout_online]" size="5" maxlength="5" value="<?php echo $pun_config['o_timeout_online'] ?>" />
-										<span><?php echo $lang_admin_options['Online timeout help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Redirect time label'] ?></th>
+										<span>Nombre de secondes qu'un utilisateur devra rester inactif avant qu'il ne soit supprimÃ© de la liste des utilisateurs en ligne.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Temps de redirection</th>
 									<td>
 										<input type="text" name="form[redirect_delay]" size="3" maxlength="3" value="<?php echo $pun_config['o_redirect_delay'] ?>" />
-										<span><?php echo $lang_admin_options['Redirect time help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Display subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Version number label'] ?></th>
-									<td>
-										<input type="radio" name="form[show_version]" value="1"<?php if ($pun_config['o_show_version'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[show_version]" value="0"<?php if ($pun_config['o_show_version'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Version number help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Info in posts label'] ?></th>
-									<td>
-										<input type="radio" name="form[show_user_info]" value="1"<?php if ($pun_config['o_show_user_info'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[show_user_info]" value="0"<?php if ($pun_config['o_show_user_info'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Info in posts help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Post count label'] ?></th>
-									<td>
-										<input type="radio" name="form[show_post_count]" value="1"<?php if ($pun_config['o_show_post_count'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[show_post_count]" value="0"<?php if ($pun_config['o_show_post_count'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Post count help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Smilies label'] ?></th>
-									<td>
-										<input type="radio" name="form[smilies]" value="1"<?php if ($pun_config['o_smilies'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[smilies]" value="0"<?php if ($pun_config['o_smilies'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Smilies help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Smilies sigs label'] ?></th>
-									<td>
-										<input type="radio" name="form[smilies_sig]" value="1"<?php if ($pun_config['o_smilies_sig'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[smilies_sig]" value="0"<?php if ($pun_config['o_smilies_sig'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Smilies sigs help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Clickable links label'] ?></th>
-									<td>
-										<input type="radio" name="form[make_links]" value="1"<?php if ($pun_config['o_make_links'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[make_links]" value="0"<?php if ($pun_config['o_make_links'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Clickable links help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Topic review label'] ?></th>
+										<span>Nombre de secondes Ã  patienter avant d'Ãªtre redirigÃ©. Si ce champ est rÃ©glÃ© Ã  0, aucune page de redirection ne sera affichÃ©e mais cela n'est pas recommandÃ©.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Afficher</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">NumÃ©ro de version</th>
+									<td>
+										<input type="radio" name="form[show_version]" value="1"<?php if ($pun_config['o_show_version'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[show_version]" value="0"<?php if ($pun_config['o_show_version'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Affiche le numÃ©ro de version de PunBB en bas de page.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Infos utilisateurs dans les messages</th>
+									<td>
+										<input type="radio" name="form[show_user_info]" value="1"<?php if ($pun_config['o_show_user_info'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[show_user_info]" value="0"<?php if ($pun_config['o_show_user_info'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Affiche des informations sur les utilisateurs sous leur nom d'utilisateur lorsque l'on affiche un sujet. Affiche le lieu, la date d'inscription, le nombre de message et les liens de contact (e-mail et site web).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Nombre de messages par utilisateur</th>
+									<td>
+										<input type="radio" name="form[show_post_count]" value="1"<?php if ($pun_config['o_show_post_count'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[show_post_count]" value="0"<?php if ($pun_config['o_show_post_count'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Affiche le nombre de messages qu'un utilisateur a Ã©crit (sur la page d'un sujet, son profil et la liste utilisateurs).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">ÃmoticÃŽnes</th>
+									<td>
+										<input type="radio" name="form[smilies]" value="1"<?php if ($pun_config['o_smilies'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[smilies]" value="0"<?php if ($pun_config['o_smilies'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Convertir les Ã©moticÃŽnes en petites images.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">ÃmoticÃŽnes dans les signatures</th>
+									<td>
+										<input type="radio" name="form[smilies_sig]" value="1"<?php if ($pun_config['o_smilies_sig'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[smilies_sig]" value="0"<?php if ($pun_config['o_smilies_sig'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Convertir les Ã©moticÃŽnes en petites images dans les signatures.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">CrÃ©er des liens cliquables</th>
+									<td>
+										<input type="radio" name="form[make_links]" value="1"<?php if ($pun_config['o_make_links'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[make_links]" value="0"<?php if ($pun_config['o_make_links'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Lorsque cette fonction est activÃ©e, PunBB dÃ©tecte automatiquement lors de l'envoi d'un nouveau message toutes les <acronym title="Uniform Resource Locator" lang="en">URL</acronym> qu'il contient et crÃ©er des liens cliquables.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">RÃ©sumÃ©s des discussions</th>
 									<td>
 										<input type="text" name="form[topic_review]" size="3" maxlength="3" value="<?php echo $pun_config['o_topic_review'] ?>" />
-										<span><?php echo $lang_admin_options['Topic review help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Topics per page label'] ?></th>
+										<span>Nombre maximum  de messages Ã  afficher quand on Ã©crit une rÃ©ponse. 0 pour dÃ©sactiver.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Discussions par page</th>
 									<td>
 										<input type="text" name="form[disp_topics_default]" size="3" maxlength="3" value="<?php echo $pun_config['o_disp_topics_default'] ?>" />
-										<span><?php echo $lang_admin_options['Topics per page help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Posts per page label'] ?></th>
+										<span>Le nombre de discussions par dÃ©faut Ã  afficher sur la page d'un forum. Les utilisateurs inscrits peuvent personnaliser cette option.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Messages par page</th>
 									<td>
 										<input type="text" name="form[disp_posts_default]" size="3" maxlength="3" value="<?php echo $pun_config['o_disp_posts_default'] ?>" />
-										<span><?php echo $lang_admin_options['Posts per page help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Indent label'] ?></th>
+										<span>Le nombre de messages par dÃ©faut Ã  afficher sur la page d'une discussion. Les utilisateurs inscrits peuvent personnaliser cette option.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Taille du retrait</th>
 									<td>
 										<input type="text" name="form[indent_num_spaces]" size="3" maxlength="3" value="<?php echo $pun_config['o_indent_num_spaces'] ?>" />
-										<span><?php echo $lang_admin_options['Indent help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Quote depth label'] ?></th>
-									<td>
-										<input type="text" name="form[quote_depth]" size="3" maxlength="3" value="<?php echo $pun_config['o_quote_depth'] ?>" />
-										<span><?php echo $lang_admin_options['Quote depth help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Features subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Quick post label'] ?></th>
-									<td>
-										<input type="radio" name="form[quickpost]" value="1"<?php if ($pun_config['o_quickpost'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[quickpost]" value="0"<?php if ($pun_config['o_quickpost'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Quick post help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Users online label'] ?></th>
-									<td>
-										<input type="radio" name="form[users_online]" value="1"<?php if ($pun_config['o_users_online'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[users_online]" value="0"<?php if ($pun_config['o_users_online'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Users online help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><a name="censoring"><?php echo $lang_admin_options['Censor words label'] ?></a></th>
-									<td>
-										<input type="radio" name="form[censoring]" value="1"<?php if ($pun_config['o_censoring'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[censoring]" value="0"<?php if ($pun_config['o_censoring'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php printf($lang_admin_options['Censor words help'], '<a href="admin_censoring.php">'.$lang_admin_common['Censoring'].'</a>') ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><a name="signatures"><?php echo $lang_admin_options['Signatures label'] ?></a></th>
-									<td>
-										<input type="radio" name="form[signatures]" value="1"<?php if ($pun_config['o_signatures'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[signatures]" value="0"<?php if ($pun_config['o_signatures'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Signatures help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><a name="ranks"><?php echo $lang_admin_options['User ranks label'] ?></a></th>
-									<td>
-										<input type="radio" name="form[ranks]" value="1"<?php if ($pun_config['o_ranks'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[ranks]" value="0"<?php if ($pun_config['o_ranks'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php printf($lang_admin_options['User ranks help'], '<a href="admin_ranks.php">'.$lang_admin_common['Ranks'].'</a>') ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['User has posted label'] ?></th>
-									<td>
-										<input type="radio" name="form[show_dot]" value="1"<?php if ($pun_config['o_show_dot'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[show_dot]" value="0"<?php if ($pun_config['o_show_dot'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['User has posted help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Topic views label'] ?></th>
-									<td>
-										<input type="radio" name="form[topic_views]" value="1"<?php if ($pun_config['o_topic_views'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[topic_views]" value="0"<?php if ($pun_config['o_topic_views'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Topic views help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Quick jump label'] ?></th>
-									<td>
-										<input type="radio" name="form[quickjump]" value="1"<?php if ($pun_config['o_quickjump'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[quickjump]" value="0"<?php if ($pun_config['o_quickjump'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Quick jump help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['GZip label'] ?></th>
-									<td>
-										<input type="radio" name="form[gzip]" value="1"<?php if ($pun_config['o_gzip'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[gzip]" value="0"<?php if ($pun_config['o_gzip'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['GZip help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Search all label'] ?></th>
-									<td>
-										<input type="radio" name="form[search_all_forums]" value="1"<?php if ($pun_config['o_search_all_forums'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[search_all_forums]" value="0"<?php if ($pun_config['o_search_all_forums'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Search all help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Menu items label'] ?></th>
+										<span>Si rÃ©glÃ©e Ã  8, une tabulation usuelle sera utilisÃ©e pour afficher du texte avec les balises [code][/code]. Sinon c'est le nombre d'espaces qui sera utilisÃ© pour mettre en retrait le texte.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>FonctionnalitÃ©s</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">RÃ©ponse rapide</th>
+									<td>
+										<input type="radio" name="form[quickpost]" value="1"<?php if ($pun_config['o_quickpost'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[quickpost]" value="0"<?php if ($pun_config['o_quickpost'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Lorsque cette option est activÃ©e, PunBB ajoute un formulaire de rÃ©ponse au bas des discussions. Ceci permet aux utilisateurs d'Ã©crire des rÃ©ponses directement depuis l'Ã©cran de lecture des discussions.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Utilisateurs en ligne</th>
+									<td>
+										<input type="radio" name="form[users_online]" value="1"<?php if ($pun_config['o_users_online'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[users_online]" value="0"<?php if ($pun_config['o_users_online'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Affiche sur la page d'accueil des forums des informations concernant les utilisateurs qui sont en ligne lors de l'affichage de la page.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row"><a name="censoring">Mots Ã  censurer</a></th>
+									<td>
+										<input type="radio" name="form[censoring]" value="1"<?php if ($pun_config['o_censoring'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[censoring]" value="0"<?php if ($pun_config['o_censoring'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Activez cette option pour censurer des mots prÃ©dÃ©finis. Pour plus d'information, voir la page d'administration des <a href="admin_censoring.php">Mots censurÃ©s</a>.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row"><a name="ranks">Rangs utilisateurs</a></th>
+									<td>
+										<input type="radio" name="form[ranks]" value="1"<?php if ($pun_config['o_ranks'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[ranks]" value="0"<?php if ($pun_config['o_ranks'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Activez cette option pour utiliser les rangs utilisateurs. Pour plus d'information, voir la page d'administration des <a href="admin_ranks.php">Rangs utilisateurs</a>.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Utilisateur a Ã©crit recemment</th>
+									<td>
+										<input type="radio" name="form[show_dot]" value="1"<?php if ($pun_config['o_show_dot'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[show_dot]" value="0"<?php if ($pun_config['o_show_dot'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Cette fonctionnalitÃ© permet d'afficher un point devant les sujets dans le cas oÃ¹ l'utilisateur identifiÃ© aurait rÃ©cemment Ã©crit dans les sujets. DÃ©sactivez si vous constatez d'importantes charges serveur.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Saut rapide</th>
+									<td>
+										<input type="radio" name="form[quickjump]" value="1"<?php if ($pun_config['o_quickjump'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[quickjump]" value="0"<?php if ($pun_config['o_quickjump'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Active le menu dÃ©roulant de saut rapide (saut de forum en forum).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Compression GZip</th>
+									<td>
+										<input type="radio" name="form[gzip]" value="1"<?php if ($pun_config['o_gzip'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[gzip]" value="0"<?php if ($pun_config['o_gzip'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Si activÃ©e, PunBB compressera la sortie envoyÃ©e aux navigateurs. Ceci devrait rÃ©duire la consommation de bande passante mais utilisera un peu plus le <acronym title="Central Processing Unit" lang="en">CPU</acronym> (processeur systÃšme). Cette option nÃ©cessite que <acronym title="PHP: Hypertext Preprocessor" lang="en">PHP</acronym> soit configurÃ© avec zlib (--with-zlib). Note : Si vous avez dÃ©jÃ  un des modules Apache mod_gzip ou mod_deflate d'installÃ© et de configurÃ© pour compresser les scripts <acronym title="PHP: Hypertext Preprocessor" lang="en">PHP</acronym>, vous pouvez alors dÃ©sactiver cette option.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Recherche dans tous les forums</th>
+									<td>
+										<input type="radio" name="form[search_all_forums]" value="1"<?php if ($pun_config['o_search_all_forums'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[search_all_forums]" value="0"<?php if ($pun_config['o_search_all_forums'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Lorsque cette option est dÃ©sactivÃ©e, les recherches ne peuvent Ãªtres effectuÃ©es que sur un forum Ã  la fois. DÃ©sactivez si la charge serveur est Ã©levÃ©e Ã  cause d'un nombre trop important de recherches.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Items de menu additionnels</th>
 									<td>
 										<textarea name="form[additional_navlinks]" rows="3" cols="55"><?php echo pun_htmlspecialchars($pun_config['o_additional_navlinks']) ?></textarea>
-										<span><?php echo $lang_admin_options['Menu items help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Feed subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Default feed label'] ?></th>
-									<td>
-										<input type="radio" name="form[feed_type]" value="0"<?php if ($pun_config['o_feed_type'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_options['None'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[feed_type]" value="1"<?php if ($pun_config['o_feed_type'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_options['RSS'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[feed_type]" value="2"<?php if ($pun_config['o_feed_type'] == '2') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_options['Atom'] ?></strong>
-										<span><?php echo $lang_admin_options['Default feed help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Feed TTL label'] ?></th>
-									<td>
-										<select name="form[feed_ttl]">
-											<option value="0"<?php if ($pun_config['o_feed_ttl'] == '0') echo ' selected="selected"'; ?>><?php echo $lang_admin_options['No cache'] ?></option>
-<?php
-
-		$times = array(5, 15, 30, 60);
-
-		foreach ($times as $time)
-			echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$time.'"'.($pun_config['o_feed_ttl'] == $time ? ' selected="selected"' : '').'>'.sprintf($lang_admin_options['Minutes'], $time).'</option>'."\n";
-
-?>
-										</select>
-										<span><?php echo $lang_admin_options['Feed TTL help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Reports subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Reporting method label'] ?></th>
-									<td>
-										<input type="radio" name="form[report_method]" value="0"<?php if ($pun_config['o_report_method'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_options['Internal'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[report_method]" value="1"<?php if ($pun_config['o_report_method'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_options['By e-mail'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[report_method]" value="2"<?php if ($pun_config['o_report_method'] == '2') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_options['Both'] ?></strong>
-										<span><?php echo $lang_admin_options['Reporting method help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Mailing list label'] ?></th>
+										<span>En entrant des liens hypertext <acronym title="HyperText Markup Language" lang="en">HTML</acronym> dans cette boite de saisie, autant d'items seront ajoutÃ©s au menu de navigation en haut de toutes les pages. Le format pour ajouter un nouveau lien est   X = &lt;a href="URL"&gt;LIEN&lt;/a&gt; oÃ¹ X est la position Ã  laquelle le lien devra Ãªtre insÃ©rÃ© (<abbr title="exemple">ex.</abbr> 0 pour insÃ©rer au dÃ©but et 2 pour insÃ©rer aprÃšs la Â«&#160;liste des membres&#160;Â»). SÃ©parez chaque entrÃ©e par un retour Ã  la ligne.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Signalements</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">MÃ©thode de signalement</th>
+									<td>
+										<input type="radio" name="form[report_method]" value="0"<?php if ($pun_config['o_report_method'] == '0') echo ' checked="checked"' ?> />&#160;Interne&#160;&#160;&#160;<input type="radio" name="form[report_method]" value="1"<?php if ($pun_config['o_report_method'] == '1') echo ' checked="checked"' ?> />&#160;E-mail&#160;&#160;&#160;<input type="radio" name="form[report_method]" value="2"<?php if ($pun_config['o_report_method'] == '2') echo ' checked="checked"' ?> />&#160;Les deux
+										<span>Choisissez la mÃ©thode pour Ãªtre avertis de nouveaux signalements. Pour la mÃ©thode par e-mail la liste d'adresses ci-dessous sera utilisÃ©e.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Signalement nouvelle inscription</th>
+									<td>
+										<input type="radio" name="form[regs_report]" value="1"<?php if ($pun_config['o_regs_report'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[regs_report]" value="0"<?php if ($pun_config['o_regs_report'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Si activÃ©e, PunBB enverra un e-mail Ã  chacune des adresses de la liste ci-dessous Ã  chaque nouvelle inscription sur les forums.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Liste d'adresses e-mail</th>
 									<td>
 										<textarea name="form[mailing_list]" rows="5" cols="55"><?php echo pun_htmlspecialchars($pun_config['o_mailing_list']) ?></textarea>
-										<span><?php echo $lang_admin_options['Mailing list help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Avatars subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Use avatars label'] ?></th>
-									<td>
-										<input type="radio" name="form[avatars]" value="1"<?php if ($pun_config['o_avatars'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[avatars]" value="0"<?php if ($pun_config['o_avatars'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Use avatars help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Upload directory label'] ?></th>
+										<span>Utilisez une virgule pour sÃ©parer les adresses. Les adresses de cette liste sont les destinataires des signalements envoyÃ©s par e-mail.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Avatars</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Utiliser les avatars</th>
+									<td>
+										<input type="radio" name="form[avatars]" value="1"<?php if ($pun_config['o_avatars'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[avatars]" value="0"<?php if ($pun_config['o_avatars'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Si cette option est activÃ©e, les utilisateurs pourront envoyer sur le serveur un avatar qui sera affichÃ© sous leur titre/rang.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">RÃ©pertoire avatars</th>
 									<td>
 										<input type="text" name="form[avatars_dir]" size="35" maxlength="50" value="<?php echo pun_htmlspecialchars($pun_config['o_avatars_dir']) ?>" />
-										<span><?php echo $lang_admin_options['Upload directory help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Max width label'] ?></th>
+										<span>Le dossier oÃ¹ les avatars seront envoyÃ©s (chemin relatif au dossier racine de PunBB). <acronym title="PHP: Hypertext Preprocessor" lang="en">PHP</acronym> doit avoir les droits en Ã©criture dans ce rÃ©pertoire.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Largeur maximum</th>
 									<td>
 										<input type="text" name="form[avatars_width]" size="5" maxlength="5" value="<?php echo $pun_config['o_avatars_width'] ?>" />
-										<span><?php echo $lang_admin_options['Max width help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Max height label'] ?></th>
+										<span>La largeur maximum admise (exprimÃ©e en pixels) pour les avatars (60 est recommandÃ©).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Hauteur maximum</th>
 									<td>
 										<input type="text" name="form[avatars_height]" size="5" maxlength="5" value="<?php echo $pun_config['o_avatars_height'] ?>" />
-										<span><?php echo $lang_admin_options['Max height help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Max size label'] ?></th>
+										<span>La hauteur maximum admise (exprimÃ©e en pixels) pour les avatars (60 est recommandÃ©).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Taile maximum</th>
 									<td>
 										<input type="text" name="form[avatars_size]" size="6" maxlength="6" value="<?php echo $pun_config['o_avatars_size'] ?>" />
-										<span><?php echo $lang_admin_options['Max size help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['E-mail subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Admin e-mail label'] ?></th>
-									<td>
-										<input type="text" name="form[admin_email]" size="50" maxlength="80" value="<?php echo $pun_config['o_admin_email'] ?>" />
-										<span><?php echo $lang_admin_options['Admin e-mail help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Webmaster e-mail label'] ?></th>
-									<td>
-										<input type="text" name="form[webmaster_email]" size="50" maxlength="80" value="<?php echo $pun_config['o_webmaster_email'] ?>" />
-										<span><?php echo $lang_admin_options['Webmaster e-mail help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Forum subscriptions label'] ?></th>
-									<td>
-										<input type="radio" name="form[forum_subscriptions]" value="1"<?php if ($pun_config['o_forum_subscriptions'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[forum_subscriptions]" value="0"<?php if ($pun_config['o_forum_subscriptions'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Forum subscriptions help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Topic subscriptions label'] ?></th>
-									<td>
-										<input type="radio" name="form[topic_subscriptions]" value="1"<?php if ($pun_config['o_topic_subscriptions'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[topic_subscriptions]" value="0"<?php if ($pun_config['o_topic_subscriptions'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Topic subscriptions help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['SMTP address label'] ?></th>
+										<span>La taille maximum admise (exprimÃ©e en bytes) pour les avatars (10240 est recommandÃ©).</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>E-mail</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">E-mail administrateur</th>
+									<td>
+										<input type="text" name="form[admin_email]" size="50" maxlength="50" value="<?php echo $pun_config['o_admin_email'] ?>" />
+										<span>L'adresse e-mail de l'administrateur des forums.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">E-mail webmaster</th>
+									<td>
+										<input type="text" name="form[webmaster_email]" size="50" maxlength="50" value="<?php echo $pun_config['o_webmaster_email'] ?>" />
+										<span>Ceci est l'adresse qui sera utilisÃ©e par tous les messages envoyÃ©s par les forums.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Abonnements</th>
+									<td>
+										<input type="radio" name="form[subscriptions]" value="1"<?php if ($pun_config['o_subscriptions'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[subscriptions]" value="0"<?php if ($pun_config['o_subscriptions'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Activer l'abonnement des utilisateurs aux discussions  (rÃ©ception d'un e-mail lors d'une rÃ©ponse).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Adresse serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym></th>
 									<td>
 										<input type="text" name="form[smtp_host]" size="30" maxlength="100" value="<?php echo pun_htmlspecialchars($pun_config['o_smtp_host']) ?>" />
-										<span><?php echo $lang_admin_options['SMTP address help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['SMTP username label'] ?></th>
+										<span>L'adresse d'un serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym> externe pour envoyer des e-mails. Vous pouvez spÃ©cifier un numÃ©ro de port si le serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym> n'utilise pas le port par dÃ©faut 25 (<abbr title="exemple">ex.</abbr> smtp.monhote.com:3580). Laissez vide pour utiliser le programme local d'envoi d'e-mails.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Nom d'utilisateur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym></th>
 									<td>
 										<input type="text" name="form[smtp_user]" size="25" maxlength="50" value="<?php echo pun_htmlspecialchars($pun_config['o_smtp_user']) ?>" />
-										<span><?php echo $lang_admin_options['SMTP username help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['SMTP password label'] ?></th>
-									<td>
-										<span><input type="checkbox" name="form[smtp_change_pass]" value="1" />&#160;&#160;<?php echo $lang_admin_options['SMTP change password help'] ?></span>
-<?php $smtp_pass = !empty($pun_config['o_smtp_pass']) ? random_key(pun_strlen($pun_config['o_smtp_pass']), true) : ''; ?>
-										<input type="password" name="form[smtp_pass1]" size="25" maxlength="50" value="<?php echo $smtp_pass ?>" />
-										<input type="password" name="form[smtp_pass2]" size="25" maxlength="50" value="<?php echo $smtp_pass ?>" />
-										<span><?php echo $lang_admin_options['SMTP password help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['SMTP SSL label'] ?></th>
-									<td>
-										<input type="radio" name="form[smtp_ssl]" value="1"<?php if ($pun_config['o_smtp_ssl'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[smtp_ssl]" value="0"<?php if ($pun_config['o_smtp_ssl'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['SMTP SSL help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Registration subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Allow new label'] ?></th>
-									<td>
-										<input type="radio" name="form[regs_allow]" value="1"<?php if ($pun_config['o_regs_allow'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[regs_allow]" value="0"<?php if ($pun_config['o_regs_allow'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Allow new help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Verify label'] ?></th>
-									<td>
-										<input type="radio" name="form[regs_verify]" value="1"<?php if ($pun_config['o_regs_verify'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[regs_verify]" value="0"<?php if ($pun_config['o_regs_verify'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Verify help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Report new label'] ?></th>
-									<td>
-										<input type="radio" name="form[regs_report]" value="1"<?php if ($pun_config['o_regs_report'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[regs_report]" value="0"<?php if ($pun_config['o_regs_report'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Report new help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Use rules label'] ?></th>
-									<td>
-										<input type="radio" name="form[rules]" value="1"<?php if ($pun_config['o_rules'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[rules]" value="0"<?php if ($pun_config['o_rules'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Use rules help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Rules label'] ?></th>
+										<span>Nom d'utilisateur du serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym>. Saisissez un nom d'utilisateur seulement si cela est nÃ©cessaire pour le serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym> (la plupart des serveurs <strong>ne demande pas</strong> d'authentification).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Mot de passe <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym></th>
+									<td>
+										<input type="text" name="form[smtp_pass]" size="25" maxlength="50" value="<?php echo pun_htmlspecialchars($pun_config['o_smtp_pass']) ?>" />
+										<span>Le mot de passe pour le serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym>. Saisissez un mot de passe seulement si cela est nÃ©cessaire pour le serveur <acronym title="Simple Mail Transfer Protocol" lang="en">SMTP</acronym> (la plupart des serveurs <strong>ne demande pas</strong> d'authentification).</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Inscriptions</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Autoriser les nouvelles inscriptions</th>
+									<td>
+										<input type="radio" name="form[regs_allow]" value="1"<?php if ($pun_config['o_regs_allow'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[regs_allow]" value="0"<?php if ($pun_config['o_regs_allow'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Permet d'accepter ou non les nouvelles inscriptions aux forums. DÃ©sactivez seulement en cas de circonstances spÃ©ciales.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">VÃ©rification des inscriptions</th>
+									<td>
+										<input type="radio" name="form[regs_verify]" value="1"<?php if ($pun_config['o_regs_verify'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[regs_verify]" value="0"<?php if ($pun_config['o_regs_verify'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Si cette option est activÃ©e, lors de leur inscription les utilisateurs recevront par e-mail un mot de passe alÃ©atoire. Ils pourront alors s'identifier et, si ils le souhaitent, changer le mot de passe depuis leur profil. Cette option nÃ©cessite que les utilisateurs valident leur adresse e-mail si jamais ils veulent la changer depuis leur profil. C'est une bonne mÃ©thode pour limiter les incriptions abusives et pour Ãªtre sÃ»r que les utilisateurs ont une adresse e-mail valide dans leur profil.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Activer rÃšgles d'utilisation</th>
+									<td>
+										<input type="radio" name="form[rules]" value="1"<?php if ($pun_config['o_rules'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[rules]" value="0"<?php if ($pun_config['o_rules'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Lorsque cette option est activÃ©e, les utilisateurs devront accepter les rÃšgles d'utilisation lors de leur inscription (saisissez le texte ci-dessous). Les rÃšgles d'utilisation seront Ã©galement consultables depuis un lien situÃ© dans la barre principale en haut de chaque pages.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">RÃšgles d'utilisation</th>
 									<td>
 										<textarea name="form[rules_message]" rows="10" cols="55"><?php echo pun_htmlspecialchars($pun_config['o_rules_message']) ?></textarea>
-										<span><?php echo $lang_admin_options['Rules help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['E-mail default label'] ?></th>
-									<td>
-										<span><?php echo $lang_admin_options['E-mail default help'] ?></span>
-										<input type="radio" name="form[default_email_setting]" value="0"<?php if ($pun_config['o_default_email_setting'] == '0') echo ' checked="checked"' ?> />&#160;<?php echo $lang_admin_options['Display e-mail label'] ?><br />
-										<input type="radio" name="form[default_email_setting]" value="1"<?php if ($pun_config['o_default_email_setting'] == '1') echo ' checked="checked"' ?> />&#160;<?php echo $lang_admin_options['Hide allow form label'] ?><br />
-										<input type="radio" name="form[default_email_setting]" value="2"<?php if ($pun_config['o_default_email_setting'] == '2') echo ' checked="checked"' ?> />&#160;<?php echo $lang_admin_options['Hide both label'] ?><br />
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Announcement subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Display announcement label'] ?></th>
-									<td>
-										<input type="radio" name="form[announcement]" value="1"<?php if ($pun_config['o_announcement'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[announcement]" value="0"<?php if ($pun_config['o_announcement'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Display announcement help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Announcement message label'] ?></th>
+										<span>Ici vous pouvez saisir toutes les rÃšgles d'utilisation ou toutes autres informations que les utilisateurs devront lire et accepter lors de leur inscription. Si vous activez les rÃšgles d'utilisation ci-dessus vous devez saisir quelque chose ici, sinon elles seront dÃ©sactivÃ©es. Ce texte n'est pas analysÃ© comme un message des forums et peut contenir du <acronym title="HyperText Markup Language" lang="en">HTML</acronym>.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Annonce</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Afficher annonce</th>
+									<td>
+										<input type="radio" name="form[announcement]" value="1"<?php if ($pun_config['o_announcement'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[announcement]" value="0"<?php if ($pun_config['o_announcement'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Activez cette option pour afficher sur les forums le texte ci-dessous.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Message de l'annonce</th>
 									<td>
 										<textarea name="form[announcement_message]" rows="5" cols="55"><?php echo pun_htmlspecialchars($pun_config['o_announcement_message']) ?></textarea>
-										<span><?php echo $lang_admin_options['Announcement message help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_options['Maintenance subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><a name="maintenance"><?php echo $lang_admin_options['Maintenance mode label'] ?></a></th>
-									<td>
-										<input type="radio" name="form[maintenance]" value="1"<?php if ($pun_config['o_maintenance'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[maintenance]" value="0"<?php if ($pun_config['o_maintenance'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_options['Maintenance mode help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_options['Maintenance message label'] ?></th>
+										<span>Ce texte n'est pas analysÃ© comme un message des forums et peut contenir du <acronym title="HyperText Markup Language" lang="en">HTML</acronym>.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Maintenance</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row"><a name="maintenance">Mode maintenance</a></th>
+									<td>
+										<input type="radio" name="form[maintenance]" value="1"<?php if ($pun_config['o_maintenance'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[maintenance]" value="0"<?php if ($pun_config['o_maintenance'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Lorsque cette fonctionnalitÃ© est activÃ©e, les forums ne seront disponibles que pour les administrateurs. Ceci peut Ãªtre utilisÃ© si les forums doivent Ãªtre fermÃ©s temporairement pour maintenance. ATTENTION ! Ne vous dÃ©connectez pas lorsque les forums sont en mode maintenance. Vous ne pourrez pas vous reconnecter.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Message de maintenance</th>
 									<td>
 										<textarea name="form[maintenance_message]" rows="5" cols="55"><?php echo pun_htmlspecialchars($pun_config['o_maintenance_message']) ?></textarea>
-										<span><?php echo $lang_admin_options['Maintenance message help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<p class="submitend"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" /></p>
+										<span>Le message qui sera affichÃ© aux utilisateurs lorsque les forums sont en mode maintenance. Si laissÃ© vide, le message par dÃ©faut sera utilisÃ©. Ce texte n'est pas analysÃ© comme un message des forums et peut contenir du <acronym title="HyperText Markup Language" lang="en">HTML</acronym>.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<p class="submitend"><input type="submit" name="save" value=" Enregistrer " /></p>
 			</form>
 		</div>
Index: trunk/web/punbb/admin_permissions.php
===================================================================
--- trunk/web/punbb/admin_permissions.php	(revision 10)
+++ trunk/web/punbb/admin_permissions.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_permissions.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_permissions.php';
 
 if (isset($_POST['form_sent']))
@@ -27,145 +42,181 @@
 	$form = array_map('intval', $_POST['form']);
 
-	foreach ($form as $key => $input)
+	while (list($key, $input) = @each($form))
 	{
 		// Only update values that have changed
 		if (array_key_exists('p_'.$key, $pun_config) && $pun_config['p_'.$key] != $input)
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value='.$input.' WHERE conf_name=\'p_'.$db->escape($key).'\'') or error('Unable to update board config', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'config SET conf_value='.$input.' WHERE conf_name=\'p_'.$db->escape($key).'\'') or error('Impossible de mettre Ã  jour la configuration des forums', __FILE__, __LINE__, $db->error());
 	}
 
 	// Regenerate the config cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_config_cache();
 
-	redirect('admin_permissions.php', $lang_admin_permissions['Perms updated redirect']);
+	redirect('admin_permissions.php', 'Permissions modifiÃ©es. Redirection ...');
 }
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Permissions']);
-define('PUN_ACTIVE_PAGE', 'admin');
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Permissions';
 require PUN_ROOT.'header.php';
-
 generate_admin_menu('permissions');
 
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_permissions['Permissions head'] ?></span></h2>
+		<h2><span>Permissions</span></h2>
 		<div class="box">
 			<form method="post" action="admin_permissions.php">
-				<p class="submittop"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" /></p>
-				<div class="inform">
-					<input type="hidden" name="form_sent" value="1" />
-					<fieldset>
-						<legend><?php echo $lang_admin_permissions['Posting subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['BBCode label'] ?></th>
-									<td>
-										<input type="radio" name="form[message_bbcode]" value="1"<?php if ($pun_config['p_message_bbcode'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[message_bbcode]" value="0"<?php if ($pun_config['p_message_bbcode'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['BBCode help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Image tag label'] ?></th>
-									<td>
-										<input type="radio" name="form[message_img_tag]" value="1"<?php if ($pun_config['p_message_img_tag'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[message_img_tag]" value="0"<?php if ($pun_config['p_message_img_tag'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['Image tag help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['All caps message label'] ?></th>
-									<td>
-										<input type="radio" name="form[message_all_caps]" value="1"<?php if ($pun_config['p_message_all_caps'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[message_all_caps]" value="0"<?php if ($pun_config['p_message_all_caps'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['All caps message help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['All caps subject label'] ?></th>
-									<td>
-										<input type="radio" name="form[subject_all_caps]" value="1"<?php if ($pun_config['p_subject_all_caps'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[subject_all_caps]" value="0"<?php if ($pun_config['p_subject_all_caps'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['All caps subject help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Require e-mail label'] ?></th>
-									<td>
-										<input type="radio" name="form[force_guest_email]" value="1"<?php if ($pun_config['p_force_guest_email'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[force_guest_email]" value="0"<?php if ($pun_config['p_force_guest_email'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['Require e-mail help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_permissions['Signatures subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['BBCode sigs label'] ?></th>
-									<td>
-										<input type="radio" name="form[sig_bbcode]" value="1"<?php if ($pun_config['p_sig_bbcode'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[sig_bbcode]" value="0"<?php if ($pun_config['p_sig_bbcode'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['BBCode sigs help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Image tag sigs label'] ?></th>
-									<td>
-										<input type="radio" name="form[sig_img_tag]" value="1"<?php if ($pun_config['p_sig_img_tag'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[sig_img_tag]" value="0"<?php if ($pun_config['p_sig_img_tag'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['Image tag sigs help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['All caps sigs label'] ?></th>
-									<td>
-										<input type="radio" name="form[sig_all_caps]" value="1"<?php if ($pun_config['p_sig_all_caps'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[sig_all_caps]" value="0"<?php if ($pun_config['p_sig_all_caps'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['All caps sigs help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Max sig length label'] ?></th>
+				<p class="submittop"><input type="submit" name="save" value=" Enregistrer " /></p>
+				<div class="inform">
+				<input type="hidden" name="form_sent" value="1" />
+					<fieldset>
+						<legend>Ãcriture</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">BBCode</th>
+									<td>
+										<input type="radio" name="form[message_bbcode]" value="1"<?php if ($pun_config['p_message_bbcode'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[message_bbcode]" value="0"<?php if ($pun_config['p_message_bbcode'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser l'utilisaton du BBCode dans les messages (recommandÃ©).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Balise Image</th>
+									<td>
+										<input type="radio" name="form[message_img_tag]" value="1"<?php if ($pun_config['p_message_img_tag'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[message_img_tag]" value="0"<?php if ($pun_config['p_message_img_tag'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser l'utilisation de la balise BBCode [img][/img] dans les messages.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Message tout en majuscules</th>
+									<td>
+										<input type="radio" name="form[message_all_caps]" value="1"<?php if ($pun_config['p_message_all_caps'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[message_all_caps]" value="0"<?php if ($pun_config['p_message_all_caps'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les messages qui ne contiennent que des lettres en majuscules.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Sujet tout en majuscules</th>
+									<td>
+										<input type="radio" name="form[subject_all_caps]" value="1"<?php if ($pun_config['p_subject_all_caps'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[subject_all_caps]" value="0"<?php if ($pun_config['p_subject_all_caps'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les sujets qui ne contiennent que des lettres en majuscules.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">E-mail invitÃ© obligatoire</th>
+									<td>
+										<input type="radio" name="form[force_guest_email]" value="1"<?php if ($pun_config['p_force_guest_email'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[force_guest_email]" value="0"<?php if ($pun_config['p_force_guest_email'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Obliger les invitÃ©s Ã  donner une adresse e-mail pour Ã©crire un message.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Signatures</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">BBCode dans les signatures</th>
+									<td>
+										<input type="radio" name="form[sig_bbcode]" value="1"<?php if ($pun_config['p_sig_bbcode'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[sig_bbcode]" value="0"<?php if ($pun_config['p_sig_bbcode'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser l'utilisation du BBCodes dans les signatures des utilisateurs.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Balise image dans les signatures</th>
+									<td>
+										<input type="radio" name="form[sig_img_tag]" value="1"<?php if ($pun_config['p_sig_img_tag'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[sig_img_tag]" value="0"<?php if ($pun_config['p_sig_img_tag'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser l'utilisation de la balise BBCode [img][/img] dans la signature des utilisateurs (non recommandÃ©).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Signature tout en majuscules</th>
+									<td>
+										<input type="radio" name="form[sig_all_caps]" value="1"<?php if ($pun_config['p_sig_all_caps'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[sig_all_caps]" value="0"<?php if ($pun_config['p_sig_all_caps'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les signatures qui ne contiennent que des lettres en majuscules.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Longueur maximum des signatures</th>
 									<td>
 										<input type="text" name="form[sig_length]" size="5" maxlength="5" value="<?php echo $pun_config['p_sig_length'] ?>" />
-										<span><?php echo $lang_admin_permissions['Max sig length help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Max sig lines label'] ?></th>
+										<span>Le nombre maximum de caractÃšres qu'une signature d'utilisateur puisse contenir.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Nombre maximum de lignes dans les signatures</th>
 									<td>
 										<input type="text" name="form[sig_lines]" size="3" maxlength="3" value="<?php echo $pun_config['p_sig_lines'] ?>" />
-										<span><?php echo $lang_admin_permissions['Max sig lines help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_permissions['Registration subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Banned e-mail label'] ?></th>
-									<td>
-										<input type="radio" name="form[allow_banned_email]" value="1"<?php if ($pun_config['p_allow_banned_email'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[allow_banned_email]" value="0"<?php if ($pun_config['p_allow_banned_email'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['Banned e-mail help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_permissions['Duplicate e-mail label'] ?></th>
-									<td>
-										<input type="radio" name="form[allow_dupe_email]" value="1"<?php if ($pun_config['p_allow_dupe_email'] == '1') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="form[allow_dupe_email]" value="0"<?php if ($pun_config['p_allow_dupe_email'] == '0') echo ' checked="checked"' ?> />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_permissions['Duplicate e-mail help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<p class="submitend"><input type="submit" name="save" value="<?php echo $lang_admin_common['Save changes'] ?>" /></p>
+										<span>Le nombre maximum de lignes qu'une signature d'utilisateur puisse contenir.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>ModÃ©rateurs</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Modifier les profils utilisateurs</th>
+									<td>
+										<input type="radio" name="form[mod_edit_users]" value="1"<?php if ($pun_config['p_mod_edit_users'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[mod_edit_users]" value="0"<?php if ($pun_config['p_mod_edit_users'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les modÃ©rateurs Ã  modifier les profils des utilisateurs.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Renommer utilisateurs</th>
+									<td>
+										<input type="radio" name="form[mod_rename_users]" value="1"<?php if ($pun_config['p_mod_rename_users'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[mod_rename_users]" value="0"<?php if ($pun_config['p_mod_rename_users'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les modÃ©rateurs Ã  renommer les utilisateurs. A l'exception des autres modÃ©rateurs et des administrateurs.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Changer les mots de passe des utilisateurs</th>
+									<td>
+										<input type="radio" name="form[mod_change_passwords]" value="1"<?php if ($pun_config['p_mod_change_passwords'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[mod_change_passwords]" value="0"<?php if ($pun_config['p_mod_change_passwords'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les modÃ©rateurs Ã  changer les mots de passe des utilisateurs. A l'exception des autres modÃ©rateurs et des administrateurs.</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Bannir utilisateurs</th>
+									<td>
+										<input type="radio" name="form[mod_ban_users]" value="1"<?php if ($pun_config['p_mod_ban_users'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[mod_ban_users]" value="0"<?php if ($pun_config['p_mod_ban_users'] == '0') echo ' checked="checked"' ?> />&#160;<strong>Non</strong>
+										<span>Autoriser les modÃ©rateurs Ã  bannir les utilisateurs (et modifier/supprimer les bannissements en cours).</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<div class="inform">
+					<fieldset>
+						<legend>Inscriptions</legend>
+						<div class="infldset">
+							<table class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Autoriser les adresses e-mail bannies</th>
+									<td>
+										<input type="radio" name="form[allow_banned_email]" value="1"<?php if ($pun_config['p_allow_banned_email'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[allow_banned_email]" value="0"<?php if ($pun_config['p_allow_banned_email'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs Ã  s'inscrire (ou changer d'adresse) avec une adresse/un domaine e-mail bannis. Si vous laissez cette option Ã  son rÃ©glage par dÃ©faut (oui) ceci sera possible mais une alerte par e-mail sera envoyÃ©e Ã  la liste d'adresses e-mail des forums (une maniÃšre efficace pour dÃ©tecter les inscriptions multiples).</span>
+									</td>
+								</tr>
+								<tr>
+									<th scope="row">Autoriser les adresses e-mail en double</th>
+									<td>
+										<input type="radio" name="form[allow_dupe_email]" value="1"<?php if ($pun_config['p_allow_dupe_email'] == '1') echo ' checked="checked"' ?> />&#160;<strong>Oui</strong>&#160;&#160;&#160;<input type="radio" name="form[allow_dupe_email]" value="0"<?php if ($pun_config['p_allow_dupe_email'] == '0') echo ' checked="checked"' ?> />
+										&#160;<strong>Non</strong>
+										<span>Autoriser les utilisateurs Ã  s'inscrire avec une adresse e-mail dÃ©jÃ  utilisÃ©e par un autre nom d'utilisateur. Si autorisÃ© une alerte e-mail sera envoyÃ©e Ã  la liste d'adresses e-mail des forums lorsqu'un doublon sera dÃ©tectÃ©.</span>
+									</td>
+								</tr>
+							</table>
+						</div>
+					</fieldset>
+				</div>
+				<p class="submitend"><input type="submit" name="save" value=" Enregistrer " /></p>
 			</form>
 		</div>
Index: trunk/web/punbb/admin_ranks.php
===================================================================
--- trunk/web/punbb/admin_ranks.php	(revision 10)
+++ trunk/web/punbb/admin_ranks.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if ($pun_user['g_id'] != PUN_ADMIN)
+if ($pun_user['g_id'] > PUN_ADMIN)
 	message($lang_common['No permission']);
 
-// Load the admin_ranks.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_ranks.php';
 
 // Add a rank
@@ -26,27 +41,25 @@
 	confirm_referrer('admin_ranks.php');
 
-	$rank = pun_trim($_POST['new_rank']);
-	$min_posts = trim($_POST['new_min_posts']);
+	$rank = trim($_POST['new_rank']);
+	$min_posts = $_POST['new_min_posts'];
 
 	if ($rank == '')
-		message($lang_admin_ranks['Must enter title message']);
+		message('Vous devez saisir un titre au rang.');
 
-	if ($min_posts == '' || preg_match('%[^0-9]%', $min_posts))
-		message($lang_admin_ranks['Must be integer message']);
+	if (!preg_match('#^\d+$#', $min_posts))
+		message('Le nombre minimum de messages doit Ãªtre un entier positif.');
 
 	// Make sure there isn't already a rank with the same min_posts value
 	$result = $db->query('SELECT 1 FROM '.$db->prefix.'ranks WHERE min_posts='.$min_posts) or error('Unable to fetch rank info', __FILE__, __LINE__, $db->error());
 	if ($db->num_rows($result))
-		message(sprintf($lang_admin_ranks['Dupe min posts message'], $min_posts));
+		message('Il y a dÃ©jÃ  un rang avec un nombre minimum de '.$min_posts.'messages.');
 
-	$db->query('INSERT INTO '.$db->prefix.'ranks (rank, min_posts) VALUES(\''.$db->escape($rank).'\', '.$min_posts.')') or error('Unable to add rank', __FILE__, __LINE__, $db->error());
+	$db->query('INSERT INTO '.$db->prefix.'ranks (rank, min_posts) VALUES(\''.$db->escape($rank).'\', '.$min_posts.')') or error('Impossible d\'ajouter le rang', __FILE__, __LINE__, $db->error());
 
 	// Regenerate the ranks cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_ranks_cache();
 
-	redirect('admin_ranks.php', $lang_admin_ranks['Rank added redirect']);
+	redirect('admin_ranks.php', 'Rang ajoutÃ©. Redirection ...');
 }
 
@@ -59,27 +72,25 @@
 	$id = intval(key($_POST['update']));
 
-	$rank = pun_trim($_POST['rank'][$id]);
+	$rank = trim($_POST['rank'][$id]);
 	$min_posts = trim($_POST['min_posts'][$id]);
 
 	if ($rank == '')
-		message($lang_admin_ranks['Must enter title message']);
+		message('You must enter a rank title.');
 
-	if ($min_posts == '' || preg_match('%[^0-9]%', $min_posts))
-		message($lang_admin_ranks['Must be integer message']);
+	if (!preg_match('#^\d+$#', $min_posts))
+		message('Le nombre minimum de messages doit Ãªtre un entier positif.');
 
 	// Make sure there isn't already a rank with the same min_posts value
-	$result = $db->query('SELECT 1 FROM '.$db->prefix.'ranks WHERE id!='.$id.' AND min_posts='.$min_posts) or error('Unable to fetch rank info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT 1 FROM '.$db->prefix.'ranks WHERE id!='.$id.' && min_posts='.$min_posts) or error('Impossible de retrouver les informations des rangs', __FILE__, __LINE__, $db->error());
 	if ($db->num_rows($result))
-		message(sprintf($lang_admin_ranks['Dupe min posts message'], $min_posts));
+		message('Il y a dÃ©jÃ  un rang avec un nombre minimum de '.$min_posts.' messages.');
 
-	$db->query('UPDATE '.$db->prefix.'ranks SET rank=\''.$db->escape($rank).'\', min_posts='.$min_posts.' WHERE id='.$id) or error('Unable to update rank', __FILE__, __LINE__, $db->error());
+	$db->query('UPDATE '.$db->prefix.'ranks SET rank=\''.$db->escape($rank).'\', min_posts='.$min_posts.' WHERE id='.$id) or error('Impossible de modifier les rangs', __FILE__, __LINE__, $db->error());
 
 	// Regenerate the ranks cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_ranks_cache();
 
-	redirect('admin_ranks.php', $lang_admin_ranks['Rank updated redirect']);
+	redirect('admin_ranks.php', 'Rangs modifiÃ©s. Redirection ...');
 }
 
@@ -92,18 +103,16 @@
 	$id = intval(key($_POST['remove']));
 
-	$db->query('DELETE FROM '.$db->prefix.'ranks WHERE id='.$id) or error('Unable to delete rank', __FILE__, __LINE__, $db->error());
+	$db->query('DELETE FROM '.$db->prefix.'ranks WHERE id='.$id) or error('Impossible de supprimer le rang', __FILE__, __LINE__, $db->error());
 
 	// Regenerate the ranks cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_ranks_cache();
 
-	redirect('admin_ranks.php', $lang_admin_ranks['Rank removed redirect']);
+	redirect('admin_ranks.php', 'Rang supprimÃ©. Redirection ...');
 }
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Ranks']);
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Rangs';
 $focus_element = array('ranks', 'new_rank');
-define('PUN_ACTIVE_PAGE', 'admin');
 require PUN_ROOT.'header.php';
 
@@ -112,25 +121,25 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_ranks['Ranks head'] ?></span></h2>
+		<h2><span>Rangs</span></h2>
 		<div class="box">
-			<form id="ranks" method="post" action="admin_ranks.php">
+			<form id="ranks" method="post" action="admin_ranks.php?action=foo">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_ranks['Add rank subhead'] ?></legend>
+						<legend>Ajouter un rang</legend>
 						<div class="infldset">
-							<p><?php echo $lang_admin_ranks['Add rank info'].' '.($pun_config['o_ranks'] == '1' ? sprintf($lang_admin_ranks['Ranks enabled'], '<a href="admin_options.php#ranks">'.$lang_admin_common['Options'].'</a>') : sprintf($lang_admin_ranks['Ranks disabled'], '<a href="admin_options.php#ranks">'.$lang_admin_common['Options'].'</a>')) ?></p>
-							<table cellspacing="0">
+							<p>Saisissez un titre de rang et un nombre minimum de messages que l'utilisateur devra atteindre afin d'obtenir ce rang. Plusieurs rangs ne peuvent avoir le mÃªme nombre minimum de messages. Si un titre est donnÃ© Ã  un utilisateur, le titre sera affichÃ© Ã  la place du rang. <strong>Les rangs utilisateurs doivent Ãªtres activÃ©s Ã  la page <a href="admin_options.php#ranks">Options</a> pour qu'ils aient un quelconque effet.</strong></p>
+							<table  cellspacing="0">
 							<thead>
 								<tr>
-									<th class="tcl" scope="col"><?php echo $lang_admin_ranks['Rank title label'] ?></th>
-									<th class="tc2" scope="col"><?php echo $lang_admin_ranks['Minimum posts label'] ?></th>
-									<th class="hidehead" scope="col"><?php echo $lang_admin_ranks['Actions label'] ?></th>
+									<th class="tcl" scope="col">Titre du rang</th>
+									<th class="tc2" scope="col">Nombre minimum de messages</th>
+									<th class="hidehead" scope="col">Action</th>
 								</tr>
 							</thead>
 							<tbody>
 								<tr>
-									<td class="tcl"><input type="text" name="new_rank" size="24" maxlength="50" tabindex="1" /></td>
-									<td class="tc2"><input type="text" name="new_min_posts" size="7" maxlength="7" tabindex="2" /></td>
-									<td><input type="submit" name="add_rank" value="<?php echo $lang_admin_common['Add'] ?>" tabindex="3" /></td>
+									<td><input type="text" name="new_rank" size="24" maxlength="50" tabindex="1" /></td>
+									<td><input type="text" name="new_min_posts" size="7" maxlength="7" tabindex="2" /></td>
+									<td><input type="submit" name="add_rank" value=" Ajouter " tabindex="3" /></td>
 								</tr>
 							</tbody>
@@ -141,19 +150,19 @@
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_ranks['Edit remove subhead'] ?></legend>
+						<legend>Modifier/supprimer les rangs</legend>
 						<div class="infldset">
 <?php
 
-$result = $db->query('SELECT id, rank, min_posts FROM '.$db->prefix.'ranks ORDER BY min_posts') or error('Unable to fetch rank list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT id, rank, min_posts FROM '.$db->prefix.'ranks ORDER BY min_posts') or error('Impossible de retrouver la liste des rangs', __FILE__, __LINE__, $db->error());
 if ($db->num_rows($result))
 {
 
 ?>
-							<table cellspacing="0">
+							<table  cellspacing="0">
 							<thead>
 								<tr>
-									<th class="tcl" scope="col"><?php echo $lang_admin_ranks['Rank title label'] ?></th>
-									<th class="tc2" scope="col"><?php echo $lang_admin_ranks['Minimum posts label'] ?></th>
-									<th class="hidehead" scope="col"><?php echo $lang_admin_ranks['Actions label'] ?></th>
+									<th class="tcl" scope="col"><strong>Titre du rang</strong></th>
+									<th class="tc2" scope="col"><strong>Nombre minimum de messages</strong></th>
+									<th class="hidehead" scope="col">Actions</th>
 								</tr>
 							</thead>
@@ -162,5 +171,5 @@
 
 	while ($cur_rank = $db->fetch_assoc($result))
-		echo "\t\t\t\t\t\t\t\t".'<tr><td class="tcl"><input type="text" name="rank['.$cur_rank['id'].']" value="'.pun_htmlspecialchars($cur_rank['rank']).'" size="24" maxlength="50" /></td><td class="tc2"><input type="text" name="min_posts['.$cur_rank['id'].']" value="'.$cur_rank['min_posts'].'" size="7" maxlength="7" /></td><td><input type="submit" name="update['.$cur_rank['id'].']" value="'.$lang_admin_common['Update'].'" />&#160;<input type="submit" name="remove['.$cur_rank['id'].']" value="'.$lang_admin_common['Remove'].'" /></td></tr>'."\n";
+		echo "\t\t\t\t\t\t\t\t".'<tr><td><input type="text" name="rank['.$cur_rank['id'].']" value="'.pun_htmlspecialchars($cur_rank['rank']).'" size="24" maxlength="50" /></td><td><input type="text" name="min_posts['.$cur_rank['id'].']" value="'.$cur_rank['min_posts'].'" size="7" maxlength="7" /></td><td><input type="submit" name="update['.$cur_rank['id'].']" value="Modifier" />&#160;<input type="submit" name="remove['.$cur_rank['id'].']" value="Supprimer" /></td></tr>'."\n";
 
 ?>
@@ -171,5 +180,5 @@
 }
 else
-	echo "\t\t\t\t\t\t\t".'<p>'.$lang_admin_ranks['No ranks in list'].'</p>'."\n";
+	echo "\t\t\t\t\t\t\t".'<p>Aucun rang dans la liste.</p>'."\n";
 
 ?>
Index: trunk/web/punbb/admin_reports.php
===================================================================
--- trunk/web/punbb/admin_reports.php	(revision 10)
+++ trunk/web/punbb/admin_reports.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if (!$pun_user['is_admmod'])
+if ($pun_user['g_id'] > PUN_MOD)
 	message($lang_common['No permission']);
 
-// Load the admin_reports.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_reports.php';
 
 // Zap a report
@@ -28,24 +43,15 @@
 	$zap_id = intval(key($_POST['zap_id']));
 
-	$result = $db->query('SELECT zapped FROM '.$db->prefix.'reports WHERE id='.$zap_id) or error('Unable to fetch report info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT zapped FROM '.$db->prefix.'reports WHERE id='.$zap_id) or error('Impossible de retrouver les informations de signalements', __FILE__, __LINE__, $db->error());
 	$zapped = $db->result($result);
 
 	if ($zapped == '')
-		$db->query('UPDATE '.$db->prefix.'reports SET zapped='.time().', zapped_by='.$pun_user['id'].' WHERE id='.$zap_id) or error('Unable to zap report', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'reports SET zapped='.time().', zapped_by='.$pun_user['id'].' WHERE id='.$zap_id) or error('Impossible d\'ignorer le signalement', __FILE__, __LINE__, $db->error());
 
-	// Delete old reports (which cannot be viewed anyway)
-	$result = $db->query('SELECT zapped FROM '.$db->prefix.'reports WHERE zapped IS NOT NULL ORDER BY zapped DESC LIMIT 10,1') or error('Unable to fetch read reports to delete', __FILE__, __LINE__, $db->error());
-	if ($db->num_rows($result) > 0)
-	{
-		$zapped_threshold = $db->result($result);
-		$db->query('DELETE FROM '.$db->prefix.'reports WHERE zapped <= '.$zapped_threshold) or error('Unable to delete old read reports', __FILE__, __LINE__, $db->error());
-	}
-
-	redirect('admin_reports.php', $lang_admin_reports['Report zapped redirect']);
+	redirect('admin_reports.php', 'Signalement ignorÃ©. Redirection ...');
 }
 
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Reports']);
-define('PUN_ACTIVE_PAGE', 'admin');
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Signalements';
 require PUN_ROOT.'header.php';
 
@@ -54,10 +60,10 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_reports['New reports head'] ?></span></h2>
+		<h2><span>Nouveaux signalements</span></h2>
 		<div class="box">
 			<form method="post" action="admin_reports.php?action=zap">
 <?php
 
-$result = $db->query('SELECT r.id, r.topic_id, r.forum_id, r.reported_by, r.created, r.message, p.id AS pid, t.subject, f.forum_name, u.username AS reporter FROM '.$db->prefix.'reports AS r LEFT JOIN '.$db->prefix.'posts AS p ON r.post_id=p.id LEFT JOIN '.$db->prefix.'topics AS t ON r.topic_id=t.id LEFT JOIN '.$db->prefix.'forums AS f ON r.forum_id=f.id LEFT JOIN '.$db->prefix.'users AS u ON r.reported_by=u.id WHERE r.zapped IS NULL ORDER BY created DESC') or error('Unable to fetch report list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT r.id, r.post_id, r.topic_id, r.forum_id, r.reported_by, r.created, r.message, t.subject, f.forum_name, u.username AS reporter FROM '.$db->prefix.'reports AS r LEFT JOIN '.$db->prefix.'topics AS t ON r.topic_id=t.id LEFT JOIN '.$db->prefix.'forums AS f ON r.forum_id=f.id LEFT JOIN '.$db->prefix.'users AS u ON r.reported_by=u.id WHERE r.zapped IS NULL ORDER BY created DESC') or error('Impossible de retrouver la liste des signalements', __FILE__, __LINE__, $db->error());
 
 if ($db->num_rows($result))
@@ -65,23 +71,22 @@
 	while ($cur_report = $db->fetch_assoc($result))
 	{
-		$reporter = ($cur_report['reporter'] != '') ? '<a href="profile.php?id='.$cur_report['reported_by'].'">'.pun_htmlspecialchars($cur_report['reporter']).'</a>' : $lang_admin_reports['Deleted user'];
-		$forum = ($cur_report['forum_name'] != '') ? '<span><a href="viewforum.php?id='.$cur_report['forum_id'].'">'.pun_htmlspecialchars($cur_report['forum_name']).'</a></span>' : '<span>'.$lang_admin_reports['Deleted'].'</span>';
-		$topic = ($cur_report['subject'] != '') ? '<span>Â»&#160;<a href="viewtopic.php?id='.$cur_report['topic_id'].'">'.pun_htmlspecialchars($cur_report['subject']).'</a></span>' : '<span>Â»&#160;'.$lang_admin_reports['Deleted'].'</span>';
-		$post = str_replace("\n", '<br />', pun_htmlspecialchars($cur_report['message']));
-		$post_id = ($cur_report['pid'] != '') ? '<span>Â»&#160;<a href="viewtopic.php?pid='.$cur_report['pid'].'#p'.$cur_report['pid'].'">'.sprintf($lang_admin_reports['Post ID'], $cur_report['pid']).'</a></span>' : '<span>Â»&#160;'.$lang_admin_reports['Deleted'].'</span>';
-		$report_location = array($forum, $topic, $post_id);
+		$reporter = ($cur_report['reporter'] != '') ? '<a href="profile.php?id='.$cur_report['reported_by'].'">'.pun_htmlspecialchars($cur_report['reporter']).'</a>' : 'Utilisateur supprimÃ©';
+		$forum = ($cur_report['forum_name'] != '') ? '<a href="viewforum.php?id='.$cur_report['forum_id'].'">'.pun_htmlspecialchars($cur_report['forum_name']).'</a>' : 'SupprimÃ©';
+		$topic = ($cur_report['subject'] != '') ? '<a href="viewtopic.php?id='.$cur_report['topic_id'].'">'.pun_htmlspecialchars($cur_report['subject']).'</a>' : 'SupprimÃ©';
+		$post = ($cur_report['post_id'] != '') ? str_replace("\n", '<br />', pun_htmlspecialchars($cur_report['message'])) : 'SupprimÃ©';
+		$postid = ($cur_report['post_id'] != '') ? '<a href="viewtopic.php?pid='.$cur_report['post_id'].'#p'.$cur_report['post_id'].'">Post #'.$cur_report['post_id'].'</a>' : 'SupprimÃ©';
 
 ?>
 				<div class="inform">
 					<fieldset>
-						<legend><?php printf($lang_admin_reports['Report subhead'], format_time($cur_report['created'])) ?></legend>
+						<legend>SignalÃ© le <?php echo format_time($cur_report['created']) ?></legend>
 						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
+							<table cellspacing="0">
 								<tr>
-									<th scope="row"><?php printf($lang_admin_reports['Reported by'], $reporter) ?></th>
-									<td class="location"><?php echo implode(' ', $report_location) ?></td>
+									<th scope="row">Forum&#160;&raquo;&#160;Discussion&#160;&raquo;&#160;Message</th>
+									<td><?php echo $forum ?>&#160;&raquo;&#160;<?php echo $topic ?>&#160;&raquo;&#160;<?php echo $postid ?></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_reports['Reason'] ?><div><input type="submit" name="zap_id[<?php echo $cur_report['id'] ?>]" value="<?php echo $lang_admin_reports['Zap'] ?>" /></div></th>
+									<th scope="row">SignalÃ© par <?php echo $reporter ?><div><input type="submit" name="zap_id[<?php echo $cur_report['id'] ?>]" value=" Ignorer " /></div></th>
 									<td><?php echo $post ?></td>
 								</tr>
@@ -95,18 +100,5 @@
 }
 else
-{
-
-?>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_common['None'] ?></legend>
-						<div class="infldset">
-							<p><?php echo $lang_admin_reports['No new reports'] ?></p>
-						</div>
-					</fieldset>
-				</div>
-<?php
-
-}
+	echo "\t\t\t\t".'<p>Il n\'y a pas de nouveaux signalements.</p>'."\n";
 
 ?>
@@ -116,10 +108,10 @@
 
 	<div class="blockform block2">
-		<h2><span><?php echo $lang_admin_reports['Last 10 head'] ?></span></h2>
+		<h2><span>10 derniers signalements ignorÃ©s</span></h2>
 		<div class="box">
 			<div class="fakeform">
 <?php
 
-$result = $db->query('SELECT r.id, r.topic_id, r.forum_id, r.reported_by, r.message, r.zapped, r.zapped_by AS zapped_by_id, p.id AS pid, t.subject, f.forum_name, u.username AS reporter, u2.username AS zapped_by FROM '.$db->prefix.'reports AS r LEFT JOIN '.$db->prefix.'posts AS p ON r.post_id=p.id LEFT JOIN '.$db->prefix.'topics AS t ON r.topic_id=t.id LEFT JOIN '.$db->prefix.'forums AS f ON r.forum_id=f.id LEFT JOIN '.$db->prefix.'users AS u ON r.reported_by=u.id LEFT JOIN '.$db->prefix.'users AS u2 ON r.zapped_by=u2.id WHERE r.zapped IS NOT NULL ORDER BY zapped DESC LIMIT 10') or error('Unable to fetch report list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT r.id, r.post_id, r.topic_id, r.forum_id, r.reported_by, r.message, r.zapped, r.zapped_by AS zapped_by_id, t.subject, f.forum_name, u.username AS reporter, u2.username AS zapped_by FROM '.$db->prefix.'reports AS r LEFT JOIN '.$db->prefix.'topics AS t ON r.topic_id=t.id LEFT JOIN '.$db->prefix.'forums AS f ON r.forum_id=f.id LEFT JOIN '.$db->prefix.'users AS u ON r.reported_by=u.id LEFT JOIN '.$db->prefix.'users AS u2 ON r.zapped_by=u2.id WHERE r.zapped IS NOT NULL ORDER BY zapped DESC LIMIT 10') or error('Impossible de retrouver la liste des signalements', __FILE__, __LINE__, $db->error());
 
 if ($db->num_rows($result))
@@ -127,25 +119,23 @@
 	while ($cur_report = $db->fetch_assoc($result))
 	{
-		$reporter = ($cur_report['reporter'] != '') ? '<a href="profile.php?id='.$cur_report['reported_by'].'">'.pun_htmlspecialchars($cur_report['reporter']).'</a>' : $lang_admin_reports['Deleted user'];
-		$forum = ($cur_report['forum_name'] != '') ? '<span><a href="viewforum.php?id='.$cur_report['forum_id'].'">'.pun_htmlspecialchars($cur_report['forum_name']).'</a></span>' : '<span>'.$lang_admin_reports['Deleted'].'</span>';
-		$topic = ($cur_report['subject'] != '') ? '<span>Â»&#160;<a href="viewtopic.php?id='.$cur_report['topic_id'].'">'.pun_htmlspecialchars($cur_report['subject']).'</a></span>' : '<span>Â»&#160;'.$lang_admin_reports['Deleted'].'</span>';
-		$post = str_replace("\n", '<br />', pun_htmlspecialchars($cur_report['message']));
-		$post_id = ($cur_report['pid'] != '') ? '<span>Â»&#160;<a href="viewtopic.php?pid='.$cur_report['pid'].'#p'.$cur_report['pid'].'">'.sprintf($lang_admin_reports['Post ID'], $cur_report['pid']).'</a></span>' : '<span>Â»&#160;'.$lang_admin_reports['Deleted'].'</span>';
-		$zapped_by = ($cur_report['zapped_by'] != '') ? '<a href="profile.php?id='.$cur_report['zapped_by_id'].'">'.pun_htmlspecialchars($cur_report['zapped_by']).'</a>' : $lang_admin_reports['NA'];
-		$zapped_by = ($cur_report['zapped_by'] != '') ? '<strong>'.pun_htmlspecialchars($cur_report['zapped_by']).'</strong>' : $lang_admin_reports['NA'];
-		$report_location = array($forum, $topic, $post_id);
+		$reporter = ($cur_report['reporter'] != '') ? '<a href="profile.php?id='.$cur_report['reported_by'].'">'.pun_htmlspecialchars($cur_report['reporter']).'</a>' : 'Utilisateur supprimÃ©';
+		$forum = ($cur_report['forum_name'] != '') ? '<a href="viewforum.php?id='.$cur_report['forum_id'].'">'.pun_htmlspecialchars($cur_report['forum_name']).'</a>' : 'SupprimÃ©';
+		$topic = ($cur_report['subject'] != '') ? '<a href="viewtopic.php?id='.$cur_report['topic_id'].'">'.pun_htmlspecialchars($cur_report['subject']).'</a>' : 'SupprimÃ©';
+		$post = ($cur_report['post_id'] != '') ? str_replace("\n", '<br />', pun_htmlspecialchars($cur_report['message'])) : 'SupprimÃ©';
+		$post_id = ($cur_report['post_id'] != '') ? '<a href="viewtopic.php?pid='.$cur_report['post_id'].'#p'.$cur_report['post_id'].'">Post #'.$cur_report['post_id'].'</a>' : 'SupprimÃ©';
+		$zapped_by = ($cur_report['zapped_by'] != '') ? '<a href="profile.php?id='.$cur_report['zapped_by_id'].'">'.pun_htmlspecialchars($cur_report['zapped_by']).'</a>' : 'N/A';
 
 ?>
 				<div class="inform">
 					<fieldset>
-						<legend><?php printf($lang_admin_reports['Zapped subhead'], format_time($cur_report['zapped']), $zapped_by) ?></legend>
+						<legend>Zapped <?php echo format_time($cur_report['zapped']) ?></legend>
 						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
+							<table cellspacing="0">
 								<tr>
-									<th scope="row"><?php printf($lang_admin_reports['Reported by'], $reporter) ?></th>
-									<td class="location"><?php echo implode(' ', $report_location) ?></td>
+									<th scope="row">Forum&#160;&raquo;&#160;Discussion&#160;&raquo;&#160;Message</th>
+									<td><?php echo $forum ?>&#160;&raquo;&#160;<?php echo $topic ?>&#160;&raquo;&#160;<?php echo $post_id ?></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_reports['Reason'] ?></th>
+									<th scope="row">SignalÃ© par <?php echo $reporter ?><div class="topspace">IgnorÃ© par <?php echo $zapped_by ?></div></th>
 									<td><?php echo $post ?></td>
 								</tr>
@@ -159,18 +149,5 @@
 }
 else
-{
-
-?>
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_common['None'] ?></legend>
-						<div class="infldset">
-							<p><?php echo $lang_admin_reports['No zapped reports'] ?></p>
-						</div>
-					</fieldset>
-				</div>
-<?php
-
-}
+	echo "\t\t\t\t".'<p>Il n\'y a pas de signalement ignorÃ©.</p>'."\n";
 
 ?>
Index: trunk/web/punbb/admin_users.php
===================================================================
--- trunk/web/punbb/admin_users.php	(revision 10)
+++ trunk/web/punbb/admin_users.php	(revision 1)
@@ -1,23 +1,38 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the admin template
 define('PUN_ADMIN_CONSOLE', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 require PUN_ROOT.'include/common_admin.php';
 
 
-if (!$pun_user['is_admmod'])
+if ($pun_user['g_id'] > PUN_MOD)
 	message($lang_common['No permission']);
 
-// Load the admin_users.php language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_users.php';
 
 // Show IP statistics for a certain user ID
@@ -28,38 +43,17 @@
 		message($lang_common['Bad request']);
 
-	// Fetch ip count
-	$result = $db->query('SELECT poster_ip, MAX(posted) AS last_used FROM '.$db->prefix.'posts WHERE poster_id='.$ip_stats.' GROUP BY poster_ip') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-	$num_ips = $db->num_rows($result);
-
-	// Determine the ip offset (based on $_GET['p'])
-	$num_pages = ceil($num_ips / 50);
-
-	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
-	$start_from = 50 * ($p - 1);
-
-	// Generate paging links
-	$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'admin_users.php?ip_stats='.$ip_stats );
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Users'], $lang_admin_users['Results head']);
-	define('PUN_ACTIVE_PAGE', 'admin');
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Utilisateurs';
 	require PUN_ROOT.'header.php';
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_users['Results head'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<div><a href="javascript:history.go(-1)">Retour</a></div>
 	</div>
 </div>
 
 <div id="users1" class="blocktable">
-	<h2><span><?php echo $lang_admin_users['Results head'] ?></span></h2>
+	<h2><span>Utilisateurs</span></h2>
 	<div class="box">
 		<div class="inbox">
@@ -67,8 +61,8 @@
 			<thead>
 				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_admin_users['Results IP address head'] ?></th>
-					<th class="tc2" scope="col"><?php echo $lang_admin_users['Results last used head'] ?></th>
-					<th class="tc3" scope="col"><?php echo $lang_admin_users['Results times found head'] ?></th>
-					<th class="tcr" scope="col"><?php echo $lang_admin_users['Results action head'] ?></th>
+					<th class="tcl" scope="col">Adresse <acronym title="Internet Protocol" lang="en">IP</acronym></th>
+					<th class="tc2" scope="col">DerniÃšre visite</th>
+					<th class="tc3" scope="col">Occurences</th>
+					<th class="tcr" scope="col">Action</th>
 				</tr>
 			</thead>
@@ -76,5 +70,5 @@
 <?php
 
-	$result = $db->query('SELECT poster_ip, MAX(posted) AS last_used, COUNT(id) AS used_times FROM '.$db->prefix.'posts WHERE poster_id='.$ip_stats.' GROUP BY poster_ip ORDER BY last_used DESC LIMIT '.$start_from.', 50') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT poster_ip, MAX(posted) AS last_used, COUNT(id) AS used_times FROM '.$db->prefix.'posts WHERE poster_id='.$ip_stats.' GROUP BY poster_ip ORDER BY last_used DESC') or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 	if ($db->num_rows($result))
 	{
@@ -87,5 +81,5 @@
 					<td class="tc2"><?php echo format_time($cur_ip['last_used']) ?></td>
 					<td class="tc3"><?php echo $cur_ip['used_times'] ?></td>
-					<td class="tcr"><a href="admin_users.php?show_users=<?php echo $cur_ip['poster_ip'] ?>"><?php echo $lang_admin_users['Results find more link'] ?></a></td>
+					<td class="tcr"><a href="admin_users.php?show_users=<?php echo $cur_ip['poster_ip'] ?>">Trouver plus d'utilisateur pour cette <acronym title="Internet Protocol" lang="en">IP</acronym></a></td>
 				</tr>
 <?php
@@ -94,5 +88,5 @@
 	}
 	else
-		echo "\t\t\t\t".'<tr><td class="tcl" colspan="4">'.$lang_admin_users['Results no posts found'].'</td></tr>'."\n";
+		echo "\t\t\t\t".'<tr><td class="tcl" colspan="4">Il n\'y a actuellement aucun message de cet utilisateur dans les forums.</td></tr>'."\n";
 
 ?>
@@ -104,14 +98,6 @@
 
 <div class="linksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_users['Results head'] ?></strong></li>
-		</ul>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<div><a href="javascript:history.go(-1)">Retour</a></div>
 	</div>
 </div>
@@ -124,43 +110,22 @@
 if (isset($_GET['show_users']))
 {
-	$ip = trim($_GET['show_users']);
-
-	if (!@preg_match('%^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$%', $ip) && !@preg_match('%^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$%', $ip))
-		message($lang_admin_users['Bad IP message']);
-
-	// Fetch user count
-	$result = $db->query('SELECT DISTINCT poster_id, poster FROM '.$db->prefix.'posts WHERE poster_ip=\''.$db->escape($ip).'\'') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-	$num_users = $db->num_rows($result);
-
-	// Determine the user offset (based on $_GET['p'])
-	$num_pages = ceil($num_users / 50);
-
-	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
-	$start_from = 50 * ($p - 1);
-
-	// Generate paging links
-	$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'admin_users.php?show_users='.$ip);
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Users'], $lang_admin_users['Results head']);
-	define('PUN_ACTIVE_PAGE', 'admin');
+	$ip = $_GET['show_users'];
+
+	if (!preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $ip))
+		message('L\'adresse IP soumise n\'est pas correctement formÃ©e.');
+
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Utilisateurs';
 	require PUN_ROOT.'header.php';
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_users['Results head'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<div><a href="javascript:history.go(-1)">Retour</a></div>
 	</div>
 </div>
 
 <div id="users2" class="blocktable">
-	<h2><span><?php echo $lang_admin_users['Results head'] ?></span></h2>
+	<h2><span>Utilisateurs</span></h2>
 	<div class="box">
 		<div class="inbox">
@@ -168,10 +133,10 @@
 			<thead>
 				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_admin_users['Results username head'] ?></th>
-					<th class="tc2" scope="col"><?php echo $lang_admin_users['Results e-mail head'] ?></th>
-					<th class="tc3" scope="col"><?php echo $lang_admin_users['Results title head'] ?></th>
-					<th class="tc4" scope="col"><?php echo $lang_admin_users['Results posts head'] ?></th>
-					<th class="tc5" scope="col"><?php echo $lang_admin_users['Results admin note head'] ?></th>
-					<th class="tcr" scope="col"><?php echo $lang_admin_users['Results actions head'] ?></th>
+					<th class="tcl" scope="col">Nom d'utilisateur</th>
+					<th class="tc2" scope="col">E-mail</th>
+					<th class="tc3" scope="col">Titre/Statut</th>
+					<th class="tc4" scope="col">Messages</th>
+					<th class="tc5" scope="col">Note admin</th>
+					<th class="tcr" scope="col">Actions</th>
 				</tr>
 			</thead>
@@ -179,5 +144,5 @@
 <?php
 
-	$result = $db->query('SELECT DISTINCT poster_id, poster FROM '.$db->prefix.'posts WHERE poster_ip=\''.$db->escape($ip).'\' ORDER BY poster DESC') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT DISTINCT poster_id, poster FROM '.$db->prefix.'posts WHERE poster_ip=\''.$db->escape($ip).'\' ORDER BY poster DESC') or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 	$num_posts = $db->num_rows($result);
 
@@ -189,5 +154,5 @@
 			list($poster_id, $poster) = $db->fetch_row($result);
 
-			$result2 = $db->query('SELECT u.id, u.username, u.email, u.title, u.num_posts, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1 AND u.id='.$poster_id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+			$result2 = $db->query('SELECT u.id, u.username, u.email, u.title, u.num_posts, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1 AND u.id='.$poster_id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 
 			if (($user_data = $db->fetch_assoc($result2)))
@@ -195,5 +160,5 @@
 				$user_title = get_title($user_data);
 
-				$actions = '<a href="admin_users.php?ip_stats='.$user_data['id'].'">'.$lang_admin_users['Results view IP link'].'</a> | <a href="search.php?action=show_user_posts&amp;user_id='.$user_data['id'].'">'.$lang_admin_users['Results show posts link'].'</a>';
+				$actions = '<a href="admin_users.php?ip_stats='.$user_data['id'].'">Voir stats IP</a> - <a href="search.php?action=show_user&amp;user_id='.$user_data['id'].'">Afficher messages</a>';
 
 ?>
@@ -202,6 +167,6 @@
 					<td class="tc2"><a href="mailto:<?php echo $user_data['email'] ?>"><?php echo $user_data['email'] ?></a></td>
 					<td class="tc3"><?php echo $user_title ?></td>
-					<td class="tc4"><?php echo forum_number_format($user_data['num_posts']) ?></td>
-					<td class="tc5"><?php echo ($user_data['admin_note'] != '') ? pun_htmlspecialchars($user_data['admin_note']) : '&#160;' ?></td>
+					<td class="tc4"><?php echo $user_data['num_posts'] ?></td>
+					<td class="tc5"><?php echo ($user_data['admin_note'] != '') ? $user_data['admin_note'] : '&#160;' ?></td>
 					<td class="tcr"><?php echo $actions ?></td>
 				</tr>
@@ -216,5 +181,5 @@
 					<td class="tcl"><?php echo pun_htmlspecialchars($poster) ?></td>
 					<td class="tc2">&#160;</td>
-					<td class="tc3"><?php echo $lang_admin_users['Results guest'] ?></td>
+					<td class="tc3">InvitÃ©</td>
 					<td class="tc4">&#160;</td>
 					<td class="tc5">&#160;</td>
@@ -227,5 +192,5 @@
 	}
 	else
-		echo "\t\t\t\t".'<tr><td class="tcl" colspan="6">'.$lang_admin_users['Results no IP found'].'</td></tr>'."\n";
+		echo "\t\t\t\t".'<tr><td class="tcl" colspan="6">L\'adresse IP soumise est introuvable dans la base de donnÃ©es.</td></tr>'."\n";
 
 ?>
@@ -237,14 +202,6 @@
 
 <div class="linksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_users['Results head'] ?></strong></li>
-		</ul>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<div><a href="javascript:history.go(-1)">Retour</a></div>
 	</div>
 </div>
@@ -254,578 +211,79 @@
 
 
-// Move multiple users to other user groups
-else if (isset($_POST['move_users']) || isset($_POST['move_users_comply']))
+else if (isset($_POST['find_user']))
 {
-	if ($pun_user['g_id'] > PUN_ADMIN)
-		message($lang_common['No permission']);
-
-	confirm_referrer('admin_users.php');
-
-	if (isset($_POST['users']))
-	{
-		$user_ids = is_array($_POST['users']) ? array_keys($_POST['users']) : explode(',', $_POST['users']);
-		$user_ids = array_map('intval', $user_ids);
-
-		// Delete invalid IDs
-		$user_ids = array_diff($user_ids, array(0, 1));
-	}
-	else
-		$user_ids = array();
-
-	if (empty($user_ids))
-		message($lang_admin_users['No users selected']);
-
-	// Are we trying to batch move any admins?
-	$result = $db->query('SELECT COUNT(*) FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).') AND group_id='.PUN_ADMIN) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-	if ($db->result($result) > 0)
-		message($lang_admin_users['No move admins message']);
-
-	// Fetch all user groups
-	$all_groups = array();
-	$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id NOT IN ('.PUN_GUEST.','.PUN_ADMIN.') ORDER BY g_title ASC') or error('Unable to fetch groups', __FILE__, __LINE__, $db->error());
-	while ($row = $db->fetch_row($result))
-		$all_groups[$row[0]] = $row[1];
-
-	if (isset($_POST['move_users_comply']))
-	{
-		$new_group = isset($_POST['new_group']) && isset($all_groups[$_POST['new_group']]) ? $_POST['new_group'] : message($lang_admin_users['Invalid group message']);
-
-		// Is the new group a moderator group?
-		$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$new_group) or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
-		$new_group_mod = $db->result($result);
-
-		// Fetch user groups
-		$user_groups = array();
-		$result = $db->query('SELECT id, group_id FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).')') or error('Unable to fetch user groups', __FILE__, __LINE__, $db->error());
-		while ($cur_user = $db->fetch_assoc($result))
-		{
-			if (!isset($user_groups[$cur_user['group_id']]))
-				$user_groups[$cur_user['group_id']] = array();
-
-			$user_groups[$cur_user['group_id']][] = $cur_user['id'];
-		}
-
-		// Are any users moderators?
-		$group_ids = array_keys($user_groups);
-		$result = $db->query('SELECT g_id, g_moderator FROM '.$db->prefix.'groups WHERE g_id IN ('.implode(',', $group_ids).')') or error('Unable to fetch group moderators', __FILE__, __LINE__, $db->error());
-		while ($cur_group = $db->fetch_assoc($result))
-		{
-			if ($cur_group['g_moderator'] == '0')
-				unset($user_groups[$cur_group['g_id']]);
-		}
-
-		if (!empty($user_groups) && $new_group != PUN_ADMIN && $new_group_mod != '1')
-		{
-			// Fetch forum list and clean up their moderator list
-			$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
-			while ($cur_forum = $db->fetch_assoc($result))
-			{
-				$cur_moderators = ($cur_forum['moderators'] != '') ? unserialize($cur_forum['moderators']) : array();
-
-				foreach ($user_groups as $group_users)
-					$cur_moderators = array_diff($cur_moderators, $group_users);
-
-				$cur_moderators = (!empty($cur_moderators)) ? '\''.$db->escape(serialize($cur_moderators)).'\'' : 'NULL';
-				$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
-			}
-		}
-
-		// Change user group
-		$db->query('UPDATE '.$db->prefix.'users SET group_id='.$new_group.' WHERE id IN ('.implode(',', $user_ids).')') or error('Unable to change user group', __FILE__, __LINE__, $db->error());
-
-		redirect('admin_users.php', $lang_admin_users['Users move redirect']);
-	}
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Users'], $lang_admin_users['Move users']);
-	define('PUN_ACTIVE_PAGE', 'admin');
-	require PUN_ROOT.'header.php';
-
-	generate_admin_menu('users');
-
-?>
-	<div class="blockform">
-		<h2><span><?php echo $lang_admin_users['Move users'] ?></span></h2>
-		<div class="box">
-			<form name="confirm_move_users" method="post" action="admin_users.php">
-				<input type="hidden" name="users" value="<?php echo implode(',', $user_ids) ?>" />
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_users['Move users subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['New group label'] ?></th>
-									<td>
-										<select name="new_group" tabindex="1">
-<?php foreach ($all_groups as $gid => $group) : ?>											<option value="<?php echo $gid ?>"><?php echo pun_htmlspecialchars($group) ?></option>
-<?php endforeach; ?>
-										</select>
-										<span><?php echo $lang_admin_users['New group help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<p class="submitend"><input type="submit" name="move_users_comply" value="<?php echo $lang_admin_common['Save'] ?>" tabindex="2" /></p>
-			</form>
-		</div>
-	</div>
-	<div class="clearer"></div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-}
-
-
-// Delete multiple users
-else if (isset($_POST['delete_users']) || isset($_POST['delete_users_comply']))
-{
-	if ($pun_user['g_id'] > PUN_ADMIN)
-		message($lang_common['No permission']);
-
-	confirm_referrer('admin_users.php');
-
-	if (isset($_POST['users']))
-	{
-		$user_ids = is_array($_POST['users']) ? array_keys($_POST['users']) : explode(',', $_POST['users']);
-		$user_ids = array_map('intval', $user_ids);
-
-		// Delete invalid IDs
-		$user_ids = array_diff($user_ids, array(0, 1));
-	}
-	else
-		$user_ids = array();
-
-	if (empty($user_ids))
-		message($lang_admin_users['No users selected']);
-
-	// Are we trying to delete any admins?
-	$result = $db->query('SELECT COUNT(*) FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).') AND group_id='.PUN_ADMIN) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-	if ($db->result($result) > 0)
-		message($lang_admin_users['No delete admins message']);
-
-	if (isset($_POST['delete_users_comply']))
-	{
-		// Fetch user groups
-		$user_groups = array();
-		$result = $db->query('SELECT id, group_id FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).')') or error('Unable to fetch user groups', __FILE__, __LINE__, $db->error());
-		while ($cur_user = $db->fetch_assoc($result))
-		{
-			if (!isset($user_groups[$cur_user['group_id']]))
-				$user_groups[$cur_user['group_id']] = array();
-
-			$user_groups[$cur_user['group_id']][] = $cur_user['id'];
-		}
-
-		// Are any users moderators?
-		$group_ids = array_keys($user_groups);
-		$result = $db->query('SELECT g_id, g_moderator FROM '.$db->prefix.'groups WHERE g_id IN ('.implode(',', $group_ids).')') or error('Unable to fetch group moderators', __FILE__, __LINE__, $db->error());
-		while ($cur_group = $db->fetch_assoc($result))
-		{
-			if ($cur_group['g_moderator'] == '0')
-				unset($user_groups[$cur_group['g_id']]);
-		}
-
-		// Fetch forum list and clean up their moderator list
-		$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
-		while ($cur_forum = $db->fetch_assoc($result))
-		{
-			$cur_moderators = ($cur_forum['moderators'] != '') ? unserialize($cur_forum['moderators']) : array();
-
-			foreach ($user_groups as $group_users)
-				$cur_moderators = array_diff($cur_moderators, $group_users);
-
-			$cur_moderators = (!empty($cur_moderators)) ? '\''.$db->escape(serialize($cur_moderators)).'\'' : 'NULL';
-			$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
-		}
-
-		// Delete any subscriptions
-		$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE user_id IN ('.implode(',', $user_ids).')') or error('Unable to delete topic subscriptions', __FILE__, __LINE__, $db->error());
-		$db->query('DELETE FROM '.$db->prefix.'forum_subscriptions WHERE user_id IN ('.implode(',', $user_ids).')') or error('Unable to delete forum subscriptions', __FILE__, __LINE__, $db->error());
-
-		// Remove them from the online list (if they happen to be logged in)
-		$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id IN ('.implode(',', $user_ids).')') or error('Unable to remove users from online list', __FILE__, __LINE__, $db->error());
-
-		// Should we delete all posts made by these users?
-		if (isset($_POST['delete_posts']))
-		{
-			require PUN_ROOT.'include/search_idx.php';
-			@set_time_limit(0);
-
-			// Find all posts made by this user
-			$result = $db->query('SELECT p.id, p.topic_id, t.forum_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE p.poster_id IN ('.implode(',', $user_ids).')') or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
-			if ($db->num_rows($result))
-			{
-				while ($cur_post = $db->fetch_assoc($result))
-				{
-					// Determine whether this post is the "topic post" or not
-					$result2 = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$cur_post['topic_id'].' ORDER BY posted LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-
-					if ($db->result($result2) == $cur_post['id'])
-						delete_topic($cur_post['topic_id']);
-					else
-						delete_post($cur_post['id'], $cur_post['topic_id']);
-
-					update_forum($cur_post['forum_id']);
-				}
-			}
-		}
-		else
-			// Set all their posts to guest
-			$db->query('UPDATE '.$db->prefix.'posts SET poster_id=1 WHERE poster_id IN ('.implode(',', $user_ids).')') or error('Unable to update posts', __FILE__, __LINE__, $db->error());
-
-		// Delete the users
-		$db->query('DELETE FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).')') or error('Unable to delete users', __FILE__, __LINE__, $db->error());
-
-		// Delete user avatars
-		foreach ($user_ids as $user_id)
-			delete_avatar($user_id);
-
-		// Regenerate the users info cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_users_info_cache();
-
-		redirect('admin_users.php', $lang_admin_users['Users delete redirect']);
-	}
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Users'], $lang_admin_users['Delete users']);
-	define('PUN_ACTIVE_PAGE', 'admin');
-	require PUN_ROOT.'header.php';
-
-	generate_admin_menu('users');
-
-?>
-	<div class="blockform">
-		<h2><span><?php echo $lang_admin_users['Delete users'] ?></span></h2>
-		<div class="box">
-			<form name="confirm_del_users" method="post" action="admin_users.php">
-				<input type="hidden" name="users" value="<?php echo implode(',', $user_ids) ?>" />
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_users['Confirm delete legend'] ?></legend>
-						<div class="infldset">
-							<p><?php echo $lang_admin_users['Confirm delete info'] ?></p>
-							<div class="rbox">
-								<label><input type="checkbox" name="delete_posts" value="1" checked="checked" /><?php echo $lang_admin_users['Delete posts'] ?><br /></label>
-							</div>
-							<p class="warntext"><strong><?php echo $lang_admin_users['Delete warning'] ?></strong></p>
-						</div>
-					</fieldset>
-				</div>
-				<p class="buttons"><input type="submit" name="delete_users_comply" value="<?php echo $lang_admin_users['Delete'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_admin_common['Go back'] ?></a></p>
-			</form>
-		</div>
-	</div>
-	<div class="clearer"></div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-}
-
-
-// Ban multiple users
-else if (isset($_POST['ban_users']) || isset($_POST['ban_users_comply']))
-{
-	if ($pun_user['g_id'] != PUN_ADMIN && ($pun_user['g_moderator'] != '1' || $pun_user['g_mod_ban_users'] == '0'))
-		message($lang_common['No permission']);
-
-	confirm_referrer('admin_users.php');
-
-	if (isset($_POST['users']))
-	{
-		$user_ids = is_array($_POST['users']) ? array_keys($_POST['users']) : explode(',', $_POST['users']);
-		$user_ids = array_map('intval', $user_ids);
-
-		// Delete invalid IDs
-		$user_ids = array_diff($user_ids, array(0, 1));
-	}
-	else
-		$user_ids = array();
-
-	if (empty($user_ids))
-		message($lang_admin_users['No users selected']);
-
-	// Are we trying to ban any admins?
-	$result = $db->query('SELECT COUNT(*) FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).') AND group_id='.PUN_ADMIN) or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
-	if ($db->result($result) > 0)
-		message($lang_admin_users['No ban admins message']);
-
-	// Also, we cannot ban moderators
-	$result = $db->query('SELECT COUNT(*) FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id WHERE g.g_moderator=1 AND u.id IN ('.implode(',', $user_ids).')') or error('Unable to fetch moderator group info', __FILE__, __LINE__, $db->error());
-	if ($db->result($result) > 0)
-		message($lang_admin_users['No ban mods message']);
-
-	if (isset($_POST['ban_users_comply']))
-	{
-		$ban_message = pun_trim($_POST['ban_message']);
-		$ban_expire = pun_trim($_POST['ban_expire']);
-		$ban_the_ip = isset($_POST['ban_the_ip']) ? intval($_POST['ban_the_ip']) : 0;
-
-		if ($ban_expire != '' && $ban_expire != 'Never')
-		{
-			$ban_expire = strtotime($ban_expire.' GMT');
-
-			if ($ban_expire == -1 || !$ban_expire)
-				message($lang_admin_users['Invalid date message'].' '.$lang_admin_users['Invalid date reasons']);
-
-			$diff = ($pun_user['timezone'] + $pun_user['dst']) * 3600;
-			$ban_expire -= $diff;
-
-			if ($ban_expire <= time())
-				message($lang_admin_users['Invalid date message'].' '.$lang_admin_users['Invalid date reasons']);
-		}
-		else
-			$ban_expire = 'NULL';
-
-		$ban_message = ($ban_message != '') ? '\''.$db->escape($ban_message).'\'' : 'NULL';
-
-		// Fetch user information
-		$user_info = array();
-		$result = $db->query('SELECT id, username, email, registration_ip FROM '.$db->prefix.'users WHERE id IN ('.implode(',', $user_ids).')') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-		while ($cur_user = $db->fetch_assoc($result))
-			$user_info[$cur_user['id']] = array('username' => $cur_user['username'], 'email' => $cur_user['email'], 'ip' => $cur_user['registration_ip']);
-
-		// Overwrite the registration IP with one from the last post (if it exists)
-		if ($ban_the_ip != 0)
-		{
-			$result = $db->query('SELECT p.poster_id, p.poster_ip FROM '.$db->prefix.'posts AS p INNER JOIN (SELECT MAX(id) AS id FROM '.$db->prefix.'posts WHERE poster_id IN ('.implode(',', $user_ids).') GROUP BY poster_id) AS i ON p.id=i.id') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-			while ($cur_address = $db->fetch_assoc($result))
-				$user_info[$cur_address['poster_id']]['ip'] = $cur_address['poster_ip'];
-		}
-
-		// And insert the bans!
-		foreach ($user_ids as $user_id)
-		{
-			$ban_username = '\''.$db->escape($user_info[$user_id]['username']).'\'';
-			$ban_email = '\''.$db->escape($user_info[$user_id]['email']).'\'';
-			$ban_ip = ($ban_the_ip != 0) ? '\''.$db->escape($user_info[$user_id]['ip']).'\'' : 'NULL';
-
-			$db->query('INSERT INTO '.$db->prefix.'bans (username, ip, email, message, expire, ban_creator) VALUES('.$ban_username.', '.$ban_ip.', '.$ban_email.', '.$ban_message.', '.$ban_expire.', '.$pun_user['id'].')') or error('Unable to add ban', __FILE__, __LINE__, $db->error());
-		}
-
-		// Regenerate the bans cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_bans_cache();
-
-		redirect('admin_users.php', $lang_admin_users['Users banned redirect']);
-	}
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Bans']);
-	$focus_element = array('bans2', 'ban_message');
-	define('PUN_ACTIVE_PAGE', 'admin');
-	require PUN_ROOT.'header.php';
-
-	generate_admin_menu('users');
-
-?>
-	<div class="blockform">
-		<h2><span><?php echo $lang_admin_users['Ban users'] ?></span></h2>
-		<div class="box">
-			<form id="bans2" name="confirm_ban_users" method="post" action="admin_users.php">
-				<input type="hidden" name="users" value="<?php echo implode(',', $user_ids) ?>" />
-				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_admin_users['Message expiry subhead'] ?></legend>
-						<div class="infldset">
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Ban message label'] ?></th>
-									<td>
-										<input type="text" name="ban_message" size="50" maxlength="255" tabindex="1" />
-										<span><?php echo $lang_admin_users['Ban message help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Expire date label'] ?></th>
-									<td>
-										<input type="text" name="ban_expire" size="17" maxlength="10" tabindex="2" />
-										<span><?php echo $lang_admin_users['Expire date help'] ?></span>
-									</td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Ban IP label'] ?></th>
-									<td>
-										<input type="radio" name="ban_the_ip" tabindex="3" value="1" checked="checked" />&#160;<strong><?php echo $lang_admin_common['Yes'] ?></strong>&#160;&#160;&#160;<input type="radio" name="ban_the_ip" tabindex="4" value="0" checked="checked" />&#160;<strong><?php echo $lang_admin_common['No'] ?></strong>
-										<span><?php echo $lang_admin_users['Ban IP help'] ?></span>
-									</td>
-								</tr>
-							</table>
-						</div>
-					</fieldset>
-				</div>
-				<p class="submitend"><input type="submit" name="ban_users_comply" value="<?php echo $lang_admin_common['Save'] ?>" tabindex="3" /></p>
-			</form>
-		</div>
-	</div>
-	<div class="clearer"></div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-}
-
-
-else if (isset($_GET['find_user']))
-{
-	$form = isset($_GET['form']) ? $_GET['form'] : array();
+	$form = $_POST['form'];
+	$form['username'] = $_POST['username'];
 
 	// trim() all elements in $form
-	$form = array_map('pun_trim', $form);
-	$conditions = $query_str = array();
-
-	$posts_greater = isset($_GET['posts_greater']) ? trim($_GET['posts_greater']) : '';
-	$posts_less = isset($_GET['posts_less']) ? trim($_GET['posts_less']) : '';
-	$last_post_after = isset($_GET['last_post_after']) ? trim($_GET['last_post_after']) : '';
-	$last_post_before = isset($_GET['last_post_before']) ? trim($_GET['last_post_before']) : '';
-	$last_visit_after = isset($_GET['last_visit_after']) ? trim($_GET['last_visit_after']) : '';
-	$last_visit_before = isset($_GET['last_visit_before']) ? trim($_GET['last_visit_before']) : '';
-	$registered_after = isset($_GET['registered_after']) ? trim($_GET['registered_after']) : '';
-	$registered_before = isset($_GET['registered_before']) ? trim($_GET['registered_before']) : '';
-	$order_by = isset($_GET['order_by']) && in_array($_GET['order_by'], array('username', 'email', 'num_posts', 'last_post', 'last_visit', 'registered')) ? $_GET['order_by'] : 'username';
-	$direction = isset($_GET['direction']) && $_GET['direction'] == 'DESC' ? 'DESC' : 'ASC';
-	$user_group = isset($_GET['user_group']) ? intval($_GET['user_group']) : -1;
-
-	$query_str[] = 'order_by='.$order_by;
-	$query_str[] = 'direction='.$direction;
-	$query_str[] = 'user_group='.$user_group;
-
-	if (preg_match('%[^0-9]%', $posts_greater.$posts_less))
-		message($lang_admin_users['Non numeric message']);
+	$form = array_map('trim', $form);
+	$conditions = array();
+	
+	$posts_greater = trim($_POST['posts_greater']);
+	$posts_less = trim($_POST['posts_less']);
+	$last_post_after = trim($_POST['last_post_after']);
+	$last_post_before = trim($_POST['last_post_before']);
+	$registered_after = trim($_POST['registered_after']);
+	$registered_before = trim($_POST['registered_before']);
+	$order_by = $_POST['order_by'];
+	$direction = $_POST['direction'];
+	$user_group = $_POST['user_group'];
+
+	if (preg_match('/[^0-9]/', $posts_greater.$posts_less))
+		message('Vous avez saisi une donnÃ©e non-numÃ©rique dans un champ qui en requiÃšre une.');
 
 	// Try to convert date/time to timestamps
 	if ($last_post_after != '')
+		$last_post_after = strtotime($last_post_after);
+	if ($last_post_before != '')
+		$last_post_before = strtotime($last_post_before);
+	if ($registered_after != '')
+		$registered_after = strtotime($registered_after);
+	if ($registered_before != '')
+		$registered_before = strtotime($registered_before);
+
+	if ($last_post_after == -1 || $last_post_before == -1 || $registered_after == -1 || $registered_before == -1)
+		message('Vous avez saisi une date/heure invalide.');
+
+	if ($last_post_after != '')
+		$conditions[] = 'u.last_post>'.$last_post_after;
+	if ($last_post_before != '')
+		$conditions[] = 'u.last_post<'.$last_post_before;
+	if ($registered_after != '')
+		$conditions[] = 'u.registered>'.$registered_after;
+	if ($registered_before != '')
+		$conditions[] = 'u.registered<'.$registered_before;
+
+	$like_command = ($db_type == 'pgsql') ? 'ILIKE' : 'LIKE';
+	while (list($key, $input) = @each($form))
 	{
-		$query_str[] = 'last_post_after='.$last_post_after;
-
-		$last_post_after = strtotime($last_post_after);
-		if ($last_post_after === false || $last_post_after == -1)
-			message($lang_admin_users['Invalid date time message']);
-
-		$conditions[] = 'u.last_post>'.$last_post_after;
+		if ($input != '')
+			$conditions[] = 'u.'.$db->escape($key).' '.$like_command.' \''.$db->escape(str_replace('*', '%', $input)).'\'';
 	}
-	if ($last_post_before != '')
-	{
-		$query_str[] = 'last_post_before='.$last_post_before;
-
-		$last_post_before = strtotime($last_post_before);
-		if ($last_post_before === false || $last_post_before == -1)
-			message($lang_admin_users['Invalid date time message']);
-
-		$conditions[] = 'u.last_post<'.$last_post_before;
-	}
-	if ($last_visit_after != '')
-	{
-		$query_str[] = 'last_visit_after='.$last_visit_after;
-
-		$last_visit_after = strtotime($last_visit_after);
-		if ($last_visit_after === false || $last_visit_after == -1)
-			message($lang_admin_users['Invalid date time message']);
-
-		$conditions[] = 'u.last_visit>'.$last_visit_after;
-	}
-	if ($last_visit_before != '')
-	{
-		$query_str[] = 'last_visit_before='.$last_visit_before;
-
-		$last_visit_before = strtotime($last_visit_before);
-		if ($last_visit_before === false || $last_visit_before == -1)
-			message($lang_admin_users['Invalid date time message']);
-
-		$conditions[] = 'u.last_visit<'.$last_visit_before;
-	}
-	if ($registered_after != '')
-	{
-		$query_str[] = 'registered_after='.$registered_after;
-
-		$registered_after = strtotime($registered_after);
-		if ($registered_after === false || $registered_after == -1)
-			message($lang_admin_users['Invalid date time message']);
-
-		$conditions[] = 'u.registered>'.$registered_after;
-	}
-	if ($registered_before != '')
-	{
-		$query_str[] = 'registered_before='.$registered_before;
-
-		$registered_before = strtotime($registered_before);
-		if ($registered_before === false || $registered_before == -1)
-			message($lang_admin_users['Invalid date time message']);
-
-		$conditions[] = 'u.registered<'.$registered_before;
-	}
-
-	$like_command = ($db_type == 'pgsql') ? 'ILIKE' : 'LIKE';
-	foreach ($form as $key => $input)
-	{
-		if ($input != '' && in_array($key, array('username', 'email', 'title', 'realname', 'url', 'jabber', 'icq', 'msn', 'aim', 'yahoo', 'location', 'signature', 'admin_note')))
-		{
-			$conditions[] = 'u.'.$db->escape($key).' '.$like_command.' \''.$db->escape(str_replace('*', '%', $input)).'\'';
-			$query_str[] = 'form%5B'.$key.'%5D='.urlencode($input);
-		}
-	}
 
 	if ($posts_greater != '')
-	{
-		$query_str[] = 'posts_greater='.$posts_greater;
 		$conditions[] = 'u.num_posts>'.$posts_greater;
-	}
 	if ($posts_less != '')
-	{
-		$query_str[] = 'posts_less='.$posts_less;
 		$conditions[] = 'u.num_posts<'.$posts_less;
-	}
-
-	if ($user_group > -1)
-		$conditions[] = 'u.group_id='.$user_group;
-
-	// Fetch user count
-	$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1'.(!empty($conditions) ? ' AND '.implode(' AND ', $conditions) : '')) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-	$num_users = $db->result($result);
-
-	// Determine the user offset (based on $_GET['p'])
-	$num_pages = ceil($num_users / 50);
-
-	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
-	$start_from = 50 * ($p - 1);
-
-	// Generate paging links
-	$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'admin_users.php?find_user=&amp;'.implode('&amp;', $query_str));
-
-	// Some helper variables for permissions
-	$can_delete = $can_move = $pun_user['g_id'] == PUN_ADMIN;
-	$can_ban = $pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && $pun_user['g_mod_ban_users'] == '1');
-	$can_action = ($can_delete || $can_ban || $can_move) && $num_users > 0;
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Users'], $lang_admin_users['Results head']);
-	$page_head = array('js' => '<script type="text/javascript" src="common.js"></script>');
-	define('PUN_ACTIVE_PAGE', 'admin');
+
+	if ($user_group != 'all')
+		$conditions[] = 'u.group_id='.$db->escape($user_group);
+
+	if (empty($conditions))
+		message('Vous n\'avez saisi aucun critÃšres de recherche.');
+
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Utilisateurs';
 	require PUN_ROOT.'header.php';
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_users['Results head'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<div class="clearer"></div>
-	</div>
-</div>
-
-
-<form id="search-users-form" action="admin_users.php" method="post">
+	<div class="inbox">
+		<div><a href="javascript:history.go(-1)">Retour</a></div>
+	</div>
+</div>
+
 <div id="users2" class="blocktable">
-	<h2><span><?php echo $lang_admin_users['Results head'] ?></span></h2>
+	<h2><span>Utilisateurs</span></h2>
 	<div class="box">
 		<div class="inbox">
@@ -833,12 +291,10 @@
 			<thead>
 				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_admin_users['Results username head'] ?></th>
-					<th class="tc2" scope="col"><?php echo $lang_admin_users['Results e-mail head'] ?></th>
-					<th class="tc3" scope="col"><?php echo $lang_admin_users['Results title head'] ?></th>
-					<th class="tc4" scope="col"><?php echo $lang_admin_users['Results posts head'] ?></th>
-					<th class="tc5" scope="col"><?php echo $lang_admin_users['Results admin note head'] ?></th>
-					<th class="tcr" scope="col"><?php echo $lang_admin_users['Results actions head'] ?></th>
-<?php if ($can_action): ?>					<th class="tcmod" scope="col"><?php echo $lang_admin_users['Select'] ?></th>
-<?php endif; ?>
+					<th class="tcl" scope="col">Nom d'utilisateur</th>
+					<th class="tc2" scope="col">E-mail</th>
+					<th class="tc3" scope="col">Titre/Status</th>
+					<th class="tc4" scope="col">Messages</th>
+					<th class="tc5" scope="col">Note admin</th>
+					<th class="tcr" scope="col">Actions</th>
 				</tr>
 			</thead>
@@ -846,5 +302,5 @@
 <?php
 
-	$result = $db->query('SELECT u.id, u.username, u.email, u.title, u.num_posts, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1'.(!empty($conditions) ? ' AND '.implode(' AND ', $conditions) : '').' ORDER BY '.$db->escape($order_by).' '.$db->escape($direction).' LIMIT '.$start_from.', 50') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT u.id, u.username, u.email, u.title, u.num_posts, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1 AND '.implode(' AND ', $conditions).' ORDER BY '.$db->escape($order_by).' '.$db->escape($direction)) or error('Impossible de retrouver les informations utilisateurs', __FILE__, __LINE__, $db->error());
 	if ($db->num_rows($result))
 	{
@@ -855,7 +311,7 @@
 			// This script is a special case in that we want to display "Not verified" for non-verified users
 			if (($user_data['g_id'] == '' || $user_data['g_id'] == PUN_UNVERIFIED) && $user_title != $lang_common['Banned'])
-				$user_title = '<span class="warntext">'.$lang_admin_users['Not verified'].'</span>';
-
-			$actions = '<a href="admin_users.php?ip_stats='.$user_data['id'].'">'.$lang_admin_users['Results view IP link'].'</a> | <a href="search.php?action=show_user_posts&amp;user_id='.$user_data['id'].'">'.$lang_admin_users['Results show posts link'].'</a>';
+				$user_title = '<span class="warntext">Not verified</span>';
+
+			$actions = '<a href="admin_users.php?ip_stats='.$user_data['id'].'">Voir stats IP</a> - <a href="search.php?action=show_user&amp;user_id='.$user_data['id'].'">Afficher messages</a>';
 
 ?>
@@ -864,9 +320,7 @@
 					<td class="tc2"><a href="mailto:<?php echo $user_data['email'] ?>"><?php echo $user_data['email'] ?></a></td>
 					<td class="tc3"><?php echo $user_title ?></td>
-					<td class="tc4"><?php echo forum_number_format($user_data['num_posts']) ?></td>
-					<td class="tc5"><?php echo ($user_data['admin_note'] != '') ? pun_htmlspecialchars($user_data['admin_note']) : '&#160;' ?></td>
+					<td class="tc4"><?php echo $user_data['num_posts'] ?></td>
+					<td class="tc5"><?php echo ($user_data['admin_note'] != '') ? $user_data['admin_note'] : '&#160;' ?></td>
 					<td class="tcr"><?php echo $actions ?></td>
-<?php if ($can_action): ?>					<td class="tcmod"><input type="checkbox" name="users[<?php echo $user_data['id'] ?>]" value="1" /></td>
-<?php endif; ?>
 				</tr>
 <?php
@@ -875,5 +329,5 @@
 	}
 	else
-		echo "\t\t\t\t".'<tr><td class="tcl" colspan="6">'.$lang_admin_users['No match'].'</td></tr>'."\n";
+		echo "\t\t\t\t".'<tr><td class="tcl" colspan="6">Aucun rÃ©sultat.</td></tr>'."\n";
 
 ?>
@@ -885,19 +339,8 @@
 
 <div class="linksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-<?php if ($can_action): ?>			<p class="conr modbuttons"><a href="#" onclick="return select_checkboxes('search-users-form', this, '<?php echo $lang_admin_users['Unselect all'] ?>')"><?php echo $lang_admin_users['Select all'] ?></a> <?php if ($can_ban) : ?><input type="submit" name="ban_users" value="<?php echo $lang_admin_users['Ban'] ?>" /><?php endif; if ($can_delete) : ?><input type="submit" name="delete_users" value="<?php echo $lang_admin_users['Delete'] ?>" /><?php endif; if ($can_move) : ?><input type="submit" name="move_users" value="<?php echo $lang_admin_users['Change group'] ?>" /><?php endif; ?></p>
-<?php endif; ?>
-		</div>
-		<ul class="crumbs">
-			<li><a href="admin_index.php"><?php echo $lang_admin_common['Admin'].' '.$lang_admin_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_admin_users['Results head'] ?></strong></li>
-		</ul>
-		<div class="clearer"></div>
-	</div>
-</div>
-</form>
+	<div class="inbox">
+		<div><a href="javascript:history.go(-1)">Retour</a></div>
+	</div>
+</div>
 <?php
 
@@ -908,7 +351,6 @@
 else
 {
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_admin_common['Admin'], $lang_admin_common['Users']);
-	$focus_element = array('find_user', 'form[username]');
-	define('PUN_ACTIVE_PAGE', 'admin');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Utilisateurs';
+	$focus_element = array('find_user', 'username');
 	require PUN_ROOT.'header.php';
 
@@ -917,129 +359,113 @@
 ?>
 	<div class="blockform">
-		<h2><span><?php echo $lang_admin_users['User search head'] ?></span></h2>
+		<h2><span>Recherche d'utilisateur</span></h2>
 		<div class="box">
-			<form id="find_user" method="get" action="admin_users.php">
-				<p class="submittop"><input type="submit" name="find_user" value="<?php echo $lang_admin_users['Submit search'] ?>" tabindex="1" /></p>
+			<form id="find_user" method="post" action="admin_users.php?action=find_user">
+				<p class="submittop"><input type="submit" name="find_user" value=" Rechercher " tabindex="1" /></p>
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_users['User search subhead'] ?></legend>
+						<legend>Saisissez vos critÃšres de recherche</legend>
 						<div class="infldset">
-							<p><?php echo $lang_admin_users['User search info'] ?></p>
-							<table class="aligntop" cellspacing="0">
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Username label'] ?></th>
-									<td><input type="text" name="form[username]" size="25" maxlength="25" tabindex="2" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['E-mail address label'] ?></th>
-									<td><input type="text" name="form[email]" size="30" maxlength="80" tabindex="3" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Title label'] ?></th>
+							<p>Recherche d'utilisateur dans la base de donnÃ©es. Vous pouvez saisir un ou plusieurs termes Ã  rechercher. Utilisez le caractÃšre astÃ©risque (*) comme joker.</p>
+							<table  class="aligntop" cellspacing="0">
+								<tr>
+									<th scope="row">Nom d'utilisateur</th>
+									<td><input type="text" name="username" size="25" maxlength="25" tabindex="2" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Adresse e-mail</th>
+									<td><input type="text" name="form[email]" size="30" maxlength="50" tabindex="3" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Titre</th>
 									<td><input type="text" name="form[title]" size="30" maxlength="50" tabindex="4" /></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Real name label'] ?></th>
+									<th scope="row">Nom rÃ©el</th>
 									<td><input type="text" name="form[realname]" size="30" maxlength="40" tabindex="5" /></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Website label'] ?></th>
+									<th scope="row">Site web</th>
 									<td><input type="text" name="form[url]" size="35" maxlength="100" tabindex="6" /></td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Jabber label'] ?></th>
-									<td><input type="text" name="form[jabber]" size="30" maxlength="75" tabindex="7" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['ICQ label'] ?></th>
-									<td><input type="text" name="form[icq]" size="12" maxlength="12" tabindex="8" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['MSN label'] ?></th>
-									<td><input type="text" name="form[msn]" size="30" maxlength="50" tabindex="9" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['AOL label'] ?></th>
-									<td><input type="text" name="form[aim]" size="20" maxlength="20" tabindex="10" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Yahoo label'] ?></th>
-									<td><input type="text" name="form[yahoo]" size="20" maxlength="20" tabindex="11" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Location label'] ?></th>
-									<td><input type="text" name="form[location]" size="30" maxlength="30" tabindex="12" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Signature label'] ?></th>
-									<td><input type="text" name="form[signature]" size="35" maxlength="512" tabindex="13" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Admin note label'] ?></th>
-									<td><input type="text" name="form[admin_note]" size="30" maxlength="30" tabindex="14" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Posts more than label'] ?></th>
-									<td><input type="text" name="posts_greater" size="5" maxlength="8" tabindex="15" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Posts less than label'] ?></th>
-									<td><input type="text" name="posts_less" size="5" maxlength="8" tabindex="16" /></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Last post after label'] ?></th>
-									<td><input type="text" name="last_post_after" size="24" maxlength="19" tabindex="17" />
-									<span><?php echo $lang_admin_users['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Last post before label'] ?></th>
-									<td><input type="text" name="last_post_before" size="24" maxlength="19" tabindex="18" />
-									<span><?php echo $lang_admin_users['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Last visit after label'] ?></th>
-									<td><input type="text" name="last_visit_after" size="24" maxlength="19" tabindex="17" />
-									<span><?php echo $lang_admin_users['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Last visit before label'] ?></th>
-									<td><input type="text" name="last_visit_before" size="24" maxlength="19" tabindex="18" />
-									<span><?php echo $lang_admin_users['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Registered after label'] ?></th>
-									<td><input type="text" name="registered_after" size="24" maxlength="19" tabindex="19" />
-									<span><?php echo $lang_admin_users['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Registered before label'] ?></th>
-									<td><input type="text" name="registered_before" size="24" maxlength="19" tabindex="20" />
-									<span><?php echo $lang_admin_users['Date help'] ?></span></td>
-								</tr>
-								<tr>
-									<th scope="row"><?php echo $lang_admin_users['Order by label'] ?></th>
+									<th scope="row">ICQ</th>
+									<td><input type="text" name="form[icq]" size="12" maxlength="12" tabindex="7" /></td>
+								</tr>
+								<tr>
+									<th scope="row">MSN Messenger</th>
+									<td><input type="text" name="form[msn]" size="30" maxlength="50" tabindex="8" /></td>
+								</tr>
+								<tr>
+									<th scope="row">AOL IM</th>
+									<td><input type="text" name="form[aim]" size="20" maxlength="20" tabindex="9" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Yahoo! Messenger</th>
+									<td><input type="text" name="form[yahoo]" size="20" maxlength="20" tabindex="10" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Lieu</th>
+									<td><input type="text" name="form[location]" size="30" maxlength="30" tabindex="11" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Signature</th>
+									<td><input type="text" name="form[signature]" size="35" maxlength="512" tabindex="12" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Note admin</th>
+									<td><input type="text" name="form[admin_note]" size="30" maxlength="30" tabindex="13" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Nombre de messages supÃ©rieur Ã </th>
+									<td><input type="text" name="posts_greater" size="5" maxlength="8" tabindex="14" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Nombre de messages infÃ©rieur Ã </th>
+									<td><input type="text" name="posts_less" size="5" maxlength="8" tabindex="15" /></td>
+								</tr>
+								<tr>
+									<th scope="row">Le dernier message est aprÃšs le</th>
+									<td><input type="text" name="last_post_after" size="24" maxlength="19" tabindex="16" />
+									<span>(yyyy-mm-dd hh:mm:ss)</span></td>
+								</tr>
+								<tr>
+									<th scope="row">Le dernier message est avant le</th>
+									<td><input type="text" name="last_post_before" size="24" maxlength="19" tabindex="17" />
+									<span>(yyyy-mm-dd hh:mm:ss)</span></td>
+								</tr>
+								<tr>
+									<th scope="row">Inscrit aprÃšs le</th>
+									<td><input type="text" name="registered_after" size="24" maxlength="19" tabindex="18" />
+									<span>(yyyy-mm-dd hh:mm:ss)</span></td>
+								</tr>
+								<tr>
+									<th scope="row">Inscrit avant le</th>
+									<td><input type="text" name="registered_before" size="24" maxlength="19" tabindex="19" />
+									<span>(yyyy-mm-dd hh:mm:ss)</span></td>
+								</tr>
+								<tr>
+									<th scope="row">Trier par</th>
 									<td>
-										<select name="order_by" tabindex="21">
-											<option value="username" selected="selected"><?php echo $lang_admin_users['Order by username'] ?></option>
-											<option value="email"><?php echo $lang_admin_users['Order by e-mail'] ?></option>
-											<option value="num_posts"><?php echo $lang_admin_users['Order by posts'] ?></option>
-											<option value="last_post"><?php echo $lang_admin_users['Order by last post'] ?></option>
-											<option value="last_visit"><?php echo $lang_admin_users['Order by last visit'] ?></option>
-											<option value="registered"><?php echo $lang_admin_users['Order by registered'] ?></option>
-										</select>&#160;&#160;&#160;<select name="direction" tabindex="22">
-											<option value="ASC" selected="selected"><?php echo $lang_admin_users['Ascending'] ?></option>
-											<option value="DESC"><?php echo $lang_admin_users['Descending'] ?></option>
+										<select name="order_by" tabindex="20">
+											<option value="username" selected="selected">Nom d'utilisateur</option>
+											<option value="email">e-mail</option>
+											<option value="num_posts">messages</option>
+											<option value="last_post">dernier message</option>
+											<option value="registered">inscriptions</option>
+										</select>&#160;&#160;&#160;<select name="direction" tabindex="21">
+											<option value="ASC" selected="selected">croissant</option>
+											<option value="DESC">dÃ©croissant</option>
 										</select>
 									</td>
 								</tr>
 								<tr>
-									<th scope="row"><?php echo $lang_admin_users['User group label'] ?></th>
+									<th scope="row">Groupe utilisateurs</th>
 									<td>
-										<select name="user_group" tabindex="23">
-											<option value="-1" selected="selected"><?php echo $lang_admin_users['All groups'] ?></option>
-											<option value="0"><?php echo $lang_admin_users['Unverified users'] ?></option>
-<?php
-
-	$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' ORDER BY g_title') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+										<select name="user_group" tabindex="22">
+												<option value="all" selected="selected">Tous les groupes</option>
+<?php
+
+	$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' ORDER BY g_title') or error('Impossible de retrouver la liste des groupes', __FILE__, __LINE__, $db->error());
 
 	while ($cur_group = $db->fetch_assoc($result))
@@ -1054,20 +480,20 @@
 					</fieldset>
 				</div>
-				<p class="submitend"><input type="submit" name="find_user" value="<?php echo $lang_admin_users['Submit search'] ?>" tabindex="25" /></p>
+				<p class="submitend"><input type="submit" name="find_user" value=" Rechercher " tabindex="23" /></p>
 			</form>
 		</div>
 
-		<h2 class="block2"><span><?php echo $lang_admin_users['IP search head'] ?></span></h2>
+		<h2 class="block2"><span>Recherche <acronym title="Internet Protocol" lang="en">IP</acronym></span></h2>
 		<div class="box">
 			<form method="get" action="admin_users.php">
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_admin_users['IP search subhead'] ?></legend>
+						<legend>Saisissez une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> Ã  rechercher</legend>
 						<div class="infldset">
 							<table class="aligntop" cellspacing="0">
 								<tr>
-									<th scope="row"><?php echo $lang_admin_users['IP address label'] ?><div><input type="submit" value="<?php echo $lang_admin_users['Find IP address'] ?>" tabindex="26" /></div></th>
+									<th scope="row">Adresse <acronym title="Internet Protocol" lang="en">IP</acronym><div><input type="submit" value=" Trouver " tabindex="25" /></div></th>
 									<td><input type="text" name="show_users" size="18" maxlength="15" tabindex="24" />
-									<span><?php echo $lang_admin_users['IP address help'] ?></span></td>
+									<span>L'adresse <acronym title="Internet Protocol" lang="en">IP</acronym> Ã  rechercher dans la base de donnÃ©es.</span></td>
 								</tr>
 							</table>
Index: trunk/web/punbb/cache/.htaccess
===================================================================
--- trunk/web/punbb/cache/.htaccess	(revision 10)
+++ trunk/web/punbb/cache/.htaccess	(revision 1)
Index: trunk/web/punbb/cache/cache_smilies.php
===================================================================
--- trunk/web/punbb/cache/cache_smilies.php	(revision 1)
+++ trunk/web/punbb/cache/cache_smilies.php	(revision 1)
@@ -0,0 +1,39 @@
+<?php
+
+$smiley_text = array(
+':top:',
+'whaou',
+':d',
+':terminator:',
+':roll:',
+':|',
+':mad2:',
+':/',
+':cool:',
+':D',
+':(',
+':)',
+':p',
+';)',
+);
+
+$smiley_img = array(
+'canon.gif',
+'whaouh6na.gif',
+'yikes.png',
+'terminator.png',
+'roll.png',
+'neutral.png',
+'mad.png',
+'hmm.png',
+'cool.png',
+'big_smile.png',
+'sad.png',
+'smile.png',
+'tongue.png',
+'wink.png',
+);
+
+define('PUN_CACHE_SMILEY', 1);
+
+?>
Index: trunk/web/punbb/cache/index.html
===================================================================
--- trunk/web/punbb/cache/index.html	(revision 10)
+++ trunk/web/punbb/cache/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/common.js
===================================================================
--- trunk/web/punbb/common.js	(revision 10)
+++ 	(revision )
@@ -1,32 +1,0 @@
-
-function select_checkboxes(curFormId, link, new_string)
-{
-	var curForm = document.getElementById(curFormId);
-	var inputlist = curForm.getElementsByTagName("input");
-	for (i = 0; i < inputlist.length; i++)
-	{
-		if (inputlist[i].getAttribute("type") == 'checkbox' && inputlist[i].disabled == false)
-			inputlist[i].checked = true;
-	}
-	
-	link.setAttribute('onclick', 'return unselect_checkboxes(\'' + curFormId + '\', this, \'' + link.innerHTML + '\')');
-	link.innerHTML = new_string;
-
-	return false;
-}
-
-function unselect_checkboxes(curFormId, link, new_string)
-{
-	var curForm = document.getElementById(curFormId);
-	var inputlist = curForm.getElementsByTagName("input");
-	for (i = 0; i < inputlist.length; i++)
-	{
-		if (inputlist[i].getAttribute("type") == 'checkbox' && inputlist[i].disabled == false)
-			inputlist[i].checked = false;
-	}
-	
-	link.setAttribute('onclick', 'return select_checkboxes(\'' + curFormId + '\', this, \'' + link.innerHTML + '\')');
-	link.innerHTML = new_string;
-
-	return false;
-}
Index: trunk/web/punbb/config.php
===================================================================
--- trunk/web/punbb/config.php	(revision 10)
+++ trunk/web/punbb/config.php	(revision 1)
@@ -4,5 +4,5 @@
   { $site_path = "../";
     require $site_path."pathes.php";
-    require_once $site_path.RSR_APP_PATH."env.php";
+    require $site_path.RSR_APP_PATH."env.php";
     $env = new env($site_path.RSR_CONFIG_FILE, $site_path);
   }
Index: trunk/web/punbb/db_update.php
===================================================================
--- trunk/web/punbb/db_update.php	(revision 10)
+++ 	(revision )
@@ -1,1908 +1,0 @@
-<?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-// The FluxBB version this script updates to
-define('UPDATE_TO', '1.4.7');
-
-define('UPDATE_TO_DB_REVISION', 15);
-define('UPDATE_TO_SI_REVISION', 2);
-define('UPDATE_TO_PARSER_REVISION', 2);
-
-define('MIN_PHP_VERSION', '4.4.0');
-define('MIN_MYSQL_VERSION', '4.1.2');
-define('MIN_PGSQL_VERSION', '7.0.0');
-define('PUN_SEARCH_MIN_WORD', 3);
-define('PUN_SEARCH_MAX_WORD', 20);
-
-// The MySQL connection character set that was used for FluxBB 1.2 - in 99% of cases this should be detected automatically,
-// but can be overridden using the below constant if required.
-//define('FORUM_DEFAULT_CHARSET', 'latin1');
-
-
-// The number of items to process per page view (lower this if the update script times out during UTF-8 conversion)
-define('PER_PAGE', 300);
-
-// Don't set to UTF-8 until after we've found out what the default character set is
-define('FORUM_NO_SET_NAMES', 1);
-
-// Make sure we are running at least MIN_PHP_VERSION
-if (!function_exists('version_compare') || version_compare(PHP_VERSION, MIN_PHP_VERSION, '<'))
-	exit('You are running PHP version '.PHP_VERSION.'. FluxBB '.UPDATE_TO.' requires at least PHP '.MIN_PHP_VERSION.' to run properly. You must upgrade your PHP installation before you can continue.');
-
-define('PUN_ROOT', dirname(__FILE__).'/');
-
-// Attempt to load the configuration file config.php
-if (file_exists(PUN_ROOT.'config.php'))
-	include PUN_ROOT.'config.php';
-
-// If we have the 1.3-legacy constant defined, define the proper 1.4 constant so we don't get an incorrect "need to install" message
-if (defined('FORUM'))
-	define('PUN', FORUM);
-
-// If PUN isn't defined, config.php is missing or corrupt
-if (!defined('PUN'))
-{
-	header('Location: install.php');
-	exit;
-}
-
-// Enable debug mode
-if (!defined('PUN_DEBUG'))
-	define('PUN_DEBUG', 1);
-
-// Load the functions script
-require PUN_ROOT.'include/functions.php';
-
-// Load UTF-8 functions
-require PUN_ROOT.'include/utf8/utf8.php';
-
-// Strip out "bad" UTF-8 characters
-forum_remove_bad_characters();
-
-// Reverse the effect of register_globals
-forum_unregister_globals();
-
-// Turn on full PHP error reporting
-error_reporting(E_ALL);
-
-// Force POSIX locale (to prevent functions such as strtolower() from messing up UTF-8 strings)
-setlocale(LC_CTYPE, 'C');
-
-// Turn off magic_quotes_runtime
-if (get_magic_quotes_runtime())
-	set_magic_quotes_runtime(0);
-
-// Strip slashes from GET/POST/COOKIE (if magic_quotes_gpc is enabled)
-if (get_magic_quotes_gpc())
-{
-	function stripslashes_array($array)
-	{
-		return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array);
-	}
-
-	$_GET = stripslashes_array($_GET);
-	$_POST = stripslashes_array($_POST);
-	$_COOKIE = stripslashes_array($_COOKIE);
-	$_REQUEST = stripslashes_array($_REQUEST);
-}
-
-// If a cookie name is not specified in config.php, we use the default (forum_cookie)
-if (empty($cookie_name))
-	$cookie_name = 'pun_cookie';
-
-// If the cache directory is not specified, we use the default setting
-if (!defined('FORUM_CACHE_DIR'))
-	define('FORUM_CACHE_DIR', PUN_ROOT.'cache/');
-
-// Turn off PHP time limit
-@set_time_limit(0);
-
-// Define a few commonly used constants
-define('PUN_UNVERIFIED', 0);
-define('PUN_ADMIN', 1);
-define('PUN_MOD', 2);
-define('PUN_GUEST', 3);
-define('PUN_MEMBER', 4);
-
-// Load DB abstraction layer and try to connect
-require PUN_ROOT.'include/dblayer/common_db.php';
-
-// Check what the default character set is - since 1.2 didn't specify any we will use whatever the default was (usually latin1)
-$old_connection_charset = defined('FORUM_DEFAULT_CHARSET') ? FORUM_DEFAULT_CHARSET : $db->get_names();
-
-// Set the connection to UTF-8 now
-$db->set_names('utf8');
-
-// Get the forum config
-$result = $db->query('SELECT * FROM '.$db->prefix.'config') or error('Unable to fetch config.', __FILE__, __LINE__, $db->error());
-while ($cur_config_item = $db->fetch_row($result))
-	$pun_config[$cur_config_item[0]] = $cur_config_item[1];
-
-// Load language file
-$default_lang = $pun_config['o_default_lang'];
-
-if (!file_exists(PUN_ROOT.'lang/'.$default_lang.'/update.php'))
-	$default_lang = 'English';
-
-require PUN_ROOT.'lang/'.$default_lang.'/common.php';
-require PUN_ROOT.'lang/'.$default_lang.'/update.php';
-
-// Check current version
-$cur_version = $pun_config['o_cur_version'];
-
-if (version_compare($cur_version, '1.2', '<'))
-	error(sprintf($lang_update['Version mismatch error'], $db_name));
-
-// Do some DB type specific checks
-$mysql = false;
-switch ($db_type)
-{
-	case 'mysql':
-	case 'mysqli':
-	case 'mysql_innodb':
-	case 'mysqli_innodb':
-		$mysql_info = $db->get_version();
-		if (version_compare($mysql_info['version'], MIN_MYSQL_VERSION, '<'))
-			error(sprintf($lang_update['You are running error'], 'MySQL', $mysql_info['version'], UPDATE_TO, MIN_MYSQL_VERSION));
-
-		$mysql = true;
-		break;
-
-	case 'pgsql':
-		$pgsql_info = $db->get_version();
-		if (version_compare($pgsql_info['version'], MIN_PGSQL_VERSION, '<'))
-			error(sprintf($lang_update['You are running error'], 'PostgreSQL', $pgsql_info['version'], UPDATE_TO, MIN_PGSQL_VERSION));
-
-		break;
-}
-
-// Check the database, search index and parser revision and the current version
-if (isset($pun_config['o_database_revision']) && $pun_config['o_database_revision'] >= UPDATE_TO_DB_REVISION &&
-		isset($pun_config['o_searchindex_revision']) && $pun_config['o_searchindex_revision'] >= UPDATE_TO_SI_REVISION &&
-		isset($pun_config['o_parser_revision']) && $pun_config['o_parser_revision'] >= UPDATE_TO_PARSER_REVISION &&
-		version_compare($pun_config['o_cur_version'], UPDATE_TO, '>='))
-	error($lang_update['No update error']);
-
-$default_style = $pun_config['o_default_style'];
-if (!file_exists(PUN_ROOT.'style/'.$default_style.'.css'))
-	$default_style = 'Air';
-
-// Start a session, used to queue up errors if duplicate users occur when converting from FluxBB v1.2.
-session_start();
-
-//
-// Determines whether $str is UTF-8 encoded or not
-//
-function seems_utf8($str)
-{
-	$str_len = strlen($str);
-	for ($i = 0; $i < $str_len; ++$i)
-	{
-		if (ord($str[$i]) < 0x80) continue; # 0bbbbbbb
-		else if ((ord($str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
-		else if ((ord($str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
-		else if ((ord($str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
-		else if ((ord($str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
-		else if ((ord($str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
-		else return false; # Does not match any model
-
-		for ($j = 0; $j < $n; ++$j) # n bytes matching 10bbbbbb follow ?
-		{
-			if ((++$i == strlen($str)) || ((ord($str[$i]) & 0xC0) != 0x80))
-				return false;
-		}
-	}
-
-	return true;
-}
-
-
-//
-// Translates the number from a HTML numeric entity into an UTF-8 character
-//
-function dcr2utf8($src)
-{
-	$dest = '';
-	if ($src < 0)
-		return false;
-	else if ($src <= 0x007f)
-		$dest .= chr($src);
-	else if ($src <= 0x07ff)
-	{
-		$dest .= chr(0xc0 | ($src >> 6));
-		$dest .= chr(0x80 | ($src & 0x003f));
-	}
-	else if ($src == 0xFEFF)
-	{
-		// nop -- zap the BOM
-	}
-	else if ($src >= 0xD800 && $src <= 0xDFFF)
-	{
-		// found a surrogate
-		return false;
-	}
-	else if ($src <= 0xffff)
-	{
-		$dest .= chr(0xe0 | ($src >> 12));
-		$dest .= chr(0x80 | (($src >> 6) & 0x003f));
-		$dest .= chr(0x80 | ($src & 0x003f));
-	}
-	else if ($src <= 0x10ffff)
-	{
-		$dest .= chr(0xf0 | ($src >> 18));
-		$dest .= chr(0x80 | (($src >> 12) & 0x3f));
-		$dest .= chr(0x80 | (($src >> 6) & 0x3f));
-		$dest .= chr(0x80 | ($src & 0x3f));
-	}
-	else
-	{
-		// out of range
-		return false;
-	}
-
-	return $dest;
-}
-
-
-//
-// Attempts to convert $str from $old_charset to UTF-8. Also converts HTML entities (including numeric entities) to UTF-8 characters
-//
-function convert_to_utf8(&$str, $old_charset)
-{
-	if ($str === null || $str == '')
-		return false;
-
-	$save = $str;
-
-	// Replace literal entities (for non-UTF-8 compliant html_entity_encode)
-	if (version_compare(PHP_VERSION, '5.0.0', '<') && $old_charset == 'ISO-8859-1' || $old_charset == 'ISO-8859-15')
-		$str = html_entity_decode($str, ENT_QUOTES, $old_charset);
-
-	if ($old_charset != 'UTF-8' && !seems_utf8($str))
-	{
-		if (function_exists('iconv'))
-			$str = iconv($old_charset == 'ISO-8859-1' ? 'WINDOWS-1252' : 'ISO-8859-1', 'UTF-8', $str);
-		else if (function_exists('mb_convert_encoding'))
-			$str = mb_convert_encoding($str, 'UTF-8', $old_charset == 'ISO-8859-1' ? 'WINDOWS-1252' : 'ISO-8859-1');
-		else if ($old_charset == 'ISO-8859-1')
-			$str = utf8_encode($str);
-	}
-
-	// Replace literal entities (for UTF-8 compliant html_entity_encode)
-	if (version_compare(PHP_VERSION, '5.0.0', '>='))
-		$str = html_entity_decode($str, ENT_QUOTES, 'UTF-8');
-
-	// Replace numeric entities
-	$str = preg_replace_callback('%&#([0-9]+);%', 'utf8_callback_1', $str);
-	$str = preg_replace_callback('%&#x([a-f0-9]+);%i', 'utf8_callback_2', $str);
-
-	// Remove "bad" characters
-	$str = remove_bad_characters($str);
-
-	return ($save != $str);
-}
-
-
-function utf8_callback_1($matches)
-{
-	return dcr2utf8($matches[1]);
-}
-
-
-function utf8_callback_2($matches)
-{
-	return dcr2utf8(hexdec($matches[1]));
-}
-
-
-//
-// Alter a table to be utf8. MySQL only
-// Function based on update_convert_table_utf8() from the Drupal project (http://drupal.org/)
-//
-function alter_table_utf8($table)
-{
-	global $mysql, $db;
-	static $types;
-
-	if (!$mysql)
-		return;
-
-	if (!isset($types))
-	{
-		$types = array(
-			'char'			=> 'binary',
-			'varchar'		=> 'varbinary',
-			'tinytext'		=> 'tinyblob',
-			'mediumtext'	=> 'mediumblob',
-			'text'			=> 'blob',
-			'longtext'		=> 'longblob'
-		);
-	}
-
-	// Set table default charset to utf8
-	$db->query('ALTER TABLE '.$table.' CHARACTER SET utf8') or error('Unable to set table character set', __FILE__, __LINE__, $db->error());
-
-	// Find out which columns need converting and build SQL statements
-	$result = $db->query('SHOW FULL COLUMNS FROM '.$table) or error('Unable to fetch column information', __FILE__, __LINE__, $db->error());
-	while ($cur_column = $db->fetch_assoc($result))
-	{
-		if ($cur_column['Collation'] === null)
-			continue;
-
-		list($type) = explode('(', $cur_column['Type']);
-		if (isset($types[$type]) && strpos($cur_column['Collation'], 'utf8') === false)
-		{
-			$allow_null = ($cur_column['Null'] == 'YES');
-			$collate = (substr($cur_column['Collation'], -3) == 'bin') ? 'utf8_bin' : 'utf8_general_ci';
-
-			$db->alter_field($table, $cur_column['Field'], preg_replace('%'.$type.'%i', $types[$type], $cur_column['Type']), $allow_null, $cur_column['Default'], null, true) or error('Unable to alter field to binary', __FILE__, __LINE__, $db->error());
-			$db->alter_field($table, $cur_column['Field'], $cur_column['Type'].' CHARACTER SET utf8 COLLATE '.$collate, $allow_null, $cur_column['Default'], null, true) or error('Unable to alter field to utf8', __FILE__, __LINE__, $db->error());
-		}
-	}
-}
-
-//
-// Safely converts text type columns into utf8
-// If finished returns true, otherwise returns $end_at
-//
-function convert_table_utf8($table, $callback, $old_charset, $key = null, $start_at = null, $error_callback = null)
-{
-	global $mysql, $db, $old_connection_charset;
-
-	$finished = true;
-	$end_at = 0;
-	if ($mysql)
-	{
-		// Only set up the tables if we are doing this in 1 go, or its the first go
-		if ($start_at === null || $start_at == 0)
-		{
-			// Drop any temp table that exists, in-case it's left over from a failed update
-			$db->drop_table($table.'_utf8', true) or error('Unable to drop left over temp table', __FILE__, __LINE__, $db->error());
-
-			// Copy the table
-			$db->query('CREATE TABLE '.$table.'_utf8 LIKE '.$table) or error('Unable to create new table', __FILE__, __LINE__, $db->error());
-
-			// Set table default charset to utf8
-			alter_table_utf8($table.'_utf8');
-		}
-
-		// Change to the old character set so MySQL doesn't attempt to perform conversion on the data from the old table
-		$db->set_names($old_connection_charset);
-
-		// Move & Convert everything
-		$result = $db->query('SELECT * FROM '.$table.($start_at === null ? '' : ' WHERE '.$key.'>'.$start_at).' ORDER BY '.$key.' ASC'.($start_at === null ? '' : ' LIMIT '.PER_PAGE), false) or error('Unable to select from old table', __FILE__, __LINE__, $db->error());
-
-		// Change back to utf8 mode so we can insert it into the new table
-		$db->set_names('utf8');
-
-		while ($cur_item = $db->fetch_assoc($result))
-		{
-			$cur_item = call_user_func($callback, $cur_item, $old_charset);
-
-			$temp = array();
-			foreach ($cur_item as $idx => $value)
-				$temp[$idx] = $value === null ? 'NULL' : '\''.$db->escape($value).'\'';
-
-			$db->query('INSERT INTO '.$table.'_utf8('.implode(',', array_keys($temp)).') VALUES ('.implode(',', array_values($temp)).')') or ($error_callback === null ? error('Unable to insert data to new table', __FILE__, __LINE__, $db->error()) : call_user_func($error_callback, $cur_item));
-
-			$end_at = $cur_item[$key];
-		}
-
-		// If we aren't doing this all in 1 go and $end_at has a value (i.e. we have processed at least 1 row), figure out if we have more to do or not
-		if ($start_at !== null && $end_at > 0)
-		{
-			$result = $db->query('SELECT 1 FROM '.$table.' WHERE '.$key.'>'.$end_at.' ORDER BY '.$key.' ASC LIMIT 1') or error('Unable to check for next row', __FILE__, __LINE__, $db->error());
-			$finished = $db->num_rows($result) == 0;
-		}
-
-		// Only swap the tables if we are doing this in 1 go, or its the last go
-		if ($finished)
-		{
-			// Delete old table
-			$db->drop_table($table, true) or error('Unable to drop old table', __FILE__, __LINE__, $db->error());
-
-			// Rename table
-			$db->query('ALTER TABLE '.$table.'_utf8 RENAME '.$table) or error('Unable to rename new table', __FILE__, __LINE__, $db->error());
-
-			return true;
-		}
-
-		return $end_at;
-	}
-	else
-	{
-		// Convert everything
-		$result = $db->query('SELECT * FROM '.$table.($start_at === null ? '' : ' WHERE '.$key.'>'.$start_at).' ORDER BY '.$key.' ASC'.($start_at === null ? '' : ' LIMIT '.PER_PAGE)) or error('Unable to select from table', __FILE__, __LINE__, $db->error());
-		while ($cur_item = $db->fetch_assoc($result))
-		{
-			$cur_item = call_user_func($callback, $cur_item, $old_charset);
-
-			$temp = array();
-			foreach ($cur_item as $idx => $value)
-				$temp[] = $idx.'='.($value === null ? 'NULL' : '\''.$db->escape($value).'\'');
-
-			if (!empty($temp))
-				$db->query('UPDATE '.$table.' SET '.implode(', ', $temp).' WHERE '.$key.'=\''.$db->escape($cur_item[$key]).'\'') or error('Unable to update data', __FILE__, __LINE__, $db->error());
-
-			$end_at = $cur_item[$key];
-		}
-
-		if ($start_at !== null && $end_at > 0)
-		{
-			$result = $db->query('SELECT 1 FROM '.$table.' WHERE '.$key.'>'.$end_at.' ORDER BY '.$key.' ASC LIMIT 1') or error('Unable to check for next row', __FILE__, __LINE__, $db->error());
-			if ($db->num_rows($result) == 0)
-				return true;
-
-			return $end_at;
-		}
-
-		return true;
-	}
-}
-
-
-header('Content-type: text/html; charset=utf-8');
-
-// Empty all output buffers and stop buffering
-while (@ob_end_clean());
-
-
-$stage = isset($_REQUEST['stage']) ? $_REQUEST['stage'] : '';
-$old_charset = isset($_REQUEST['req_old_charset']) ? str_replace('ISO8859', 'ISO-8859', strtoupper($_REQUEST['req_old_charset'])) : 'ISO-8859-1';
-$start_at = isset($_REQUEST['start_at']) ? intval($_REQUEST['start_at']) : 0;
-$query_str = '';
-
-// Show form
-if (empty($stage))
-{
-	if (file_exists(FORUM_CACHE_DIR.'db_update.lock'))
-	{
-		// Deal with newlines, tabs and multiple spaces
-		$pattern = array("\t", '  ', '  ');
-		$replace = array('&#160; &#160; ', '&#160; ', ' &#160;');
-		$message = str_replace($pattern, $replace, $pun_config['o_maintenance_message']);
-
-?>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang_common['lang_identifier'] ?>" lang="<?php echo $lang_common['lang_identifier'] ?>" dir="<?php echo $lang_common['lang_direction'] ?>">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo $lang_update['Maintenance'] ?></title>
-<link rel="stylesheet" type="text/css" href="style/<?php echo $default_style ?>.css" />
-</head>
-<body>
-
-<div id="punmaint" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div id="brdmain">
-<div class="block">
-	<h2><?php echo $lang_update['Maintenance'] ?></h2>
-	<div class="box">
-		<div class="inbox">
-			<p><?php echo $message ?></p>
-		</div>
-	</div>
-</div>
-</div>
-
-</div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
-</div>
-
-</body>
-</html>
-<?php
-
-	}
-	else
-	{
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang_common['lang_identifier'] ?>" lang="<?php echo $lang_common['lang_identifier'] ?>" dir="<?php echo $lang_common['lang_direction'] ?>">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo $lang_update['Update'] ?></title>
-<link rel="stylesheet" type="text/css" href="style/<?php echo $default_style ?>.css" />
-</head>
-<body onload="document.getElementById('install').req_db_pass.focus();document.getElementById('install').start.disabled=false;">
-
-<div id="pundb_update" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div id="brdheader" class="block">
-	<div class="box">
-		<div id="brdtitle" class="inbox">
-			<h1><span><?php echo $lang_update['Update'] ?></span></h1>
-			<div id="brddesc"><p><?php echo $lang_update['Update message'] ?></p><p><strong><?php echo $lang_update['Note']; ?></strong> <?php echo $lang_update['Members message']; ?></p></div>
-		</div>
-	</div>
-</div>
-
-<div id="brdmain">
-<div class="blockform">
-	<h2><span><?php echo $lang_update['Update'] ?></span></h2>
-	<div class="box">
-		<form id="install" method="post" action="db_update.php">
-			<input type="hidden" name="stage" value="start" />
-			<div class="inform">
-				<fieldset>
-				<legend><?php echo $lang_update['Administrator only'] ?></legend>
-					<div class="infldset">
-						<p><?php echo $lang_update['Database password info'] ?></p>
-						<p><strong><?php echo $lang_update['Note']; ?></strong> <?php echo $lang_update['Database password note'] ?></p>
-						<label class="required"><strong><?php echo $lang_update['Database password'] ?> <span><?php echo $lang_update['Required'] ?></span></strong><br /><input type="password" id="req_db_pass" name="req_db_pass" /><br /></label>
-						<p><?php echo $lang_update['Maintenance message info'] ?></p>
-						<div class="txtarea">
-							<label class="required"><strong><?php echo $lang_update['Maintenance message'] ?> <span><?php echo $lang_update['Required'] ?></span></strong><br />
-							<textarea name="req_maintenance_message" rows="4" cols="65"><?php echo pun_htmlspecialchars($pun_config['o_maintenance_message']) ?></textarea><br /></label>
-						</div>
-					</div>
-				</fieldset>
-			</div>
-			<div class="inform">
-				<div class="forminfo">
-					<p><?php echo $lang_update['Intro 1'] ?></p>
-					<p><?php echo $lang_update['Intro 2'] ?></p>
-<?php
-
-	if (strpos($cur_version, '1.2') === 0)
-	{
-		if (!function_exists('iconv') && !function_exists('mb_convert_encoding'))
-		{
-
-?>
-					<p><?php echo $lang_update['No charset conversion'] ?></p>
-<?php
-
-		}
-
-?>
-				</div>
-			</div>
-			<div class="inform">
-				<div class="forminfo">
-					<p><?php echo $lang_update['Enable conversion'] ?></p>
-					<p><?php echo $lang_update['Current character set'] ?></p>
-				</div>
-				<fieldset>
-					<legend><?php echo $lang_update['Charset conversion'] ?></legend>
-					<div class="infldset">
-						<div class="rbox">
-							<label><input type="checkbox" name="convert_charset" value="1" checked="checked" /><?php echo $lang_update['Enable conversion label'] ?><br /></label>
-						</div>
-						<label>
-							<strong><?php echo $lang_update['Current character set label'] ?></strong><br /><?php echo $lang_update['Current character set info'] ?><br />
-							<input type="text" name="req_old_charset" size="12" maxlength="20" value="<?php echo $old_charset ?>" /><br />
-						</label>
-					</div>
-				</fieldset>
-<?php
-
-	}
-	else
-		echo "\t\t\t\t".'</div>'."\n";
-
-?>
-			</div>
-			<p class="buttons"><input type="submit" name="start" value="<?php echo $lang_update['Start update'] ?>" /></p>
-		</form>
-	</div>
-</div>
-</div>
-
-</div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
-</div>
-
-</body>
-</html>
-<?php
-
-	}
-	$db->end_transaction();
-	$db->close();
-	exit;
-
-}
-
-// Read the lock file
-$lock = file_exists(FORUM_CACHE_DIR.'db_update.lock') ? trim(file_get_contents(FORUM_CACHE_DIR.'db_update.lock')) : false;
-$lock_error = false;
-
-// Generate or fetch the UID - this confirms we have a valid admin
-if (isset($_POST['req_db_pass']))
-{
-	$req_db_pass = strtolower(trim($_POST['req_db_pass']));
-
-	switch ($db_type)
-	{
-		// For SQLite we compare against the database file name, since the password is left blank
-		case 'sqlite':
-			if ($req_db_pass != strtolower($db_name))
-				error(sprintf($lang_update['Invalid file error'], 'config.php'));
-
-			break;
-		// For everything else, check the password matches
-		default:
-			if ($req_db_pass != strtolower($db_password))
-				error(sprintf($lang_update['Invalid password error'], 'config.php'));
-
-			break;
-	}
-
-	// Generate a unique id to identify this session, only if this is a valid session
-	$uid = pun_hash($req_db_pass.'|'.uniqid(rand(), true));
-	if ($lock) // We already have a lock file
-		$lock_error = true;
-	else // Create the lock file
-	{
-		$fh = @fopen(FORUM_CACHE_DIR.'db_update.lock', 'wb');
-		if (!$fh)
-			error(sprintf($lang_update['Unable to lock error'], 'cache'));
-
-		fwrite($fh, $uid);
-		fclose($fh);
-
-		// Update maintenance message
-		if ($_POST['req_maintenance_message'] != '')
-			$maintenance_message = pun_trim(pun_linebreaks($_POST['req_maintenance_message']));
-		else
-		{
-			// Load the admin_options.php language file
-			require PUN_ROOT.'lang/'.$default_lang.'/admin_options.php';
-
-			$maintenance_message = $lang_admin_options['Default maintenance message'];
-		}
-
-		$db->query('UPDATE '.$db->prefix.'config SET conf_value=\''.$db->escape($maintenance_message).'\' WHERE conf_name=\'o_maintenance_message\'') or error('Unable to update board config', __FILE__, __LINE__, $db->error());
-
-		// Regenerate the config cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_config_cache();
-	}
-}
-else if (isset($_GET['uid']))
-{
-	$uid = trim($_GET['uid']);
-	if (!$lock || $lock != $uid) // The lock doesn't exist or doesn't match the given UID
-		$lock_error = true;
-}
-else
-	error($lang_update['No password error']);
-
-// If there is an error with the lock file
-if ($lock_error)
-	error(sprintf($lang_update['Script runs error'], FORUM_CACHE_DIR.'db_update.lock'));
-
-switch ($stage)
-{
-	// Start by updating the database structure
-	case 'start':
-		$query_str = '?stage=preparse_posts';
-
-		// If we don't need to update the database, skip this stage
-		if (isset($pun_config['o_database_revision']) && $pun_config['o_database_revision'] >= UPDATE_TO_DB_REVISION)
-			break;
-
-		// Make all email fields VARCHAR(80)
-		$db->alter_field('bans', 'email', 'VARCHAR(80)', true) or error('Unable to alter email field', __FILE__, __LINE__, $db->error());
-		$db->alter_field('posts', 'poster_email', 'VARCHAR(80)', true) or error('Unable to alter poster_email field', __FILE__, __LINE__, $db->error());
-		$db->alter_field('users', 'email', 'VARCHAR(80)', false, '') or error('Unable to alter email field', __FILE__, __LINE__, $db->error());
-		$db->alter_field('users', 'jabber', 'VARCHAR(80)', true) or error('Unable to alter jabber field', __FILE__, __LINE__, $db->error());
-		$db->alter_field('users', 'msn', 'VARCHAR(80)', true) or error('Unable to alter msn field', __FILE__, __LINE__, $db->error());
-		$db->alter_field('users', 'activate_string', 'VARCHAR(80)', true) or error('Unable to alter activate_string field', __FILE__, __LINE__, $db->error());
-
-		// Make all IP fields VARCHAR(39) to support IPv6
-		$db->alter_field('posts', 'poster_ip', 'VARCHAR(39)', true) or error('Unable to alter poster_ip field', __FILE__, __LINE__, $db->error());
-		$db->alter_field('users', 'registration_ip', 'VARCHAR(39)', false, '0.0.0.0') or error('Unable to alter registration_ip field', __FILE__, __LINE__, $db->error());
-
-		// Make the message field MEDIUMTEXT to allow proper conversion of 65535 character posts to UTF-8
-		$db->alter_field('posts', 'message', 'MEDIUMTEXT', true) or error('Unable to alter message field', __FILE__, __LINE__, $db->error());
-
-		// Add the DST option to the users table
-		$db->add_field('users', 'dst', 'TINYINT(1)', false, 0, 'timezone') or error('Unable to add dst field', __FILE__, __LINE__, $db->error());
-
-		// Add the last_post field to the online table
-		$db->add_field('online', 'last_post', 'INT(10) UNSIGNED', true, null, null) or error('Unable to add last_post field', __FILE__, __LINE__, $db->error());
-
-		// Add the last_search field to the online table
-		$db->add_field('online', 'last_search', 'INT(10) UNSIGNED', true, null, null) or error('Unable to add last_search field', __FILE__, __LINE__, $db->error());
-
-		// Add the last_search column to the users table
-		$db->add_field('users', 'last_search', 'INT(10) UNSIGNED', true, null, 'last_post') or error('Unable to add last_search field', __FILE__, __LINE__, $db->error());
-
-		// Drop use_avatar column from users table
-		$db->drop_field('users', 'use_avatar') or error('Unable to drop use_avatar field', __FILE__, __LINE__, $db->error());
-
-		// Drop save_pass column from users table
-		$db->drop_field('users', 'save_pass') or error('Unable to drop save_pass field', __FILE__, __LINE__, $db->error());
-
-		// Drop g_edit_subjects_interval column from groups table
-		$db->drop_field('groups', 'g_edit_subjects_interval');
-
-		// Add database revision number
-		if (!array_key_exists('o_database_revision', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_database_revision\', \'0\')') or error('Unable to insert config value \'o_database_revision\'', __FILE__, __LINE__, $db->error());
-
-		// Add search index revision number
-		if (!array_key_exists('o_searchindex_revision', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_searchindex_revision\', \'0\')') or error('Unable to insert config value \'o_searchindex_revision\'', __FILE__, __LINE__, $db->error());
-
-		// Add parser revision number
-		if (!array_key_exists('o_parser_revision', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_parser_revision\', \'0\')') or error('Unable to insert config value \'o_parser_revision\'', __FILE__, __LINE__, $db->error());
-
-		// Add default email setting option
-		if (!array_key_exists('o_default_email_setting', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_default_email_setting\', \'1\')') or error('Unable to insert config value \'o_default_email_setting\'', __FILE__, __LINE__, $db->error());
-
-		// Make sure we have o_additional_navlinks (was added in 1.2.1)
-		if (!array_key_exists('o_additional_navlinks', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_additional_navlinks\', \'\')') or error('Unable to insert config value \'o_additional_navlinks\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_topic_views
-		if (!array_key_exists('o_topic_views', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_topic_views\', \'1\')') or error('Unable to insert config value \'o_topic_views\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_signatures
-		if (!array_key_exists('o_signatures', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_signatures\', \'1\')') or error('Unable to insert config value \'o_signatures\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_smtp_ssl
-		if (!array_key_exists('o_smtp_ssl', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_smtp_ssl\', \'0\')') or error('Unable to insert config value \'o_smtp_ssl\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_default_dst
-		if (!array_key_exists('o_default_dst', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_default_dst\', \'0\')') or error('Unable to insert config value \'o_default_dst\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_quote_depth
-		if (!array_key_exists('o_quote_depth', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_quote_depth\', \'3\')') or error('Unable to insert config value \'o_quote_depth\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_feed_type
-		if (!array_key_exists('o_feed_type', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_feed_type\', \'2\')') or error('Unable to insert config value \'o_feed_type\'', __FILE__, __LINE__, $db->error());
-
-		// Insert new config option o_feed_ttl
-		if (!array_key_exists('o_feed_ttl', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_feed_ttl\', \'0\')') or error('Unable to insert config value \'o_feed_ttl\'', __FILE__, __LINE__, $db->error());
-
-		// Insert config option o_base_url which was removed in 1.3
-		if (!array_key_exists('o_base_url', $pun_config))
-		{
-			// If it isn't in $pun_config['o_base_url'] it should be in $base_url, but just in-case it isn't we can make a guess at it
-			if (!isset($base_url))
-			{
-				// Make an educated guess regarding base_url
-				$base_url  = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';	// protocol
-				$base_url .= preg_replace('%:(80|443)$%', '', $_SERVER['HTTP_HOST']);							// host[:port]
-				$base_url .= str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));							// path
-			}
-
-			if (substr($base_url, -1) == '/')
-				$base_url = substr($base_url, 0, -1);
-
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_base_url\', \''.$db->escape($base_url).'\')') or error('Unable to insert config value \'o_quote_depth\'', __FILE__, __LINE__, $db->error());
-		}
-
-		if (strpos($cur_version, '1.2') === 0)
-		{
-			// Groups are almost the same as 1.2:
-			// unverified:	32000 -> 0
-
-			$db->query('UPDATE '.$db->prefix.'users SET group_id = 0 WHERE group_id = 32000') or error('Unable to update unverified users', __FILE__, __LINE__, $db->error());
-		}
-		else if (strpos($cur_version, '1.3') === 0)
-		{
-			// Groups have changed quite a lot from 1.3:
-			// unverified:	0 -> 0
-			// admin:		1 -> 1
-			// mod:			? -> 2
-			// guest:		2 -> 3
-			// member:		? -> 4
-
-			$result = $db->query('SELECT MAX(g_id) + 1 FROM '.$db->prefix.'groups') or error('Unable to select temp group ID', __FILE__, __LINE__, $db->error());
-			$temp_id = $db->result($result);
-
-			$result = $db->query('SELECT g_id FROM '.$db->prefix.'groups WHERE g_moderator = 1 AND g_id > 1 LIMIT 1') or error('Unable to select moderator group', __FILE__, __LINE__, $db->error());
-			if ($db->num_rows($result))
-				$mod_gid = $db->result($result);
-			else
-			{
-				$db->query('INSERT INTO '.$db->prefix.'groups (g_title, g_user_title, g_moderator, g_mod_edit_users, g_mod_rename_users, g_mod_change_passwords, g_mod_ban_users, g_read_board, g_view_users, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_send_email, g_post_flood, g_search_flood, g_email_flood, g_report_flood) VALUES('."'Moderators', 'Moderator', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0)") or error('Unable to add group', __FILE__, __LINE__, $db->error());
-				$mod_gid = $db->insert_id();
-			}
-
-			$member_gid = $pun_config['o_default_user_group'];
-
-			// move the mod group to a temp place
-			$db->query('UPDATE '.$db->prefix.'groups SET g_id = '.$temp_id.' WHERE g_id = '.$mod_gid) or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'users SET group_id = '.$temp_id.' WHERE group_id = '.$mod_gid) or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = '.$temp_id.' WHERE group_id = '.$mod_gid) or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-			if ($member_gid == $mod_gid) $member_gid = $temp_id;
-
-			// move whoever is in 3 to a spare slot
-			$db->query('UPDATE '.$db->prefix.'groups SET g_id = '.$mod_gid.' WHERE g_id = 3') or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'users SET group_id = '.$mod_gid.' WHERE group_id = 3') or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = '.$mod_gid.' WHERE group_id = 3') or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-			if ($member_gid == 3) $member_gid = $mod_gid;
-
-			// move guest to 3
-			$db->query('UPDATE '.$db->prefix.'groups SET g_id = 3 WHERE g_id = 2') or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'users SET group_id = 3 WHERE group_id = 2') or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = 3 WHERE group_id = 2') or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-			if ($member_gid == 2) $member_gid = 3;
-
-			// move mod group in temp place to 2
-			$db->query('UPDATE '.$db->prefix.'groups SET g_id = 2 WHERE g_id = '.$temp_id) or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'users SET group_id = 2 WHERE group_id = '.$temp_id) or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-			$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = 2 WHERE group_id = '.$temp_id) or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-			if ($member_gid == $temp_id) $member_gid = 2;
-
-			// Only move stuff around if it isn't already in the right place
-			if ($member_gid != $mod_gid || $member_gid != 4)
-			{
-				// move members to temp place
-				$db->query('UPDATE '.$db->prefix.'groups SET g_id = '.$temp_id.' WHERE g_id = '.$member_gid) or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-				$db->query('UPDATE '.$db->prefix.'users SET group_id = '.$temp_id.' WHERE group_id = '.$member_gid) or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-				$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = '.$temp_id.' WHERE group_id = '.$member_gid) or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-
-				// move whoever is in 4 to members place
-				$db->query('UPDATE '.$db->prefix.'groups SET g_id = '.$member_gid.' WHERE g_id = 4') or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-				$db->query('UPDATE '.$db->prefix.'users SET group_id = '.$member_gid.' WHERE group_id = 4') or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-				$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = '.$member_gid.' WHERE group_id = 4') or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-
-				// move members in temp place to 4
-				$db->query('UPDATE '.$db->prefix.'groups SET g_id = 4 WHERE g_id = '.$temp_id) or error('Unable to update group ID', __FILE__, __LINE__, $db->error());
-				$db->query('UPDATE '.$db->prefix.'users SET group_id = 4 WHERE group_id = '.$temp_id) or error('Unable to update users group ID', __FILE__, __LINE__, $db->error());
-				$db->query('UPDATE '.$db->prefix.'forum_perms SET group_id = 4 WHERE group_id = '.$temp_id) or error('Unable to forum_perms group ID', __FILE__, __LINE__, $db->error());
-			}
-
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value=\''.$member_gid.'\' WHERE conf_name=\'o_default_user_group\'') or error('Unable to update default user group ID', __FILE__, __LINE__, $db->error());
-		}
-
-		// Server time zone is now simply the default time zone
-		if (!array_key_exists('o_default_timezone', $pun_config))
-			$db->query('UPDATE '.$db->prefix.'config SET conf_name = \'o_default_timezone\' WHERE conf_name = \'o_server_timezone\'') or error('Unable to update time zone config', __FILE__, __LINE__, $db->error());
-
-		// Increase visit timeout to 30 minutes (only if it hasn't been changed from the default)
-		if (!array_key_exists('o_database_revision', $pun_config) && $pun_config['o_timeout_visit'] == '600')
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value = \'1800\' WHERE conf_name = \'o_timeout_visit\'') or error('Unable to update visit timeout config', __FILE__, __LINE__, $db->error());
-
-		// Remove obsolete g_post_polls permission from groups table
-		$db->drop_field('groups', 'g_post_polls');
-
-		// Make room for multiple moderator groups
-		if (!$db->field_exists('groups', 'g_moderator'))
-		{
-			// Add g_moderator column to groups table
-			$db->add_field('groups', 'g_moderator', 'TINYINT(1)', false, 0, 'g_user_title') or error('Unable to add g_moderator field', __FILE__, __LINE__, $db->error());
-
-			// Give the moderator group moderator privileges
-			$db->query('UPDATE '.$db->prefix.'groups SET g_moderator = 1 WHERE g_id = 2') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-		}
-
-		// Replace obsolete p_mod_edit_users config setting with new per-group permission
-		if (array_key_exists('p_mod_edit_users', $pun_config))
-		{
-			$db->query('DELETE FROM '.$db->prefix.'config WHERE conf_name = \'p_mod_edit_users\'') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-
-			$db->add_field('groups', 'g_mod_edit_users', 'TINYINT(1)', false, 0, 'g_moderator') or error('Unable to add g_mod_edit_users field', __FILE__, __LINE__, $db->error());
-
-			$db->query('UPDATE '.$db->prefix.'groups SET g_mod_edit_users = '.$pun_config['p_mod_edit_users'].' WHERE g_moderator = 1') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-		}
-
-		// Replace obsolete p_mod_rename_users config setting with new per-group permission
-		if (array_key_exists('p_mod_rename_users', $pun_config))
-		{
-			$db->query('DELETE FROM '.$db->prefix.'config WHERE conf_name = \'p_mod_rename_users\'') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-
-			$db->add_field('groups', 'g_mod_rename_users', 'TINYINT(1)', false, 0, 'g_mod_edit_users') or error('Unable to add g_mod_rename_users field', __FILE__, __LINE__, $db->error());
-
-			$db->query('UPDATE '.$db->prefix.'groups SET g_mod_rename_users = '.$pun_config['p_mod_rename_users'].' WHERE g_moderator = 1') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-		}
-
-		// Replace obsolete p_mod_change_passwords config setting with new per-group permission
-		if (array_key_exists('p_mod_change_passwords', $pun_config))
-		{
-			$db->query('DELETE FROM '.$db->prefix.'config WHERE conf_name = \'p_mod_change_passwords\'') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-
-			$db->add_field('groups', 'g_mod_change_passwords', 'TINYINT(1)', false, 0, 'g_mod_rename_users') or error('Unable to add g_mod_change_passwords field', __FILE__, __LINE__, $db->error());
-
-			$db->query('UPDATE '.$db->prefix.'groups SET g_mod_change_passwords = '.$pun_config['p_mod_change_passwords'].' WHERE g_moderator = 1') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-		}
-
-		// Replace obsolete p_mod_ban_users config setting with new per-group permission
-		if (array_key_exists('p_mod_ban_users', $pun_config))
-		{
-			$db->query('DELETE FROM '.$db->prefix.'config WHERE conf_name = \'p_mod_ban_users\'') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-
-			$db->add_field('groups', 'g_mod_ban_users', 'TINYINT(1)', false, 0, 'g_mod_change_passwords') or error('Unable to add g_mod_ban_users field', __FILE__, __LINE__, $db->error());
-
-			$db->query('UPDATE '.$db->prefix.'groups SET g_mod_ban_users = '.$pun_config['p_mod_ban_users'].' WHERE g_moderator = 1') or error('Unable to update moderator powers', __FILE__, __LINE__, $db->error());
-		}
-
-		// We need to add a unique index to avoid users having multiple rows in the online table
-		if (!$db->index_exists('online', 'user_id_ident_idx'))
-		{
-			$db->truncate_table('online') or error('Unable to clear online table', __FILE__, __LINE__, $db->error());
-
-			if ($mysql)
-				$db->add_index('online', 'user_id_ident_idx', array('user_id', 'ident(25)'), true) or error('Unable to add user_id_ident_idx index', __FILE__, __LINE__, $db->error());
-			else
-				$db->add_index('online', 'user_id_ident_idx', array('user_id', 'ident'), true) or error('Unable to add user_id_ident_idx index', __FILE__, __LINE__, $db->error());
-		}
-
-		// Remove the redundant user_id_idx on the online table
-		$db->drop_index('online', 'user_id_idx') or error('Unable to drop user_id_idx index', __FILE__, __LINE__, $db->error());
-
-		// Add an index to ident on the online table
-		if ($mysql)
-			$db->add_index('online', 'ident_idx', array('ident(25)')) or error('Unable to add ident_idx index', __FILE__, __LINE__, $db->error());
-		else
-			$db->add_index('online', 'ident_idx', array('ident')) or error('Unable to add ident_idx index', __FILE__, __LINE__, $db->error());
-
-		// Add an index to logged in the online table
-		$db->add_index('online', 'logged_idx', array('logged')) or error('Unable to add logged_idx index', __FILE__, __LINE__, $db->error());
-
-		// Add an index to last_post in the topics table
-		$db->add_index('topics', 'last_post_idx', array('last_post')) or error('Unable to add last_post_idx index', __FILE__, __LINE__, $db->error());
-
-		// Add an index to username on the bans table
-		if ($mysql)
-			$db->add_index('bans', 'username_idx', array('username(25)')) or error('Unable to add username_idx index', __FILE__, __LINE__, $db->error());
-		else
-			$db->add_index('bans', 'username_idx', array('username')) or error('Unable to add username_idx index', __FILE__, __LINE__, $db->error());
-
-		// Change the username_idx on users to a unique index of max size 25
-		$db->drop_index('users', 'username_idx') or error('Unable to drop old username_idx index', __FILE__, __LINE__, $db->error());
-		$field = $mysql ? 'username(25)' : 'username';
-
-		// Attempt to add a unique index. If the user doesn't use a transactional database this can fail due to multiple matching usernames in the
-		// users table. This is bad, but just giving up if it happens is even worse! If it fails just add a regular non-unique index.
-		if (!$db->add_index('users', 'username_idx', array($field), true))
-			$db->add_index('users', 'username_idx', array($field)) or error('Unable to add username_idx field', __FILE__, __LINE__, $db->error());
-
-		// Add g_view_users field to groups table
-		$db->add_field('groups', 'g_view_users', 'TINYINT(1)', false, 1, 'g_read_board') or error('Unable to add g_view_users field', __FILE__, __LINE__, $db->error());
-
-		// Add the last_email_sent column to the users table and the g_send_email and
-		// g_email_flood columns to the groups table
-		$db->add_field('users', 'last_email_sent', 'INT(10) UNSIGNED', true, null, 'last_search') or error('Unable to add last_email_sent field', __FILE__, __LINE__, $db->error());
-		$db->add_field('groups', 'g_send_email', 'TINYINT(1)', false, 1, 'g_search_users') or error('Unable to add g_send_email field', __FILE__, __LINE__, $db->error());
-		$db->add_field('groups', 'g_email_flood', 'SMALLINT(6)', false, 60, 'g_search_flood') or error('Unable to add g_email_flood field', __FILE__, __LINE__, $db->error());
-
-		// Add the last_report_sent column to the users table and the g_report_flood
-		// column to the groups table
-		$db->add_field('users', 'last_report_sent', 'INT(10) UNSIGNED', true, null, 'last_email_sent') or error('Unable to add last_report_sent field', __FILE__, __LINE__, $db->error());
-		$db->add_field('groups', 'g_report_flood', 'SMALLINT(6)', false, 60, 'g_email_flood') or error('Unable to add g_report_flood field', __FILE__, __LINE__, $db->error());
-
-		// Set non-default g_send_email, g_flood_email and g_flood_report values properly
-		$db->query('UPDATE '.$db->prefix.'groups SET g_send_email = 0 WHERE g_id = 3') or error('Unable to update group email permissions', __FILE__, __LINE__, $db->error());
-		$db->query('UPDATE '.$db->prefix.'groups SET g_email_flood = 0, g_report_flood = 0 WHERE g_id IN (1,2,3)') or error('Unable to update group email permissions', __FILE__, __LINE__, $db->error());
-
-		// Add the auto notify/subscription option to the users table
-		$db->add_field('users', 'auto_notify', 'TINYINT(1)', false, 0, 'notify_with_post') or error('Unable to add auto_notify field', __FILE__, __LINE__, $db->error());
-
-		// Add the first_post_id column to the topics table
-		if (!$db->field_exists('topics', 'first_post_id'))
-		{
-			$db->add_field('topics', 'first_post_id', 'INT(10) UNSIGNED', false, 0, 'posted') or error('Unable to add first_post_id field', __FILE__, __LINE__, $db->error());
-			$db->add_index('topics', 'first_post_id_idx', array('first_post_id')) or error('Unable to add first_post_id_idx index', __FILE__, __LINE__, $db->error());
-
-			// Now that we've added the column and indexed it, we need to give it correct data
-			$result = $db->query('SELECT MIN(id) AS first_post, topic_id FROM '.$db->prefix.'posts GROUP BY topic_id') or error('Unable to fetch first_post_id', __FILE__, __LINE__, $db->error());
-
-			while ($cur_post = $db->fetch_assoc($result))
-				$db->query('UPDATE '.$db->prefix.'topics SET first_post_id = '.$cur_post['first_post'].' WHERE id = '.$cur_post['topic_id']) or error('Unable to update first_post_id', __FILE__, __LINE__, $db->error());
-		}
-
-		// Move any users with the old unverified status to their new group
-		$db->query('UPDATE '.$db->prefix.'users SET group_id=0 WHERE group_id=32000') or error('Unable to move unverified users', __FILE__, __LINE__, $db->error());
-
-		// Add the ban_creator column to the bans table
-		$db->add_field('bans', 'ban_creator', 'INT(10) UNSIGNED', false, 0) or error('Unable to add ban_creator field', __FILE__, __LINE__, $db->error());
-
-		// Add the time/date format settings to the user table
-		$db->add_field('users', 'time_format', 'TINYINT(1)', false, 0, 'dst') or error('Unable to add time_format field', __FILE__, __LINE__, $db->error());
-		$db->add_field('users', 'date_format', 'TINYINT(1)', false, 0, 'dst') or error('Unable to add date_format field', __FILE__, __LINE__, $db->error());
-
-		// Change the search_data field to mediumtext
-		$db->alter_field('search_cache', 'search_data', 'MEDIUMTEXT', true) or error('Unable to alter search_data field', __FILE__, __LINE__, $db->error());
-
-		// Incase we had the fulltext search extension installed (1.3-legacy), remove it
-		$db->drop_index('topics', 'subject_idx') or error('Unable to drop subject_idx index', __FILE__, __LINE__, $db->error());
-		$db->drop_index('posts', 'message_idx') or error('Unable to drop message_idx index', __FILE__, __LINE__, $db->error());
-		// Incase we had the fulltext search mod installed (1.2), remove it
-		$db->drop_index('topics', 'subject_fulltext_search') or error('Unable to drop subject_fulltext_search index', __FILE__, __LINE__, $db->error());
-		$db->drop_index('posts', 'message_fulltext_search') or error('Unable to drop message_fulltext_search index', __FILE__, __LINE__, $db->error());
-
-		// If the search_cache table has been dropped by the fulltext search extension, recreate it
-		if (!$db->table_exists('search_cache'))
-		{
-			$schema = array(
-				'FIELDS'		=> array(
-					'id'			=> array(
-						'datatype'		=> 'INT(10) UNSIGNED',
-						'allow_null'	=> false,
-						'default'		=> '0'
-					),
-					'ident'			=> array(
-						'datatype'		=> 'VARCHAR(200)',
-						'allow_null'	=> false,
-						'default'		=> '\'\''
-					),
-					'search_data'	=> array(
-						'datatype'		=> 'MEDIUMTEXT',
-						'allow_null'	=> true
-					)
-				),
-				'PRIMARY KEY'	=> array('id'),
-				'INDEXES'		=> array(
-					'ident_idx'	=> array('ident')
-				)
-			);
-
-			if ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-				$schema['INDEXES']['ident_idx'] = array('ident(8)');
-
-			$db->create_table('search_cache', $schema);
-		}
-
-		// If the search_matches table has been dropped by the fulltext search extension, recreate it
-		if (!$db->table_exists('search_matches'))
-		{
-			$schema = array(
-				'FIELDS'		=> array(
-					'post_id'		=> array(
-						'datatype'		=> 'INT(10) UNSIGNED',
-						'allow_null'	=> false,
-						'default'		=> '0'
-					),
-					'word_id'		=> array(
-						'datatype'		=> 'INT(10) UNSIGNED',
-						'allow_null'	=> false,
-						'default'		=> '0'
-					),
-					'subject_match'	=> array(
-						'datatype'		=> 'TINYINT(1)',
-						'allow_null'	=> false,
-						'default'		=> '0'
-					)
-				),
-				'INDEXES'		=> array(
-					'word_id_idx'	=> array('word_id'),
-					'post_id_idx'	=> array('post_id')
-				)
-			);
-
-			$db->create_table('search_matches', $schema);
-		}
-
-		// If the search_words table has been dropped by the fulltext search extension, recreate it
-		if (!$db->table_exists('search_words'))
-		{
-			$schema = array(
-				'FIELDS'		=> array(
-					'id'			=> array(
-						'datatype'		=> 'SERIAL',
-						'allow_null'	=> false
-					),
-					'word'			=> array(
-						'datatype'		=> 'VARCHAR(20)',
-						'allow_null'	=> false,
-						'default'		=> '\'\'',
-						'collation'		=> 'bin'
-					)
-				),
-				'PRIMARY KEY'	=> array('word'),
-				'INDEXES'		=> array(
-					'id_idx'	=> array('id')
-				)
-			);
-
-			if ($db_type == 'sqlite')
-			{
-				$schema['PRIMARY KEY'] = array('id');
-				$schema['UNIQUE KEYS'] = array('word_idx'	=> array('word'));
-			}
-
-			$db->create_table('search_words', $schema);
-		}
-
-		// Rename the subscription table
-		$db->rename_table('subscriptions', 'topic_subscriptions');
-
-		// if we don't have the forum_subscriptions table, create it
-		if (!$db->table_exists('forum_subscriptions'))
-		{
-			$schema = array(
-				'FIELDS'		=> array(
-					'user_id'		=> array(
-						'datatype'		=> 'INT(10) UNSIGNED',
-						'allow_null'	=> false,
-						'default'		=> '0'
-					),
-					'forum_id'		=> array(
-						'datatype'		=> 'INT(10) UNSIGNED',
-						'allow_null'	=> false,
-						'default'		=> '0'
-					)
-				),
-				'PRIMARY KEY'	=> array('user_id', 'forum_id')
-			);
-
-			$db->create_table('forum_subscriptions', $schema) or error('Unable to create forum subscriptions table', __FILE__, __LINE__, $db->error());
-		}
-
-		// Insert new config option o_forum_subscriptions
-		if (!array_key_exists('o_forum_subscriptions', $pun_config))
-			$db->query('INSERT INTO '.$db->prefix.'config (conf_name, conf_value) VALUES (\'o_forum_subscriptions\', \'1\')') or error('Unable to insert config value \'o_forum_subscriptions\'', __FILE__, __LINE__, $db->error());
-
-		// Rename config option o_subscriptions to o_topic_subscriptions
-		if (!array_key_exists('o_topic_subscriptions', $pun_config))
-			$db->query('UPDATE '.$db->prefix.'config SET conf_name=\'o_topic_subscriptions\' WHERE conf_name=\'o_subscriptions\'') or error('Unable to rename config value \'o_subscriptions\'', __FILE__, __LINE__, $db->error());
-
-		// Change the default style if the old doesn't exist anymore
-		if ($pun_config['o_default_style'] != $default_style)
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value = \''.$db->escape($default_style).'\' WHERE conf_name = \'o_default_style\'') or error('Unable to update default style config', __FILE__, __LINE__, $db->error());
-
-		// For MySQL(i) without InnoDB, change the engine of the online table (for performance reasons)
-		if ($db_type == 'mysql' || $db_type == 'mysqli')
-			$db->query('ALTER TABLE '.$db->prefix.'online ENGINE = MyISAM') or error('Unable to change engine type of online table to MyISAM', __FILE__, __LINE__, $db->error());
-
-		// Should we do charset conversion or not?
-		if (strpos($cur_version, '1.2') === 0 && isset($_POST['convert_charset']))
-			$query_str = '?stage=conv_bans&req_old_charset='.$old_charset;
-
-		break;
-
-
-	// Convert bans
-	case 'conv_bans':
-		$query_str = '?stage=conv_categories&req_old_charset='.$old_charset;
-
-		function _conv_bans($cur_item, $old_charset)
-		{
-			global $lang_update;
-
-			echo sprintf($lang_update['Converting item'], $lang_update['ban'], $cur_item['id']).'<br />'."\n";
-
-			convert_to_utf8($cur_item['username'], $old_charset);
-			convert_to_utf8($cur_item['message'], $old_charset);
-
-			return $cur_item;
-		}
-
-		$end_at = convert_table_utf8($db->prefix.'bans', '_conv_bans', $old_charset, 'id', $start_at);
-
-		if ($end_at !== true)
-			$query_str = '?stage=conv_bans&req_old_charset='.$old_charset.'&start_at='.$end_at;
-
-		break;
-
-
-	// Convert categories
-	case 'conv_categories':
-		$query_str = '?stage=conv_censors&req_old_charset='.$old_charset;
-
-		echo sprintf($lang_update['Converting'], $lang_update['categories']).'<br />'."\n";
-
-		function _conv_categories($cur_item, $old_charset)
-		{
-			convert_to_utf8($cur_item['cat_name'], $old_charset);
-
-			return $cur_item;
-		}
-
-		convert_table_utf8($db->prefix.'categories', '_conv_categories', $old_charset, 'id');
-
-		break;
-
-
-	// Convert censor words
-	case 'conv_censors':
-		$query_str = '?stage=conv_config&req_old_charset='.$old_charset;
-
-		echo sprintf($lang_update['Converting'], $lang_update['censor words']).'<br />'."\n";
-
-		function _conv_censoring($cur_item, $old_charset)
-		{
-			convert_to_utf8($cur_item['search_for'], $old_charset);
-			convert_to_utf8($cur_item['replace_with'], $old_charset);
-
-			return $cur_item;
-		}
-
-		convert_table_utf8($db->prefix.'censoring', '_conv_censoring', $old_charset, 'id');
-
-		break;
-
-
-	// Convert config
-	case 'conv_config':
-		$query_str = '?stage=conv_forums&req_old_charset='.$old_charset;
-
-		echo sprintf($lang_update['Converting'], $lang_update['configuration']).'<br />'."\n";
-
-		function _conv_config($cur_item, $old_charset)
-		{
-			convert_to_utf8($cur_item['conf_value'], $old_charset);
-
-			return $cur_item;
-		}
-
-		convert_table_utf8($db->prefix.'config', '_conv_config', $old_charset, 'conf_name');
-
-		break;
-
-
-	// Convert forums
-	case 'conv_forums':
-		$query_str = '?stage=conv_perms&req_old_charset='.$old_charset;
-
-		echo sprintf($lang_update['Converting'], $lang_update['forums']).'<br />'."\n";
-
-		function _conv_forums($cur_item, $old_charset)
-		{
-			$moderators = ($cur_item['moderators'] != '') ? unserialize($cur_item['moderators']) : array();
-			$moderators_utf8 = array();
-			foreach ($moderators as $mod_username => $mod_user_id)
-			{
-				convert_to_utf8($mod_username, $old_charset);
-				$moderators_utf8[$mod_username] = $mod_user_id;
-			}
-
-			convert_to_utf8($cur_item['forum_name'], $old_charset);
-			convert_to_utf8($cur_item['forum_desc'], $old_charset);
-
-			if (!empty($moderators_utf8))
-				$cur_item['moderators'] = serialize($moderators_utf8);
-
-			return $cur_item;
-		}
-
-		convert_table_utf8($db->prefix.'forums', '_conv_forums', $old_charset, 'id');
-
-		break;
-
-
-	// Convert forum permissions
-	case 'conv_perms':
-		$query_str = '?stage=conv_groups&req_old_charset='.$old_charset;
-
-		alter_table_utf8($db->prefix.'forum_perms');
-
-		break;
-
-
-	// Convert groups
-	case 'conv_groups':
-		$query_str = '?stage=conv_online&req_old_charset='.$old_charset;
-
-		echo sprintf($lang_update['Converting'], $lang_update['groups']).'<br />'."\n";
-
-		function _conv_groups($cur_item, $old_charset)
-		{
-			convert_to_utf8($cur_item['g_title'], $old_charset);
-			convert_to_utf8($cur_item['g_user_title'], $old_charset);
-
-			return $cur_item;
-		}
-
-		convert_table_utf8($db->prefix.'groups', '_conv_groups', $old_charset, 'g_id');
-
-		break;
-
-
-	// Convert online
-	case 'conv_online':
-		$query_str = '?stage=conv_posts&req_old_charset='.$old_charset;
-
-		// Truncate the table
-		$db->truncate_table('online') or error('Unable to empty online table', __FILE__, __LINE__, $db->error());
-
-		alter_table_utf8($db->prefix.'online');
-
-		break;
-
-
-	// Convert posts
-	case 'conv_posts':
-		$query_str = '?stage=conv_ranks&req_old_charset='.$old_charset;
-
-		function _conv_posts($cur_item, $old_charset)
-		{
-			global $lang_update;
-
-			echo sprintf($lang_update['Converting item'], $lang_update['post'], $cur_item['id']).'<br />'."\n";
-
-			convert_to_utf8($cur_item['poster'], $old_charset);
-			convert_to_utf8($cur_item['message'], $old_charset);
-			convert_to_utf8($cur_item['edited_by'], $old_charset);
-
-			return $cur_item;
-		}
-
-		$end_at = convert_table_utf8($db->prefix.'posts', '_conv_posts', $old_charset, 'id', $start_at);
-
-		if ($end_at !== true)
-			$query_str = '?stage=conv_posts&req_old_charset='.$old_charset.'&start_at='.$end_at;
-
-		break;
-
-
-	// Convert ranks
-	case 'conv_ranks':
-		$query_str = '?stage=conv_reports&req_old_charset='.$old_charset;
-
-		echo sprintf($lang_update['Converting'], $lang_update['ranks']).'<br />'."\n";
-
-		function _conv_ranks($cur_item, $old_charset)
-		{
-			convert_to_utf8($cur_item['rank'], $old_charset);
-
-			return $cur_item;
-		}
-
-		convert_table_utf8($db->prefix.'ranks', '_conv_ranks', $old_charset, 'id');
-
-		break;
-
-
-	// Convert reports
-	case 'conv_reports':
-		$query_str = '?stage=conv_search_cache&req_old_charset='.$old_charset;
-
-		function _conv_reports($cur_item, $old_charset)
-		{
-			global $lang_update;
-
-			echo sprintf($lang_update['Converting item'], $lang_update['report'], $cur_item['id']).'<br />'."\n";
-
-			convert_to_utf8($cur_item['message'], $old_charset);
-
-			return $cur_item;
-		}
-
-		$end_at = convert_table_utf8($db->prefix.'reports', '_conv_reports', $old_charset, 'id', $start_at);
-
-		if ($end_at !== true)
-			$query_str = '?stage=conv_reports&req_old_charset='.$old_charset.'&start_at='.$end_at;
-
-		break;
-
-
-	// Convert search cache
-	case 'conv_search_cache':
-		$query_str = '?stage=conv_search_matches&req_old_charset='.$old_charset;
-
-		// Truncate the table
-		$db->truncate_table('search_cache') or error('Unable to empty search cache table', __FILE__, __LINE__, $db->error());
-
-		alter_table_utf8($db->prefix.'search_cache');
-
-		break;
-
-
-	// Convert search matches
-	case 'conv_search_matches':
-		$query_str = '?stage=conv_search_words&req_old_charset='.$old_charset;
-
-		// Truncate the table
-		$db->truncate_table('search_matches') or error('Unable to empty search index match table', __FILE__, __LINE__, $db->error());
-
-		alter_table_utf8($db->prefix.'search_matches');
-
-		break;
-
-
-	// Convert search words
-	case 'conv_search_words':
-		$query_str = '?stage=conv_subscriptions&req_old_charset='.$old_charset;
-
-		// Truncate the table
-		$db->truncate_table('search_words') or error('Unable to empty search index words table', __FILE__, __LINE__, $db->error());
-
-		// Reset the sequence for the search words (not needed for SQLite)
-		switch ($db_type)
-		{
-			case 'mysql':
-			case 'mysqli':
-			case 'mysql_innodb':
-			case 'mysqli_innodb':
-				$db->query('ALTER TABLE '.$db->prefix.'search_words auto_increment=1') or error('Unable to update table auto_increment', __FILE__, __LINE__, $db->error());
-				break;
-
-			case 'pgsql';
-				$db->query('SELECT setval(\''.$db->prefix.'search_words_id_seq\', 1, false)') or error('Unable to update sequence', __FILE__, __LINE__, $db->error());
-				break;
-		}
-
-		alter_table_utf8($db->prefix.'search_words');
-
-		break;
-
-
-	// Convert subscriptions
-	case 'conv_subscriptions':
-		$query_str = '?stage=conv_topics&req_old_charset='.$old_charset;
-
-		// By this stage we should have already renamed the subscription table
-		alter_table_utf8($db->prefix.'topic_subscriptions');
-		alter_table_utf8($db->prefix.'forum_subscriptions'); // This should actually already be utf8, but for consistency...
-
-		break;
-
-
-	// Convert topics
-	case 'conv_topics':
-		$query_str = '?stage=conv_users&req_old_charset='.$old_charset;
-
-		function _conv_topics($cur_item, $old_charset)
-		{
-			global $lang_update;
-
-			echo sprintf($lang_update['Converting item'], $lang_update['topic'], $cur_item['id']).'<br />'."\n";
-
-			convert_to_utf8($cur_item['poster'], $old_charset);
-			convert_to_utf8($cur_item['subject'], $old_charset);
-			convert_to_utf8($cur_item['last_poster'], $old_charset);
-
-			return $cur_item;
-		}
-
-		$end_at = convert_table_utf8($db->prefix.'topics', '_conv_topics', $old_charset, 'id', $start_at);
-
-		if ($end_at !== true)
-			$query_str = '?stage=conv_topics&req_old_charset='.$old_charset.'&start_at='.$end_at;
-
-		break;
-
-
-	// Convert users
-	case 'conv_users':
-		$query_str = '?stage=preparse_posts';
-
-		if ($start_at == 0)
-			$_SESSION['dupe_users'] = array();
-
-		function _conv_users($cur_item, $old_charset)
-		{
-			global $lang_update;
-
-			echo sprintf($lang_update['Converting item'], $lang_update['user'], $cur_item['id']).'<br />'."\n";
-
-			convert_to_utf8($cur_item['username'], $old_charset);
-			convert_to_utf8($cur_item['title'], $old_charset);
-			convert_to_utf8($cur_item['realname'], $old_charset);
-			convert_to_utf8($cur_item['location'], $old_charset);
-			convert_to_utf8($cur_item['signature'], $old_charset);
-			convert_to_utf8($cur_item['admin_note'], $old_charset);
-
-			return $cur_item;
-		}
-
-		function _error_users($cur_user)
-		{
-			$_SESSION['dupe_users'][$cur_user['id']] = $cur_user;
-		}
-
-		$end_at = convert_table_utf8($db->prefix.'users', '_conv_users', $old_charset, 'id', $start_at, '_error_users');
-
-		if ($end_at !== true)
-			$query_str = '?stage=conv_users&req_old_charset='.$old_charset.'&start_at='.$end_at;
-		else if (!empty($_SESSION['dupe_users']))
-			$query_str = '?stage=conv_users_dupe';
-
-		break;
-
-
-	// Handle any duplicate users which occured due to conversion
-	case 'conv_users_dupe':
-		$query_str = '?stage=preparse_posts';
-
-		if (!$mysql || empty($_SESSION['dupe_users']))
-			break;
-
-		if (isset($_POST['form_sent']))
-		{
-			$errors = array();
-
-			require PUN_ROOT.'include/email.php';
-
-			foreach ($_SESSION['dupe_users'] as $id => $cur_user)
-			{
-				$errors[$id] = array();
-
-				$username = pun_trim($_POST['dupe_users'][$id]);
-
-				if (pun_strlen($username) < 2)
-					$errors[$id][] = $lang_update['Username too short error'];
-				else if (pun_strlen($username) > 25) // This usually doesn't happen since the form element only accepts 25 characters
-					$errors[$id][] = $lang_update['Username too long error'];
-				else if (!strcasecmp($username, 'Guest'))
-					$errors[$id][] = $lang_update['Username Guest reserved error'];
-				else if (preg_match('%[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}%', $username) || preg_match('%((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))%', $username))
-					$errors[$id][] = $lang_update['Username IP format error'];
-				else if ((strpos($username, '[') !== false || strpos($username, ']') !== false) && strpos($username, '\'') !== false && strpos($username, '"') !== false)
-					$errors[$id][] = $lang_update['Username bad characters error'];
-				else if (preg_match('%(?:\[/?(?:b|u|s|ins|del|em|i|h|colou?r|quote|code|img|url|email|list|\*)\]|\[(?:img|url|quote|list)=)%i', $username))
-					$errors[$id][] = $lang_update['Username BBCode error'];
-
-				$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE (UPPER(username)=UPPER(\''.$db->escape($username).'\') OR UPPER(username)=UPPER(\''.$db->escape(ucp_preg_replace('%[^\p{L}\p{N}]%u', '', $username)).'\')) AND id>1') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-
-				if ($db->num_rows($result))
-				{
-					$busy = $db->result($result);
-					$errors[$id][] = sprintf($lang_update['Username duplicate error'], pun_htmlspecialchars($busy));
-				}
-
-				if (empty($errors[$id]))
-				{
-					$old_username = $cur_user['username'];
-					$_SESSION['dupe_users'][$id]['username'] = $cur_user['username'] = $username;
-
-					$temp = array();
-					foreach ($cur_user as $idx => $value)
-						$temp[$idx] = $value === null ? 'NULL' : '\''.$db->escape($value).'\'';
-
-					// Insert the renamed user
-					$db->query('INSERT INTO '.$db->prefix.'users('.implode(',', array_keys($temp)).') VALUES ('.implode(',', array_values($temp)).')') or error('Unable to insert data to new table', __FILE__, __LINE__, $db->error());
-
-					// Renaming a user also affects a bunch of other stuff, lets fix that too...
-					$db->query('UPDATE '.$db->prefix.'posts SET poster=\''.$db->escape($username).'\' WHERE poster_id='.$id) or error('Unable to update posts', __FILE__, __LINE__, $db->error());
-
-					// TODO: The following must compare using collation utf8_bin otherwise we will accidently update posts/topics/etc belonging to both of the duplicate users, not just the one we renamed!
-					$db->query('UPDATE '.$db->prefix.'posts SET edited_by=\''.$db->escape($username).'\' WHERE edited_by=\''.$db->escape($old_username).'\' COLLATE utf8_bin') or error('Unable to update posts', __FILE__, __LINE__, $db->error());
-					$db->query('UPDATE '.$db->prefix.'topics SET poster=\''.$db->escape($username).'\' WHERE poster=\''.$db->escape($old_username).'\' COLLATE utf8_bin') or error('Unable to update topics', __FILE__, __LINE__, $db->error());
-					$db->query('UPDATE '.$db->prefix.'topics SET last_poster=\''.$db->escape($username).'\' WHERE last_poster=\''.$db->escape($old_username).'\' COLLATE utf8_bin') or error('Unable to update topics', __FILE__, __LINE__, $db->error());
-					$db->query('UPDATE '.$db->prefix.'forums SET last_poster=\''.$db->escape($username).'\' WHERE last_poster=\''.$db->escape($old_username).'\' COLLATE utf8_bin') or error('Unable to update forums', __FILE__, __LINE__, $db->error());
-					$db->query('UPDATE '.$db->prefix.'online SET ident=\''.$db->escape($username).'\' WHERE ident=\''.$db->escape($old_username).'\' COLLATE utf8_bin') or error('Unable to update online list', __FILE__, __LINE__, $db->error());
-
-					// If the user is a moderator or an administrator we have to update the moderator lists
-					$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$cur_user['group_id']) or error('Unable to fetch group', __FILE__, __LINE__, $db->error());
-					$group_mod = $db->result($result);
-
-					if ($cur_user['group_id'] == PUN_ADMIN || $group_mod == '1')
-					{
-						$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
-
-						while ($cur_forum = $db->fetch_assoc($result))
-						{
-							$cur_moderators = ($cur_forum['moderators'] != '') ? unserialize($cur_forum['moderators']) : array();
-
-							if (in_array($id, $cur_moderators))
-							{
-								unset($cur_moderators[$old_username]);
-								$cur_moderators[$username] = $id;
-								uksort($cur_moderators, 'utf8_strcasecmp');
-
-								$db->query('UPDATE '.$db->prefix.'forums SET moderators=\''.$db->escape(serialize($cur_moderators)).'\' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
-							}
-						}
-					}
-
-					// Email the user alerting them of the change
-					if (file_exists(PUN_ROOT.'lang/'.$cur_user['language'].'/mail_templates/rename.tpl'))
-						$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$cur_user['language'].'/mail_templates/rename.tpl'));
-					else if (file_exists(PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/mail_templates/rename.tpl'))
-						$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/mail_templates/rename.tpl'));
-					else
-						$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/English/mail_templates/rename.tpl'));
-
-					// The first row contains the subject
-					$first_crlf = strpos($mail_tpl, "\n");
-					$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-					$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-					$mail_subject = str_replace('<board_title>', $pun_config['o_board_title'], $mail_subject);
-					$mail_message = str_replace('<base_url>', get_base_url().'/', $mail_message);
-					$mail_message = str_replace('<old_username>', $old_username, $mail_message);
-					$mail_message = str_replace('<new_username>', $username, $mail_message);
-					$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-					pun_mail($cur_user['email'], $mail_subject, $mail_message);
-
-					unset($_SESSION['dupe_users'][$id]);
-				}
-			}
-		}
-
-		if (!empty($_SESSION['dupe_users']))
-		{
-			$query_str = '';
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang_common['lang_identifier'] ?>" lang="<?php echo $lang_common['lang_identifier'] ?>" dir="<?php echo $lang_common['lang_direction'] ?>">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo $lang_update['Update'] ?></title>
-<link rel="stylesheet" type="text/css" href="style/<?php echo $default_style ?>.css" />
-</head>
-<body>
-
-<div id="pundb_update" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div class="blockform">
-	<h2><span><?php echo $lang_update['Error converting users'] ?></span></h2>
-	<div class="box">
-		<form method="post" action="db_update.php?stage=conv_users_dupe&amp;uid=<?php echo $uid ?>">
-			<input type="hidden" name="form_sent" value="1" />
-			<div class="inform">
-				<div class="forminfo">
-						<p style="font-size: 1.1em"><?php echo $lang_update['Error info 1'] ?></p>
-						<p style="font-size: 1.1em"><?php echo $lang_update['Error info 2'] ?></p>
-				</div>
-			</div>
-<?php
-
-			foreach ($_SESSION['dupe_users'] as $id => $cur_user)
-			{
-
-?>
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo pun_htmlspecialchars($cur_user['username']); ?></legend>
-					<div class="infldset">
-						<label class="required"><strong><?php echo $lang_update['New username'] ?> <span><?php echo $lang_update['Required'] ?></span></strong><br /><input type="text" name="<?php echo 'dupe_users['.$id.']'; ?>" value="<?php if (isset($_POST['dupe_users'][$id])) echo pun_htmlspecialchars($_POST['dupe_users'][$id]); ?>" size="25" maxlength="25" /><br /></label>
-					</div>
-				</fieldset>
-<?php if (!empty($errors[$id])): ?>				<div class="forminfo error-info">
-					<h3><?php echo $lang_update['Correct errors'] ?></h3>
-					<ul class="error-list">
-<?php
-
-foreach ($errors[$id] as $cur_error)
-	echo "\t\t\t\t\t\t".'<li><strong>'.$cur_error.'</strong></li>'."\n";
-?>
-					</ul>
-				</div>
-<?php endif; ?>			</div>
-<?php
-
-			}
-
-?>
-			<p class="buttons"><input type="submit" name="rename" value="<?php echo $lang_update['Rename users'] ?>" /></p>
-		</form>
-	</div>
-</div>
-
-</div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
-</div>
-
-</body>
-</html>
-<?php
-
-		}
-
-		break;
-
-
-	// Preparse posts
-	case 'preparse_posts':
-		$query_str = '?stage=preparse_sigs';
-
-		// If we don't need to parse the posts, skip this stage
-		if (isset($pun_config['o_parser_revision']) && $pun_config['o_parser_revision'] >= UPDATE_TO_PARSER_REVISION)
-			break;
-
-		require PUN_ROOT.'include/parser.php';
-
-		// Fetch posts to process this cycle
-		$result = $db->query('SELECT id, message FROM '.$db->prefix.'posts WHERE id > '.$start_at.' ORDER BY id ASC LIMIT '.PER_PAGE) or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
-
-		$temp = array();
-		$end_at = 0;
-		while ($cur_item = $db->fetch_assoc($result))
-		{
-			echo sprintf($lang_update['Preparsing item'], $lang_update['post'], $cur_item['id']).'<br />'."\n";
-			$db->query('UPDATE '.$db->prefix.'posts SET message = \''.$db->escape(preparse_bbcode($cur_item['message'], $temp)).'\' WHERE id = '.$cur_item['id']) or error('Unable to update post', __FILE__, __LINE__, $db->error());
-
-			$end_at = $cur_item['id'];
-		}
-
-		// Check if there is more work to do
-		if ($end_at > 0)
-		{
-			$result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id > '.$end_at.' ORDER BY id ASC LIMIT 1') or error('Unable to fetch next ID', __FILE__, __LINE__, $db->error());
-
-			if ($db->num_rows($result) > 0)
-				$query_str = '?stage=preparse_posts&start_at='.$end_at;
-		}
-
-		break;
-
-
-	// Preparse signatures
-	case 'preparse_sigs':
-		$query_str = '?stage=rebuild_idx';
-
-		// If we don't need to parse the sigs, skip this stage
-		if (isset($pun_config['o_parser_revision']) && $pun_config['o_parser_revision'] >= UPDATE_TO_PARSER_REVISION)
-			break;
-
-		require PUN_ROOT.'include/parser.php';
-
-		// Fetch users to process this cycle
-		$result = $db->query('SELECT id, signature FROM '.$db->prefix.'users WHERE id > '.$start_at.' ORDER BY id ASC LIMIT '.PER_PAGE) or error('Unable to fetch users', __FILE__, __LINE__, $db->error());
-
-		$temp = array();
-		$end_at = 0;
-		while ($cur_item = $db->fetch_assoc($result))
-		{
-			echo sprintf($lang_update['Preparsing item'], $lang_update['signature'], $cur_item['id']).'<br />'."\n";
-			$db->query('UPDATE '.$db->prefix.'users SET signature = \''.$db->escape(preparse_bbcode($cur_item['signature'], $temp, true)).'\' WHERE id = '.$cur_item['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
-
-			$end_at = $cur_item['id'];
-		}
-
-		// Check if there is more work to do
-		if ($end_at > 0)
-		{
-			$result = $db->query('SELECT 1 FROM '.$db->prefix.'users WHERE id > '.$end_at.' ORDER BY id ASC LIMIT 1') or error('Unable to fetch next ID', __FILE__, __LINE__, $db->error());
-			if ($db->num_rows($result) > 0)
-				$query_str = '?stage=preparse_sigs&start_at='.$end_at;
-		}
-
-		break;
-
-
-	// Rebuild the search index
-	case 'rebuild_idx':
-		$query_str = '?stage=finish';
-
-		// If we don't need to update the search index, skip this stage
-		if (isset($pun_config['o_searchindex_revision']) && $pun_config['o_searchindex_revision'] >= UPDATE_TO_SI_REVISION)
-			break;
-
-		if ($start_at == 0)
-		{
-			// Truncate the tables just in-case we didn't already (if we are coming directly here without converting the tables)
-			$db->truncate_table('search_cache') or error('Unable to empty search cache table', __FILE__, __LINE__, $db->error());
-			$db->truncate_table('search_matches') or error('Unable to empty search index match table', __FILE__, __LINE__, $db->error());
-			$db->truncate_table('search_words') or error('Unable to empty search index words table', __FILE__, __LINE__, $db->error());
-
-			// Reset the sequence for the search words (not needed for SQLite)
-			switch ($db_type)
-			{
-				case 'mysql':
-				case 'mysqli':
-				case 'mysql_innodb':
-				case 'mysqli_innodb':
-					$db->query('ALTER TABLE '.$db->prefix.'search_words auto_increment=1') or error('Unable to update table auto_increment', __FILE__, __LINE__, $db->error());
-					break;
-
-				case 'pgsql';
-					$db->query('SELECT setval(\''.$db->prefix.'search_words_id_seq\', 1, false)') or error('Unable to update sequence', __FILE__, __LINE__, $db->error());
-					break;
-			}
-		}
-
-		require PUN_ROOT.'include/search_idx.php';
-
-		// Fetch posts to process this cycle
-		$result = $db->query('SELECT p.id, p.message, t.subject, t.first_post_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE p.id > '.$start_at.' ORDER BY p.id ASC LIMIT '.PER_PAGE) or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
-
-		$end_at = 0;
-		while ($cur_item = $db->fetch_assoc($result))
-		{
-			echo sprintf($lang_update['Rebuilding index item'], $lang_update['post'], $cur_item['id']).'<br />'."\n";
-
-			if ($cur_item['id'] == $cur_item['first_post_id'])
-				update_search_index('post', $cur_item['id'], $cur_item['message'], $cur_item['subject']);
-			else
-				update_search_index('post', $cur_item['id'], $cur_item['message']);
-
-			$end_at = $cur_item['id'];
-		}
-
-		// Check if there is more work to do
-		if ($end_at > 0)
-		{
-			$result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id > '.$end_at.' ORDER BY id ASC LIMIT 1') or error('Unable to fetch next ID', __FILE__, __LINE__, $db->error());
-
-			if ($db->num_rows($result) > 0)
-				$query_str = '?stage=rebuild_idx&start_at='.$end_at;
-		}
-
-		break;
-
-
-	// Show results page
-	case 'finish':
-		// We update the version number
-		$db->query('UPDATE '.$db->prefix.'config SET conf_value = \''.UPDATE_TO.'\' WHERE conf_name = \'o_cur_version\'') or error('Unable to update version', __FILE__, __LINE__, $db->error());
-
-		// And the database revision number
-		$db->query('UPDATE '.$db->prefix.'config SET conf_value = \''.UPDATE_TO_DB_REVISION.'\' WHERE conf_name = \'o_database_revision\'') or error('Unable to update database revision number', __FILE__, __LINE__, $db->error());
-
-		// And the search index revision number
-		$db->query('UPDATE '.$db->prefix.'config SET conf_value = \''.UPDATE_TO_SI_REVISION.'\' WHERE conf_name = \'o_searchindex_revision\'') or error('Unable to update search index revision number', __FILE__, __LINE__, $db->error());
-
-		// And the parser revision number
-		$db->query('UPDATE '.$db->prefix.'config SET conf_value = \''.UPDATE_TO_PARSER_REVISION.'\' WHERE conf_name = \'o_parser_revision\'') or error('Unable to update parser revision number', __FILE__, __LINE__, $db->error());
-
-		// Check the default language still exists!
-		if (!file_exists(PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/common.php'))
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value = \'English\' WHERE conf_name = \'o_default_lang\'') or error('Unable to update default language', __FILE__, __LINE__, $db->error());
-
-		// Check the default style still exists!
-		if (!file_exists(PUN_ROOT.'style/'.$pun_config['o_default_style'].'.css'))
-			$db->query('UPDATE '.$db->prefix.'config SET conf_value = \'Air\' WHERE conf_name = \'o_default_style\'') or error('Unable to update default style', __FILE__, __LINE__, $db->error());
-
-		// This feels like a good time to synchronize the forums
-		$result = $db->query('SELECT id FROM '.$db->prefix.'forums') or error('Unable to fetch forum IDs', __FILE__, __LINE__, $db->error());
-
-		while ($row = $db->fetch_row($result))
-			update_forum($row[0]);
-
-		// Empty the PHP cache
-		forum_clear_cache();
-
-		// Delete the update lock file
-		@unlink(FORUM_CACHE_DIR.'db_update.lock');
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $lang_common['lang_identifier'] ?>" lang="<?php echo $lang_common['lang_identifier'] ?>" dir="<?php echo $lang_common['lang_direction'] ?>">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo $lang_update['Update'] ?></title>
-<link rel="stylesheet" type="text/css" href="style/<?php echo $default_style ?>.css" />
-</head>
-<body>
-
-<div id="pundb_update" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div class="blockform">
-	<h2><span><?php echo $lang_update['Update'] ?></span></h2>
-	<div class="box">
-		<div class="fakeform">
-			<div class="inform">
-				<div class="forminfo">
-					<p style="font-size: 1.1em"><?php printf($lang_update['Successfully updated'], sprintf('<a href="index.php">%s</a>', $lang_update['go to index'])) ?></p>
-				</div>
-			</div>
-		</div>
-	</div>
-</div>
-
-</div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
-</div>
-
-</body>
-</html>
-<?php
-
-		break;
-}
-
-$db->end_transaction();
-$db->close();
-
-if ($query_str != '')
-	exit('<script type="text/javascript">window.location="db_update.php'.$query_str.'&uid='.$uid.'"</script><noscript><meta http-equiv="refresh" content="0;url=db_update.php'.$query_str.'&uid='.$uid.'" /></noscript>');
Index: trunk/web/punbb/delete.php
===================================================================
--- trunk/web/punbb/delete.php	(revision 10)
+++ trunk/web/punbb/delete.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -20,5 +37,5 @@
 
 // Fetch some info about the post, the topic and the forum
-$result = $db->query('SELECT f.id AS fid, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.id AS tid, t.subject, t.first_post_id, t.closed, p.posted, p.poster, p.poster_id, p.message, p.hide_smilies FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id='.$id) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT f.id AS fid, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.id AS tid, t.subject, t.posted, t.closed, p.poster, p.poster_id, p.message, p.hide_smilies FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id='.$id) or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 if (!$db->num_rows($result))
 	message($lang_common['Bad request']);
@@ -26,12 +43,13 @@
 $cur_post = $db->fetch_assoc($result);
 
-if ($pun_config['o_censoring'] == '1')
-	$cur_post['subject'] = censor_words($cur_post['subject']);
-
 // Sort out who the moderators are and if we are currently a moderator (or an admin)
 $mods_array = ($cur_post['moderators'] != '') ? unserialize($cur_post['moderators']) : array();
-$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
+$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
 
-$is_topic_post = ($id == $cur_post['first_post_id']) ? true : false;
+// Determine whether this post is the "topic post" or not
+$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$cur_post['tid'].' ORDER BY posted LIMIT 1') or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
+$topic_post_id = $db->result($result);
+
+$is_topic_post = ($id == $topic_post_id) ? true : false;
 
 // Do we have permission to edit this post?
@@ -68,15 +86,10 @@
 		update_forum($cur_post['fid']);
 
-		// Redirect towards the previous post
-		$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$cur_post['tid'].' AND id < '.$id.' ORDER BY id DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-		$post_id = $db->result($result);
-
-		redirect('viewtopic.php?pid='.$post_id.'#p'.$post_id, $lang_delete['Post del redirect']);
+		redirect('viewtopic.php?id='.$cur_post['tid'], $lang_delete['Post del redirect']);
 	}
 }
 
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_delete['Delete post']);
-define ('PUN_ACTIVE_PAGE', 'index');
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_delete['Delete post'];
 require PUN_ROOT.'header.php';
 
@@ -87,10 +100,5 @@
 <div class="linkst">
 	<div class="inbox">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $cur_post['fid'] ?>"><?php echo pun_htmlspecialchars($cur_post['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?pid=<?php echo $id ?>#p<?php echo $id ?>"><?php echo pun_htmlspecialchars($cur_post['subject']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_delete['Delete post'] ?></strong></li>
-		</ul>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li><li>&#160;&raquo;&#160;<a href="viewforum.php?id=<?php echo $cur_post['fid'] ?>"><?php echo pun_htmlspecialchars($cur_post['forum_name']) ?></a></li><li>&#160;&raquo;&#160;<?php echo pun_htmlspecialchars($cur_post['subject']) ?></li></ul>
 	</div>
 </div>
@@ -101,34 +109,16 @@
 		<form method="post" action="delete.php?id=<?php echo $id ?>">
 			<div class="inform">
-				<div class="forminfo">
-					<h3><span><?php printf($is_topic_post ? $lang_delete['Topic by'] : $lang_delete['Reply by'], '<strong>'.pun_htmlspecialchars($cur_post['poster']).'</strong>', format_time($cur_post['posted'])) ?></span></h3>
-					<p><?php echo ($is_topic_post) ? '<strong>'.$lang_delete['Topic warning'].'</strong>' : '<strong>'.$lang_delete['Warning'].'</strong>' ?><br /><?php echo $lang_delete['Delete info'] ?></p>
-				</div>
-			</div>
-			<p class="buttons"><input type="submit" name="delete" value="<?php echo $lang_delete['Delete'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
-		</form>
-	</div>
-</div>
-
-<div id="postreview">
-	<div class="blockpost">
-		<div class="box">
-			<div class="inbox">
-				<div class="postbody">
-					<div class="postleft">
-						<dl>
-							<dt><strong><?php echo pun_htmlspecialchars($cur_post['poster']) ?></strong></dt>
-							<dd><span><?php echo format_time($cur_post['posted']) ?></span></dd>
-						</dl>
-					</div>
-					<div class="postright">
+				<fieldset>
+					<legend class="warntext"><?php echo $lang_delete['Warning'] ?></legend>
+					<div class="infldset">
 						<div class="postmsg">
-							<?php echo $cur_post['message']."\n" ?>
+							<p><?php echo $lang_common['Author'] ?>: <strong><?php echo pun_htmlspecialchars($cur_post['poster']) ?></strong></p>
+							<?php echo $cur_post['message'] ?>
 						</div>
 					</div>
-				</div>
-				<div class="clearer"></div>
+				</fieldset>
 			</div>
-		</div>
+			<p><input type="submit" name="delete" value="<?php echo $lang_delete['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+		</form>
 	</div>
 </div>
Index: trunk/web/punbb/edit.php
===================================================================
--- trunk/web/punbb/edit.php	(revision 10)
+++ trunk/web/punbb/edit.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -20,5 +37,5 @@
 
 // Fetch some info about the post, the topic and the forum
-$result = $db->query('SELECT f.id AS fid, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.id AS tid, t.subject, t.posted, t.first_post_id, t.sticky, t.closed, p.poster, p.poster_id, p.message, p.hide_smilies FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id='.$id) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT f.id AS fid, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.id AS tid, t.subject, t.posted, t.closed, p.poster, p.poster_id, p.message, p.hide_smilies FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id='.$id) or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 if (!$db->num_rows($result))
 	message($lang_common['Bad request']);
@@ -28,13 +45,11 @@
 // Sort out who the moderators are and if we are currently a moderator (or an admin)
 $mods_array = ($cur_post['moderators'] != '') ? unserialize($cur_post['moderators']) : array();
-$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
-
-$can_edit_subject = $id == $cur_post['first_post_id'];
-
-if ($pun_config['o_censoring'] == '1')
-{
-	$cur_post['subject'] = censor_words($cur_post['subject']);
-	$cur_post['message'] = censor_words($cur_post['message']);
-}
+$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
+
+// Determine whether this post is the "topic post" or not
+$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$cur_post['tid'].' ORDER BY posted LIMIT 1') or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
+$topic_post_id = $db->result($result);
+
+$can_edit_subject = ($id == $topic_post_id && (($pun_user['g_edit_subjects_interval'] == '0' || (time() - $cur_post['posted']) < $pun_user['g_edit_subjects_interval']) || $is_admmod)) ? true : false;
 
 // Do we have permission to edit this post?
@@ -57,20 +72,15 @@
 		confirm_referrer('edit.php');
 
-	// If it's a topic it must contain a subject
+	// If it is a topic it must contain a subject
 	if ($can_edit_subject)
 	{
 		$subject = pun_trim($_POST['req_subject']);
 
-		if ($pun_config['o_censoring'] == '1')
-			$censored_subject = pun_trim(censor_words($subject));
-
 		if ($subject == '')
 			$errors[] = $lang_post['No subject'];
-		else if ($pun_config['o_censoring'] == '1' && $censored_subject == '')
-			$errors[] = $lang_post['No subject after censoring'];
 		else if (pun_strlen($subject) > 70)
 			$errors[] = $lang_post['Too long subject'];
-		else if ($pun_config['p_subject_all_caps'] == '0' && is_all_uppercase($subject) && !$pun_user['is_admmod'])
-			$errors[] = $lang_post['All caps subject'];
+		else if ($pun_config['p_subject_all_caps'] == '0' && strtoupper($subject) == $subject && $pun_user['g_id'] > PUN_MOD)
+			$subject = ucwords(strtolower($subject));
 	}
 
@@ -78,12 +88,13 @@
 	$message = pun_linebreaks(pun_trim($_POST['req_message']));
 
-	// Here we use strlen() not pun_strlen() as we want to limit the post to PUN_MAX_POSTSIZE bytes, not characters
-	if (strlen($message) > PUN_MAX_POSTSIZE)
-		$errors[] = sprintf($lang_post['Too long message'], forum_number_format(PUN_MAX_POSTSIZE));
-	else if ($pun_config['p_message_all_caps'] == '0' && is_all_uppercase($message) && !$pun_user['is_admmod'])
-		$errors[] = $lang_post['All caps message'];
+	if ($message == '')
+		$errors[] = $lang_post['No message'];
+	else if (strlen($message) > 65535)
+		$errors[] = $lang_post['Too long message'];
+	else if ($pun_config['p_message_all_caps'] == '0' && strtoupper($message) == $message && $pun_user['g_id'] > PUN_MOD)
+		$message = ucwords(strtolower($message));
 
 	// Validate BBCode syntax
-	if ($pun_config['p_message_bbcode'] == '1')
+	if ($pun_config['p_message_bbcode'] == '1' && strpos($message, '[') !== false && strpos($message, ']') !== false)
 	{
 		require PUN_ROOT.'include/parser.php';
@@ -91,27 +102,12 @@
 	}
 
-	if (empty($errors))
-	{
-		if ($message == '')
-			$errors[] = $lang_post['No message'];
-		else if ($pun_config['o_censoring'] == '1')
-		{
-			// Censor message to see if that causes problems
-			$censored_message = pun_trim(censor_words($message));
-
-			if ($censored_message == '')
-				$errors[] = $lang_post['No message after censoring'];
-		}
-	}
-
-	$hide_smilies = isset($_POST['hide_smilies']) ? '1' : '0';
-	$stick_topic = isset($_POST['stick_topic']) ? '1' : '0';
-	if (!$is_admmod)
-		$stick_topic = $cur_post['sticky'];
+
+	$hide_smilies = isset($_POST['hide_smilies']) ? intval($_POST['hide_smilies']) : 0;
+	if ($hide_smilies != '1') $hide_smilies = '0';
 
 	// Did everything go according to plan?
 	if (empty($errors) && !isset($_POST['preview']))
 	{
-		$edited_sql = (!isset($_POST['silent']) || !$is_admmod) ? ', edited='.time().', edited_by=\''.$db->escape($pun_user['username']).'\'' : '';
+		$edited_sql = (!isset($_POST['silent']) || !$is_admmod) ? $edited_sql = ', edited='.time().', edited_by=\''.$db->escape($pun_user['username']).'\'' : '';
 
 		require PUN_ROOT.'include/search_idx.php';
@@ -120,5 +116,5 @@
 		{
 			// Update the topic and any redirect topics
-			$db->query('UPDATE '.$db->prefix.'topics SET subject=\''.$db->escape($subject).'\', sticky='.$stick_topic.' WHERE id='.$cur_post['tid'].' OR moved_to='.$cur_post['tid']) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'topics SET subject=\''.$db->escape($subject).'\' WHERE id='.$cur_post['tid'].' OR moved_to='.$cur_post['tid']) or error('Impossible de modifier la discussion', __FILE__, __LINE__, $db->error());
 
 			// We changed the subject, so we need to take that into account when we update the search words
@@ -129,5 +125,5 @@
 
 		// Update the post
-		$db->query('UPDATE '.$db->prefix.'posts SET message=\''.$db->escape($message).'\', hide_smilies='.$hide_smilies.$edited_sql.' WHERE id='.$id) or error('Unable to update post', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'posts SET message=\''.$db->escape($message).'\', hide_smilies=\''.$hide_smilies.'\''.$edited_sql.' WHERE id='.$id) or error('Impossible de modifier le message', __FILE__, __LINE__, $db->error());
 
 		redirect('viewtopic.php?pid='.$id.'#p'.$id, $lang_post['Edit redirect']);
@@ -137,8 +133,7 @@
 
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_post['Edit post']);
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_post['Edit post'];
 $required_fields = array('req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message']);
 $focus_element = array('edit', 'req_message');
-define('PUN_ACTIVE_PAGE', 'index');
 require PUN_ROOT.'header.php';
 
@@ -148,10 +143,5 @@
 <div class="linkst">
 	<div class="inbox">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $cur_post['fid'] ?>"><?php echo pun_htmlspecialchars($cur_post['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?id=<?php echo $cur_post['tid'] ?>"><?php echo pun_htmlspecialchars($cur_post['subject']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_post['Edit post'] ?></strong></li>
-		</ul>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li><li>&#160;&raquo;&#160;<a href="viewforum.php?id=<?php echo $cur_post['fid'] ?>"><?php echo pun_htmlspecialchars($cur_post['forum_name']) ?></a></li><li>&#160;&raquo;&#160;<?php echo pun_htmlspecialchars($cur_post['subject']) ?></li></ul>
 	</div>
 </div>
@@ -167,10 +157,10 @@
 	<h2><span><?php echo $lang_post['Post errors'] ?></span></h2>
 	<div class="box">
-		<div class="inbox error-info">
+		<div class="inbox"
 			<p><?php echo $lang_post['Post errors info'] ?></p>
-			<ul class="error-list">
-<?php
-
-	foreach ($errors as $cur_error)
+			<ul>
+<?php
+
+	while (list(, $cur_error) = each($errors))
 		echo "\t\t\t\t".'<li><strong>'.$cur_error.'</strong></li>'."\n";
 ?>
@@ -193,9 +183,7 @@
 	<div class="box">
 		<div class="inbox">
-			<div class="postbody">
-				<div class="postright">
-					<div class="postmsg">
-						<?php echo $preview_message."\n" ?>
-					</div>
+			<div class="postright">
+				<div class="postmsg">
+					<?php echo $preview_message."\n" ?>
 				</div>
 			</div>
@@ -209,6 +197,6 @@
 
 ?>
-<div id="editform" class="blockform">
-	<h2><span><?php echo $lang_post['Edit post'] ?></span></h2>
+<div class="blockform">
+	<h2><?php echo $lang_post['Edit post'] ?></h2>
 	<div class="box">
 		<form id="edit" method="post" action="edit.php?id=<?php echo $id ?>&amp;action=edit" onsubmit="return process_form(this)">
@@ -218,12 +206,13 @@
 					<input type="hidden" name="form_sent" value="1" />
 					<div class="infldset txtarea">
-<?php if ($can_edit_subject): ?>						<label class="required"><strong><?php echo $lang_common['Subject'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
+<?php if ($can_edit_subject): ?>						<label><?php echo $lang_common['Subject'] ?><br />
 						<input class="longinput" type="text" name="req_subject" size="80" maxlength="70" tabindex="<?php echo $cur_index++ ?>" value="<?php echo pun_htmlspecialchars(isset($_POST['req_subject']) ? $_POST['req_subject'] : $cur_post['subject']) ?>" /><br /></label>
-<?php endif; ?>						<label class="required"><strong><?php echo $lang_common['Message'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
+<?php endif; $bbcode_form = 'edit'; $bbcode_field = 'req_message'; require PUN_ROOT.'mod_easy_bbcode.php'; ?>						<label><?php echo $lang_common['Message'] ?><br />
+
 						<textarea name="req_message" rows="20" cols="95" tabindex="<?php echo $cur_index++ ?>"><?php echo pun_htmlspecialchars(isset($_POST['req_message']) ? $message : $cur_post['message']) ?></textarea><br /></label>
 						<ul class="bblinks">
-							<li><span><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a> <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-							<li><span><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a> <?php echo ($pun_config['p_message_bbcode'] == '1' && $pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-							<li><span><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a> <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
+							<li><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a>: <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+							<li><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a>: <?php echo ($pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+							<li><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a>: <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
 						</ul>
 					</div>
@@ -232,26 +221,18 @@
 
 $checkboxes = array();
-if ($can_edit_subject && $is_admmod)
-{
-	if (isset($_POST['stick_topic']) || $cur_post['sticky'] == '1')
-		$checkboxes[] = '<label><input type="checkbox" name="stick_topic" value="1" checked="checked" tabindex="'.($cur_index++).'" />'.$lang_common['Stick topic'].'<br /></label>';
+if ($pun_config['o_smilies'] == '1')
+{
+	if (isset($_POST['hide_smilies']) || $cur_post['hide_smilies'] == '1')
+		$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" checked="checked" tabindex="'.($cur_index++).'" />&#160;'.$lang_post['Hide smilies'];
 	else
-		$checkboxes[] = '<label><input type="checkbox" name="stick_topic" value="1" tabindex="'.($cur_index++).'" />'.$lang_common['Stick topic'].'<br /></label>';
-}
-
-if ($pun_config['o_smilies'] == '1')
-{
-	if (isset($_POST['hide_smilies']) || $cur_post['hide_smilies'] == '1')
-		$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" checked="checked" tabindex="'.($cur_index++).'" />'.$lang_post['Hide smilies'].'<br /></label>';
+		$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'" />&#160;'.$lang_post['Hide smilies'];
+}
+
+if ($is_admmod)
+{
+	if ((isset($_POST['form_sent']) && isset($_POST['silent'])) || !isset($_POST['form_sent']))
+		$checkboxes[] = '<label><input type="checkbox" name="silent" value="1" tabindex="'.($cur_index++).'" checked="checked" />&#160;'.$lang_post['Silent edit'];
 	else
-		$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'" />'.$lang_post['Hide smilies'].'<br /></label>';
-}
-
-if ($is_admmod)
-{
-	if ((isset($_POST['form_sent']) && isset($_POST['silent'])) || !isset($_POST['form_sent']))
-		$checkboxes[] = '<label><input type="checkbox" name="silent" value="1" tabindex="'.($cur_index++).'" checked="checked" />'.$lang_post['Silent edit'].'<br /></label>';
-	else
-		$checkboxes[] = '<label><input type="checkbox" name="silent" value="1" tabindex="'.($cur_index++).'" />'.$lang_post['Silent edit'].'<br /></label>';
+		$checkboxes[] = '<label><input type="checkbox" name="silent" value="1" tabindex="'.($cur_index++).'" />&#160;'.$lang_post['Silent edit'];
 }
 
@@ -266,5 +247,5 @@
 					<div class="infldset">
 						<div class="rbox">
-							<?php echo implode("\n\t\t\t\t\t\t\t", $checkboxes)."\n" ?>
+							<?php echo implode('</label>'."\n\t\t\t\t\t\t\t", $checkboxes).'</label>'."\n" ?>
 						</div>
 					</div>
@@ -276,5 +257,5 @@
 ?>
 			</div>
-			<p class="buttons"><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="s" /> <input type="submit" name="preview" value="<?php echo $lang_post['Preview'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="p" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="s" /><input type="submit" name="preview" value="<?php echo $lang_post['Preview'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="p" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
Index: trunk/web/punbb/extern.php
===================================================================
--- trunk/web/punbb/extern.php	(revision 10)
+++ trunk/web/punbb/extern.php	(revision 1)
@@ -1,488 +1,282 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-/*-----------------------------------------------------------------------------
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************
+
 
   INSTRUCTIONS
 
-  This script is used to include information about your board from
-  pages outside the forums and to syndicate news about recent
-  discussions via RSS/Atom/XML. The script can display a list of
-  recent discussions, a list of active users or a collection of
-  general board statistics. The script can be called directly via
-  an URL, from a PHP include command or through the use of Server
-  Side Includes (SSI).
-
-  The scripts behaviour is controlled via variables supplied in the
-  URL to the script. The different variables are: action (what to
-  do), show (how many items to display), fid (the ID or IDs of
-  the forum(s) to poll for topics), nfid (the ID or IDs of forums
-  that should be excluded), tid (the ID of the topic from which to
-  display posts) and type (output as HTML or RSS). The only
-  mandatory variable is action. Possible/default values are:
-
-	action: feed - show most recent topics/posts (HTML or RSS)
-			online - show users online (HTML)
-			online_full - as above, but includes a full list (HTML)
-			stats - show board statistics (HTML)
-
-	type:   rss - output as RSS 2.0
-			atom - output as Atom 1.0
-			xml - output as XML
-			html - output as HTML (<li>'s)
-
-	fid:    One or more forum IDs (comma-separated). If ignored,
-			topics from all readable forums will be pulled.
-
-	nfid:   One or more forum IDs (comma-separated) that are to be
-			excluded. E.g. the ID of a a test forum.
-
-	tid:    A topic ID from which to show posts. If a tid is supplied,
-			fid and nfid are ignored.
-
-	show:   Any integer value between 1 and 50. The default is 15.
-
-	order:  last_post - show topics ordered by when they were last
-						posted in, giving information about the reply.
-			posted - show topics ordered by when they were first
-					 posted, giving information about the original post.
-
------------------------------------------------------------------------------*/
-
-define('PUN_QUIET_VISIT', 1);
-
-if (!defined('PUN_ROOT'))
-	define('PUN_ROOT', dirname(__FILE__).'/');
-require PUN_ROOT.'include/common.php';
-
-// The length at which topic subjects will be truncated (for HTML output)
-if (!defined('FORUM_EXTERN_MAX_SUBJECT_LENGTH'))
-	define('FORUM_EXTERN_MAX_SUBJECT_LENGTH', 30);
-
-// If we're a guest and we've sent a username/pass, we can try to authenticate using those details
-if ($pun_user['is_guest'] && isset($_SERVER['PHP_AUTH_USER']))
-	authenticate_user($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
-
-if ($pun_user['g_read_board'] == '0')
-{
-	http_authenticate_user();
-	exit($lang_common['No view']);
-}
-
-$action = isset($_GET['action']) ? strtolower($_GET['action']) : 'feed';
-
-// Handle a couple old formats, from FluxBB 1.2
-switch ($action)
-{
-	case 'active':
-		$action = 'feed';
-		$_GET['order'] = 'last_post';
-		break;
-
-	case 'new':
-		$action = 'feed';
-		$_GET['order'] = 'posted';
-		break;
-}
-
-//
-// Sends the proper headers for Basic HTTP Authentication
-//
-function http_authenticate_user()
-{
-	global $pun_config, $pun_user;
-
-	if (!$pun_user['is_guest'])
-		return;
-
-	header('WWW-Authenticate: Basic realm="'.$pun_config['o_board_title'].' External Syndication"');
-	header('HTTP/1.0 401 Unauthorized');
-}
-
-
-//
-// Output $feed as RSS 2.0
-//
-function output_rss($feed)
-{
-	global $lang_common, $pun_config;
-
-	// Send XML/no cache headers
-	header('Content-Type: application/xml; charset=utf-8');
-	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	header('Pragma: public');
-
-	echo '<?xml version="1.0" encoding="utf-8"?>'."\n";
-	echo '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">'."\n";
-	echo "\t".'<channel>'."\n";
-	echo "\t\t".'<atom:link href="'.pun_htmlspecialchars(get_current_url()).'" rel="self" type="application/rss+xml" />'."\n";
-	echo "\t\t".'<title><![CDATA['.escape_cdata($feed['title']).']]></title>'."\n";
-	echo "\t\t".'<link>'.pun_htmlspecialchars($feed['link']).'</link>'."\n";
-	echo "\t\t".'<description><![CDATA['.escape_cdata($feed['description']).']]></description>'."\n";
-	echo "\t\t".'<lastBuildDate>'.gmdate('r', count($feed['items']) ? $feed['items'][0]['pubdate'] : time()).'</lastBuildDate>'."\n";
-
-	if ($pun_config['o_show_version'] == '1')
-		echo "\t\t".'<generator>FluxBB '.$pun_config['o_cur_version'].'</generator>'."\n";
+  Le script extern.php est utiliser pour inclure des informations Ã  
+  propos de vos forums sur des pages externes aux forums et pour 
+  syndiquer les discussions rÃ©centes via RSS. Le script peut afficher 
+  une liste de discussions rÃ©centes (triÃ©e par messages, dates ou 
+  derniers messages), une liste dÂutilisateurs actifs ou une 
+  collection de statistiques gÃ©nÃ©rales. Le script peut Ãªtre appeler 
+  directement par lÂintermÃ©diaire dÂune URL (pour RSS), de la 
+  commande inclue de PHP ou par lÂutilisation du Server Side 
+  Includes (SSI).
+
+  Le comportement du script est commandÃ© par lÂintermÃ©diaire de 
+  variables fournies au script dans lÂURL. Les diffÃ©rentes variables 
+  sont : action (que faut-il afficher), show (combien de discussions 
+  afficher), forum (lÂID du forum Ã  sonder pour rÃ©cupÃšrer les 
+  discussions) et type (sortie comme HTML ou RSS). La seule variable 
+  obligatoire est action. Les valeurs de possibles (par defaut) sont :
+
+    action: 
+	  active (affiche les discussions rÃ©cemment actives) (HTML ou RSS)
+      new (afficher les plus rÃ©centes discussions) (HTML ou RSS)
+      online (afficher les utilisateurs en ligne) (HTML)
+      online_full (idem, mais inclut une liste complÃšte) (HTML)
+      stats (afficher les statistiques des forums) (HTML)
+
+    show:   NÂimporte quÂelle valeur, nombre entier entre 1 et 50. 
+	        Cette variable est ignorÃ©es pour la sortie RSS. 15 par 
+			dÃ©faut.
+
+    fid:    Un ou plusieurs ID de forum (sÃ©parÃ©s par des virgules). 
+	        Si ignorÃ©e, des discussions de tous les forums lisibles 
+			par les invitÃ©s seront rÃ©cupÃ©rÃ©es.
+
+    nfid:   Un ou plusieurs ID de forum (sÃ©parÃ©s par des virgules) 
+	        qui seront ignorÃ©s. Ex. l'ID d'un forum de test.
+
+    type:   RSS. Toute autre chose signifie une sortie en HTML.
+
+
+  Voici quelques exemples en utilisant la fonction include() de PHP :
+
+    Afficher les 15 discussions les plus rÃ©cemment actives depuis tous les forums :
+    include('http://host.com/forums/extern.php?action=active');
+
+    Afficher les 10 discussions les plus rÃ©centes depuis les forums dÂID 5, 6 et 7 :
+    include('http://host.com/forums/extern.php?action=new&show=10&fid=5,6,7');
+
+    Afficher les utilisateurs en ligne :
+    include('http://host.com/forums/extern.php?action=online');
+
+    Afficher les utilisateurs en ligne avec une liste complÃšte :
+    include('http://host.com/forums/extern.php?action=online_full');
+
+    Afficher les statistiques des forums :
+    include('http://host.com/forums/extern.php?action=stats');
+
+
+  Voici quelques exemples en utilisant SSI :
+
+    Afficher les 5 discussions les plus rÃ©centes depuis les forums dÂID 11 et 22:
+    <!--#include virtual="forums/extern.php?action=new&show=5&fid=11,22" -->
+
+    Afficher les statistiques des forums :
+    <!--#include virtual="forums/extern.php?action=stats" -->
+
+
+  Et finalement quelques exemples en utilisant extern.php pour produire un fil RSS 0.91 :
+
+    Afficher les 15 discussions les plus rÃ©cemment actives :
+    http://host.com/extern.php?action=active&type=RSS
+
+    Afficher les 15 discussions les plus rÃ©cemment actives depuis le forum dÂID 2:
+    http://host.com/extern.php?action=active&type=RSS&fid=2
+
+  Ci-dessous vous trouverez des variables que vous pouvez modifier pour que le 
+  script se comporte selon vos besoins.
+
+/***********************************************************************/
+
+// Le nombre maximum de discussions qui seront affichÃ©es
+$show_max_topics = 60;
+
+// La longueur Ã  laquelle les sujets des discussions seront tronquÃ©es (pour HTML)
+$max_subject_length = 30;
+
+/***********************************************************************/
+
+// NE MODIFIEZ RIEN AU-DESSOUS DE CETTE LIGNE ! (Ã  moins que vous sachiez ce que vous faites)
+
+
+define('PUN_ROOT', './');
+@include PUN_ROOT.'config.php';
+
+// If PUN isn't defined, config.php is missing or corrupt
+if (!defined('PUN'))
+	exit('Le fichier "config.php" n\'existe pas ou est endommagÃ©. Veuillez lancer install.php pour installer PunBB.');
+
+
+// Make sure PHP reports all errors except E_NOTICE
+error_reporting(E_ALL ^ E_NOTICE);
+
+// Turn off magic_quotes_runtime
+set_magic_quotes_runtime(0);
+
+
+// Load the functions script
+require PUN_ROOT.'include/functions.php';
+
+// Load DB abstraction layer and try to connect
+require PUN_ROOT.'include/dblayer/common_db.php';
+
+// Load cached config
+@include PUN_ROOT.'cache/cache_config.php';
+if (!defined('PUN_CONFIG_LOADED'))
+{
+	require PUN_ROOT.'include/cache.php';
+	generate_config_cache();
+	require PUN_ROOT.'cache/cache_config.php';
+}
+
+// Make sure we (guests) have permission to read the forums
+$result = $db->query('SELECT g_read_board FROM '.$db->prefix.'groups WHERE g_id=3') or error('Unable to fetch group info', __FILE__, __LINE__, $db->error());
+if ($db->result($result) == '0')
+	exit('Vous n\'avez pas les permissions');
+
+
+// Attempt to load the common language file
+@include PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/common.php';
+if (!isset($lang_common))
+	exit('Il n\'y a pas de pack de langue \''.$pun_config['o_default_lang'].'\' d\'installÃ©. Veuillez rÃ©-installer une langue de ce nom.');
+
+if (!isset($_GET['action']))
+	exit('Aucun paramÃštre de fourni. Veuillez voir extern.php pour les instructions.');
+
+
+//
+// Converts the CDATA end sequence ]]> into ]]&gt;
+//
+function escape_cdata($str)
+{
+	return str_replace(']]>', ']]&gt;', $str);
+}
+
+
+//
+// Show recent discussions
+//
+if ($_GET['action'] == 'active' || $_GET['action'] == 'new')
+{
+	$order_by = ($_GET['action'] == 'active') ? 't.last_post' : 't.posted';
+	$forum_sql = '';
+
+	// Was any specific forum ID's supplied?
+	if (isset($_GET['fid']) && $_GET['fid'] != '')
+	{
+		$fids = explode(',', trim($_GET['fid']));
+		$fids = array_map('intval', $fids);
+
+		if (!empty($fids))
+			$forum_sql = ' AND f.id IN('.implode(',', $fids).')';
+	}
+
+	// Any forum ID's to exclude?
+	if (isset($_GET['nfid']) && $_GET['nfid'] != '')
+	{
+		$nfids = explode(',', trim($_GET['nfid']));
+		$nfids = array_map('intval', $nfids);
+
+		if (!empty($nfids))
+			$forum_sql = ' AND f.id NOT IN('.implode(',', $nfids).')';
+	}
+
+	// Should we output this as RSS?
+	if (isset($_GET['type']) && strtoupper($_GET['type']) == 'RSS')
+	{
+		$rss_description = ($_GET['action'] == 'active') ? $lang_common['RSS Desc Active'] : $lang_common['RSS Desc New'];
+		$url_action = ($_GET['action'] == 'active') ? '&amp;action=new' : '';
+
+		// Send XML/no cache headers
+		header('Content-Type: text/xml');
+		header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
+		header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
+		header('Pragma: public');
+
+		// It's time for some syndication!
+		echo '<?xml version="1.0" encoding="'.$lang_common['lang_encoding'].'"?>'."\r\n";
+		echo '<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">'."\r\n";
+		echo '<rss version="0.91">'."\r\n";
+		echo '<channel>'."\r\n";
+		echo "\t".'<title>'.pun_htmlspecialchars($pun_config['o_board_title']).'</title>'."\r\n";
+		echo "\t".'<link>'.$pun_config['o_base_url'].'/</link>'."\r\n";
+		echo "\t".'<description>'.pun_htmlspecialchars($rss_description.' '.$pun_config['o_board_title']).'</description>'."\r\n";
+		echo "\t".'<language>en-us</language>'."\r\n";
+
+		// Fetch 15 topics
+		$result = $db->query('SELECT t.id, t.poster, t.subject, t.posted, t.last_post, f.id AS fid, f.forum_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL'.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT 15') or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
+
+		while ($cur_topic = $db->fetch_assoc($result))
+		{
+			if ($pun_config['o_censoring'] == '1')
+				$cur_topic['subject'] = censor_words($cur_topic['subject']);
+
+			echo "\t".'<item>'."\r\n";
+			echo "\t\t".'<title>'.pun_htmlspecialchars($cur_topic['subject']).'</title>'."\r\n";
+			echo "\t\t".'<link>'.$pun_config['o_base_url'].'/viewtopic.php?id='.$cur_topic['id'].$url_action.'</link>'."\r\n";
+			echo "\t\t".'<description><![CDATA['.escape_cdata($lang_common['Forum'].': <a href="'.$pun_config['o_base_url'].'/viewforum.php?id='.$cur_topic['fid'].'">'.$cur_topic['forum_name'].'</a><br />'."\r\n".$lang_common['Author'].': '.$cur_topic['poster'].'<br />'."\r\n".$lang_common['Posted'].': '.date('r', $cur_topic['posted']).'<br />'."\r\n".$lang_common['Last post'].': '.date('r', $cur_topic['last_post'])).']]></description>'."\r\n";
+			echo "\t".'</item>'."\r\n";
+		}
+
+		echo '</channel>'."\r\n";
+		echo '</rss>';
+	}
+
+
+	// Output regular HTML
 	else
-		echo "\t\t".'<generator>FluxBB</generator>'."\n";
-
-	foreach ($feed['items'] as $item)
-	{
-		echo "\t\t".'<item>'."\n";
-		echo "\t\t\t".'<title><![CDATA['.escape_cdata($item['title']).']]></title>'."\n";
-		echo "\t\t\t".'<link>'.pun_htmlspecialchars($item['link']).'</link>'."\n";
-		echo "\t\t\t".'<description><![CDATA['.escape_cdata($item['description']).']]></description>'."\n";
-		echo "\t\t\t".'<author><![CDATA['.(isset($item['author']['email']) ? escape_cdata($item['author']['email']) : 'dummy@example.com').' ('.escape_cdata($item['author']['name']).')]]></author>'."\n";
-		echo "\t\t\t".'<pubDate>'.gmdate('r', $item['pubdate']).'</pubDate>'."\n";
-		echo "\t\t\t".'<guid>'.pun_htmlspecialchars($item['link']).'</guid>'."\n";
-
-		echo "\t\t".'</item>'."\n";
-	}
-
-	echo "\t".'</channel>'."\n";
-	echo '</rss>'."\n";
-}
-
-
-//
-// Output $feed as Atom 1.0
-//
-function output_atom($feed)
-{
-	global $lang_common, $pun_config;
-
-	// Send XML/no cache headers
-	header('Content-Type: application/atom+xml; charset=utf-8');
-	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	header('Pragma: public');
-
-	echo '<?xml version="1.0" encoding="utf-8"?>'."\n";
-	echo '<feed xmlns="http://www.w3.org/2005/Atom">'."\n";
-
-	echo "\t".'<title type="html"><![CDATA['.escape_cdata($feed['title']).']]></title>'."\n";
-	echo "\t".'<link rel="self" href="'.pun_htmlspecialchars(get_current_url()).'"/>'."\n";
-	echo "\t".'<link href="'.pun_htmlspecialchars($feed['link']).'"/>'."\n";
-	echo "\t".'<updated>'.gmdate('Y-m-d\TH:i:s\Z', count($feed['items']) ? $feed['items'][0]['pubdate'] : time()).'</updated>'."\n";
-
-	if ($pun_config['o_show_version'] == '1')
-		echo "\t".'<generator version="'.$pun_config['o_cur_version'].'">FluxBB</generator>'."\n";
-	else
-		echo "\t".'<generator>FluxBB</generator>'."\n";
-
-	echo "\t".'<id>'.pun_htmlspecialchars($feed['link']).'</id>'."\n";
-
-	$content_tag = ($feed['type'] == 'posts') ? 'content' : 'summary';
-
-	foreach ($feed['items'] as $item)
-	{
-		echo "\t".'<entry>'."\n";
-		echo "\t\t".'<title type="html"><![CDATA['.escape_cdata($item['title']).']]></title>'."\n";
-		echo "\t\t".'<link rel="alternate" href="'.pun_htmlspecialchars($item['link']).'"/>'."\n";
-		echo "\t\t".'<'.$content_tag.' type="html"><![CDATA['.escape_cdata($item['description']).']]></'.$content_tag.'>'."\n";
-		echo "\t\t".'<author>'."\n";
-		echo "\t\t\t".'<name><![CDATA['.escape_cdata($item['author']['name']).']]></name>'."\n";
-
-		if (isset($item['author']['email']))
-			echo "\t\t\t".'<email><![CDATA['.escape_cdata($item['author']['email']).']]></email>'."\n";
-
-		if (isset($item['author']['uri']))
-			echo "\t\t\t".'<uri>'.pun_htmlspecialchars($item['author']['uri']).'</uri>'."\n";
-
-		echo "\t\t".'</author>'."\n";
-		echo "\t\t".'<updated>'.gmdate('Y-m-d\TH:i:s\Z', $item['pubdate']).'</updated>'."\n";
-
-		echo "\t\t".'<id>'.pun_htmlspecialchars($item['link']).'</id>'."\n";
-		echo "\t".'</entry>'."\n";
-	}
-
-	echo '</feed>'."\n";
-}
-
-
-//
-// Output $feed as XML
-//
-function output_xml($feed)
-{
-	global $lang_common, $pun_config;
-
-	// Send XML/no cache headers
-	header('Content-Type: application/xml; charset=utf-8');
-	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	header('Pragma: public');
-
-	echo '<?xml version="1.0" encoding="utf-8"?>'."\n";
-	echo '<source>'."\n";
-	echo "\t".'<url>'.pun_htmlspecialchars($feed['link']).'</url>'."\n";
-
-	$forum_tag = ($feed['type'] == 'posts') ? 'post' : 'topic';
-
-	foreach ($feed['items'] as $item)
-	{
-		echo "\t".'<'.$forum_tag.' id="'.$item['id'].'">'."\n";
-
-		echo "\t\t".'<title><![CDATA['.escape_cdata($item['title']).']]></title>'."\n";
-		echo "\t\t".'<link>'.pun_htmlspecialchars($item['link']).'</link>'."\n";
-		echo "\t\t".'<content><![CDATA['.escape_cdata($item['description']).']]></content>'."\n";
-		echo "\t\t".'<author>'."\n";
-		echo "\t\t\t".'<name><![CDATA['.escape_cdata($item['author']['name']).']]></name>'."\n";
-
-		if (isset($item['author']['email']))
-			echo "\t\t\t".'<email><![CDATA['.escape_cdata($item['author']['email']).']]></email>'."\n";
-
-		if (isset($item['author']['uri']))
-			echo "\t\t\t".'<uri>'.pun_htmlspecialchars($item['author']['uri']).'</uri>'."\n";
-
-		echo "\t\t".'</author>'."\n";
-		echo "\t\t".'<posted>'.gmdate('r', $item['pubdate']).'</posted>'."\n";
-
-		echo "\t".'</'.$forum_tag.'>'."\n";
-	}
-
-	echo '</source>'."\n";
-}
-
-
-//
-// Output $feed as HTML (using <li> tags)
-//
-function output_html($feed)
-{
-
-	// Send the Content-type header in case the web server is setup to send something else
-	header('Content-type: text/html; charset=utf-8');
-	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	header('Pragma: public');
-
-	foreach ($feed['items'] as $item)
-	{
-		if (utf8_strlen($item['title']) > FORUM_EXTERN_MAX_SUBJECT_LENGTH)
-			$subject_truncated = pun_htmlspecialchars(pun_trim(utf8_substr($item['title'], 0, (FORUM_EXTERN_MAX_SUBJECT_LENGTH - 5)))).' âŠ';
-		else
-			$subject_truncated = pun_htmlspecialchars($item['title']);
-
-		echo '<li><a href="'.pun_htmlspecialchars($item['link']).'" title="'.pun_htmlspecialchars($item['title']).'">'.$subject_truncated.'</a></li>'."\n";
-	}
-}
-
-// Show recent discussions
-if ($action == 'feed')
-{
-	require PUN_ROOT.'include/parser.php';
-
-	// Determine what type of feed to output
-	$type = isset($_GET['type']) ? strtolower($_GET['type']) : 'html';
-	if (!in_array($type, array('html', 'rss', 'atom', 'xml')))
-		$type = 'html';
-
-	$show = isset($_GET['show']) ? intval($_GET['show']) : 15;
-	if ($show < 1 || $show > 50)
-		$show = 15;
-
-	// Was a topic ID supplied?
-	if (isset($_GET['tid']))
-	{
-		$tid = intval($_GET['tid']);
-
-		// Fetch topic subject
-		$result = $db->query('SELECT t.subject, t.first_post_id FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL AND t.id='.$tid) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
-		if (!$db->num_rows($result))
+	{
+		$show = isset($_GET['show']) ? intval($_GET['show']) : 15;
+		if ($show < 1 || $show > 50)
+			$show = 15;
+
+		// Fetch $show topics
+		$result = $db->query('SELECT t.id, t.subject FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL'.$forum_sql.' ORDER BY '.$order_by.' DESC LIMIT '.$show) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
+
+		while ($cur_topic = $db->fetch_assoc($result))
 		{
-			http_authenticate_user();
-			exit($lang_common['Bad request']);
+			if ($pun_config['o_censoring'] == '1')
+				$cur_topic['subject'] = censor_words($cur_topic['subject']);
+
+			if (pun_strlen($cur_topic['subject']) > $max_subject_length)
+				$subject_truncated = pun_htmlspecialchars(trim(substr($cur_topic['subject'], 0, ($max_subject_length-5)))).' ...';
+			else
+				$subject_truncated = pun_htmlspecialchars($cur_topic['subject']);
+
+			echo '<li><a href="'.$pun_config['o_base_url'].'/viewtopic.php?id='.$cur_topic['id'].'&amp;action=new" title="'.pun_htmlspecialchars($cur_topic['subject']).'">'.$subject_truncated.'</a></li>'."\n";
 		}
-
-		$cur_topic = $db->fetch_assoc($result);
-
-		if ($pun_config['o_censoring'] == '1')
-			$cur_topic['subject'] = censor_words($cur_topic['subject']);
-
-		// Setup the feed
-		$feed = array(
-			'title' 		=>	$pun_config['o_board_title'].$lang_common['Title separator'].$cur_topic['subject'],
-			'link'			=>	get_base_url(true).'/viewtopic.php?id='.$tid,
-			'description'		=>	sprintf($lang_common['RSS description topic'], $cur_topic['subject']),
-			'items'			=>	array(),
-			'type'			=>	'posts'
-		);
-
-		// Fetch $show posts
-		$result = $db->query('SELECT p.id, p.poster, p.message, p.hide_smilies, p.posted, p.poster_id, u.email_setting, u.email, p.poster_email FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id WHERE p.topic_id='.$tid.' ORDER BY p.posted DESC LIMIT '.$show) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-		while ($cur_post = $db->fetch_assoc($result))
-		{
-			$cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies']);
-
-			$item = array(
-				'id'			=>	$cur_post['id'],
-				'title'			=>	$cur_topic['first_post_id'] == $cur_post['id'] ? $cur_topic['subject'] : $lang_common['RSS reply'].$cur_topic['subject'],
-				'link'			=>	get_base_url(true).'/viewtopic.php?pid='.$cur_post['id'].'#p'.$cur_post['id'],
-				'description'		=>	$cur_post['message'],
-				'author'		=>	array(
-					'name'	=> $cur_post['poster'],
-				),
-				'pubdate'		=>	$cur_post['posted']
-			);
-
-			if ($cur_post['poster_id'] > 1)
-			{
-				if ($cur_post['email_setting'] == '0' && !$pun_user['is_guest'])
-					$item['author']['email'] = $cur_post['email'];
-
-				$item['author']['uri'] = get_base_url(true).'/profile.php?id='.$cur_post['poster_id'];
-			}
-			else if ($cur_post['poster_email'] != '' && !$pun_user['is_guest'])
-				$item['author']['email'] = $cur_post['poster_email'];
-
-			$feed['items'][] = $item;
-		}
-
-		$output_func = 'output_'.$type;
-		$output_func($feed);
-	}
-	else
-	{
-		$order_posted = isset($_GET['order']) && strtolower($_GET['order']) == 'posted';
-		$forum_name = '';
-		$forum_sql = '';
-
-		// Were any forum IDs supplied?
-		if (isset($_GET['fid']) && is_scalar($_GET['fid']) && $_GET['fid'] != '')
-		{
-			$fids = explode(',', pun_trim($_GET['fid']));
-			$fids = array_map('intval', $fids);
-
-			if (!empty($fids))
-				$forum_sql .= ' AND t.forum_id IN('.implode(',', $fids).')';
-
-			if (count($fids) == 1)
-			{
-				// Fetch forum name
-				$result = $db->query('SELECT f.forum_name FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fids[0]) or error('Unable to fetch forum name', __FILE__, __LINE__, $db->error());
-				if ($db->num_rows($result))
-					$forum_name = $lang_common['Title separator'].$db->result($result);
-			}
-		}
-
-		// Any forum IDs to exclude?
-		if (isset($_GET['nfid']) && is_scalar($_GET['nfid']) && $_GET['nfid'] != '')
-		{
-			$nfids = explode(',', pun_trim($_GET['nfid']));
-			$nfids = array_map('intval', $nfids);
-
-			if (!empty($nfids))
-				$forum_sql .= ' AND t.forum_id NOT IN('.implode(',', $nfids).')';
-		}
-
-		// Only attempt to cache if caching is enabled and we have all or a single forum
-		if ($pun_config['o_feed_ttl'] > 0 && ($forum_sql == '' || ($forum_name != '' && !isset($_GET['nfid']))))
-			$cache_id = 'feed'.sha1($pun_user['g_id'].'|'.$lang_common['lang_identifier'].'|'.($order_posted ? '1' : '0').($forum_name == '' ? '' : '|'.$fids[0]));
-
-		// Load cached feed
-		if (isset($cache_id) && file_exists(FORUM_CACHE_DIR.'cache_'.$cache_id.'.php'))
-			include FORUM_CACHE_DIR.'cache_'.$cache_id.'.php';
-
-		$now = time();
-		if (!isset($feed) || $cache_expire < $now)
-		{
-			// Setup the feed
-			$feed = array(
-				'title' 		=>	$pun_config['o_board_title'].$forum_name,
-				'link'			=>	'/index.php',
-				'description'	=>	sprintf($lang_common['RSS description'], $pun_config['o_board_title']),
-				'items'			=>	array(),
-				'type'			=>	'topics'
-			);
-
-			// Fetch $show topics
-			$result = $db->query('SELECT t.id, t.poster, t.subject, t.posted, t.last_post, t.last_poster, p.message, p.hide_smilies, u.email_setting, u.email, p.poster_id, p.poster_email FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'posts AS p ON p.id='.($order_posted ? 't.first_post_id' : 't.last_post_id').' INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL'.$forum_sql.' ORDER BY '.($order_posted ? 't.posted' : 't.last_post').' DESC LIMIT '.(isset($cache_id) ? 50 : $show)) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
-			while ($cur_topic = $db->fetch_assoc($result))
-			{
-				if ($pun_config['o_censoring'] == '1')
-					$cur_topic['subject'] = censor_words($cur_topic['subject']);
-
-				$cur_topic['message'] = parse_message($cur_topic['message'], $cur_topic['hide_smilies']);
-
-				$item = array(
-					'id'			=>	$cur_topic['id'],
-					'title'			=>	$cur_topic['subject'],
-					'link'			=>	'/viewtopic.php?id='.$cur_topic['id'].($order_posted ? '' : '&action=new'),
-					'description'	=>	$cur_topic['message'],
-					'author'		=>	array(
-						'name'	=> $order_posted ? $cur_topic['poster'] : $cur_topic['last_poster']
-					),
-					'pubdate'		=>	$order_posted ? $cur_topic['posted'] : $cur_topic['last_post']
-				);
-
-				if ($cur_topic['poster_id'] > 1)
-				{
-					if ($cur_topic['email_setting'] == '0' && !$pun_user['is_guest'])
-						$item['author']['email'] = $cur_topic['email'];
-
-					$item['author']['uri'] = '/profile.php?id='.$cur_topic['poster_id'];
-				}
-				else if ($cur_topic['poster_email'] != '' && !$pun_user['is_guest'])
-					$item['author']['email'] = $cur_topic['poster_email'];
-
-				$feed['items'][] = $item;
-			}
-
-			// Output feed as PHP code
-			if (isset($cache_id))
-			{
-				$fh = @fopen(FORUM_CACHE_DIR.'cache_'.$cache_id.'.php', 'wb');
-				if (!$fh)
-					error('Unable to write feed cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
-
-				fwrite($fh, '<?php'."\n\n".'$feed = '.var_export($feed, true).';'."\n\n".'$cache_expire = '.($now + ($pun_config['o_feed_ttl'] * 60)).';'."\n\n".'?>');
-
-				fclose($fh);
-
-				if (function_exists('apc_delete_file'))
-					@apc_delete_file(FORUM_CACHE_DIR.'cache_'.$cache_id.'.php');
-			}
-		}
-
-		// If we only want to show a few items but due to caching we have too many
-		if (count($feed['items']) > $show)
-			$feed['items'] = array_slice($feed['items'], 0, $show);
-
-		// Prepend the current base URL onto some links. Done after caching to handle http/https correctly
-		$feed['link'] = get_base_url(true).$feed['link'];
-
-		foreach ($feed['items'] as $key => $item)
-		{
-			$feed['items'][$key]['link'] = get_base_url(true).$item['link'];
-
-			if (isset($item['author']['uri']))
-				$feed['items'][$key]['author']['uri'] = get_base_url(true).$item['author']['uri'];
-		}
-
-		$output_func = 'output_'.$type;
-		$output_func($feed);
-	}
-
-	exit;
-}
-
+	}
+
+	return;
+}
+
+
+//
 // Show users online
-else if ($action == 'online' || $action == 'online_full')
+//
+else if ($_GET['action'] == 'online' || $_GET['action'] == 'online_full')
 {
 	// Load the index.php language file
 	require PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/index.php';
-
+	
 	// Fetch users online info and generate strings for output
 	$num_guests = $num_users = 0;
 	$users = array();
-
-	$result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Impossible de retrouver la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 
 	while ($pun_user_online = $db->fetch_assoc($result))
@@ -490,5 +284,5 @@
 		if ($pun_user_online['user_id'] > 1)
 		{
-			$users[] = ($pun_user['g_view_users'] == '1') ? '<a href="'.pun_htmlspecialchars(get_base_url(true)).'/profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>' : pun_htmlspecialchars($pun_user_online['ident']);
+			$users[] = '<a href="'.$pun_config['o_base_url'].'/profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>';
 			++$num_users;
 		}
@@ -497,22 +291,19 @@
 	}
 
-	// Send the Content-type header in case the web server is setup to send something else
-	header('Content-type: text/html; charset=utf-8');
-	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	header('Pragma: public');
-
-	echo sprintf($lang_index['Guests online'], forum_number_format($num_guests)).'<br />'."\n";
-
-	if ($action == 'online_full' && !empty($users))
-		echo sprintf($lang_index['Users online'], implode(', ', $users)).'<br />'."\n";
+	echo $lang_index['Guests online'].': '.$num_guests.'<br />';
+
+	if ($_GET['action'] == 'online_full')
+		echo $lang_index['Users online'].': '.implode(', ', $users).'<br />';
 	else
-		echo sprintf($lang_index['Users online'], forum_number_format($num_users)).'<br />'."\n";
-
-	exit;
-}
-
+		echo $lang_index['Users online'].': '.$num_users.'<br />';
+
+	return;
+}
+
+
+//
 // Show board statistics
-else if ($action == 'stats')
+//
+else if ($_GET['action'] == 'stats')
 {
 	// Load the index.php language file
@@ -520,33 +311,22 @@
 
 	// Collect some statistics from the database
-	if (file_exists(FORUM_CACHE_DIR.'cache_users_info.php'))
-		include FORUM_CACHE_DIR.'cache_users_info.php';
-
-	if (!defined('PUN_USERS_INFO_LOADED'))
-	{
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_users_info_cache();
-		require FORUM_CACHE_DIR.'cache_users_info.php';
-	}
-
-	$result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Unable to fetch topic/post count', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT COUNT(id)-1 FROM '.$db->prefix.'users') or error('Impossible de retrouver le nombre total d\'utilisateurs', __FILE__, __LINE__, $db->error());
+	$stats['total_users'] = $db->result($result);
+
+	$result = $db->query('SELECT id, username FROM '.$db->prefix.'users ORDER BY registered DESC LIMIT 1') or error('Impossible de retrouver le dernier utilisateur inscrit', __FILE__, __LINE__, $db->error());
+	$stats['last_user'] = $db->fetch_assoc($result);
+
+	$result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Impossible de retrouver le total de discussions et de messages', __FILE__, __LINE__, $db->error());
 	list($stats['total_topics'], $stats['total_posts']) = $db->fetch_row($result);
 
-	// Send the Content-type header in case the web server is setup to send something else
-	header('Content-type: text/html; charset=utf-8');
-	header('Expires: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
-	header('Pragma: public');
-
-	echo sprintf($lang_index['No of users'], forum_number_format($stats['total_users'])).'<br />'."\n";
-	echo sprintf($lang_index['Newest user'], (($pun_user['g_view_users'] == '1') ? '<a href="'.pun_htmlspecialchars(get_base_url(true)).'/profile.php?id='.$stats['last_user']['id'].'">'.pun_htmlspecialchars($stats['last_user']['username']).'</a>' : pun_htmlspecialchars($stats['last_user']['username']))).'<br />'."\n";
-	echo sprintf($lang_index['No of topics'], forum_number_format($stats['total_topics'])).'<br />'."\n";
-	echo sprintf($lang_index['No of posts'], forum_number_format($stats['total_posts'])).'<br />'."\n";
-
-	exit;
-}
-
-// If we end up here, the script was called with some wacky parameters
-exit($lang_common['Bad request']);
+	echo $lang_index['No of users'].': '.$stats['total_users'].'<br />';
+	echo $lang_index['Newest user'].': <a href="'.$pun_config['o_base_url'].'/profile.php?id='.$stats['last_user']['id'].'">'.pun_htmlspecialchars($stats['last_user']['username']).'</a><br />';
+	echo $lang_index['No of topics'].': '.$stats['total_topics'].'<br />';
+	echo $lang_index['No of posts'].': '.$stats['total_posts'];
+
+	return;
+}
+
+
+else
+	exit('Bad request');
Index: trunk/web/punbb/footer.php
===================================================================
--- trunk/web/punbb/footer.php	(revision 10)
+++ trunk/web/punbb/footer.php	(revision 1)
@@ -1,9 +1,38 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+/* dÃ©commenter pour activer les stats phpmyvisites */
+
+// include ("../phpmv2.php");
+
+
+
+
+/* dÃ©commenter pour activer les stats google analytics */
+
+// include ("../google_analytics.php");
+
+
 
 // Make sure no one attempts to run this script "directly"
@@ -24,67 +53,5 @@
 	<h2><span><?php echo $lang_common['Board footer'] ?></span></h2>
 	<div class="box">
-<?php
-
-if (isset($footer_style) && ($footer_style == 'viewforum' || $footer_style == 'viewtopic') && $is_admmod)
-{
-	echo "\t\t".'<div id="modcontrols" class="inbox">'."\n";
-
-	if ($footer_style == 'viewforum')
-	{
-		echo "\t\t\t".'<dl>'."\n";
-		echo "\t\t\t\t".'<dt><strong>'.$lang_forum['Mod controls'].'</strong></dt>'."\n";
-		echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;p='.$p.'">'.$lang_common['Moderate forum'].'</a></span></dd>'."\n";
-		echo "\t\t\t".'</dl>'."\n";
-	}
-	else if ($footer_style == 'viewtopic')
-	{
-		echo "\t\t\t".'<dl>'."\n";
-		echo "\t\t\t\t".'<dt><strong>'.$lang_topic['Mod controls'].'</strong></dt>'."\n";
-		echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;tid='.$id.'&amp;p='.$p.'">'.$lang_common['Moderate topic'].'</a></span></dd>'."\n";
-		echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;move_topics='.$id.'">'.$lang_common['Move topic'].'</a></span></dd>'."\n";
-
-		if ($cur_topic['closed'] == '1')
-			echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;open='.$id.'">'.$lang_common['Open topic'].'</a></span></dd>'."\n";
-		else
-			echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;close='.$id.'">'.$lang_common['Close topic'].'</a></span></dd>'."\n";
-
-		if ($cur_topic['sticky'] == '1')
-			echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;unstick='.$id.'">'.$lang_common['Unstick topic'].'</a></span></dd>'."\n";
-		else
-			echo "\t\t\t\t".'<dd><span><a href="moderate.php?fid='.$forum_id.'&amp;stick='.$id.'">'.$lang_common['Stick topic'].'</a></span></dd>'."\n";
-
-		echo "\t\t\t".'</dl>'."\n";
-	}
-
-	echo "\t\t\t".'<div class="clearer"></div>'."\n\t\t".'</div>'."\n";
-}
-
-?>
-		<div id="brdfooternav" class="inbox">
-<?php
-
-echo "\t\t\t".'<div class="conl">'."\n";
-
-// Display the "Jump to" drop list
-if ($pun_config['o_quickjump'] == '1')
-{
-	// Load cached quick jump
-	if (file_exists(FORUM_CACHE_DIR.'cache_quickjump_'.$pun_user['g_id'].'.php'))
-		include FORUM_CACHE_DIR.'cache_quickjump_'.$pun_user['g_id'].'.php';
-
-	if (!defined('PUN_QJ_LOADED'))
-	{
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_quickjump_cache($pun_user['g_id']);
-		require FORUM_CACHE_DIR.'cache_quickjump_'.$pun_user['g_id'].'.php';
-	}
-}
-
-echo "\t\t\t".'</div>'."\n";
-
-?>
-			<div class="conr">
+		<div class="inbox">
 <?php
 
@@ -92,29 +59,77 @@
 $footer_style = isset($footer_style) ? $footer_style : NULL;
 
-if ($footer_style == 'index')
+if ($footer_style == 'index' || $footer_style == 'search')
 {
-	if ($pun_config['o_feed_type'] == '1')
-		echo "\t\t\t\t".'<p id="feedlinks"><span class="rss"><a href="extern.php?action=feed&amp;type=rss">'.$lang_common['RSS active topics feed'].'</a></span></p>'."\n";
-	else if ($pun_config['o_feed_type'] == '2')
-		echo "\t\t\t\t".'<p id="feedlinks"><span class="atom"><a href="extern.php?action=feed&amp;type=atom">'.$lang_common['Atom active topics feed'].'</a></span></p>'."\n";
+	if (!$pun_user['is_guest'])
+	{
+		echo "\n\t\t\t".'<dl id="searchlinks" class="conl">'."\n\t\t\t\t".'<dt><strong>'.$lang_common['Search links'].'</strong></dt>'."\n\t\t\t\t".'<dd><a href="search.php?action=show_24h">'.$lang_common['Show recent posts'].'</a></dd>'."\n";
+		echo "\t\t\t\t".'<dd><a href="search.php?action=show_unanswered">'.$lang_common['Show unanswered posts'].'</a></dd>'."\n";
+
+		if ($pun_config['o_subscriptions'] == '1')
+			echo "\t\t\t\t".'<dd><a href="search.php?action=show_subscriptions">'.$lang_common['Show subscriptions'].'</a></dd>'."\n";
+
+		echo "\t\t\t\t".'<dd><a href="search.php?action=show_user&amp;user_id='.$pun_user['id'].'">'.$lang_common['Show your posts'].'</a></dd>'."\n\t\t\t".'</dl>'."\n";
+	}
+	else
+	{
+		if ($pun_user['g_search'] == '1')
+		{
+			echo "\n\t\t\t".'<dl id="searchlinks" class="conl">'."\n\t\t\t\t".'<dt><strong>'.$lang_common['Search links'].'</strong></dt><dd><a href="search.php?action=show_24h">'.$lang_common['Show recent posts'].'</a></dd>'."\n";
+			echo "\t\t\t\t".'<dd><a href="search.php?action=show_unanswered">'.$lang_common['Show unanswered posts'].'</a></dd>'."\n\t\t\t".'</dl>'."\n";
+		}
+	}
 }
-else if ($footer_style == 'viewforum')
+else if ($footer_style == 'viewforum' || $footer_style == 'viewtopic')
 {
-	if ($pun_config['o_feed_type'] == '1')
-		echo "\t\t\t\t".'<p id="feedlinks"><span class="rss"><a href="extern.php?action=feed&amp;fid='.$forum_id.'&amp;type=rss">'.$lang_common['RSS forum feed'].'</a></span></p>'."\n";
-	else if ($pun_config['o_feed_type'] == '2')
-		echo "\t\t\t\t".'<p id="feedlinks"><span class="atom"><a href="extern.php?action=feed&amp;fid='.$forum_id.'&amp;type=atom">'.$lang_common['Atom forum feed'].'</a></span></p>'."\n";
-}
-else if ($footer_style == 'viewtopic')
-{
-	if ($pun_config['o_feed_type'] == '1')
-		echo "\t\t\t\t".'<p id="feedlinks"><span class="rss"><a href="extern.php?action=feed&amp;tid='.$id.'&amp;type=rss">'.$lang_common['RSS topic feed'].'</a></span></p>'."\n";
-	else if ($pun_config['o_feed_type'] == '2')
-		echo "\t\t\t\t".'<p id="feedlinks"><span class="atom"><a href="extern.php?action=feed&amp;tid='.$id.'&amp;type=atom">'.$lang_common['Atom topic feed'].'</a></span></p>'."\n";
+	echo "\n\t\t\t".'<div class="conl">'."\n";
+
+	// Display the "Jump to" drop list
+	if ($pun_config['o_quickjump'] == '1')
+	{
+		// Load cached quickjump
+		@include PUN_ROOT.'cache/cache_quickjump_'.$pun_user['g_id'].'.php';
+		if (!defined('PUN_QJ_LOADED'))
+		{
+			require_once PUN_ROOT.'include/cache.php';
+			generate_quickjump_cache($pun_user['g_id']);
+			require PUN_ROOT.'cache/cache_quickjump_'.$pun_user['g_id'].'.php';
+		}
+	}
+
+	if ($footer_style == 'viewforum' && $is_admmod)
+		echo "\t\t\t".'<p id="modcontrols"><a href="moderate.php?fid='.$forum_id.'&amp;p='.$p.'">'.$lang_common['Moderate forum'].'</a></p>'."\n";
+	else if ($footer_style == 'viewtopic' && $is_admmod)
+	{
+		echo "\t\t\t".'<dl id="modcontrols"><dt><strong>'.$lang_topic['Mod controls'].'</strong></dt><dd><a href="moderate.php?fid='.$forum_id.'&amp;tid='.$id.'&amp;p='.$p.'">'.$lang_common['Delete posts'].'</a></dd>'."\n";
+		echo "\t\t\t".'<dd><a href="moderate.php?fid='.$forum_id.'&amp;move_topics='.$id.'">'.$lang_common['Move topic'].'</a></dd>'."\n";
+
+		if ($cur_topic['closed'] == '1')
+			echo "\t\t\t".'<dd><a href="moderate.php?fid='.$forum_id.'&amp;open='.$id.'">'.$lang_common['Open topic'].'</a></dd>'."\n";
+		else
+			echo "\t\t\t".'<dd><a href="moderate.php?fid='.$forum_id.'&amp;close='.$id.'">'.$lang_common['Close topic'].'</a></dd>'."\n";
+
+		if ($cur_topic['sticky'] == '1')
+			echo "\t\t\t".'<dd><a href="moderate.php?fid='.$forum_id.'&amp;unstick='.$id.'">'.$lang_common['Unstick topic'].'</a></dd></dl>'."\n";
+		else
+			echo "\t\t\t".'<dd><a href="moderate.php?fid='.$forum_id.'&amp;stick='.$id.'">'.$lang_common['Stick topic'].'</a></dd></dl>'."\n";
+	}
+
+	echo "\t\t\t".'</div>'."\n";
 }
 
 ?>
-				<p id="poweredby"><?php printf($lang_common['Powered by'], '<a href="http://fluxbb.org/">FluxBB</a>'.(($pun_config['o_show_version'] == '1') ? ' '.$pun_config['o_cur_version'] : '')) ?></p>
-			</div>
+		  <p class="conr">PropulsÃ© par <a href="http://www.punbb.org/">PunBB</a><?php if ($pun_config['o_show_version'] == '1') echo ' '.$pun_config['o_cur_version']; ?><br />&copy; Copyright 2002&#8211;2005 Rickard Andersson<br /> Traduction par <a href="http://www.punbb.fr/">punbb.fr</a></p>
+<?php
+
+// Display debug info (if enabled/defined)
+if (defined('PUN_DEBUG'))
+{
+	// Calculate script generation time
+	list($usec, $sec) = explode(' ', microtime());
+	$time_diff = sprintf('%.3f', ((float)$usec + (float)$sec) - $pun_start);
+	echo "\t\t\t".'<p class="conr">[ GÃ©nÃ©rÃ©e en '.$time_diff.' sec., '.$db->get_num_queries().' requÃªtes exÃ©cutÃ©es ]</p>'."\n";
+}
+
+?>
 			<div class="clearer"></div>
 		</div>
@@ -122,24 +137,4 @@
 </div>
 <?php
-
-// Display debug info (if enabled/defined)
-if (defined('PUN_DEBUG'))
-{
-	echo '<p id="debugtime">[ ';
-
-	// Calculate script generation time
-	$time_diff = sprintf('%.3f', get_microtime() - $pun_start);
-	echo sprintf($lang_common['Querytime'], $time_diff, $db->get_num_queries());
-
-	if (function_exists('memory_get_usage'))
-	{
-		echo ' - '.sprintf($lang_common['Memory usage'], file_size(memory_get_usage()));
-
-		if (function_exists('memory_get_peak_usage'))
-			echo ' '.sprintf($lang_common['Peak usage'], file_size(memory_get_peak_usage()));
-	}
-
-	echo ' ]</p>'."\n";
-}
 
 
@@ -157,6 +152,21 @@
 
 
+// START SUBST - <pun_include "*">
+while (preg_match('#<pun_include "([^/\\\\]*?)">#', $tpl_main, $cur_include))
+{
+	if (!file_exists(PUN_ROOT.'include/user/'.$cur_include[1]))
+	    error('Impossible de procÃ©der Ã  l\'inclusion utilisateur &lt;pun_include "'.htmlspecialchars($cur_include[1]).'"&gt; depuis le template main.tpl. Il n\'y a pas de fichier dans le rÃ©pertoire /include/user/');
+	
+	ob_start();
+	include PUN_ROOT.'include/user/'.$cur_include[1];
+	$tpl_temp = ob_get_contents();
+	$tpl_main = str_replace($cur_include[0], $tpl_temp, $tpl_main);
+    ob_end_clean();
+}
+// END SUBST - <pun_include "*">
+
+
 // Close the db connection (and free up any result data)
-//$db->close();
+// $db->close();
 
 // Spit out the page
Index: trunk/web/punbb/header.php
===================================================================
--- trunk/web/punbb/header.php	(revision 10)
+++ trunk/web/punbb/header.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure no one attempts to run this script "directly"
@@ -12,58 +29,17 @@
 
 // Send no-cache headers
-header('Expires: Thu, 21 Jul 1977 07:30:00 GMT'); // When yours truly first set eyes on this world! :)
+header('Expires: Thu, 21 Jul 1977 07:30:00 GMT');	// When yours truly first set eyes on this world! :)
 header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
 header('Cache-Control: post-check=0, pre-check=0', false);
-header('Pragma: no-cache'); // For HTTP/1.0 compatibility
-
-// Send the Content-type header in case the web server is setup to send something else
-header('Content-type: text/html; charset=utf-8');
+header('Pragma: no-cache');		// For HTTP/1.0 compability
+
 
 // Load the template
 if (defined('PUN_ADMIN_CONSOLE'))
-	$tpl_file = 'admin.tpl';
+	$tpl_main = file_get_contents(PUN_ROOT.'include/template/admin.tpl');
 else if (defined('PUN_HELP'))
-	$tpl_file = 'help.tpl';
+	$tpl_main = file_get_contents(PUN_ROOT.'include/template/help.tpl');
 else
-	$tpl_file = 'main.tpl';
-
-if (file_exists(PUN_ROOT.'style/'.$pun_user['style'].'/'.$tpl_file))
-{
-	$tpl_file = PUN_ROOT.'style/'.$pun_user['style'].'/'.$tpl_file;
-	$tpl_inc_dir = PUN_ROOT.'style/'.$pun_user['style'].'/';
-}
-else
-{
-	$tpl_file = PUN_ROOT.'include/template/'.$tpl_file;
-	$tpl_inc_dir = PUN_ROOT.'include/user/';
-}
-
-$tpl_main = file_get_contents($tpl_file);
-
-// START SUBST - <pun_include "*">
-preg_match_all('%<pun_include "([^/\\\\]*?)\.(php[45]?|inc|html?|txt)">%i', $tpl_main, $pun_includes, PREG_SET_ORDER);
-
-foreach ($pun_includes as $cur_include)
-{
-	ob_start();
-
-	// Allow for overriding user includes, too.
-	if (file_exists($tpl_inc_dir.$cur_include[1].'.'.$cur_include[2]))
-		require $tpl_inc_dir.$cur_include[1].'.'.$cur_include[2];
-	else if (file_exists(PUN_ROOT.'include/user/'.$cur_include[1].'.'.$cur_include[2]))
-		require PUN_ROOT.'include/user/'.$cur_include[1].'.'.$cur_include[2];
-	else
-		error(sprintf($lang_common['Pun include error'], htmlspecialchars($cur_include[0]), basename($tpl_file)));
-
-	$tpl_temp = ob_get_contents();
-	$tpl_main = str_replace($cur_include[0], $tpl_temp, $tpl_main);
-	ob_end_clean();
-}
-// END SUBST - <pun_include "*">
-
-
-// START SUBST - <pun_language>
-$tpl_main = str_replace('<pun_language>', $lang_common['lang_identifier'], $tpl_main);
-// END SUBST - <pun_language>
+	$tpl_main = file_get_contents(PUN_ROOT.'include/template/main.tpl');
 
 
@@ -73,9 +49,11 @@
 
 
+// START SUBST - <pun_char_encoding>
+$tpl_main = str_replace('<pun_char_encoding>', $lang_common['lang_encoding'], $tpl_main);
+// END SUBST - <pun_char_encoding>
+
+
 // START SUBST - <pun_head>
 ob_start();
-
-// Define $p if its not set to avoid a PHP notice
-$p = isset($p) ? $p : null;
 
 // Is this a page that we want search index spiders to index?
@@ -84,15 +62,10 @@
 
 ?>
-<title><?php echo generate_page_title($page_title, $p) ?></title>
+<title><?php echo $page_title ?></title>
 <link rel="stylesheet" type="text/css" href="style/<?php echo $pun_user['style'].'.css' ?>" />
 <?php
 
 if (defined('PUN_ADMIN_CONSOLE'))
-{
-	if (file_exists(PUN_ROOT.'style/'.$pun_user['style'].'/base_admin.css'))
-		echo '<link rel="stylesheet" type="text/css" href="style/'.$pun_user['style'].'/base_admin.css" />'."\n";
-	else
-		echo '<link rel="stylesheet" type="text/css" href="style/imports/base_admin.css" />'."\n";
-}
+	echo '<link rel="stylesheet" type="text/css" href="style/imports/base_admin.css" />'."\n";
 
 if (isset($required_fields))
@@ -102,37 +75,36 @@
 ?>
 <script type="text/javascript">
-/* <![CDATA[ */
+<!--
 function process_form(the_form)
 {
-	var element_names = {
-<?php
-	// Output a JavaScript object with localised field names
-	$tpl_temp = count($required_fields);
-	foreach ($required_fields as $elem_orig => $elem_trans)
-	{
-		echo "\t\t\"".$elem_orig.'": "'.addslashes(str_replace('&#160;', ' ', $elem_trans));
-		if (--$tpl_temp) echo "\",\n";
-		else echo "\"\n\t};\n";
-	}
-?>
+	var element_names = new Object()
+<?php
+
+	// Output a JavaScript array with localised field names
+	while (list($elem_orig, $elem_trans) = @each($required_fields))
+		echo "\t".'element_names["'.$elem_orig.'"] = "'.addslashes(str_replace('&#160;', ' ', $elem_trans)).'"'."\n";
+
+?>
+
 	if (document.all || document.getElementById)
 	{
-		for (var i = 0; i < the_form.length; ++i)
+		for (i = 0; i < the_form.length; ++i)
 		{
-			var elem = the_form.elements[i];
-			if (elem.name && (/^req_/.test(elem.name)))
+			var elem = the_form.elements[i]
+			if (elem.name && elem.name.substring(0, 4) == "req_")
 			{
-				if (!elem.value && elem.type && (/^(?:text(?:area)?|password|file)$/i.test(elem.type)))
+				if (elem.type && (elem.type=="text" || elem.type=="textarea" || elem.type=="password" || elem.type=="file") && elem.value=='')
 				{
-					alert('"' + element_names[elem.name] + '" <?php echo $lang_common['required field'] ?>');
-					elem.focus();
-					return false;
+					alert("\"" + element_names[elem.name] + "\" <?php echo $lang_common['required field'] ?>")
+					elem.focus()
+					return false
 				}
 			}
 		}
 	}
-	return true;
-}
-/* ]]> */
+
+	return true
+}
+// -->
 </script>
 <?php
@@ -140,9 +112,7 @@
 }
 
-// JavaScript tricks for IE6 and older
-echo '<!--[if lte IE 6]><script type="text/javascript" src="style/imports/minmax.js"></script><![endif]-->'."\n";
-
-if (isset($page_head))
-	echo implode("\n", $page_head)."\n";
+$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
+if (strpos($user_agent, 'msie') !== false && strpos($user_agent, 'windows') !== false && strpos($user_agent, 'opera') === false)
+	echo '<script type="text/javascript" src="style/imports/minmax.js"></script>';
 
 $tpl_temp = trim(ob_get_contents());
@@ -155,6 +125,6 @@
 if (isset($focus_element))
 {
-	$tpl_main = str_replace('<body onload="', '<body onload="document.getElementById(\''.$focus_element[0].'\').elements[\''.$focus_element[1].'\'].focus();', $tpl_main);
-	$tpl_main = str_replace('<body>', '<body onload="document.getElementById(\''.$focus_element[0].'\').elements[\''.$focus_element[1].'\'].focus()">', $tpl_main);
+	$tpl_main = str_replace('<body onload="', '<body onload="document.getElementById(\''.$focus_element[0].'\').'.$focus_element[1].'.focus();', $tpl_main);
+	$tpl_main = str_replace('<body>', '<body onload="document.getElementById(\''.$focus_element[0].'\').'.$focus_element[1].'.focus()">', $tpl_main);
 }
 // END SUBST - <body>
@@ -162,126 +132,46 @@
 
 // START SUBST - <pun_page>
-$tpl_main = str_replace('<pun_page>', htmlspecialchars(basename($_SERVER['PHP_SELF'], '.php')), $tpl_main);
-// END SUBST - <pun_page>
+$tpl_main = str_replace('<pun_page>', basename($_SERVER['PHP_SELF'], '.php'), $tpl_main);
+// END SUBST - <pun_title>
 
 
 // START SUBST - <pun_title>
-$tpl_main = str_replace('<pun_title>', '<h1><a href="index.php">'.pun_htmlspecialchars($pun_config['o_board_title']).'</a></h1>', $tpl_main);
+$tpl_main = str_replace('<pun_title>', '<h1><span>'.pun_htmlspecialchars($pun_config['o_board_title']).'</span></h1>', $tpl_main);
 // END SUBST - <pun_title>
 
 
 // START SUBST - <pun_desc>
-$tpl_main = str_replace('<pun_desc>', '<div id="brddesc">'.$pun_config['o_board_desc'].'</div>', $tpl_main);
+$tpl_main = str_replace('<pun_desc>', '<p><span>'.$pun_config['o_board_desc'].'</span></p>', $tpl_main);
 // END SUBST - <pun_desc>
 
 
 // START SUBST - <pun_navlinks>
-$links = array();
-
-// Index should always be displayed
-$links[] = '<li id="navindex"'.((PUN_ACTIVE_PAGE == 'index') ? ' class="isactive"' : '').'><a href="index.php">'.$lang_common['Index'].'</a></li>';
-
-if ($pun_user['g_read_board'] == '1' && $pun_user['g_view_users'] == '1')
-	$links[] = '<li id="navuserlist"'.((PUN_ACTIVE_PAGE == 'userlist') ? ' class="isactive"' : '').'><a href="userlist.php">'.$lang_common['User list'].'</a></li>';
-
-if ($pun_config['o_rules'] == '1' && (!$pun_user['is_guest'] || $pun_user['g_read_board'] == '1' || $pun_config['o_regs_allow'] == '1'))
-	$links[] = '<li id="navrules"'.((PUN_ACTIVE_PAGE == 'rules') ? ' class="isactive"' : '').'><a href="misc.php?action=rules">'.$lang_common['Rules'].'</a></li>';
-
-if ($pun_user['g_read_board'] == '1' && $pun_user['g_search'] == '1')
-	$links[] = '<li id="navsearch"'.((PUN_ACTIVE_PAGE == 'search') ? ' class="isactive"' : '').'><a href="search.php">'.$lang_common['Search'].'</a></li>';
-
+$tpl_main = str_replace('<pun_navlinks>','<div id="brdmenu" class="inbox">'."\n\t\t\t". generate_navlinks()."\n\t\t".'</div>', $tpl_main);
+// END SUBST - <pun_navlinks>
+
+
+// START SUBST - <pun_status>
 if ($pun_user['is_guest'])
-{
-	$links[] = '<li id="navregister"'.((PUN_ACTIVE_PAGE == 'register') ? ' class="isactive"' : '').'><a href="register.php">'.$lang_common['Register'].'</a></li>';
-	$links[] = '<li id="navlogin"'.((PUN_ACTIVE_PAGE == 'login') ? ' class="isactive"' : '').'><a href="login.php">'.$lang_common['Login'].'</a></li>';
-}
+	$tpl_temp = '<div id="brdwelcome" class="inbox">'."\n\t\t\t".'<p>'.$lang_common['Not logged in'].'</p>'."\n\t\t".'</div>';
 else
 {
-	$links[] = '<li id="navprofile"'.((PUN_ACTIVE_PAGE == 'profile') ? ' class="isactive"' : '').'><a href="profile.php?id='.$pun_user['id'].'">'.$lang_common['Profile'].'</a></li>';
-
-	if ($pun_user['is_admmod'])
-		$links[] = '<li id="navadmin"'.((PUN_ACTIVE_PAGE == 'admin') ? ' class="isactive"' : '').'><a href="admin_index.php">'.$lang_common['Admin'].'</a></li>';
-
-	$links[] = '<li id="navlogout"><a href="login.php?action=out&amp;id='.$pun_user['id'].'&amp;csrf_token='.pun_hash($pun_user['id'].pun_hash(get_remote_address())).'">'.$lang_common['Logout'].'</a></li>';
-}
-
-// Are there any additional navlinks we should insert into the array before imploding it?
-if ($pun_user['g_read_board'] == '1' && $pun_config['o_additional_navlinks'] != '')
-{
-	if (preg_match_all('%([0-9]+)\s*=\s*(.*?)\n%s', $pun_config['o_additional_navlinks']."\n", $extra_links))
+	$tpl_temp = '<div id="brdwelcome" class="inbox">'."\n\t\t\t".'<ul class="conl">'."\n\t\t\t\t".'<li>'.$lang_common['Logged in as'].' <strong>'.pun_htmlspecialchars($pun_user['username']).'</strong></li>'."\n\t\t\t\t".'<li>'.$lang_common['Last visit'].': '.format_time($pun_user['last_visit']).'</li>';
+
+	if ($pun_user['g_id'] < PUN_GUEST)
 	{
-		// Insert any additional links into the $links array (at the correct index)
-		$num_links = count($extra_links[1]);
-		for ($i = 0; $i < $num_links; ++$i)
-			array_splice($links, $extra_links[1][$i], 0, array('<li id="navextra'.($i + 1).'">'.$extra_links[2][$i].'</li>'));
+		$result_header = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'reports WHERE zapped IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error());
+
+		if ($db->result($result_header))
+			$tpl_temp .= "\n\t\t\t\t".'<li class="reportlink"><strong><a href="admin_reports.php">Il y a de nouveaux signalements</a></strong></li>';
+
+		if ($pun_config['o_maintenance'] == '1')
+			$tpl_temp .= "\n\t\t\t\t".'<li class="maintenancelink"><strong><a href="admin_options.php#maintenance">Le mode maintenance est activÃ©&#160;!</a></strong></li>';
 	}
-}
-
-$tpl_temp = '<div id="brdmenu" class="inbox">'."\n\t\t\t".'<ul>'."\n\t\t\t\t".implode("\n\t\t\t\t", $links)."\n\t\t\t".'</ul>'."\n\t\t".'</div>';
-$tpl_main = str_replace('<pun_navlinks>', $tpl_temp, $tpl_main);
-// END SUBST - <pun_navlinks>
-
-
-// START SUBST - <pun_status>
-$page_statusinfo = $page_topicsearches = array();
-
-if ($pun_user['is_guest'])
-	$page_statusinfo = '<p class="conl">'.$lang_common['Not logged in'].'</p>';
-else
-{
-	$page_statusinfo[] = '<li><span>'.$lang_common['Logged in as'].' <strong>'.pun_htmlspecialchars($pun_user['username']).'</strong></span></li>';
-	$page_statusinfo[] = '<li><span>'.sprintf($lang_common['Last visit'], format_time($pun_user['last_visit'])).'</span></li>';
-
-	if ($pun_user['is_admmod'])
-	{
-		if ($pun_config['o_report_method'] == '0' || $pun_config['o_report_method'] == '2')
-		{
-			$result_header = $db->query('SELECT 1 FROM '.$db->prefix.'reports WHERE zapped IS NULL') or error('Unable to fetch reports info', __FILE__, __LINE__, $db->error());
-
-			if ($db->result($result_header))
-				$page_statusinfo[] = '<li class="reportlink"><span><strong><a href="admin_reports.php">'.$lang_common['New reports'].'</a></strong></span></li>';
-		}
-
-		if ($pun_config['o_maintenance'] == '1')
-			$page_statusinfo[] = '<li class="maintenancelink"><span><strong><a href="admin_options.php#maintenance">'.$lang_common['Maintenance mode enabled'].'</a></strong></span></li>';
-	}
-
-	if ($pun_user['g_read_board'] == '1' && $pun_user['g_search'] == '1')
-	{
-		$page_topicsearches[] = '<a href="search.php?action=show_replies" title="'.$lang_common['Show posted topics'].'">'.$lang_common['Posted topics'].'</a>';
-		$page_topicsearches[] = '<a href="search.php?action=show_new" title="'.$lang_common['Show new posts'].'">'.$lang_common['New posts header'].'</a>';
-	}
-}
-
-// Quick searches
-if ($pun_user['g_read_board'] == '1' && $pun_user['g_search'] == '1')
-{
-	$page_topicsearches[] = '<a href="search.php?action=show_recent" title="'.$lang_common['Show active topics'].'">'.$lang_common['Active topics'].'</a>';
-	$page_topicsearches[] = '<a href="search.php?action=show_unanswered" title="'.$lang_common['Show unanswered topics'].'">'.$lang_common['Unanswered topics'].'</a>';
-}
-
-
-// Generate all that jazz
-$tpl_temp = '<div id="brdwelcome" class="inbox">';
-
-// The status information
-if (is_array($page_statusinfo))
-{
-	$tpl_temp .= "\n\t\t\t".'<ul class="conl">';
-	$tpl_temp .= "\n\t\t\t\t".implode("\n\t\t\t\t", $page_statusinfo);
-	$tpl_temp .= "\n\t\t\t".'</ul>';
-}
-else
-	$tpl_temp .= "\n\t\t\t".$page_statusinfo;
-
-// Generate quicklinks
-if (!empty($page_topicsearches))
-{
-	$tpl_temp .= "\n\t\t\t".'<ul class="conr">';
-	$tpl_temp .= "\n\t\t\t\t".'<li><span>'.$lang_common['Topic searches'].' '.implode(' | ', $page_topicsearches).'</span></li>';
-	$tpl_temp .= "\n\t\t\t".'</ul>';
-}
-
-$tpl_temp .= "\n\t\t\t".'<div class="clearer"></div>'."\n\t\t".'</div>';
+
+	if (in_array(basename($_SERVER['PHP_SELF']), array('index.php', 'search.php')))
+		$tpl_temp .= "\n\t\t\t".'</ul>'."\n\t\t\t".'<ul class="conr">'."\n\t\t\t\t".'<li><a href="search.php?action=show_new">'.$lang_common['Show new posts'].'</a></li>'."\n\t\t\t\t".'<li><a href="misc.php?action=markread">'.$lang_common['Mark all as read'].'</a></li>'."\n\t\t\t".'</ul>'."\n\t\t\t".'<div class="clearer"></div>'."\n\t\t".'</div>';
+	else
+		$tpl_temp .= "\n\t\t\t".'</ul>'."\n\t\t\t".'<div class="clearer"></div>'."\n\t\t".'</div>';
+}
 
 $tpl_main = str_replace('<pun_status>', $tpl_temp, $tpl_main);
@@ -290,5 +180,5 @@
 
 // START SUBST - <pun_announcement>
-if ($pun_user['g_read_board'] == '1' && $pun_config['o_announcement'] == '1')
+if ($pun_config['o_announcement'] == '1')
 {
 	ob_start();
@@ -296,8 +186,8 @@
 ?>
 <div id="announce" class="block">
-	<div class="hd"><h2><span><?php echo $lang_common['Announcement'] ?></span></h2></div>
+	<h2><span><?php echo $lang_common['Announcement'] ?></span></h2>
 	<div class="box">
-		<div id="announce-block" class="inbox">
-			<div class="usercontent"><?php echo $pun_config['o_announcement_message'] ?></div>
+		<div class="inbox">
+			<div><?php echo $pun_config['o_announcement_message'] ?></div>
 		</div>
 	</div>
Index: trunk/web/punbb/help.php
===================================================================
--- trunk/web/punbb/help.php	(revision 10)
+++ trunk/web/punbb/help.php	(revision 1)
@@ -1,14 +1,31 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Tell header.php to use the help template
 define('PUN_HELP', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -22,130 +39,122 @@
 
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_help['Help']);
-define('PUN_ACTIVE_PAGE', 'help');
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_help['Help'];
 require PUN_ROOT.'header.php';
 
 ?>
-<h2><span><?php echo $lang_help['BBCode'] ?></span></h2>
+<h2><?php echo $lang_common['BBCode'] ?></h2>
 <div class="box">
 	<div class="inbox">
-		<p><a name="bbcode"></a><?php echo $lang_help['BBCode info 1'] ?></p>
+		<p><a name="bbcode"></a><?php echo $lang_help['BBCode info 1'] ?></p><br />
 		<p><?php echo $lang_help['BBCode info 2'] ?></p>
 	</div>
 </div>
-<h2><span><?php echo $lang_help['Text style'] ?></span></h2>
+<h2><?php echo $lang_help['Text style'] ?></h2>
 <div class="box">
-	<div class="inbox">
-		<p><?php echo $lang_help['Text style info'] ?></p>
-		<p><code>[b]<?php echo $lang_help['Bold text'] ?>[/b]</code> <?php echo $lang_help['produces'] ?> <samp><strong><?php echo $lang_help['Bold text'] ?></strong></samp></p>
-		<p><code>[u]<?php echo $lang_help['Underlined text'] ?>[/u]</code> <?php echo $lang_help['produces'] ?> <samp><span class="bbu"><?php echo $lang_help['Underlined text'] ?></span></samp></p>
-		<p><code>[i]<?php echo $lang_help['Italic text'] ?>[/i]</code> <?php echo $lang_help['produces'] ?> <samp><em><?php echo $lang_help['Italic text'] ?></em></samp></p>
-		<p><code>[s]<?php echo $lang_help['Strike-through text'] ?>[/s]</code> <?php echo $lang_help['produces'] ?> <samp><span class="bbs"><?php echo $lang_help['Strike-through text'] ?></span></samp></p>
-		<p><code>[del]<?php echo $lang_help['Deleted text'] ?>[/del]</code> <?php echo $lang_help['produces'] ?> <samp><del><?php echo $lang_help['Deleted text'] ?></del></samp></p>
-		<p><code>[ins]<?php echo $lang_help['Inserted text'] ?>[/ins]</code> <?php echo $lang_help['produces'] ?> <samp><ins><?php echo $lang_help['Inserted text'] ?></ins></samp></p>
-		<p><code>[em]<?php echo $lang_help['Emphasised text'] ?>[/em]</code> <?php echo $lang_help['produces'] ?> <samp><em><?php echo $lang_help['Emphasised text'] ?></em></samp></p>
-		<p><code>[color=#FF0000]<?php echo $lang_help['Red text'] ?>[/color]</code> <?php echo $lang_help['produces'] ?> <samp><span style="color: #ff0000"><?php echo $lang_help['Red text'] ?></span></samp></p>
-		<p><code>[color=blue]<?php echo $lang_help['Blue text'] ?>[/color]</code> <?php echo $lang_help['produces'] ?> <samp><span style="color: blue"><?php echo $lang_help['Blue text'] ?></span></samp></p>
-		<p><code>[h]<?php echo $lang_help['Heading text'] ?>[/h]</code> <?php echo $lang_help['produces'] ?></p> <div class="postmsg"><h5><?php echo $lang_help['Heading text'] ?></h5></div>
+	<p><?php echo $lang_help['Text style info'] ?></p><br />
+	<div style="padding-left: 4px">
+		[b]<?php echo $lang_help['Bold text'] ?>[/b] <?php echo $lang_help['produces'] ?> <b><?php echo $lang_help['Bold text'] ?></b><br />
+		[u]<?php echo $lang_help['Underlined text'] ?>[/u] <?php echo $lang_help['produces'] ?> <span class="bbu"><?php echo $lang_help['Underlined text'] ?></span><br />
+		[i]<?php echo $lang_help['Italic text'] ?>[/i] <?php echo $lang_help['produces'] ?> <i><?php echo $lang_help['Italic text'] ?></i><br />
+		[color=#FF0000]<?php echo $lang_help['Red text'] ?>[/color] <?php echo $lang_help['produces'] ?> <span style="color: #ff0000"><?php echo $lang_help['Red text'] ?></span><br />
+		[color=blue]<?php echo $lang_help['Blue text'] ?>[/color] <?php echo $lang_help['produces'] ?> <span style="color: blue"><?php echo $lang_help['Blue text'] ?></span>
 	</div>
 </div>
-<h2><span><?php echo $lang_help['Links and images'] ?></span></h2>
+<h2><?php echo $lang_help['Links and images'] ?></h2>
 <div class="box">
-	<div class="inbox">
-		<p><?php echo $lang_help['Links info'] ?></p>
-		<p><code>[url=<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>]<?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>"><?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?></a></samp></p>
-		<p><code>[url]<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/') ?>"><?php echo pun_htmlspecialchars(get_base_url(true).'/') ?></a></samp></p>
-		<p><code>[url=/help.php]<?php echo $lang_help['This help page'] ?>[/url]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo get_base_url(true).'/help.php' ?>"><?php echo $lang_help['This help page'] ?></a></samp></p>
-		<p><code>[email]myname@mydomain.com[/email]</code> <?php echo $lang_help['produces'] ?> <samp><a href="mailto:myname@mydomain.com">myname@mydomain.com</a></samp></p>
-		<p><code>[email=myname@mydomain.com]<?php echo $lang_help['My email address'] ?>[/email]</code> <?php echo $lang_help['produces'] ?> <samp><a href="mailto:myname@mydomain.com"><?php echo $lang_help['My email address'] ?></a></samp></p>
-		<p><code>[topic=1]<?php echo $lang_help['Test topic'] ?>[/topic]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?id=1') ?>"><?php echo $lang_help['Test topic'] ?></a></samp></p>
-		<p><code>[topic]1[/topic]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?id=1') ?>"><?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?id=1') ?></a></samp></p>
-		<p><code>[post=1]<?php echo $lang_help['Test post'] ?>[/post]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?pid=1#p1') ?>"><?php echo $lang_help['Test post'] ?></a></samp></p>
-		<p><code>[post]1[/post]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?pid=1#p1') ?>"><?php echo pun_htmlspecialchars(get_base_url(true).'/viewtopic.php?pid=1#p1') ?></a></samp></p>
-		<p><code>[forum=1]<?php echo $lang_help['Test forum'] ?>[/forum]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewforum.php?id=1') ?>"><?php echo $lang_help['Test forum'] ?></a></samp></p>
-		<p><code>[forum]1[/forum]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/viewforum.php?id=1') ?>"><?php echo pun_htmlspecialchars(get_base_url(true).'/viewforum.php?id=1') ?></a></samp></p>
-		<p><code>[user=2]<?php echo $lang_help['Test user'] ?>[/user]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/profile.php?id=2') ?>"><?php echo $lang_help['Test user'] ?></a></samp></p>
-		<p><code>[user]2[/user]</code> <?php echo $lang_help['produces'] ?> <samp><a href="<?php echo pun_htmlspecialchars(get_base_url(true).'/profile.php?id=2') ?>"><?php echo pun_htmlspecialchars(get_base_url(true).'/profile.php?id=2') ?></a></samp></p>
+	<p><?php echo $lang_help['Links info'] ?></p><br />
+	<div style="padding-left: 4px">
+		[url=<?php echo $pun_config['o_base_url'].'/' ?>]<?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?>[/url] <?php echo $lang_help['produces'] ?> <a href="<?php echo $pun_config['o_base_url'].'/' ?>"><?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?></a><br />
+		[url]<?php echo $pun_config['o_base_url'].'/' ?>[/url] <?php echo $lang_help['produces'] ?> <a href="<?php echo $pun_config['o_base_url'] ?>"><?php echo $pun_config['o_base_url'].'/' ?></a><br />
+		[email]myname@mydomain.com[/email] <?php echo $lang_help['produces'] ?> <a href="mailto:myname@mydomain.com">myname@mydomain.com</a><br />
+		[email=myname@mydomain.com]<?php echo $lang_help['My e-mail address'] ?>[/email] <?php echo $lang_help['produces'] ?> <a href="mailto:myname@mydomain.com"><?php echo $lang_help['My e-mail address'] ?></a><br /><br />
 	</div>
-	<div class="inbox">
-		<p><a name="img"></a><?php echo $lang_help['Images info'] ?></p>
-		<p><code>[img=<?php echo $lang_help['FluxBB bbcode test'] ?>]<?php echo pun_htmlspecialchars(get_base_url(true)) ?>/img/test.png[/img]</code> <?php echo $lang_help['produces'] ?> <samp><img style="height: 21px" src="<?php echo pun_htmlspecialchars(get_base_url(true)) ?>/img/test.png" alt="<?php echo $lang_help['FluxBB bbcode test'] ?>" /></samp></p>
-	</div>
+	<p><a name="img"></a><?php echo $lang_help['Images info'] ?></p>
+	<div>[img]http://www.punbb.org/img/small_logo.png[/img] <?php echo $lang_help['produces'] ?> <img src="http://www.punbb.org/img/small_logo.png" alt="http://www.punbb.org/img/small_logo.png" /></div>
 </div>
-<h2><span><?php echo $lang_help['Quotes'] ?></span></h2>
+<h2><?php echo $lang_help['Quotes'] ?></h2>
 <div class="box">
-	<div class="inbox">
-		<p><?php echo $lang_help['Quotes info'] ?></p>
-		<p><code>[quote=James]<?php echo $lang_help['Quote text'] ?>[/quote]</code></p>
-		<p><?php echo $lang_help['produces quote box'] ?></p>
+	<div style="padding-left: 4px">
+		<?php echo $lang_help['Quotes info'] ?><br /><br />
+		&#160;&#160;&#160;&#160;[quote=James]<?php echo $lang_help['Quote text'] ?>[/quote]<br /><br />
+		<?php echo $lang_help['produces quote box'] ?><br /><br />
 		<div class="postmsg">
-			<div class="quotebox"><cite>James <?php echo $lang_common['wrote'] ?></cite><blockquote><div><p><?php echo $lang_help['Quote text'] ?></p></div></blockquote></div>
+			<blockquote><div class="incqbox"><h4>James <?php echo $lang_common['wrote'] ?>:</h4><p><?php echo $lang_help['Quote text'] ?></p></div></blockquote>
 		</div>
-		<p><?php echo $lang_help['Quotes info 2'] ?></p>
-		<p><code>[quote]<?php echo $lang_help['Quote text'] ?>[/quote]</code></p>
-		<p><?php echo $lang_help['produces quote box'] ?></p>
+		<br />
+		<?php echo $lang_help['Quotes info 2'] ?><br /><br />
+		&#160;&#160;&#160;&#160;[quote]<?php echo $lang_help['Quote text'] ?>[/quote]<br /><br />
+		<?php echo $lang_help['produces quote box'] ?><br /><br />
 		<div class="postmsg">
-			<div class="quotebox"><blockquote><div><p><?php echo $lang_help['Quote text'] ?></p></div></blockquote></div>
-		</div>
-		<p><?php echo $lang_help['quote note'] ?></p>
-	</div>
-</div>
-<h2><span><?php echo $lang_help['Code'] ?></span></h2>
-<div class="box">
-	<div class="inbox">
-		<p><?php echo $lang_help['Code info'] ?></p>
-		<p><code>[code]<?php echo $lang_help['Code text'] ?>[/code]</code></p>
-		<p><?php echo $lang_help['produces code box'] ?></p>
-		<div class="postmsg">
-			<div class="codebox"><pre><code><?php echo $lang_help['Code text'] ?></code></pre></div>
+			<blockquote><div class="incqbox"><p><?php echo $lang_help['Quote text'] ?></p></div></blockquote>
 		</div>
 	</div>
 </div>
-<h2><span><?php echo $lang_help['Lists'] ?></span></h2>
+<h2><?php echo $lang_help['Code'] ?></h2>
 <div class="box">
-	<div class="inbox">
-		<p><a name="lists"></a><?php echo $lang_help['List info'] ?></p>
-		<p><code>[list][*]<?php echo $lang_help['List text 1'] ?>[/*][*]<?php echo $lang_help['List text 2'] ?>[/*][*]<?php echo $lang_help['List text 3'] ?>[/*][/list]</code>
-		<br /><span><?php echo $lang_help['produces list'] ?></span></p>
+	<div style="padding-left: 4px">
+		<?php echo $lang_help['Code info'] ?><br /><br />
+		&#160;&#160;&#160;&#160;[code]<?php echo $lang_help['Code text'] ?>[/code]<br /><br />
+		<?php echo $lang_help['produces code box'] ?><br /><br />
 		<div class="postmsg">
-			<ul><li><p><?php echo $lang_help['List text 1'] ?></p></li><li><p><?php echo $lang_help['List text 2'] ?></p></li><li><p><?php echo $lang_help['List text 3'] ?></p></li></ul>
-		</div>
-		<p><code>[list=1][*]<?php echo $lang_help['List text 1'] ?>[/*][*]<?php echo $lang_help['List text 2'] ?>[/*][*]<?php echo $lang_help['List text 3'] ?>[/*][/list]</code>
-		<br /><span><?php echo $lang_help['produces decimal list'] ?></span></p>
-		<div class="postmsg">
-			<ol class="decimal"><li><p><?php echo $lang_help['List text 1'] ?></p></li><li><p><?php echo $lang_help['List text 2'] ?></p></li><li><p><?php echo $lang_help['List text 3'] ?></p></li></ol>
-		</div>
-		<p><code>[list=a][*]<?php echo $lang_help['List text 1'] ?>[/*][*]<?php echo $lang_help['List text 2'] ?>[/*][*]<?php echo $lang_help['List text 3'] ?>[/*][/list]</code>
-		<br /><span><?php echo $lang_help['produces alpha list'] ?></span></p>
-		<div class="postmsg">
-			<ol class="alpha"><li><p><?php echo $lang_help['List text 1'] ?></p></li><li><p><?php echo $lang_help['List text 2'] ?></p></li><li><p><?php echo $lang_help['List text 3'] ?></p></li></ol>
+			<div class="codebox"><div class="incqbox"><h4><?php echo $lang_common['Code'] ?>:</h4><div class="scrollbox" style="height: 4.5em"><pre><?php echo $lang_help['Code text'] ?></pre></div></div></div>
 		</div>
 	</div>
 </div>
-<h2><span><?php echo $lang_help['Nested tags'] ?></span></h2>
+<h2><?php echo $lang_help['Nested tags'] ?></h2>
 <div class="box">
-	<div class="inbox">
-		<p><?php echo $lang_help['Nested tags info'] ?></p>
-		<p><code>[b][u]<?php echo $lang_help['Bold, underlined text'] ?>[/u][/b]</code> <?php echo $lang_help['produces'] ?> <samp><strong><span class="bbu"><?php echo $lang_help['Bold, underlined text'] ?></span></strong></samp></p>
+	<div style="padding-left: 4px">
+		<?php echo $lang_help['Nested tags info'] ?><br /><br />
+		&#160;&#160;&#160;&#160;[b][u]<?php echo $lang_help['Bold, underlined text'] ?>[/u][/b] <?php echo $lang_help['produces'] ?> <span class="bbu"><b><?php echo $lang_help['Bold, underlined text'] ?></b></span><br /><br />
 	</div>
 </div>
-<h2><span><?php echo $lang_help['Smilies'] ?></span></h2>
+<h2><?php echo $lang_common['Smilies'] ?></h2>
 <div class="box">
-	<div class="inbox">
-		<p><a name="smilies"></a><?php echo $lang_help['Smilies info'] ?></p>
+	<div style="padding-left: 4px">
+		<a name="smilies"></a><?php echo $lang_help['Smilies info'] ?><br /><br />
 <?php
 
 // Display the smiley set
-require PUN_ROOT.'include/parser.php';
+@include_once PUN_ROOT.'cache/cache_smilies.php';
+if (!defined('PUN_CACHE_SMILEY'))
+{
+	require_once PUN_ROOT.'include/cache_smilies.php';
+	generate_smiley_cache();
+	require PUN_ROOT.'cache/cache_smilies.php';
+}
 
-$smiley_groups = array();
+$num_smilies = count($smiley_text);
+for ($i = 0; $i < $num_smilies; ++$i)
+{
+	// Is there a smiley at the current index?
+	if (!isset($smiley_text[$i]))
+		continue;
 
-foreach ($smilies as $smiley_text => $smiley_img)
-	$smiley_groups[$smiley_img][] = $smiley_text;
+	echo "\t\t".'&#160;&#160;&#160;&#160;'.$smiley_text[$i];
 
-foreach ($smiley_groups as $smiley_img => $smiley_texts)
-	echo "\t\t".'<p><code>'.implode('</code> '.$lang_common['and'].' <code>', $smiley_texts).'</code> <span>'.$lang_help['produces'].'</span> <samp><img src="'.pun_htmlspecialchars(get_base_url(true)).'/img/smilies/'.$smiley_img.'" width="15" height="15" alt="'.$smiley_texts[0].'" /></samp></p>'."\n";
+	// Save the current text and image
+	$cur_img = $smiley_img[$i];
+	$cur_text = $smiley_text[$i];
+
+	// Loop through the rest of the array and see if there are any duplicate images
+	// (more than one text representation for one image)
+	for ($next = $i + 1; $next < $num_smilies; ++$next)
+	{
+		// Did we find a dupe?
+		if (isset($smiley_img[$next]) && $smiley_img[$i] == $smiley_img[$next])
+		{
+			echo ' '.$lang_common['and'].' '.$smiley_text[$next];
+
+			// Remove the dupe so we won't display it twice
+			unset($smiley_text[$next]);
+			unset($smiley_img[$next]);
+		}
+	}
+
+	echo ' '.$lang_help['produces'].' <img src="img/smilies/'.$cur_img.'" alt="'.$cur_text.'" /><br />'."\n";
+}
 
 ?>
+		<br />
 	</div>
 </div>
Index: trunk/web/punbb/img/avatars/index.html
===================================================================
--- trunk/web/punbb/img/avatars/index.html	(revision 10)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<html><head><title>.</title></head><body>.</body></html>
Index: trunk/web/punbb/img/index.html
===================================================================
--- trunk/web/punbb/img/index.html	(revision 10)
+++ trunk/web/punbb/img/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/img/smilies/index.html
===================================================================
--- trunk/web/punbb/img/smilies/index.html	(revision 10)
+++ trunk/web/punbb/img/smilies/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/include/cache.php
===================================================================
--- trunk/web/punbb/include/cache.php	(revision 10)
+++ trunk/web/punbb/include/cache.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure no one attempts to run this script "directly"
@@ -13,4 +30,49 @@
 
 //
+// If we are running pre PHP 4.2.0, we add our own implementation of var_export
+//
+if (!function_exists('var_export'))
+{
+	function var_export()
+	{
+		$args = func_get_args();
+		$indent = (isset($args[2])) ? $args[2] : '';
+
+		if (is_array($args[0]))
+		{
+			$output = 'array ('."\n";
+
+			foreach ($args[0] as $k => $v)
+			{
+				if (is_numeric($k))
+					$output .= $indent.'  '.$k.' => ';
+				else
+					$output .= $indent.'  \''.str_replace('\'', '\\\'', str_replace('\\', '\\\\', $k)).'\' => ';
+
+				if (is_array($v))
+					$output .= var_export($v, true, $indent.'  ');
+				else
+				{
+					if (gettype($v) != 'string' && !empty($v))
+						$output .= $v.','."\n";
+					else
+						$output .= '\''.str_replace('\'', '\\\'', str_replace('\\', '\\\\', $v)).'\','."\n";
+				}
+			}
+
+			$output .= ($indent != '') ? $indent.'),'."\n" : ')';
+		}
+		else
+			$output = $args[0];
+
+		if ($args[1] == true)
+			return $output;
+		else
+			echo $output;
+	}
+}
+
+
+//
 // Generate the config cache PHP script
 //
@@ -20,19 +82,16 @@
 
 	// Get the forum config from the DB
-	$result = $db->query('SELECT * FROM '.$db->prefix.'config', true) or error('Unable to fetch forum config', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT * FROM '.$db->prefix.'config', true) or error('Impossible de retrouver la configuration des forums', __FILE__, __LINE__, $db->error());
 	while ($cur_config_item = $db->fetch_row($result))
 		$output[$cur_config_item[0]] = $cur_config_item[1];
 
 	// Output config as PHP code
-	$fh = @fopen(FORUM_CACHE_DIR.'cache_config.php', 'wb');
+	$fh = @fopen(PUN_ROOT.'cache/cache_config.php', 'wb');
 	if (!$fh)
-		error('Unable to write configuration cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
+		error('Impossible d\'Ã©crire le fichier cache de configuration dans le rÃ©pertoire cache. Veuillez vous assurer que PHP a l\'accÃšs en Ã©crire au rÃ©pertoire \'cache\'', __FILE__, __LINE__);
 
 	fwrite($fh, '<?php'."\n\n".'define(\'PUN_CONFIG_LOADED\', 1);'."\n\n".'$pun_config = '.var_export($output, true).';'."\n\n".'?>');
 
 	fclose($fh);
-
-	if (function_exists('apc_delete_file'))
-		@apc_delete_file(FORUM_CACHE_DIR.'cache_config.php');
 }
 
@@ -46,5 +105,5 @@
 
 	// Get the ban list from the DB
-	$result = $db->query('SELECT * FROM '.$db->prefix.'bans', true) or error('Unable to fetch ban list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT * FROM '.$db->prefix.'bans', true) or error('Impossible de retrouver la liste de bannissements', __FILE__, __LINE__, $db->error());
 
 	$output = array();
@@ -53,14 +112,11 @@
 
 	// Output ban list as PHP code
-	$fh = @fopen(FORUM_CACHE_DIR.'cache_bans.php', 'wb');
+	$fh = @fopen(PUN_ROOT.'cache/cache_bans.php', 'wb');
 	if (!$fh)
-		error('Unable to write bans cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
+		error('Impossible d\'Ã©crire le fichier cache de bannissements dans le rÃ©pertoire cache. Veuillez vous assurer que PHP a l\'accÃšs en Ã©crire au rÃ©pertoire \'cache\'', __FILE__, __LINE__);
 
 	fwrite($fh, '<?php'."\n\n".'define(\'PUN_BANS_LOADED\', 1);'."\n\n".'$pun_bans = '.var_export($output, true).';'."\n\n".'?>');
 
 	fclose($fh);
-
-	if (function_exists('apc_delete_file'))
-		@apc_delete_file(FORUM_CACHE_DIR.'cache_bans.php');
 }
 
@@ -74,5 +130,5 @@
 
 	// Get the rank list from the DB
-	$result = $db->query('SELECT * FROM '.$db->prefix.'ranks ORDER BY min_posts', true) or error('Unable to fetch rank list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT * FROM '.$db->prefix.'ranks ORDER BY min_posts', true) or error('Impossible de retrouver la liste des rangs utilisateurs', __FILE__, __LINE__, $db->error());
 
 	$output = array();
@@ -81,19 +137,16 @@
 
 	// Output ranks list as PHP code
-	$fh = @fopen(FORUM_CACHE_DIR.'cache_ranks.php', 'wb');
+	$fh = @fopen(PUN_ROOT.'cache/cache_ranks.php', 'wb');
 	if (!$fh)
-		error('Unable to write ranks cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
+		error('Impossible d\'Ã©crire le fichier de cache de rangs utilisateurs dans le rÃ©pertoire cache. Veuillez vous assurer que PHP a l\'accÃšs en Ã©crire au rÃ©pertoire \'cache\'', __FILE__, __LINE__);
 
 	fwrite($fh, '<?php'."\n\n".'define(\'PUN_RANKS_LOADED\', 1);'."\n\n".'$pun_ranks = '.var_export($output, true).';'."\n\n".'?>');
 
 	fclose($fh);
-
-	if (function_exists('apc_delete_file'))
-		@apc_delete_file(FORUM_CACHE_DIR.'cache_ranks.php');
-}
-
-
-//
-// Generate quick jump cache PHP scripts
+}
+
+
+//
+// Generate quickjump cache PHP scripts
 //
 function generate_quickjump_cache($group_id = false)
@@ -101,183 +154,52 @@
 	global $db, $lang_common, $pun_user;
 
-	$groups = array();
-
-	// If a group_id was supplied, we generate the quick jump cache for that group only
+	// If a group_id was supplied, we generate the quickjump cache for that group only
 	if ($group_id !== false)
-	{
-		// Is this group even allowed to read forums?
-		$result = $db->query('SELECT g_read_board FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch user group read permission', __FILE__, __LINE__, $db->error());
-		$read_board = $db->result($result);
-
-		$groups[$group_id] = $read_board;
-	}
+		$groups[0] = $group_id;
 	else
 	{
-		// A group_id was not supplied, so we generate the quick jump cache for all groups
-		$result = $db->query('SELECT g_id, g_read_board FROM '.$db->prefix.'groups') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+		// A group_id was now supplied, so we generate the quickjump cache for all groups
+		$result = $db->query('SELECT g_id FROM '.$db->prefix.'groups') or error('Impossible de retrouver la liste des groupes utilisateurs', __FILE__, __LINE__, $db->error());
 		$num_groups = $db->num_rows($result);
 
-		while ($row = $db->fetch_row($result))
-			$groups[$row[0]] = $row[1];
+		for ($i = 0; $i < $num_groups; ++$i)
+			$groups[] = $db->result($result, $i);
 	}
 
 	// Loop through the groups in $groups and output the cache for each of them
-	foreach ($groups as $group_id => $read_board)
+	while (list(, $group_id) = @each($groups))
 	{
-		// Output quick jump as PHP code
-		$fh = @fopen(FORUM_CACHE_DIR.'cache_quickjump_'.$group_id.'.php', 'wb');
+		// Output quickjump as PHP code
+		$fh = @fopen(PUN_ROOT.'cache/cache_quickjump_'.$group_id.'.php', 'wb');
 		if (!$fh)
-			error('Unable to write quick jump cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
-
-		$output = '<?php'."\n\n".'if (!defined(\'PUN\')) exit;'."\n".'define(\'PUN_QJ_LOADED\', 1);'."\n".'$forum_id = isset($forum_id) ? $forum_id : 0;'."\n\n".'?>';
-
-		if ($read_board == '1')
+			error('Impossible d\'Ã©crire le fichier cache de saut rapide de forums dans le rÃ©pertoire cache. Veuillez vous assurer que PHP a l\'accÃšs en Ã©crire au rÃ©pertoire \'cache\'', __FILE__, __LINE__);
+
+		$output = '<?php'."\n\n".'if (!defined(\'PUN\')) exit;'."\n".'define(\'PUN_QJ_LOADED\', 1);'."\n\n".'?>';
+		$output .= "\t\t\t\t".'<form id="qjump" method="get" action="viewforum.php">'."\n\t\t\t\t\t".'<div><label><?php echo $lang_common[\'Jump to\'] ?>'."\n\n\t\t\t\t\t".'<br /><select name="id" onchange="window.location=(\'viewforum.php?id=\'+this.options[this.selectedIndex].value)">'."\n";
+
+
+		$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$group_id.') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Impossible de retrouver la liste des catÃ©gories et des forums', __FILE__, __LINE__, $db->error());
+
+		$cur_category = 0;
+		while ($cur_forum = $db->fetch_assoc($result))
 		{
-			$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$group_id.') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
-
-			if ($db->num_rows($result))
+			if ($cur_forum['cid'] != $cur_category)	// A new category since last iteration?
 			{
-				$output .= "\t\t\t\t".'<form id="qjump" method="get" action="viewforum.php">'."\n\t\t\t\t\t".'<div><label><span><?php echo $lang_common[\'Jump to\'] ?>'.'<br /></span>'."\n\t\t\t\t\t".'<select name="id" onchange="window.location=(\'viewforum.php?id=\'+this.options[this.selectedIndex].value)">'."\n";
-
-				$cur_category = 0;
-				while ($cur_forum = $db->fetch_assoc($result))
-				{
-					if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
-					{
-						if ($cur_category)
-							$output .= "\t\t\t\t\t\t".'</optgroup>'."\n";
-
-						$output .= "\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($cur_forum['cat_name']).'">'."\n";
-						$cur_category = $cur_forum['cid'];
-					}
-
-					$redirect_tag = ($cur_forum['redirect_url'] != '') ? ' &gt;&gt;&gt;' : '';
-					$output .= "\t\t\t\t\t\t\t".'<option value="'.$cur_forum['fid'].'"<?php echo ($forum_id == '.$cur_forum['fid'].') ? \' selected="selected"\' : \'\' ?>>'.pun_htmlspecialchars($cur_forum['forum_name']).$redirect_tag.'</option>'."\n";
-				}
-
-				$output .= "\t\t\t\t\t\t".'</optgroup>'."\n\t\t\t\t\t".'</select>'."\n\t\t\t\t\t".'<input type="submit" value="<?php echo $lang_common[\'Go\'] ?>" accesskey="g" />'."\n\t\t\t\t\t".'</label></div>'."\n\t\t\t\t".'</form>'."\n";
+				if ($cur_category)
+					$output .= "\t\t\t\t\t\t".'</optgroup>'."\n";
+
+				$output .= "\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($cur_forum['cat_name']).'">'."\n";
+				$cur_category = $cur_forum['cid'];
 			}
+
+			$redirect_tag = ($cur_forum['redirect_url'] != '') ? ' &gt;&gt;&gt;' : '';
+			$output .= "\t\t\t\t\t\t\t".'<option value="'.$cur_forum['fid'].'"<?php echo ($forum_id == '.$cur_forum['fid'].') ? \' selected="selected"\' : \'\' ?>>'.pun_htmlspecialchars($cur_forum['forum_name']).$redirect_tag.'</option>'."\n";
 		}
 
+		$output .= "\t\t\t\t\t".'</optgroup>'."\n\t\t\t\t\t".'</select>'."\n\t\t\t\t\t".'<input type="submit" value="<?php echo $lang_common[\'Go\'] ?>" accesskey="g" />'."\n\t\t\t\t\t".'</label></div>'."\n\t\t\t\t".'</form>'."\n";
+
 		fwrite($fh, $output);
 
 		fclose($fh);
-
-		if (function_exists('apc_delete_file'))
-			@apc_delete_file(FORUM_CACHE_DIR.'cache_quickjump_'.$group_id.'.php');
 	}
 }
-
-
-//
-// Generate the censoring cache PHP script
-//
-function generate_censoring_cache()
-{
-	global $db;
-
-	$result = $db->query('SELECT search_for, replace_with FROM '.$db->prefix.'censoring') or error('Unable to fetch censoring list', __FILE__, __LINE__, $db->error());
-	$num_words = $db->num_rows($result);
-
-	$search_for = $replace_with = array();
-	for ($i = 0; $i < $num_words; $i++)
-	{
-		list($search_for[$i], $replace_with[$i]) = $db->fetch_row($result);
-		$search_for[$i] = '%(?<=[^\p{L}\p{N}])('.str_replace('\*', '[\p{L}\p{N}]*?', preg_quote($search_for[$i], '%')).')(?=[^\p{L}\p{N}])%iu';
-	}
-
-	// Output censored words as PHP code
-	$fh = @fopen(FORUM_CACHE_DIR.'cache_censoring.php', 'wb');
-	if (!$fh)
-		error('Unable to write censoring cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
-
-	fwrite($fh, '<?php'."\n\n".'define(\'PUN_CENSOR_LOADED\', 1);'."\n\n".'$search_for = '.var_export($search_for, true).';'."\n\n".'$replace_with = '.var_export($replace_with, true).';'."\n\n".'?>');
-
-	fclose($fh);
-
-	if (function_exists('apc_delete_file'))
-		@apc_delete_file(FORUM_CACHE_DIR.'cache_censoring.php');
-}
-
-
-//
-// Generate the stopwords cache PHP script
-//
-function generate_stopwords_cache()
-{
-	$stopwords = array();
-
-	$d = dir(PUN_ROOT.'lang');
-	while (($entry = $d->read()) !== false)
-	{
-		if ($entry{0} == '.')
-			continue;
-
-		if (is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/stopwords.txt'))
-			$stopwords = array_merge($stopwords, file(PUN_ROOT.'lang/'.$entry.'/stopwords.txt'));
-	}
-	$d->close();
-
-	// Tidy up and filter the stopwords
-	$stopwords = array_map('pun_trim', $stopwords);
-	$stopwords = array_filter($stopwords);
-
-	// Output stopwords as PHP code
-	$fh = @fopen(FORUM_CACHE_DIR.'cache_stopwords.php', 'wb');
-	if (!$fh)
-		error('Unable to write stopwords cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
-
-	fwrite($fh, '<?php'."\n\n".'$cache_id = \''.generate_stopwords_cache_id().'\';'."\n".'if ($cache_id != generate_stopwords_cache_id()) return;'."\n\n".'define(\'PUN_STOPWORDS_LOADED\', 1);'."\n\n".'$stopwords = '.var_export($stopwords, true).';'."\n\n".'?>');
-
-	fclose($fh);
-
-	if (function_exists('apc_delete_file'))
-		@apc_delete_file(FORUM_CACHE_DIR.'cache_stopwords.php');
-}
-
-
-//
-// Load some information about the latest registered users
-//
-function generate_users_info_cache()
-{
-	global $db;
-
-	$stats = array();
-
-	$result = $db->query('SELECT COUNT(id)-1 FROM '.$db->prefix.'users WHERE group_id!='.PUN_UNVERIFIED) or error('Unable to fetch total user count', __FILE__, __LINE__, $db->error());
-	$stats['total_users'] = $db->result($result);
-
-	$result = $db->query('SELECT id, username FROM '.$db->prefix.'users WHERE group_id!='.PUN_UNVERIFIED.' ORDER BY registered DESC LIMIT 1') or error('Unable to fetch newest registered user', __FILE__, __LINE__, $db->error());
-	$stats['last_user'] = $db->fetch_assoc($result);
-
-	// Output users info as PHP code
-	$fh = @fopen(FORUM_CACHE_DIR.'cache_users_info.php', 'wb');
-	if (!$fh)
-		error('Unable to write users info cache file to cache directory. Please make sure PHP has write access to the directory \''.pun_htmlspecialchars(FORUM_CACHE_DIR).'\'', __FILE__, __LINE__);
-
-	fwrite($fh, '<?php'."\n\n".'define(\'PUN_USERS_INFO_LOADED\', 1);'."\n\n".'$stats = '.var_export($stats, true).';'."\n\n".'?>');
-
-	fclose($fh);
-
-	if (function_exists('apc_delete_file'))
-		@apc_delete_file(FORUM_CACHE_DIR.'cache_users_info.php');
-}
-
-
-//
-// Delete all feed caches
-//
-function clear_feed_cache()
-{
-	$d = dir(FORUM_CACHE_DIR);
-	while (($entry = $d->read()) !== false)
-	{
-		if (substr($entry, 0, 10) == 'cache_feed' && substr($entry, -4) == '.php')
-			@unlink(FORUM_CACHE_DIR.$entry);
-	}
-	$d->close();
-}
-
-
-define('FORUM_CACHE_FUNCTIONS_LOADED', true);
Index: trunk/web/punbb/include/common.php
===================================================================
--- trunk/web/punbb/include/common.php	(revision 10)
+++ trunk/web/punbb/include/common.php	(revision 1)
@@ -1,75 +1,63 @@
 <?php
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+// Activez le mode DEBUG en enlevant // du dÃ©but de la ligne ci-dessous
+//define('PUN_DEBUG', 1);
+
+// Ceci permettra d'afficher en bas de page toutes les requÃªtes exÃ©cutÃ©es
+// N'ACTIVEZ PAS cela sur un environnement de production !
+//define('PUN_SHOW_QUERIES', 1);
 
 if (!defined('PUN_ROOT'))
-	exit('The constant PUN_ROOT must be defined and point to a valid FluxBB installation root directory.');
+	exit('La constante PUN_ROOT doit Ãªtre dÃ©finie est doit pointer le repertoire racine d\'une installation fonctionnelle de PunBB.');
 
-// Define the version and database revision that this code was written for
-define('FORUM_VERSION', '1.4.7');
-
-define('FORUM_DB_REVISION', 15);
-define('FORUM_SI_REVISION', 2);
-define('FORUM_PARSER_REVISION', 2);
-
-// Block prefetch requests
-if (isset($_SERVER['HTTP_X_MOZ']) && $_SERVER['HTTP_X_MOZ'] == 'prefetch')
-{
-	header('HTTP/1.1 403 Prefetching Forbidden');
-
-	// Send no-cache headers
-	header('Expires: Thu, 21 Jul 1977 07:30:00 GMT'); // When yours truly first set eyes on this world! :)
-	header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: post-check=0, pre-check=0', false);
-	header('Pragma: no-cache'); // For HTTP/1.0 compatibility
-
-	exit;
-}
-
-// Attempt to load the configuration file config.php
-if (file_exists(PUN_ROOT.'config.php'))
-	require PUN_ROOT.'config.php';
-
-// If we have the 1.3-legacy constant defined, define the proper 1.4 constant so we don't get an incorrect "need to install" message
-if (defined('FORUM'))
-	define('PUN', FORUM);
 
 // Load the functions script
 require PUN_ROOT.'include/functions.php';
 
-// Load UTF-8 functions
-require PUN_ROOT.'include/utf8/utf8.php';
+// Reverse the effect of register_globals
+if (@ini_get('register_globals'))
+	unregister_globals();
 
-// Strip out "bad" UTF-8 characters
-forum_remove_bad_characters();
-
-// Reverse the effect of register_globals
-forum_unregister_globals();
+include PUN_ROOT.'config.php';
 
 // If PUN isn't defined, config.php is missing or corrupt
 if (!defined('PUN'))
-{
-	header('Location: install.php');
-	exit;
-}
+	exit('Le fichier "config.php" n\'existe pas ou est endommagÃ©. Veuillez lancer <a href="install.php">install.php</a> pour installer PunBB.');
+
 
 // Record the start time (will be used to calculate the generation time for the page)
-$pun_start = get_microtime();
+list($usec, $sec) = explode(' ', microtime());
+$pun_start = ((float)$usec + (float)$sec);
 
-// Make sure PHP reports all errors except E_NOTICE. FluxBB supports E_ALL, but a lot of scripts it may interact with, do not
+// Enable full error, warning and notice reporting
 error_reporting(E_ALL ^ E_NOTICE);
 
-// Force POSIX locale (to prevent functions such as strtolower() from messing up UTF-8 strings)
-setlocale(LC_CTYPE, 'C');
+// Turn off magic_quotes_runtime
+set_magic_quotes_runtime(0);
 
-// Turn off magic_quotes_runtime
-if (get_magic_quotes_runtime())
-	set_magic_quotes_runtime(0);
-
-// Strip slashes from GET/POST/COOKIE/REQUEST/FILES (if magic_quotes_gpc is enabled)
+// Strip slashes from GET/POST/COOKIE (if magic_quotes_gpc is enabled)
 if (get_magic_quotes_gpc())
 {
@@ -82,22 +70,20 @@
 	$_POST = stripslashes_array($_POST);
 	$_COOKIE = stripslashes_array($_COOKIE);
-	$_REQUEST = stripslashes_array($_REQUEST);
-	$_FILES = stripslashes_array($_FILES);
 }
 
-// If a cookie name is not specified in config.php, we use the default (pun_cookie)
+// Seed the random number generator
+mt_srand((double)microtime()*1000000);
+
+// If a cookie name is not specified in config.php, we use the default (punbb_cookie)
 if (empty($cookie_name))
-	$cookie_name = 'pun_cookie';
-
-// If the cache directory is not specified, we use the default setting
-if (!defined('FORUM_CACHE_DIR'))
-	define('FORUM_CACHE_DIR', PUN_ROOT.'cache/');
+	$cookie_name = 'punbb_cookie';
 
 // Define a few commonly used constants
-define('PUN_UNVERIFIED', 0);
+define('PUN_UNVERIFIED', 32000);
 define('PUN_ADMIN', 1);
 define('PUN_MOD', 2);
 define('PUN_GUEST', 3);
 define('PUN_MEMBER', 4);
+
 
 // Load DB abstraction layer and connect
@@ -108,31 +94,21 @@
 
 // Load cached config
-if (file_exists(FORUM_CACHE_DIR.'cache_config.php'))
-	include FORUM_CACHE_DIR.'cache_config.php';
-
+@include PUN_ROOT.'cache/cache_config.php';
 if (!defined('PUN_CONFIG_LOADED'))
 {
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require PUN_ROOT.'include/cache.php';
 	generate_config_cache();
-	require FORUM_CACHE_DIR.'cache_config.php';
+	require PUN_ROOT.'cache/cache_config.php';
 }
 
-// Verify that we are running the proper database schema revision
-if (!isset($pun_config['o_database_revision']) || $pun_config['o_database_revision'] < FORUM_DB_REVISION ||
-	!isset($pun_config['o_searchindex_revision']) || $pun_config['o_searchindex_revision'] < FORUM_SI_REVISION ||
-	!isset($pun_config['o_parser_revision']) || $pun_config['o_parser_revision'] < FORUM_PARSER_REVISION ||
-	version_compare($pun_config['o_cur_version'], FORUM_VERSION, '<'))
-{
-	header('Location: db_update.php');
-	exit;
-}
 
 // Enable output buffering
 if (!defined('PUN_DISABLE_BUFFERING'))
 {
+	// For some very odd reason, "Norton Internet Security" unsets this
+	$_SERVER['HTTP_ACCEPT_ENCODING'] = isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '';
+
 	// Should we use gzip output compression?
-	if ($pun_config['o_gzip'] && extension_loaded('zlib'))
+	if ($pun_config['o_gzip'] && extension_loaded('zlib') && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false || strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') !== false))
 		ob_start('ob_gzhandler');
 	else
@@ -140,7 +116,4 @@
 }
 
-// Define standard date/time formats
-$forum_time_formats = array($pun_config['o_time_format'], 'H:i:s', 'H:i', 'g:i:s a', 'g:i a');
-$forum_date_formats = array($pun_config['o_date_format'], 'Y-m-d', 'Y-d-m', 'd-m-Y', 'm-d-Y', 'M j Y', 'jS M Y');
 
 // Check/update/set cookie and fetch user info
@@ -149,8 +122,7 @@
 
 // Attempt to load the common language file
-if (file_exists(PUN_ROOT.'lang/'.$pun_user['language'].'/common.php'))
-	include PUN_ROOT.'lang/'.$pun_user['language'].'/common.php';
-else
-	error('There is no valid language pack \''.pun_htmlspecialchars($pun_user['language']).'\' installed. Please reinstall a language of that name');
+@include PUN_ROOT.'lang/'.$pun_user['language'].'/common.php';
+if (!isset($lang_common))
+	exit('Il n\'y a pas de pack de langue \''.pun_htmlspecialchars($pun_user['language']).'\' d\'installÃ©. Veuillez rÃ©-installer une langue de ce nom.');
 
 // Check if we are to display a maintenance message
@@ -158,15 +130,12 @@
 	maintenance_message();
 
+
 // Load cached bans
-if (file_exists(FORUM_CACHE_DIR.'cache_bans.php'))
-	include FORUM_CACHE_DIR.'cache_bans.php';
-
+@include PUN_ROOT.'cache/cache_bans.php';
 if (!defined('PUN_BANS_LOADED'))
 {
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
+	require_once PUN_ROOT.'include/cache.php';
 	generate_bans_cache();
-	require FORUM_CACHE_DIR.'cache_bans.php';
+	require PUN_ROOT.'cache/cache_bans.php';
 }
 
@@ -177,17 +146,3 @@
 update_users_online();
 
-// Check to see if we logged in without a cookie being set
-if ($pun_user['is_guest'] && isset($_GET['login']))
-	message($lang_common['No cookie']);
-
-// The maximum size of a post, in bytes, since the field is now MEDIUMTEXT this allows ~16MB but lets cap at 1MB...
-if (!defined('PUN_MAX_POSTSIZE'))
-	define('PUN_MAX_POSTSIZE', 1048576);
-
-if (!defined('PUN_SEARCH_MIN_WORD'))
-	define('PUN_SEARCH_MIN_WORD', 3);
-if (!defined('PUN_SEARCH_MAX_WORD'))
-	define('PUN_SEARCH_MAX_WORD', 20);
-
-if (!defined('FORUM_MAX_COOKIE_SIZE'))
-	define('FORUM_MAX_COOKIE_SIZE', 4048);
+?>
Index: trunk/web/punbb/include/common_admin.php
===================================================================
--- trunk/web/punbb/include/common_admin.php	(revision 10)
+++ trunk/web/punbb/include/common_admin.php	(revision 1)
@@ -1,9 +1,25 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
 
 // Make sure no one attempts to run this script "directly"
@@ -11,14 +27,4 @@
 	exit;
 
-// Make sure we have a usable language pack for admin.
-if (file_exists(PUN_ROOT.'lang/'.$pun_user['language'].'/admin_common.php'))
-	$admin_language = $pun_user['language'];
-else if (file_exists(PUN_ROOT.'lang/'.$pun_config['o_default_lang'].'/admin_common.php'))
-	$admin_language = $pun_config['o_default_lang'];
-else
-	$admin_language = 'English';
-
-// Attempt to load the admin_common language file
-require PUN_ROOT.'lang/'.$admin_language.'/admin_common.php';
 
 //
@@ -27,5 +33,5 @@
 function generate_admin_menu($page = '')
 {
-	global $pun_config, $pun_user, $lang_admin_common;
+	global $pun_config, $pun_user;
 
 	$is_admin = $pun_user['g_id'] == PUN_ADMIN ? true : false;
@@ -34,33 +40,21 @@
 <div id="adminconsole" class="block2col">
 	<div id="adminmenu" class="blockmenu">
-		<h2><span><?php echo $lang_admin_common['Moderator menu'] ?></span></h2>
+		<h2><span>Menu <?php echo ($is_admin) ? 'Admin' : 'ModÃ©rateur' ?></span></h2>
 		<div class="box">
 			<div class="inbox">
 				<ul>
-					<li<?php if ($page == 'index') echo ' class="isactive"'; ?>><a href="admin_index.php"><?php echo $lang_admin_common['Index'] ?></a></li>
-					<li<?php if ($page == 'users') echo ' class="isactive"'; ?>><a href="admin_users.php"><?php echo $lang_admin_common['Users'] ?></a></li>
-<?php if ($is_admin || $pun_user['g_mod_ban_users'] == '1'): ?>					<li<?php if ($page == 'bans') echo ' class="isactive"'; ?>><a href="admin_bans.php"><?php echo $lang_admin_common['Bans'] ?></a></li>
-<?php endif; if ($is_admin || $pun_config['o_report_method'] == '0' || $pun_config['o_report_method'] == '2'): ?>					<li<?php if ($page == 'reports') echo ' class="isactive"'; ?>><a href="admin_reports.php"><?php echo $lang_admin_common['Reports'] ?></a></li>
-<?php endif; ?>				</ul>
-			</div>
-		</div>
-<?php
-
-	if ($is_admin)
-	{
-
-?>
-		<h2 class="block2"><span><?php echo $lang_admin_common['Admin menu'] ?></span></h2>
-		<div class="box">
-			<div class="inbox">
-				<ul>
-					<li<?php if ($page == 'options') echo ' class="isactive"'; ?>><a href="admin_options.php"><?php echo $lang_admin_common['Options'] ?></a></li>
-					<li<?php if ($page == 'permissions') echo ' class="isactive"'; ?>><a href="admin_permissions.php"><?php echo $lang_admin_common['Permissions'] ?></a></li>
-					<li<?php if ($page == 'categories') echo ' class="isactive"'; ?>><a href="admin_categories.php"><?php echo $lang_admin_common['Categories'] ?></a></li>
-					<li<?php if ($page == 'forums') echo ' class="isactive"'; ?>><a href="admin_forums.php"><?php echo $lang_admin_common['Forums'] ?></a></li>
-					<li<?php if ($page == 'groups') echo ' class="isactive"'; ?>><a href="admin_groups.php"><?php echo $lang_admin_common['User groups'] ?></a></li>
-					<li<?php if ($page == 'censoring') echo ' class="isactive"'; ?>><a href="admin_censoring.php"><?php echo $lang_admin_common['Censoring'] ?></a></li>
-					<li<?php if ($page == 'ranks') echo ' class="isactive"'; ?>><a href="admin_ranks.php"><?php echo $lang_admin_common['Ranks'] ?></a></li>
-					<li<?php if ($page == 'maintenance') echo ' class="isactive"'; ?>><a href="admin_maintenance.php"><?php echo $lang_admin_common['Maintenance'] ?></a></li>
+					<li<?php if ($page == 'index') echo ' class="isactive"'; ?>><a href="admin_index.php">Index</a></li>
+<?php if ($is_admin): ?>					<li<?php if ($page == 'categories') echo ' class="isactive"'; ?>><a href="admin_categories.php">CatÃ©gories</a></li>
+<?php endif; ?><?php if ($is_admin): ?>					<li<?php if ($page == 'forums') echo ' class="isactive"'; ?>><a href="admin_forums.php">Forums</a></li>
+<?php endif; ?>					<li<?php if ($page == 'users') echo ' class="isactive"'; ?>><a href="admin_users.php">Utilisateurs</a></li>
+<?php if ($is_admin): ?>					<li<?php if ($page == 'groups') echo ' class="isactive"'; ?>><a href="admin_groups.php">Groupes</a></li>
+<?php endif; ?><?php if ($is_admin): ?>					<li<?php if ($page == 'options') echo ' class="isactive"'; ?>><a href="admin_options.php">Options</a></li>
+<?php endif; ?><?php if ($is_admin): ?>					<li<?php if ($page == 'permissions') echo ' class="isactive"'; ?>><a href="admin_permissions.php">Permissions</a></li>
+<?php endif; ?>					<li<?php if ($page == 'censoring') echo ' class="isactive"'; ?>><a href="admin_censoring.php">Mots censurÃ©s</a></li>
+<?php if ($is_admin): ?>					<li<?php if ($page == 'ranks') echo ' class="isactive"'; ?>><a href="admin_ranks.php">Rangs utilisateurs</a></li>
+<?php endif; ?><?php if ($is_admin || $pun_config['p_mod_ban_users'] == '1'): ?>					<li<?php if ($page == 'bans') echo ' class="isactive"'; ?>><a href="admin_bans.php">Bannissements</a></li>
+<?php endif; ?><?php if ($is_admin): ?>					<li<?php if ($page == 'prune') echo ' class="isactive"'; ?>><a href="admin_prune.php">Ãlaguage</a></li>
+<?php endif; ?><?php if ($is_admin): ?>					<li<?php if ($page == 'maintenance') echo ' class="isactive"'; ?>><a href="admin_maintenance.php">Maintenance</a></li>
+<?php endif; ?>					<li<?php if ($page == 'reports') echo ' class="isactive"'; ?>><a href="admin_reports.php">Signalements</a></li>
 				</ul>
 			</div>
@@ -68,8 +62,16 @@
 <?php
 
+	// See if there are any plugins
+	$plugins = array();
+	$d = dir(PUN_ROOT.'plugins');
+	while (($entry = $d->read()) !== false)
+	{
+		$prefix = substr($entry, 0, strpos($entry, '_'));
+		$suffix = substr($entry, strlen($entry) - 4);
+
+		if ($suffix == '.php' && ((!$is_admin && $prefix == 'AMP') || ($is_admin && ($prefix == 'AP' || $prefix == 'AMP'))))
+			$plugins[] = array(substr(substr($entry, strpos($entry, '_') + 1), 0, -4), $entry);
 	}
-
-	// See if there are any plugins
-	$plugins = forum_list_plugins($is_admin);
+	$d->close();
 
 	// Did we find any plugins?
@@ -78,5 +80,5 @@
 
 ?>
-		<h2 class="block2"><span><?php echo $lang_admin_common['Plugins menu'] ?></span></h2>
+		<h2 class="block2"><span>Plugins</span></h2>
 		<div class="box">
 			<div class="inbox">
@@ -84,6 +86,6 @@
 <?php
 
-		foreach ($plugins as $plugin_name => $plugin)
-			echo "\t\t\t\t\t".'<li'.(($page == $plugin_name) ? ' class="isactive"' : '').'><a href="admin_loader.php?plugin='.$plugin_name.'">'.str_replace('_', ' ', $plugin).'</a></li>'."\n";
+		while (list(, $cur_plugin) = @each($plugins))
+			echo "\t\t\t\t\t".'<li'.(($page == $cur_plugin[1]) ? ' class="isactive"' : '').'><a href="admin_loader.php?plugin='.$cur_plugin[1].'">'.str_replace('_', ' ', $cur_plugin[0]).'</a></li>'."\n";
 
 ?>
@@ -116,5 +118,5 @@
 
 	// Fetch topics to prune
-	$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE forum_id='.$forum_id.$extra_sql, true) or error('Unable to fetch topics', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE forum_id='.$forum_id.$extra_sql, true) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
 
 	$topic_ids = '';
@@ -125,5 +127,5 @@
 	{
 		// Fetch posts to prune
-		$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id IN('.$topic_ids.')', true) or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id IN('.$topic_ids.')', true) or error('Impossible de retrouver les messages', __FILE__, __LINE__, $db->error());
 
 		$post_ids = '';
@@ -134,9 +136,9 @@
 		{
 			// Delete topics
-			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.$topic_ids.')') or error('Unable to prune topics', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.$topic_ids.')') or error('Impossible d\'Ã©laguer les discussions', __FILE__, __LINE__, $db->error());
 			// Delete subscriptions
-			$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE topic_id IN('.$topic_ids.')') or error('Unable to prune subscriptions', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'subscriptions WHERE topic_id IN('.$topic_ids.')') or error('Impossible d\'Ã©laguer les abonnements', __FILE__, __LINE__, $db->error());
 			// Delete posts
-			$db->query('DELETE FROM '.$db->prefix.'posts WHERE id IN('.$post_ids.')') or error('Unable to prune posts', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'posts WHERE id IN('.$post_ids.')') or error('Impossible d\'Ã©laguer les messages', __FILE__, __LINE__, $db->error());
 
 			// We removed a bunch of posts, so now we have to update the search index
Index: trunk/web/punbb/include/dblayer/common_db.php
===================================================================
--- trunk/web/punbb/include/dblayer/common_db.php	(revision 10)
+++ trunk/web/punbb/include/dblayer/common_db.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure no one attempts to run this script "directly"
@@ -12,33 +29,38 @@
 
 
+//
+// Return current timestamp (with microseconds) as a float (used in dblayer)
+//
+if (defined('PUN_SHOW_QUERIES'))
+{
+	function get_microtime()
+	{
+		list($usec, $sec) = explode(' ', microtime());
+		return ((float)$usec + (float)$sec);
+	}
+}
+
+
 // Load the appropriate DB layer class
 switch ($db_type)
 {
 	case 'mysql':
-		require_once PUN_ROOT.'include/dblayer/mysql.php';
-		break;
-
-	case 'mysql_innodb':
-		require_once PUN_ROOT.'include/dblayer/mysql_innodb.php';
+		require PUN_ROOT.'include/dblayer/mysql.php';
 		break;
 
 	case 'mysqli':
-		require_once PUN_ROOT.'include/dblayer/mysqli.php';
-		break;
-
-	case 'mysqli_innodb':
-		require_once PUN_ROOT.'include/dblayer/mysqli_innodb.php';
+		require PUN_ROOT.'include/dblayer/mysqli.php';
 		break;
 
 	case 'pgsql':
-		require_once PUN_ROOT.'include/dblayer/pgsql.php';
+		require PUN_ROOT.'include/dblayer/pgsql.php';
 		break;
 
 	case 'sqlite':
-		require_once PUN_ROOT.'include/dblayer/sqlite.php';
+		require PUN_ROOT.'include/dblayer/sqlite.php';
 		break;
 
 	default:
-		error('\''.$db_type.'\' is not a valid database type. Please check settings in config.php.', __FILE__, __LINE__);
+		error('\''.$db_type.'\' n\'est pas un type de base de donnÃ©es valable. Veuillez vÃ©rifier vos paramÃštres de configuration dans config.php', __FILE__, __LINE__);
 		break;
 }
Index: trunk/web/punbb/include/dblayer/index.html
===================================================================
--- trunk/web/punbb/include/dblayer/index.html	(revision 10)
+++ trunk/web/punbb/include/dblayer/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/include/dblayer/mysql.php
===================================================================
--- trunk/web/punbb/include/dblayer/mysql.php	(revision 10)
+++ trunk/web/punbb/include/dblayer/mysql.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure we have built in support for MySQL
@@ -21,11 +38,4 @@
 	var $num_queries = 0;
 
-	var $error_no = false;
-	var $error_msg = 'Unknown';
-
-	var $datatype_transformations = array(
-		'%^SERIAL$%'	=>	'INT(10) UNSIGNED AUTO_INCREMENT'
-	);
-
 
 	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
@@ -40,15 +50,13 @@
 		if ($this->link_id)
 		{
-			if (!@mysql_select_db($db_name, $this->link_id))
+			if (@mysql_select_db($db_name, $this->link_id))
+			{ mysql_query("SET NAMES utf8");
+				return $this->link_id;
+		   }
+			else
 				error('Unable to select database. MySQL reported: '.mysql_error(), __FILE__, __LINE__);
 		}
 		else
 			error('Unable to connect to MySQL server. MySQL reported: '.mysql_error(), __FILE__, __LINE__);
-
-		// Setup the client-server character set (UTF-8)
-		if (!defined('FORUM_NO_SET_NAMES'))
-			$this->set_names('utf8');
-
-		return $this->link_id;
 	}
 
@@ -90,7 +98,4 @@
 				$this->saved_queries[] = array($sql, 0);
 
-			$this->error_no = @mysql_errno($this->link_id);
-			$this->error_msg = @mysql_error($this->link_id);
-
 			return false;
 		}
@@ -98,7 +103,7 @@
 
 
-	function result($query_id = 0, $row = 0, $col = 0)
+	function result($query_id = 0, $row = 0)
 	{
-		return ($query_id) ? @mysql_result($query_id, $row, $col) : false;
+		return ($query_id) ? @mysql_result($query_id, $row) : false;
 	}
 
@@ -154,7 +159,5 @@
 	function escape($str)
 	{
-		if (is_array($str))
-			return '';
-		else if (function_exists('mysql_real_escape_string'))
+		if (function_exists('mysql_real_escape_string'))
 			return mysql_real_escape_string($str, $this->link_id);
 		else
@@ -166,6 +169,6 @@
 	{
 		$result['error_sql'] = @current(@end($this->saved_queries));
-		$result['error_no'] = $this->error_no;
-		$result['error_msg'] = $this->error_msg;
+		$result['error_no'] = @mysql_errno($this->link_id);
+		$result['error_msg'] = @mysql_error($this->link_id);
 
 		return $result;
@@ -185,188 +188,3 @@
 			return false;
 	}
-
-	function get_names()
-	{
-		$result = $this->query('SHOW VARIABLES LIKE \'character_set_connection\'');
-		return $this->result($result, 0, 1);
-	}
-
-
-	function set_names($names)
-	{
-		return $this->query('SET NAMES \''.$this->escape($names).'\'');
-	}
-
-
-	function get_version()
-	{
-		$result = $this->query('SELECT VERSION()');
-
-		return array(
-			'name'		=> 'MySQL Standard',
-			'version'	=> preg_replace('%^([^-]+).*$%', '\\1', $this->result($result))
-		);
-	}
-
-
-	function table_exists($table_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW TABLES LIKE \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function field_exists($table_name, $field_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW COLUMNS FROM '.($no_prefix ? '' : $this->prefix).$table_name.' LIKE \''.$this->escape($field_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function index_exists($table_name, $index_name, $no_prefix = false)
-	{
-		$exists = false;
-
-		$result = $this->query('SHOW INDEX FROM '.($no_prefix ? '' : $this->prefix).$table_name);
-		while ($cur_index = $this->fetch_assoc($result))
-		{
-			if (strtolower($cur_index['Key_name']) == strtolower(($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name))
-			{
-				$exists = true;
-				break;
-			}
-		}
-
-		return $exists;
-	}
-
-
-	function create_table($table_name, $schema, $no_prefix = false)
-	{
-		if ($this->table_exists($table_name, $no_prefix))
-			return true;
-
-		$query = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name." (\n";
-
-		// Go through every schema element and add it to the query
-		foreach ($schema['FIELDS'] as $field_name => $field_data)
-		{
-			$field_data['datatype'] = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_data['datatype']);
-
-			$query .= $field_name.' '.$field_data['datatype'];
-
-			if (isset($field_data['collation']))
-				$query .= 'CHARACTER SET utf8 COLLATE utf8_'.$field_data['collation'];
-
-			if (!$field_data['allow_null'])
-				$query .= ' NOT NULL';
-
-			if (isset($field_data['default']))
-				$query .= ' DEFAULT '.$field_data['default'];
-
-			$query .= ",\n";
-		}
-
-		// If we have a primary key, add it
-		if (isset($schema['PRIMARY KEY']))
-			$query .= 'PRIMARY KEY ('.implode(',', $schema['PRIMARY KEY']).'),'."\n";
-
-		// Add unique keys
-		if (isset($schema['UNIQUE KEYS']))
-		{
-			foreach ($schema['UNIQUE KEYS'] as $key_name => $key_fields)
-				$query .= 'UNIQUE KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$key_name.'('.implode(',', $key_fields).'),'."\n";
-		}
-
-		// Add indexes
-		if (isset($schema['INDEXES']))
-		{
-			foreach ($schema['INDEXES'] as $index_name => $index_fields)
-				$query .= 'KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.'('.implode(',', $index_fields).'),'."\n";
-		}
-
-		// We remove the last two characters (a newline and a comma) and add on the ending
-		$query = substr($query, 0, strlen($query) - 2)."\n".') ENGINE = '.(isset($schema['ENGINE']) ? $schema['ENGINE'] : 'MyISAM').' CHARACTER SET utf8';
-
-		return $this->query($query) ? true : false;
-	}
-
-
-	function drop_table($table_name, $no_prefix = false)
-	{
-		if (!$this->table_exists($table_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-
-
-	function rename_table($old_table, $new_table, $no_prefix = false)
-	{
-		// If there new table exists and the old one doesn't, then we're happy
-		if ($this->table_exists($new_table, $no_prefix) && !$this->table_exists($old_table, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$old_table.' RENAME TO '.($no_prefix ? '' : $this->prefix).$new_table) ? true : false;
-	}
-
-
-	function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if ($this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function alter_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' MODIFY '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function drop_field($table_name, $field_name, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP '.$field_name) ? true : false;
-	}
-
-
-	function add_index($table_name, $index_name, $index_fields, $unique = false, $no_prefix = false)
-	{
-		if ($this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.($unique ? 'UNIQUE ' : '').'INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.' ('.implode(',', $index_fields).')') ? true : false;
-	}
-
-
-	function drop_index($table_name, $index_name, $no_prefix = false)
-	{
-		if (!$this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name) ? true : false;
-	}
-
-	function truncate_table($table_name, $no_prefix = false)
-	{
-		return $this->query('TRUNCATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
 }
Index: trunk/web/punbb/include/dblayer/mysql_innodb.php
===================================================================
--- trunk/web/punbb/include/dblayer/mysql_innodb.php	(revision 10)
+++ 	(revision )
@@ -1,386 +1,0 @@
-<?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-// Make sure we have built in support for MySQL
-if (!function_exists('mysql_connect'))
-	exit('This PHP environment doesn\'t have MySQL support built in. MySQL support is required if you want to use a MySQL database to run this forum. Consult the PHP documentation for further assistance.');
-
-
-class DBLayer
-{
-	var $prefix;
-	var $link_id;
-	var $query_result;
-	var $in_transaction = 0;
-
-	var $saved_queries = array();
-	var $num_queries = 0;
-
-	var $error_no = false;
-	var $error_msg = 'Unknown';
-
-	var $datatype_transformations = array(
-		'%^SERIAL$%'	=>	'INT(10) UNSIGNED AUTO_INCREMENT'
-	);
-
-
-	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
-	{
-		$this->prefix = $db_prefix;
-
-		if ($p_connect)
-			$this->link_id = @mysql_pconnect($db_host, $db_username, $db_password);
-		else
-			$this->link_id = @mysql_connect($db_host, $db_username, $db_password);
-
-		if ($this->link_id)
-		{
-			if (!@mysql_select_db($db_name, $this->link_id))
-				error('Unable to select database. MySQL reported: '.mysql_error(), __FILE__, __LINE__);
-		}
-		else
-			error('Unable to connect to MySQL server. MySQL reported: '.mysql_error(), __FILE__, __LINE__);
-
-		// Setup the client-server character set (UTF-8)
-		if (!defined('FORUM_NO_SET_NAMES'))
-			$this->set_names('utf8');
-
-		return $this->link_id;
-	}
-
-
-	function start_transaction()
-	{
-		++$this->in_transaction;
-
-		mysql_query('START TRANSACTION', $this->link_id);
-		return;
-	}
-
-
-	function end_transaction()
-	{
-		--$this->in_transaction;
-
-		mysql_query('COMMIT', $this->link_id);
-		return;
-	}
-
-
-	function query($sql, $unbuffered = false)
-	{
-		if (defined('PUN_SHOW_QUERIES'))
-			$q_start = get_microtime();
-
-		if ($unbuffered)
-			$this->query_result = @mysql_unbuffered_query($sql, $this->link_id);
-		else
-			$this->query_result = @mysql_query($sql, $this->link_id);
-
-		if ($this->query_result)
-		{
-			if (defined('PUN_SHOW_QUERIES'))
-				$this->saved_queries[] = array($sql, sprintf('%.5f', get_microtime() - $q_start));
-
-			++$this->num_queries;
-
-			return $this->query_result;
-		}
-		else
-		{
-			if (defined('PUN_SHOW_QUERIES'))
-				$this->saved_queries[] = array($sql, 0);
-
-			$this->error_no = @mysql_errno($this->link_id);
-			$this->error_msg = @mysql_error($this->link_id);
-
-			// Rollback transaction
-			if ($this->in_transaction)
-				mysql_query('ROLLBACK', $this->link_id);
-
-			--$this->in_transaction;
-
-			return false;
-		}
-	}
-
-
-	function result($query_id = 0, $row = 0, $col = 0)
-	{
-		return ($query_id) ? @mysql_result($query_id, $row, $col) : false;
-	}
-
-
-	function fetch_assoc($query_id = 0)
-	{
-		return ($query_id) ? @mysql_fetch_assoc($query_id) : false;
-	}
-
-
-	function fetch_row($query_id = 0)
-	{
-		return ($query_id) ? @mysql_fetch_row($query_id) : false;
-	}
-
-
-	function num_rows($query_id = 0)
-	{
-		return ($query_id) ? @mysql_num_rows($query_id) : false;
-	}
-
-
-	function affected_rows()
-	{
-		return ($this->link_id) ? @mysql_affected_rows($this->link_id) : false;
-	}
-
-
-	function insert_id()
-	{
-		return ($this->link_id) ? @mysql_insert_id($this->link_id) : false;
-	}
-
-
-	function get_num_queries()
-	{
-		return $this->num_queries;
-	}
-
-
-	function get_saved_queries()
-	{
-		return $this->saved_queries;
-	}
-
-
-	function free_result($query_id = false)
-	{
-		return ($query_id) ? @mysql_free_result($query_id) : false;
-	}
-
-
-	function escape($str)
-	{
-		if (is_array($str))
-			return '';
-		else if (function_exists('mysql_real_escape_string'))
-			return mysql_real_escape_string($str, $this->link_id);
-		else
-			return mysql_escape_string($str);
-	}
-
-
-	function error()
-	{
-		$result['error_sql'] = @current(@end($this->saved_queries));
-		$result['error_no'] = $this->error_no;
-		$result['error_msg'] = $this->error_msg;
-
-		return $result;
-	}
-
-
-	function close()
-	{
-		if ($this->link_id)
-		{
-			if ($this->query_result)
-				@mysql_free_result($this->query_result);
-
-			return @mysql_close($this->link_id);
-		}
-		else
-			return false;
-	}
-
-
-	function get_names()
-	{
-		$result = $this->query('SHOW VARIABLES LIKE \'character_set_connection\'');
-		return $this->result($result, 0, 1);
-	}
-
-
-	function set_names($names)
-	{
-		return $this->query('SET NAMES \''.$this->escape($names).'\'');
-	}
-
-
-	function get_version()
-	{
-		$result = $this->query('SELECT VERSION()');
-
-		return array(
-			'name'		=> 'MySQL Standard (InnoDB)',
-			'version'	=> preg_replace('%^([^-]+).*$%', '\\1', $this->result($result))
-		);
-	}
-
-
-	function table_exists($table_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW TABLES LIKE \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function field_exists($table_name, $field_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW COLUMNS FROM '.($no_prefix ? '' : $this->prefix).$table_name.' LIKE \''.$this->escape($field_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function index_exists($table_name, $index_name, $no_prefix = false)
-	{
-		$exists = false;
-
-		$result = $this->query('SHOW INDEX FROM '.($no_prefix ? '' : $this->prefix).$table_name);
-		while ($cur_index = $this->fetch_assoc($result))
-		{
-			if (strtolower($cur_index['Key_name']) == strtolower(($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name))
-			{
-				$exists = true;
-				break;
-			}
-		}
-
-		return $exists;
-	}
-
-
-	function create_table($table_name, $schema, $no_prefix = false)
-	{
-		if ($this->table_exists($table_name, $no_prefix))
-			return true;
-
-		$query = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name." (\n";
-
-		// Go through every schema element and add it to the query
-		foreach ($schema['FIELDS'] as $field_name => $field_data)
-		{
-			$field_data['datatype'] = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_data['datatype']);
-
-			$query .= $field_name.' '.$field_data['datatype'];
-
-			if (isset($field_data['collation']))
-				$query .= 'CHARACTER SET utf8 COLLATE utf8_'.$field_data['collation'];
-
-			if (!$field_data['allow_null'])
-				$query .= ' NOT NULL';
-
-			if (isset($field_data['default']))
-				$query .= ' DEFAULT '.$field_data['default'];
-
-			$query .= ",\n";
-		}
-
-		// If we have a primary key, add it
-		if (isset($schema['PRIMARY KEY']))
-			$query .= 'PRIMARY KEY ('.implode(',', $schema['PRIMARY KEY']).'),'."\n";
-
-		// Add unique keys
-		if (isset($schema['UNIQUE KEYS']))
-		{
-			foreach ($schema['UNIQUE KEYS'] as $key_name => $key_fields)
-				$query .= 'UNIQUE KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$key_name.'('.implode(',', $key_fields).'),'."\n";
-		}
-
-		// Add indexes
-		if (isset($schema['INDEXES']))
-		{
-			foreach ($schema['INDEXES'] as $index_name => $index_fields)
-				$query .= 'KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.'('.implode(',', $index_fields).'),'."\n";
-		}
-
-		// We remove the last two characters (a newline and a comma) and add on the ending
-		$query = substr($query, 0, strlen($query) - 2)."\n".') ENGINE = '.(isset($schema['ENGINE']) ? $schema['ENGINE'] : 'InnoDB').' CHARACTER SET utf8';
-
-		return $this->query($query) ? true : false;
-	}
-
-
-	function drop_table($table_name, $no_prefix = false)
-	{
-		if (!$this->table_exists($table_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-
-
-	function rename_table($old_table, $new_table, $no_prefix = false)
-	{
-		// If there new table exists and the old one doesn't, then we're happy
-		if ($this->table_exists($new_table, $no_prefix) && !$this->table_exists($old_table, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$old_table.' RENAME TO '.($no_prefix ? '' : $this->prefix).$new_table) ? true : false;
-	}
-
-
-	function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if ($this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function alter_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' MODIFY '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function drop_field($table_name, $field_name, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP '.$field_name) ? true : false;
-	}
-
-
-	function add_index($table_name, $index_name, $index_fields, $unique = false, $no_prefix = false)
-	{
-		if ($this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.($unique ? 'UNIQUE ' : '').'INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.' ('.implode(',', $index_fields).')') ? true : false;
-	}
-
-
-	function drop_index($table_name, $index_name, $no_prefix = false)
-	{
-		if (!$this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name) ? true : false;
-	}
-
-	function truncate_table($table_name, $no_prefix = false)
-	{
-		return $this->query('TRUNCATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-}
Index: trunk/web/punbb/include/dblayer/mysqli.php
===================================================================
--- trunk/web/punbb/include/dblayer/mysqli.php	(revision 10)
+++ trunk/web/punbb/include/dblayer/mysqli.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure we have built in support for MySQL
@@ -21,13 +38,6 @@
 	var $num_queries = 0;
 
-	var $error_no = false;
-	var $error_msg = 'Unknown';
 
-	var $datatype_transformations = array(
-		'%^SERIAL$%'	=>	'INT(10) UNSIGNED AUTO_INCREMENT'
-	);
-
-
-	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
+	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $foo)
 	{
 		$this->prefix = $db_prefix;
@@ -37,20 +47,11 @@
 			list($db_host, $db_port) = explode(':', $db_host);
 
-		// Persistent connection in MySQLi are only available in PHP 5.3 and later releases
-		$p_connect = $p_connect && version_compare(PHP_VERSION, '5.3.0', '>=') ? 'p:' : '';
-
 		if (isset($db_port))
-			$this->link_id = @mysqli_connect($p_connect.$db_host, $db_username, $db_password, $db_name, $db_port);
+			$this->link_id = @mysqli_connect($db_host, $db_username, $db_password, $db_name, $db_port);
 		else
-			$this->link_id = @mysqli_connect($p_connect.$db_host, $db_username, $db_password, $db_name);
+			$this->link_id = @mysqli_connect($db_host, $db_username, $db_password, $db_name);
 
 		if (!$this->link_id)
 			error('Unable to connect to MySQL and select database. MySQL reported: '.mysqli_connect_error(), __FILE__, __LINE__);
-
-		// Setup the client-server character set (UTF-8)
-		if (!defined('FORUM_NO_SET_NAMES'))
-			$this->set_names('utf8');
-
-		return $this->link_id;
 	}
 
@@ -89,7 +90,4 @@
 				$this->saved_queries[] = array($sql, 0);
 
-			$this->error_no = @mysqli_errno($this->link_id);
-			$this->error_msg = @mysqli_error($this->link_id);
-
 			return false;
 		}
@@ -97,16 +95,13 @@
 
 
-	function result($query_id = 0, $row = 0, $col = 0)
+	function result($query_id = 0, $row = 0)
 	{
 		if ($query_id)
 		{
-			if ($row !== 0 && @mysqli_data_seek($query_id, $row) === false)
-				return false;
+			if ($row)
+				@mysqli_data_seek($query_id, $row);
 
 			$cur_row = @mysqli_fetch_row($query_id);
-			if ($cur_row === false)
-				return false;
-
-			return $cur_row[$col];
+			return $cur_row[0];
 		}
 		else
@@ -165,5 +160,5 @@
 	function escape($str)
 	{
-		return is_array($str) ? '' : mysqli_real_escape_string($this->link_id, $str);
+		return mysqli_real_escape_string($this->link_id, $str);
 	}
 
@@ -172,6 +167,6 @@
 	{
 		$result['error_sql'] = @current(@end($this->saved_queries));
-		$result['error_no'] = $this->error_no;
-		$result['error_msg'] = $this->error_msg;
+		$result['error_no'] = @mysqli_errno($this->link_id);
+		$result['error_msg'] = @mysqli_error($this->link_id);
 
 		return $result;
@@ -191,189 +186,3 @@
 			return false;
 	}
-
-
-	function get_names()
-	{
-		$result = $this->query('SHOW VARIABLES LIKE \'character_set_connection\'');
-		return $this->result($result, 0, 1);
-	}
-
-
-	function set_names($names)
-	{
-		return $this->query('SET NAMES \''.$this->escape($names).'\'');
-	}
-
-
-	function get_version()
-	{
-		$result = $this->query('SELECT VERSION()');
-
-		return array(
-			'name'		=> 'MySQL Improved',
-			'version'	=> preg_replace('%^([^-]+).*$%', '\\1', $this->result($result))
-		);
-	}
-
-
-	function table_exists($table_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW TABLES LIKE \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function field_exists($table_name, $field_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW COLUMNS FROM '.($no_prefix ? '' : $this->prefix).$table_name.' LIKE \''.$this->escape($field_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function index_exists($table_name, $index_name, $no_prefix = false)
-	{
-		$exists = false;
-
-		$result = $this->query('SHOW INDEX FROM '.($no_prefix ? '' : $this->prefix).$table_name);
-		while ($cur_index = $this->fetch_assoc($result))
-		{
-			if (strtolower($cur_index['Key_name']) == strtolower(($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name))
-			{
-				$exists = true;
-				break;
-			}
-		}
-
-		return $exists;
-	}
-
-
-	function create_table($table_name, $schema, $no_prefix = false)
-	{
-		if ($this->table_exists($table_name, $no_prefix))
-			return true;
-
-		$query = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name." (\n";
-
-		// Go through every schema element and add it to the query
-		foreach ($schema['FIELDS'] as $field_name => $field_data)
-		{
-			$field_data['datatype'] = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_data['datatype']);
-
-			$query .= $field_name.' '.$field_data['datatype'];
-
-			if (isset($field_data['collation']))
-				$query .= 'CHARACTER SET utf8 COLLATE utf8_'.$field_data['collation'];
-
-			if (!$field_data['allow_null'])
-				$query .= ' NOT NULL';
-
-			if (isset($field_data['default']))
-				$query .= ' DEFAULT '.$field_data['default'];
-
-			$query .= ",\n";
-		}
-
-		// If we have a primary key, add it
-		if (isset($schema['PRIMARY KEY']))
-			$query .= 'PRIMARY KEY ('.implode(',', $schema['PRIMARY KEY']).'),'."\n";
-
-		// Add unique keys
-		if (isset($schema['UNIQUE KEYS']))
-		{
-			foreach ($schema['UNIQUE KEYS'] as $key_name => $key_fields)
-				$query .= 'UNIQUE KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$key_name.'('.implode(',', $key_fields).'),'."\n";
-		}
-
-		// Add indexes
-		if (isset($schema['INDEXES']))
-		{
-			foreach ($schema['INDEXES'] as $index_name => $index_fields)
-				$query .= 'KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.'('.implode(',', $index_fields).'),'."\n";
-		}
-
-		// We remove the last two characters (a newline and a comma) and add on the ending
-		$query = substr($query, 0, strlen($query) - 2)."\n".') ENGINE = '.(isset($schema['ENGINE']) ? $schema['ENGINE'] : 'MyISAM').' CHARACTER SET utf8';
-
-		return $this->query($query) ? true : false;
-	}
-
-
-	function drop_table($table_name, $no_prefix = false)
-	{
-		if (!$this->table_exists($table_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-
-
-	function rename_table($old_table, $new_table, $no_prefix = false)
-	{
-		// If there new table exists and the old one doesn't, then we're happy
-		if ($this->table_exists($new_table, $no_prefix) && !$this->table_exists($old_table, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$old_table.' RENAME TO '.($no_prefix ? '' : $this->prefix).$new_table) ? true : false;
-	}
-
-
-	function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if ($this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function alter_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' MODIFY '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function drop_field($table_name, $field_name, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP '.$field_name) ? true : false;
-	}
-
-
-	function add_index($table_name, $index_name, $index_fields, $unique = false, $no_prefix = false)
-	{
-		if ($this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.($unique ? 'UNIQUE ' : '').'INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.' ('.implode(',', $index_fields).')') ? true : false;
-	}
-
-
-	function drop_index($table_name, $index_name, $no_prefix = false)
-	{
-		if (!$this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name) ? true : false;
-	}
-
-	function truncate_table($table_name, $no_prefix = false)
-	{
-		return $this->query('TRUNCATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
 }
Index: trunk/web/punbb/include/dblayer/mysqli_innodb.php
===================================================================
--- trunk/web/punbb/include/dblayer/mysqli_innodb.php	(revision 10)
+++ 	(revision )
@@ -1,392 +1,0 @@
-<?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-// Make sure we have built in support for MySQL
-if (!function_exists('mysqli_connect'))
-	exit('This PHP environment doesn\'t have Improved MySQL (mysqli) support built in. Improved MySQL support is required if you want to use a MySQL 4.1 (or later) database to run this forum. Consult the PHP documentation for further assistance.');
-
-
-class DBLayer
-{
-	var $prefix;
-	var $link_id;
-	var $query_result;
-
-	var $saved_queries = array();
-	var $num_queries = 0;
-	var $in_transaction = 0;
-
-	var $error_no = false;
-	var $error_msg = 'Unknown';
-
-	var $datatype_transformations = array(
-		'%^SERIAL$%'	=>	'INT(10) UNSIGNED AUTO_INCREMENT'
-	);
-
-
-	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
-	{
-		$this->prefix = $db_prefix;
-
-		// Was a custom port supplied with $db_host?
-		if (strpos($db_host, ':') !== false)
-			list($db_host, $db_port) = explode(':', $db_host);
-
-		// Persistent connection in MySQLi are only available in PHP 5.3 and later releases
-		$p_connect = $p_connect && version_compare(PHP_VERSION, '5.3.0', '>=') ? 'p:' : '';
-
-		if (isset($db_port))
-			$this->link_id = @mysqli_connect($p_connect.$db_host, $db_username, $db_password, $db_name, $db_port);
-		else
-			$this->link_id = @mysqli_connect($p_connect.$db_host, $db_username, $db_password, $db_name);
-
-		if (!$this->link_id)
-			error('Unable to connect to MySQL and select database. MySQL reported: '.mysqli_connect_error(), __FILE__, __LINE__);
-
-		// Setup the client-server character set (UTF-8)
-		if (!defined('FORUM_NO_SET_NAMES'))
-			$this->set_names('utf8');
-
-		return $this->link_id;
-	}
-
-
-	function start_transaction()
-	{
-		++$this->in_transaction;
-
-		mysqli_query($this->link_id, 'START TRANSACTION');
-		return;
-	}
-
-
-	function end_transaction()
-	{
-		--$this->in_transaction;
-
-		mysqli_query($this->link_id, 'COMMIT');
-		return;
-	}
-
-
-	function query($sql, $unbuffered = false)
-	{
-		if (defined('PUN_SHOW_QUERIES'))
-			$q_start = get_microtime();
-
-		$this->query_result = @mysqli_query($this->link_id, $sql);
-
-		if ($this->query_result)
-		{
-			if (defined('PUN_SHOW_QUERIES'))
-				$this->saved_queries[] = array($sql, sprintf('%.5f', get_microtime() - $q_start));
-
-			++$this->num_queries;
-
-			return $this->query_result;
-		}
-		else
-		{
-			if (defined('PUN_SHOW_QUERIES'))
-				$this->saved_queries[] = array($sql, 0);
-
-			$this->error_no = @mysqli_errno($this->link_id);
-			$this->error_msg = @mysqli_error($this->link_id);
-
-			// Rollback transaction
-			if ($this->in_transaction)
-				mysqli_query($this->link_id, 'ROLLBACK');
-
-			--$this->in_transaction;
-
-			return false;
-		}
-	}
-
-
-	function result($query_id = 0, $row = 0, $col = 0)
-	{
-		if ($query_id)
-		{
-			if ($row !== 0 && @mysqli_data_seek($query_id, $row) === false)
-				return false;
-
-			$cur_row = @mysqli_fetch_row($query_id);
-			if ($cur_row === false)
-				return false;
-
-			return $cur_row[$col];
-		}
-		else
-			return false;
-	}
-
-
-	function fetch_assoc($query_id = 0)
-	{
-		return ($query_id) ? @mysqli_fetch_assoc($query_id) : false;
-	}
-
-
-	function fetch_row($query_id = 0)
-	{
-		return ($query_id) ? @mysqli_fetch_row($query_id) : false;
-	}
-
-
-	function num_rows($query_id = 0)
-	{
-		return ($query_id) ? @mysqli_num_rows($query_id) : false;
-	}
-
-
-	function affected_rows()
-	{
-		return ($this->link_id) ? @mysqli_affected_rows($this->link_id) : false;
-	}
-
-
-	function insert_id()
-	{
-		return ($this->link_id) ? @mysqli_insert_id($this->link_id) : false;
-	}
-
-
-	function get_num_queries()
-	{
-		return $this->num_queries;
-	}
-
-
-	function get_saved_queries()
-	{
-		return $this->saved_queries;
-	}
-
-
-	function free_result($query_id = false)
-	{
-		return ($query_id) ? @mysqli_free_result($query_id) : false;
-	}
-
-
-	function escape($str)
-	{
-		return is_array($str) ? '' : mysqli_real_escape_string($this->link_id, $str);
-	}
-
-
-	function error()
-	{
-		$result['error_sql'] = @current(@end($this->saved_queries));
-		$result['error_no'] = $this->error_no;
-		$result['error_msg'] = $this->error_msg;
-
-		return $result;
-	}
-
-
-	function close()
-	{
-		if ($this->link_id)
-		{
-			if ($this->query_result)
-				@mysqli_free_result($this->query_result);
-
-			return @mysqli_close($this->link_id);
-		}
-		else
-			return false;
-	}
-
-
-	function get_names()
-	{
-		$result = $this->query('SHOW VARIABLES LIKE \'character_set_connection\'');
-		return $this->result($result, 0, 1);
-	}
-
-
-	function set_names($names)
-	{
-		return $this->query('SET NAMES \''.$this->escape($names).'\'');
-	}
-
-
-	function get_version()
-	{
-		$result = $this->query('SELECT VERSION()');
-
-		return array(
-			'name'		=> 'MySQL Improved (InnoDB)',
-			'version'	=> preg_replace('%^([^-]+).*$%', '\\1', $this->result($result))
-		);
-	}
-
-
-	function table_exists($table_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW TABLES LIKE \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function field_exists($table_name, $field_name, $no_prefix = false)
-	{
-		$result = $this->query('SHOW COLUMNS FROM '.($no_prefix ? '' : $this->prefix).$table_name.' LIKE \''.$this->escape($field_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function index_exists($table_name, $index_name, $no_prefix = false)
-	{
-		$exists = false;
-
-		$result = $this->query('SHOW INDEX FROM '.($no_prefix ? '' : $this->prefix).$table_name);
-		while ($cur_index = $this->fetch_assoc($result))
-		{
-			if (strtolower($cur_index['Key_name']) == strtolower(($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name))
-			{
-				$exists = true;
-				break;
-			}
-		}
-
-		return $exists;
-	}
-
-
-	function create_table($table_name, $schema, $no_prefix = false)
-	{
-		if ($this->table_exists($table_name, $no_prefix))
-			return true;
-
-		$query = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name." (\n";
-
-		// Go through every schema element and add it to the query
-		foreach ($schema['FIELDS'] as $field_name => $field_data)
-		{
-			$field_data['datatype'] = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_data['datatype']);
-
-			$query .= $field_name.' '.$field_data['datatype'];
-
-			if (isset($field_data['collation']))
-				$query .= 'CHARACTER SET utf8 COLLATE utf8_'.$field_data['collation'];
-
-			if (!$field_data['allow_null'])
-				$query .= ' NOT NULL';
-
-			if (isset($field_data['default']))
-				$query .= ' DEFAULT '.$field_data['default'];
-
-			$query .= ",\n";
-		}
-
-		// If we have a primary key, add it
-		if (isset($schema['PRIMARY KEY']))
-			$query .= 'PRIMARY KEY ('.implode(',', $schema['PRIMARY KEY']).'),'."\n";
-
-		// Add unique keys
-		if (isset($schema['UNIQUE KEYS']))
-		{
-			foreach ($schema['UNIQUE KEYS'] as $key_name => $key_fields)
-				$query .= 'UNIQUE KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$key_name.'('.implode(',', $key_fields).'),'."\n";
-		}
-
-		// Add indexes
-		if (isset($schema['INDEXES']))
-		{
-			foreach ($schema['INDEXES'] as $index_name => $index_fields)
-				$query .= 'KEY '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.'('.implode(',', $index_fields).'),'."\n";
-		}
-
-		// We remove the last two characters (a newline and a comma) and add on the ending
-		$query = substr($query, 0, strlen($query) - 2)."\n".') ENGINE = '.(isset($schema['ENGINE']) ? $schema['ENGINE'] : 'InnoDB').' CHARACTER SET utf8';
-
-		return $this->query($query) ? true : false;
-	}
-
-
-	function drop_table($table_name, $no_prefix = false)
-	{
-		if (!$this->table_exists($table_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-
-
-	function rename_table($old_table, $new_table, $no_prefix = false)
-	{
-		// If there new table exists and the old one doesn't, then we're happy
-		if ($this->table_exists($new_table, $no_prefix) && !$this->table_exists($old_table, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$old_table.' RENAME TO '.($no_prefix ? '' : $this->prefix).$new_table) ? true : false;
-	}
-
-
-	function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if ($this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function alter_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
-			$default_value = '\''.$this->escape($default_value).'\'';
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' MODIFY '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) ? true : false;
-	}
-
-
-	function drop_field($table_name, $field_name, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP '.$field_name) ? true : false;
-	}
-
-
-	function add_index($table_name, $index_name, $index_fields, $unique = false, $no_prefix = false)
-	{
-		if ($this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.($unique ? 'UNIQUE ' : '').'INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.' ('.implode(',', $index_fields).')') ? true : false;
-	}
-
-
-	function drop_index($table_name, $index_name, $no_prefix = false)
-	{
-		if (!$this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name) ? true : false;
-	}
-
-	function truncate_table($table_name, $no_prefix = false)
-	{
-		return $this->query('TRUNCATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-}
Index: trunk/web/punbb/include/dblayer/pgsql.php
===================================================================
--- trunk/web/punbb/include/dblayer/pgsql.php	(revision 10)
+++ trunk/web/punbb/include/dblayer/pgsql.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure we have built in support for PostgreSQL
@@ -26,13 +43,4 @@
 	var $error_msg = 'Unknown';
 
-	var $datatype_transformations = array(
-		'%^(TINY|SMALL)INT( )?(\\([0-9]+\\))?( )?(UNSIGNED)?$%i'			=>	'SMALLINT',
-		'%^(MEDIUM)?INT( )?(\\([0-9]+\\))?( )?(UNSIGNED)?$%i'				=>	'INTEGER',
-		'%^BIGINT( )?(\\([0-9]+\\))?( )?(UNSIGNED)?$%i'						=>	'BIGINT',
-		'%^(TINY|MEDIUM|LONG)?TEXT$%i'										=>	'TEXT',
-		'%^DOUBLE( )?(\\([0-9,]+\\))?( )?(UNSIGNED)?$%i'					=>	'DOUBLE PRECISION',
-		'%^FLOAT( )?(\\([0-9]+\\))?( )?(UNSIGNED)?$%i'						=>	'REAL'
-	);
-
 
 	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
@@ -40,5 +48,5 @@
 		$this->prefix = $db_prefix;
 
-		if ($db_host)
+		if ($db_host != '')
 		{
 			if (strpos($db_host, ':') !== false)
@@ -48,5 +56,8 @@
 			}
 			else
-				$connect_str[] = 'host='.$db_host;
+			{
+				if ($db_host != 'localhost')
+					$connect_str[] = 'host='.$db_host;
+			}
 		}
 
@@ -54,8 +65,8 @@
 			$connect_str[] = 'dbname='.$db_name;
 
-		if ($db_username)
+		if ($db_username != '')
 			$connect_str[] = 'user='.$db_username;
 
-		if ($db_password)
+		if ($db_password != '')
 			$connect_str[] = 'password='.$db_password;
 
@@ -67,10 +78,6 @@
 		if (!$this->link_id)
 			error('Unable to connect to PostgreSQL server', __FILE__, __LINE__);
-
-		// Setup the client-server character set (UTF-8)
-		if (!defined('FORUM_NO_SET_NAMES'))
-			$this->set_names('utf8');
-
-		return $this->link_id;
+		else
+			return $this->link_id;
 	}
 
@@ -98,8 +105,8 @@
 
 
-	function query($sql, $unbuffered = false) // $unbuffered is ignored since there is no pgsql_unbuffered_query()
+	function query($sql, $unbuffered = false)	// $unbuffered is ignored since there is no pgsql_unbuffered_query()
 	{
 		if (strrpos($sql, 'LIMIT') !== false)
-			$sql = preg_replace('%LIMIT ([0-9]+),([ 0-9]+)%', 'LIMIT \\2 OFFSET \\1', $sql);
+			$sql = preg_replace('#LIMIT ([0-9]+),([ 0-9]+)#', 'LIMIT \\2 OFFSET \\1', $sql);
 
 		if (defined('PUN_SHOW_QUERIES'))
@@ -125,5 +132,4 @@
 				$this->saved_queries[] = array($sql, 0);
 
-			$this->error_no = false;
 			$this->error_msg = @pg_result_error($this->query_result);
 
@@ -138,7 +144,7 @@
 
 
-	function result($query_id = 0, $row = 0, $col = 0)
-	{
-		return ($query_id) ? @pg_fetch_result($query_id, $row, $col) : false;
+	function result($query_id = 0, $row = 0)
+	{
+		return ($query_id) ? @pg_fetch_result($query_id, $row, 0) : false;
 	}
 
@@ -174,5 +180,5 @@
 		if ($query_id && $this->last_query_text[$query_id] != '')
 		{
-			if (preg_match('%^INSERT INTO ([a-z0-9\_\-]+)%is', $this->last_query_text[$query_id], $table_name))
+			if (preg_match('/^INSERT INTO ([a-z0-9\_\-]+)/is', $this->last_query_text[$query_id], $table_name))
 			{
 				// Hack (don't ask)
@@ -212,5 +218,5 @@
 	function escape($str)
 	{
-		return is_array($str) ? '' : pg_escape_string($str);
+		return pg_escape_string($str);
 	}
 
@@ -219,5 +225,15 @@
 	{
 		$result['error_sql'] = @current(@end($this->saved_queries));
-		$result['error_no'] = $this->error_no;
+		$result['error_no'] = false;
+/*
+		if (!empty($this->query_result))
+		{
+			$result['error_msg'] = trim(@pg_result_error($this->query_result));
+			if ($result['error_msg'] != '')
+				return $result;
+		}
+
+		$result['error_msg'] = (!empty($this->link_id)) ? trim(@pg_last_error($this->link_id)) : trim(@pg_last_error());
+*/
 		$result['error_msg'] = $this->error_msg;
 
@@ -246,191 +262,3 @@
 			return false;
 	}
-
-
-	function get_names()
-	{
-		$result = $this->query('SHOW client_encoding');
-		return strtolower($this->result($result)); // MySQL returns lowercase so lets be consistent
-	}
-
-
-	function set_names($names)
-	{
-		return $this->query('SET NAMES \''.$this->escape($names).'\'');
-	}
-
-
-	function get_version()
-	{
-		$result = $this->query('SELECT VERSION()');
-
-		return array(
-			'name'		=> 'PostgreSQL',
-			'version'	=> preg_replace('%^[^0-9]+([^\s,-]+).*$%', '\\1', $this->result($result))
-		);
-	}
-
-
-	function table_exists($table_name, $no_prefix = false)
-	{
-		$result = $this->query('SELECT 1 FROM pg_class WHERE relname = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function field_exists($table_name, $field_name, $no_prefix = false)
-	{
-		$result = $this->query('SELECT 1 FROM pg_class c INNER JOIN pg_attribute a ON a.attrelid = c.oid WHERE c.relname = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\' AND a.attname = \''.$this->escape($field_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function index_exists($table_name, $index_name, $no_prefix = false)
-	{
-		$result = $this->query('SELECT 1 FROM pg_index i INNER JOIN pg_class c1 ON c1.oid = i.indrelid INNER JOIN pg_class c2 ON c2.oid = i.indexrelid WHERE c1.relname = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\' AND c2.relname = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_'.$this->escape($index_name).'\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function create_table($table_name, $schema, $no_prefix = false)
-	{
-		if ($this->table_exists($table_name, $no_prefix))
-			return true;
-
-		$query = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name." (\n";
-
-		// Go through every schema element and add it to the query
-		foreach ($schema['FIELDS'] as $field_name => $field_data)
-		{
-			$field_data['datatype'] = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_data['datatype']);
-
-			$query .= $field_name.' '.$field_data['datatype'];
-
-			// The SERIAL datatype is a special case where we don't need to say not null
-			if (!$field_data['allow_null'] && $field_data['datatype'] != 'SERIAL')
-				$query .= ' NOT NULL';
-
-			if (isset($field_data['default']))
-				$query .= ' DEFAULT '.$field_data['default'];
-
-			$query .= ",\n";
-		}
-
-		// If we have a primary key, add it
-		if (isset($schema['PRIMARY KEY']))
-			$query .= 'PRIMARY KEY ('.implode(',', $schema['PRIMARY KEY']).'),'."\n";
-
-		// Add unique keys
-		if (isset($schema['UNIQUE KEYS']))
-		{
-			foreach ($schema['UNIQUE KEYS'] as $key_name => $key_fields)
-				$query .= 'UNIQUE ('.implode(',', $key_fields).'),'."\n";
-		}
-
-		// We remove the last two characters (a newline and a comma) and add on the ending
-		$query = substr($query, 0, strlen($query) - 2)."\n".')';
-
-		$result = $this->query($query) ? true : false;
-
-		// Add indexes
-		if (isset($schema['INDEXES']))
-		{
-			foreach ($schema['INDEXES'] as $index_name => $index_fields)
-				$result &= $this->add_index($table_name, $index_name, $index_fields, false, $no_prefix);
-		}
-
-		return $result;
-	}
-
-
-	function drop_table($table_name, $no_prefix = false)
-	{
-		if (!$this->table_exists($table_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-
-
-	function rename_table($old_table, $new_table, $no_prefix = false)
-	{
-		// If there new table exists and the old one doesn't, then we're happy
-		if ($this->table_exists($new_table, $no_prefix) && !$this->table_exists($old_table, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$old_table.' RENAME TO '.($no_prefix ? '' : $this->prefix).$new_table) ? true : false;
-	}
-
-
-	function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if ($this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		$result = $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD '.$field_name.' '.$field_type) ? true : false;
-
-		if ($default_value !== null)
-		{
-			if (!is_int($default_value) && !is_float($default_value))
-				$default_value = '\''.$this->escape($default_value).'\'';
-
-			$result &= $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ALTER '.$field_name.' SET DEFAULT '.$default_value) ? true : false;
-			$result &= $this->query('UPDATE '.($no_prefix ? '' : $this->prefix).$table_name.' SET '.$field_name.'='.$default_value) ? true : false;
-		}
-
-		if (!$allow_null)
-			$result &= $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ALTER '.$field_name.' SET NOT NULL') ? true : false;
-
-		return $result;
-	}
-
-
-	function alter_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-
-		$result = $this->add_field($table_name, 'tmp_'.$field_name, $field_type, $allow_null, $default_value, $after_field, $no_prefix);
-		$result &= $this->query('UPDATE '.($no_prefix ? '' : $this->prefix).$table_name.' SET tmp_'.$field_name.' = '.$field_name) ? true : false;
-		$result &= $this->drop_field($table_name, $field_name, $no_prefix);
-		$result &= $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' RENAME COLUMN tmp_'.$field_name.' TO '.$field_name) ? true : false;
-
-		return $result;
-	}
-
-
-	function drop_field($table_name, $field_name, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		return $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' DROP '.$field_name) ? true : false;
-	}
-
-
-	function add_index($table_name, $index_name, $index_fields, $unique = false, $no_prefix = false)
-	{
-		if ($this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('CREATE '.($unique ? 'UNIQUE ' : '').'INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.' ON '.($no_prefix ? '' : $this->prefix).$table_name.'('.implode(',', $index_fields).')') ? true : false;
-	}
-
-
-	function drop_index($table_name, $index_name, $no_prefix = false)
-	{
-		if (!$this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name) ? true : false;
-	}
-
-	function truncate_table($table_name, $no_prefix = false)
-	{
-		return $this->query('DELETE FROM '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
 }
Index: trunk/web/punbb/include/dblayer/sqlite.php
===================================================================
--- trunk/web/punbb/include/dblayer/sqlite.php	(revision 10)
+++ trunk/web/punbb/include/dblayer/sqlite.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure we have built in support for SQLite
@@ -25,10 +42,4 @@
 	var $error_msg = 'Unknown';
 
-	var $datatype_transformations = array(
-		'%^SERIAL$%'															=>	'INTEGER',
-		'%^(TINY|SMALL|MEDIUM|BIG)?INT( )?(\\([0-9]+\\))?( )?(UNSIGNED)?$%i'	=>	'INTEGER',
-		'%^(TINY|MEDIUM|LONG)?TEXT$%i'											=>	'TEXT'
-	);
-
 
 	function DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, $p_connect)
@@ -124,16 +135,12 @@
 
 
-	function result($query_id = 0, $row = 0, $col = 0)
+	function result($query_id = 0, $row = 0)
 	{
 		if ($query_id)
 		{
-			if ($row !== 0 && @sqlite_seek($query_id, $row) === false)
-				return false;
-
-			$cur_row = @sqlite_current($query_id);
-			if ($cur_row === false)
-				return false;
-
-			return $cur_row[$col];
+			if ($row != 0)
+				@sqlite_seek($query_id, $row);
+
+			return @current(@sqlite_current($query_id));
 		}
 		else
@@ -150,13 +157,13 @@
 			{
 				// Horrible hack to get rid of table names and table aliases from the array keys
-				foreach ($cur_row as $key => $value)
+				while (list($key, $value) = @each($cur_row))
 				{
-					$dot_spot = strpos($key, '.');
-					if ($dot_spot !== false)
-					{
-						unset($cur_row[$key]);
-						$key = substr($key, $dot_spot+1);
-						$cur_row[$key] = $value;
-					}
+				    $dot_spot = strpos($key, '.');
+				    if ($dot_spot !== false)
+				    {
+				        unset($cur_row[$key]);
+				        $key = substr($key, $dot_spot+1);
+				        $cur_row[$key] = $value;
+				    }
 				}
 			}
@@ -183,5 +190,5 @@
 	function affected_rows()
 	{
-		return ($this->link_id) ? @sqlite_changes($this->link_id) : false;
+		return ($this->query_result) ? @sqlite_changes($this->query_result) : false;
 	}
 
@@ -213,5 +220,5 @@
 	function escape($str)
 	{
-		return is_array($str) ? '' : sqlite_escape_string($str);
+		return sqlite_escape_string($str);
 	}
 
@@ -244,324 +251,3 @@
 			return false;
 	}
-
-
-	function get_names()
-	{
-		return '';
-	}
-
-
-	function set_names($names)
-	{
-		return true;
-	}
-
-
-	function get_version()
-	{
-		return array(
-			'name'		=> 'SQLite',
-			'version'	=> sqlite_libversion()
-		);
-	}
-
-
-	function table_exists($table_name, $no_prefix = false)
-	{
-		$result = $this->query('SELECT 1 FROM sqlite_master WHERE name = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\' AND type=\'table\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function field_exists($table_name, $field_name, $no_prefix = false)
-	{
-		$result = $this->query('SELECT sql FROM sqlite_master WHERE name = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\' AND type=\'table\'');
-		if (!$this->num_rows($result))
-			return false;
-
-		return preg_match('%[\r\n]'.preg_quote($field_name, '%').' %', $this->result($result));
-	}
-
-
-	function index_exists($table_name, $index_name, $no_prefix = false)
-	{
-		$result = $this->query('SELECT 1 FROM sqlite_master WHERE tbl_name = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\' AND name = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_'.$this->escape($index_name).'\' AND type=\'index\'');
-		return $this->num_rows($result) > 0;
-	}
-
-
-	function create_table($table_name, $schema, $no_prefix = false)
-	{
-		if ($this->table_exists($table_name, $no_prefix))
-			return true;
-
-		$query = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$table_name." (\n";
-
-		// Go through every schema element and add it to the query
-		foreach ($schema['FIELDS'] as $field_name => $field_data)
-		{
-			$field_data['datatype'] = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_data['datatype']);
-
-			$query .= $field_name.' '.$field_data['datatype'];
-
-			if (!$field_data['allow_null'])
-				$query .= ' NOT NULL';
-
-			if (isset($field_data['default']))
-				$query .= ' DEFAULT '.$field_data['default'];
-
-			$query .= ",\n";
-		}
-
-		// If we have a primary key, add it
-		if (isset($schema['PRIMARY KEY']))
-			$query .= 'PRIMARY KEY ('.implode(',', $schema['PRIMARY KEY']).'),'."\n";
-
-		// Add unique keys
-		if (isset($schema['UNIQUE KEYS']))
-		{
-			foreach ($schema['UNIQUE KEYS'] as $key_name => $key_fields)
-				$query .= 'UNIQUE ('.implode(',', $key_fields).'),'."\n";
-		}
-
-		// We remove the last two characters (a newline and a comma) and add on the ending
-		$query = substr($query, 0, strlen($query) - 2)."\n".')';
-
-		$result = $this->query($query) ? true : false;
-
-		// Add indexes
-		if (isset($schema['INDEXES']))
-		{
-			foreach ($schema['INDEXES'] as $index_name => $index_fields)
-				$result &= $this->add_index($table_name, $index_name, $index_fields, false, $no_prefix);
-		}
-
-		return $result;
-	}
-
-
-	function drop_table($table_name, $no_prefix = false)
-	{
-		if (!$this->table_exists($table_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP TABLE '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
-
-
-	function rename_table($old_name, $new_name, $no_prefix = false)
-	{
-		// If there new table exists and the old one doesn't, then we're happy
-		if ($this->table_exists($new_table, $no_prefix) && !$this->table_exists($old_table, $no_prefix))
-			return true;
-
-		$table = $this->get_table_info($old_name, $no_prefix);
-
-		// Create new table
-		$newtable = str_replace('CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($old_name).' (', 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($new_name).' (', $table['sql']);
-		$result = $this->query($newtable) ? true : false;
-
-		// Recreate indexes
-		if (!empty($table['indices']))
-		{
-			foreach ($table['indices'] as $cur_index)
-				$result &= $this->query($cur_index) ? true : false;
-		}
-
-		// Copy content across
-		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($new_name).' SELECT * FROM '.($no_prefix ? '' : $this->prefix).$this->escape($old_name)) ? true : false;
-
-		// Drop old table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name));
-
-		return $result;
-	}
-
-
-	function get_table_info($table_name, $no_prefix = false)
-	{
-		// Grab table info
-		$result = $this->query('SELECT sql FROM sqlite_master WHERE tbl_name = \''.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'\' ORDER BY type DESC') or error('Unable to fetch table information', __FILE__, __LINE__, $this->error());
-		$num_rows = $this->num_rows($result);
-
-		if ($num_rows == 0)
-			return;
-
-		$table = array();
-		$table['indices'] = array();
-		while ($cur_index = $this->fetch_assoc($result))
-		{
-			if (empty($cur_index['sql']))
-				continue;
-
-			if (!isset($table['sql']))
-				$table['sql'] = $cur_index['sql'];
-			else
-				$table['indices'][] = $cur_index['sql'];
-		}
-
-		// Work out the columns in the table currently
-		$table_lines = explode("\n", $table['sql']);
-		$table['columns'] = array();
-		foreach ($table_lines as $table_line)
-		{
-			$table_line = trim($table_line, " \t\n\r,"); // trim spaces, tabs, newlines, and commas
-			if (substr($table_line, 0, 12) == 'CREATE TABLE')
-				continue;
-			else if (substr($table_line, 0, 11) == 'PRIMARY KEY')
-				$table['primary_key'] = $table_line;
-			else if (substr($table_line, 0, 6) == 'UNIQUE')
-				$table['unique'] = $table_line;
-			else if (substr($table_line, 0, strpos($table_line, ' ')) != '')
-				$table['columns'][substr($table_line, 0, strpos($table_line, ' '))] = trim(substr($table_line, strpos($table_line, ' ')));
-		}
-
-		return $table;
-	}
-
-
-	function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = 0, $no_prefix = false)
-	{
-		if ($this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$table = $this->get_table_info($table_name, $no_prefix);
-
-		// Create temp table
-		$now = time();
-		$tmptable = str_replace('CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' (', 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now.' (', $table['sql']);
-		$result = $this->query($tmptable) ? true : false;
-		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now.' SELECT * FROM '.($no_prefix ? '' : $this->prefix).$this->escape($table_name)) ? true : false;
-
-		// Create new table sql
-		$field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);
-		$query = $field_type;
-		if (!$allow_null)
-			$query .= ' NOT NULL';
-		if ($default_value === null || $default_value === '')
-			$default_value = '\'\'';
-
-		$query .= ' DEFAULT '.$default_value;
-
-		$old_columns = array_keys($table['columns']);
-		array_insert($table['columns'], $after_field, $query, $field_name);
-
-		$new_table = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' (';
-
-		foreach ($table['columns'] as $cur_column => $column_details)
-			$new_table .= "\n".$cur_column.' '.$column_details.',';
-
-		if (isset($table['unique']))
-			$new_table .= "\n".$table['unique'].',';
-
-		if (isset($table['primary_key']))
-			$new_table .= "\n".$table['primary_key'].',';
-
-		$new_table = trim($new_table, ',')."\n".');';
-
-		// Drop old table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name));
-
-		// Create new table
-		$result &= $this->query($new_table) ? true : false;
-
-		// Recreate indexes
-		if (!empty($table['indices']))
-		{
-			foreach ($table['indices'] as $cur_index)
-				$result &= $this->query($cur_index) ? true : false;
-		}
-
-		// Copy content back
-		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' ('.implode(', ', $old_columns).') SELECT * FROM '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now) ? true : false;
-
-		// Drop temp table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now);
-
-		return $result;
-	}
-
-
-	function alter_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = 0, $no_prefix = false)
-	{
-		// Unneeded for SQLite
-		return true;
-	}
-
-
-	function drop_field($table_name, $field_name, $no_prefix = false)
-	{
-		if (!$this->field_exists($table_name, $field_name, $no_prefix))
-			return true;
-
-		$table = $this->get_table_info($table_name, $no_prefix);
-
-		// Create temp table
-		$now = time();
-		$tmptable = str_replace('CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' (', 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now.' (', $table['sql']);
-		$result = $this->query($tmptable) ? true : false;
-		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now.' SELECT * FROM '.($no_prefix ? '' : $this->prefix).$this->escape($table_name)) ? true : false;
-
-		// Work out the columns we need to keep and the sql for the new table
-		unset($table['columns'][$field_name]);
-		$new_columns = array_keys($table['columns']);
-
-		$new_table = 'CREATE TABLE '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' (';
-
-		foreach ($table['columns'] as $cur_column => $column_details)
-			$new_table .= "\n".$cur_column.' '.$column_details.',';
-
-		if (isset($table['unique']))
-			$new_table .= "\n".$table['unique'].',';
-
-		if (isset($table['primary_key']))
-			$new_table .= "\n".$table['primary_key'].',';
-
-		$new_table = trim($new_table, ',')."\n".');';
-
-		// Drop old table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name));
-
-		// Create new table
-		$result &= $this->query($new_table) ? true : false;
-
-		// Recreate indexes
-		if (!empty($table['indices']))
-		{
-			foreach ($table['indices'] as $cur_index)
-				if (!preg_match('%\('.preg_quote($field_name, '%').'\)%', $cur_index))
-					$result &= $this->query($cur_index) ? true : false;
-		}
-
-		// Copy content back
-		$result &= $this->query('INSERT INTO '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).' SELECT '.implode(', ', $new_columns).' FROM '.($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now) ? true : false;
-
-		// Drop temp table
-		$result &= $this->drop_table(($no_prefix ? '' : $this->prefix).$this->escape($table_name).'_t'.$now);
-
-		return $result;
-	}
-
-
-	function add_index($table_name, $index_name, $index_fields, $unique = false, $no_prefix = false)
-	{
-		if ($this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('CREATE '.($unique ? 'UNIQUE ' : '').'INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name.' ON '.($no_prefix ? '' : $this->prefix).$table_name.'('.implode(',', $index_fields).')') ? true : false;
-	}
-
-
-	function drop_index($table_name, $index_name, $no_prefix = false)
-	{
-		if (!$this->index_exists($table_name, $index_name, $no_prefix))
-			return true;
-
-		return $this->query('DROP INDEX '.($no_prefix ? '' : $this->prefix).$table_name.'_'.$index_name) ? true : false;
-	}
-
-	function truncate_table($table_name, $no_prefix = false)
-	{
-		return $this->query('DELETE FROM '.($no_prefix ? '' : $this->prefix).$table_name) ? true : false;
-	}
 }
Index: trunk/web/punbb/include/email.php
===================================================================
--- trunk/web/punbb/include/email.php	(revision 10)
+++ trunk/web/punbb/include/email.php	(revision 1)
@@ -1,9 +1,26 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // Make sure no one attempts to run this script "directly"
@@ -11,15 +28,14 @@
 	exit;
 
-require PUN_ROOT.'include/utf8/utils/ascii.php';
 
 //
-// Validate an email address
+// Validate an e-mail address
 //
 function is_valid_email($email)
 {
-	if (strlen($email) > 80)
+	if (strlen($email) > 50)
 		return false;
 
-	return preg_match('%^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|("[^"]+"))@((\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])|(([a-zA-Z\d\-]+\.)+[a-zA-Z]{2,}))$%', $email);
+	return preg_match('/^(([^<>()[\]\\.,;:\s@"\']+(\.[^<>()[\]\\.,;:\s@"\']+)*)|("[^"\']+"))@((\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])|(([a-zA-Z\d\-]+\.)+[a-zA-Z]{2,}))$/', $email);
 }
 
@@ -30,5 +46,5 @@
 function is_banned_email($email)
 {
-	global $pun_bans;
+	global $db, $pun_bans;
 
 	foreach ($pun_bans as $cur_ban)
@@ -45,213 +61,34 @@
 
 //
-// Only encode with base64, if there is at least one unicode character in the string
-//
-function encode_mail_text($str)
-{
-	if (utf8_is_ascii($str))
-		return $str;
-
-	return '=?UTF-8?B?'.base64_encode($str).'?=';
-}
-
-
-//
-// Make a post email safe
-//
-function bbcode2email($text, $wrap_length = 72)
-{
-    static $base_url;
-
-    if (!isset($base_url))
-        $base_url = get_base_url();
-
-    $text = pun_trim($text, "\t\n ");
-
-    $shortcut_urls = array(
-        'topic' => '/viewtopic.php?id=$1',
-        'post' => '/viewtopic.php?pid=$1#p$1',
-        'forum' => '/viewforum.php?id=$1',
-        'user' => '/profile.php?id=$1',
-    );
-
-    // Split code blocks and text so BBcode in codeblocks won't be touched
-    list($code, $text) = extract_blocks($text, '[code]', '[/code]');
-
-    // Strip all bbcodes, except the quote, url, img, email, code and list items bbcodes
-    $text = preg_replace(array(
-        '%\[/?(?!(?:quote|url|topic|post|user|forum|img|email|code|list|\*))[a-z]+(?:=[^\]]+)?\]%i',
-        '%\n\[/?list(?:=[^\]]+)?\]%i' // A separate regex for the list tags to get rid of some whitespace
-    ), '', $text);
-
-    // Match the deepest nested bbcode
-    // An adapted example from Mastering Regular Expressions
-    $match_quote_regex = '%
-        \[(quote|\*|url|img|email|topic|post|user|forum)(?:=([^\]]+))?\]
-        (
-            (?>[^\[]*)
-            (?>
-                (?!\[/?\1(?:=[^\]]+)?\])
-                \[
-                [^\[]*
-            )*
-        )
-        \[/\1\]
-    %ix';
-
-    $url_index = 1;
-    $url_stack = array();
-    while (preg_match($match_quote_regex, $text, $matches))
-    {
-        // Quotes
-        if ($matches[1] == 'quote')
-        {
-            // Put '>' or '> ' at the start of a line
-            $replacement = preg_replace(
-                array('%^(?=\>)%m', '%^(?!\>)%m'),
-                array('>', '> '),
-                $matches[2]." said:\n".$matches[3]);
-        }
-
-        // List items
-        elseif ($matches[1] == '*')
-        {
-            $replacement = ' * '.$matches[3];
-        }
-
-        // URLs and emails
-        elseif (in_array($matches[1], array('url', 'email')))
-        {
-            if (!empty($matches[2]))
-            {
-                $replacement = '['.$matches[3].']['.$url_index.']';
-                $url_stack[$url_index] = $matches[2];
-                $url_index++;
-            }
-            else
-                $replacement = '['.$matches[3].']';
-        }
-
-        // Images
-        elseif ($matches[1] == 'img')
-        {
-            if (!empty($matches[2]))
-                $replacement = '['.$matches[2].']['.$url_index.']';
-            else
-                $replacement = '['.basename($matches[3]).']['.$url_index.']';
-
-            $url_stack[$url_index] = $matches[3];
-            $url_index++;
-        }
-
-        // Topic, post, forum and user URLs
-        elseif (in_array($matches[1], array('topic', 'post', 'forum', 'user')))
-        {
-            $url = isset($shortcut_urls[$matches[1]]) ? $base_url.$shortcut_urls[$matches[1]] : '';
-
-            if (!empty($matches[2]))
-            {
-                $replacement = '['.$matches[3].']['.$url_index.']';
-                $url_stack[$url_index] = str_replace('$1', $matches[2], $url);
-                $url_index++;
-            }
-            else
-                $replacement = '['.str_replace('$1', $matches[3], $url).']';
-        }
-
-        // Update the main text if there is a replacment
-        if (!is_null($replacement))
-        {
-            $text = str_replace($matches[0], $replacement, $text);
-            $replacement = null;
-        }
-    }
-
-    // Put code blocks and text together
-    if (isset($code))
-    {
-        $parts = explode("\1", $text);
-        $text = '';
-        foreach ($parts as $i => $part)
-        {
-            $text .= $part;
-            if (isset($code[$i]))
-                $text .= trim($code[$i], "\n\r");
-        }
-    }
-
-    // Put URLs at the bottom
-    if ($url_stack)
-    {
-        $text .= "\n\n";
-        foreach ($url_stack as $i => $url)
-            $text .= "\n".' ['.$i.']: '.$url;
-    }
-
-    // Wrap lines if $wrap_length is higher than -1
-    if ($wrap_length > -1)
-    {
-        // Split all lines and wrap them individually
-        $parts = explode("\n", $text);
-        foreach ($parts as $k => $part)
-        {
-            preg_match('%^(>+ )?(.*)%', $part, $matches);
-            $parts[$k] = wordwrap($matches[1].$matches[2], $wrap_length -
-                strlen($matches[1]), "\n".$matches[1]);
-        }
-
-        return implode("\n", $parts);
-    }
-    else
-        return $text;
-}
-
-
-//
 // Wrapper for PHP's mail()
 //
-function pun_mail($to, $subject, $message, $reply_to_email = '', $reply_to_name = '')
+function pun_mail($to, $subject, $message, $from = '')
 {
 	global $pun_config, $lang_common;
 
 	// Default sender/return address
-	$from_name = sprintf($lang_common['Mailer'], $pun_config['o_board_title']);
-	$from_email = $pun_config['o_webmaster_email'];
+	if (!$from)
+		$from = '"'.str_replace('"', '', $pun_config['o_board_title'].' '.$lang_common['Mailer']).'" <'.$pun_config['o_webmaster_email'].'>';
 
 	// Do a little spring cleaning
-	$to = pun_trim(preg_replace('%[\n\r]+%s', '', $to));
-	$subject = pun_trim(preg_replace('%[\n\r]+%s', '', $subject));
-	$from_email = pun_trim(preg_replace('%[\n\r:]+%s', '', $from_email));
-	$from_name = pun_trim(preg_replace('%[\n\r:]+%s', '', str_replace('"', '', $from_name)));
-	$reply_to_email = pun_trim(preg_replace('%[\n\r:]+%s', '', $reply_to_email));
-	$reply_to_name = pun_trim(preg_replace('%[\n\r:]+%s', '', str_replace('"', '', $reply_to_name)));
+	$to = trim(preg_replace('#[\n\r]+#s', '', $to));
+	$subject = trim(preg_replace('#[\n\r]+#s', '', $subject));
+	$from = trim(preg_replace('#[\n\r:]+#s', '', $from));
 
-	// Set up some headers to take advantage of UTF-8
-	$from = '"'.encode_mail_text($from_name).'" <'.$from_email.'>';
-	$subject = encode_mail_text($subject);
+	$headers = 'From: '.$from."\r\n".'Date: '.date('r')."\r\n".'MIME-Version: 1.0'."\r\n".'Content-transfer-encoding: 8bit'."\r\n".'Content-type: text/plain; charset='.$lang_common['lang_encoding']."\r\n".'X-Mailer: PunBB Mailer';
 
-	$headers = 'From: '.$from."\r\n".'Date: '.gmdate('r')."\r\n".'MIME-Version: 1.0'."\r\n".'Content-transfer-encoding: 8bit'."\r\n".'Content-type: text/plain; charset=utf-8'."\r\n".'X-Mailer: FluxBB Mailer';
-
-	// If we specified a reply-to email, we deal with it here
-	if (!empty($reply_to_email))
-	{
-		$reply_to = '"'.encode_mail_text($reply_to_name).'" <'.$reply_to_email.'>';
-
-		$headers .= "\r\n".'Reply-To: '.$reply_to;
-	}
-
-	// Make sure all linebreaks are LF in message (and strip out any NULL bytes)
-	$message = str_replace("\0", '', pun_linebreaks($message));
+	// Make sure all linebreaks are CRLF in message
+	$message = str_replace("\n", "\r\n", pun_linebreaks($message));
 
 	if ($pun_config['o_smtp_host'] != '')
-	{
-		// Headers should be \r\n
-		// Message should be ??
-		$message = str_replace("\n", "\r\n", $message);
 		smtp_mail($to, $subject, $message, $headers);
-	}
 	else
 	{
-		// Headers should be \r\n
-		// Message should be \n
+		// Change the linebreaks used in the headers according to OS
+		if (strtoupper(substr(PHP_OS, 0, 3)) == 'MAC')
+			$headers = str_replace("\r\n", "\r", $headers);
+		else if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN')
+			$headers = str_replace("\r\n", "\n", $headers);
+		
 		mail($to, $subject, $message, $headers);
 	}
@@ -260,6 +97,6 @@
 
 //
-// This function was originally a part of the phpBB Group forum software phpBB2 (http://www.phpbb.com)
-// They deserve all the credit for writing it. I made small modifications for it to suit PunBB and it's coding standards
+// This function was originally a part of the phpBB Group forum software phpBB2 (http://www.phpbb.com).
+// They deserve all the credit for writing it. I made small modifications for it to suit PunBB and it's coding standards.
 //
 function server_parse($socket, $expected_response)
@@ -269,14 +106,14 @@
 	{
 		if (!($server_response = fgets($socket, 256)))
-			error('Couldn\'t get mail server response codes. Please contact the forum administrator.', __FILE__, __LINE__);
+			error('N\'a pas pu obtenir les codes de rÃ©ponse du serveur mail. Veuillez contacter l\'administrateur de forum', __FILE__, __LINE__);
 	}
 
 	if (!(substr($server_response, 0, 3) == $expected_response))
-		error('Unable to send email. Please contact the forum administrator with the following error message reported by the SMTP server: "'.$server_response.'"', __FILE__, __LINE__);
+		error('Impossible d\'envoyer l\'e-mail. Veuillez contacter l\'administrateur des forums avec le message d\'erreur suivant rapportÃ© par le serveur SMTP : "'.$server_response.'"', __FILE__, __LINE__);
 }
 
 
 //
-// This function was originally a part of the phpBB Group forum software phpBB2 (http://www.phpbb.com)
+// This function was originally a part of the phpBB Group forum software phpBB2 (http://www.phpbb.com).
 // They deserve all the credit for writing it. I made small modifications for it to suit PunBB and it's coding standards.
 //
@@ -286,8 +123,4 @@
 
 	$recipients = explode(',', $to);
-
-	// Sanitize the message
-	$message = str_replace("\r\n.", "\r\n..", $message);
-	$message = (substr($message, 0, 1) == '.' ? '.'.$message : $message);
 
 	// Are we using port 25 or a custom port?
@@ -300,9 +133,6 @@
 	}
 
-	if ($pun_config['o_smtp_ssl'] == '1')
-		$smtp_host = 'ssl://'.$smtp_host;
-
 	if (!($socket = fsockopen($smtp_host, $smtp_port, $errno, $errstr, 15)))
-		error('Could not connect to smtp host "'.$pun_config['o_smtp_host'].'" ('.$errno.') ('.$errstr.')', __FILE__, __LINE__);
+		error('Impossible de joindre l\'hÃŽte SMTP "'.$pun_config['o_smtp_host'].'" ('.$errno.') ('.$errstr.')', __FILE__, __LINE__);
 
 	server_parse($socket, '220');
@@ -331,8 +161,13 @@
 	server_parse($socket, '250');
 
-	foreach ($recipients as $email)
+	$to_header = 'To: ';
+
+	@reset($recipients);
+	while (list(, $email) = @each($recipients))
 	{
 		fwrite($socket, 'RCPT TO: <'.$email.'>'."\r\n");
 		server_parse($socket, '250');
+
+		$to_header .= '<'.$email.'>, ';
 	}
 
@@ -340,5 +175,5 @@
 	server_parse($socket, '354');
 
-	fwrite($socket, 'Subject: '.$subject."\r\n".'To: <'.implode('>, <', $recipients).'>'."\r\n".$headers."\r\n\r\n".$message."\r\n");
+	fwrite($socket, 'Subject: '.$subject."\r\n".$to_header."\r\n".$headers."\r\n\r\n".$message."\r\n");
 
 	fwrite($socket, '.'."\r\n");
Index: trunk/web/punbb/include/functions.php
===================================================================
--- trunk/web/punbb/include/functions.php	(revision 10)
+++ trunk/web/punbb/include/functions.php	(revision 1)
@@ -1,19 +1,25 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-
-//
-// Return current timestamp (with microseconds) as a float
-//
-function get_microtime()
-{
-	list($usec, $sec) = explode(' ', microtime());
-	return ((float)$usec + (float)$sec);
-}
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
 
 //
@@ -22,27 +28,27 @@
 function check_cookie(&$pun_user)
 {
-	global $db, $db_type, $pun_config, $cookie_name, $cookie_seed;
+	global $db, $pun_config, $cookie_name, $cookie_seed;
 
 	$now = time();
-
-	// If the cookie is set and it matches the correct pattern, then read the values from it
-	if (isset($_COOKIE[$cookie_name]) && preg_match('%^(\d+)\|([0-9a-fA-F]+)\|(\d+)\|([0-9a-fA-F]+)$%', $_COOKIE[$cookie_name], $matches))
-	{
-		$cookie = array(
-			'user_id'			=> intval($matches[1]),
-			'password_hash' 	=> $matches[2],
-			'expiration_time'	=> intval($matches[3]),
-			'cookie_hash'		=> $matches[4],
-		);
-	}
-
-	// If it has a non-guest user, and hasn't expired
-	if (isset($cookie) && $cookie['user_id'] > 1 && $cookie['expiration_time'] > $now)
-	{
-		// If the cookie has been tampered with
-		if (forum_hmac($cookie['user_id'].'|'.$cookie['expiration_time'], $cookie_seed.'_cookie_hash') != $cookie['cookie_hash'])
-		{
-			$expire = $now + 31536000; // The cookie expires after a year
-			pun_setcookie(1, pun_hash(uniqid(rand(), true)), $expire);
+	$expire = $now + 31536000;	// The cookie expires after a year
+
+	// We assume it's a guest
+	$cookie = array('user_id' => 1, 'password_hash' => 'InvitÃ©');
+
+	// If a cookie is set, we get the user_id and password hash from it
+	if (isset($_COOKIE[$cookie_name]))
+		list($cookie['user_id'], $cookie['password_hash']) = @unserialize($_COOKIE[$cookie_name]);
+
+	if ($cookie['user_id'] > 1)
+	{
+		// Check if there's a user with the user ID and password hash from the cookie
+        $_query = 'SELECT u.*, g.*, o.logged, o.idle FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$db->prefix.'online AS o ON o.user_id=u.id WHERE u.id='.intval($cookie['user_id']);
+		$result = $db->query($_query) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
+		$pun_user = $db->fetch_assoc($result);
+
+		// If user authorisation failed
+		if (!isset($pun_user['id']) || md5($cookie_seed.$pun_user['password']) !== $cookie['password_hash'])
+		{
+			pun_setcookie(0, random_pass(8), $expire);
 			set_default_user();
 
@@ -50,28 +56,10 @@
 		}
 
-		// Check if there's a user with the user ID and password hash from the cookie
-		$result = $db->query('SELECT u.*, g.*, o.logged, o.idle FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$db->prefix.'online AS o ON o.user_id=u.id WHERE u.id='.intval($cookie['user_id'])) or error('Unable to fetch user information', __FILE__, __LINE__, $db->error());
-		$pun_user = $db->fetch_assoc($result);
-
-		// If user authorisation failed
-		if (!isset($pun_user['id']) || forum_hmac($pun_user['password'], $cookie_seed.'_password_hash') !== $cookie['password_hash'])
-		{
-			$expire = $now + 31536000; // The cookie expires after a year
-			pun_setcookie(1, pun_hash(uniqid(rand(), true)), $expire);
-			set_default_user();
-
-			return;
-		}
-
-		// Send a new, updated cookie with a new expiration timestamp
-		$expire = ($cookie['expiration_time'] > $now + $pun_config['o_timeout_visit']) ? $now + 1209600 : $now + $pun_config['o_timeout_visit'];
-		pun_setcookie($pun_user['id'], $pun_user['password'], $expire);
-
 		// Set a default language if the user selected language no longer exists
-		if (!file_exists(PUN_ROOT.'lang/'.$pun_user['language']))
+		if (!$pun_user['language'] || !@file_exists(PUN_ROOT.'lang/'.$pun_user['language']))
 			$pun_user['language'] = $pun_config['o_default_lang'];
 
 		// Set a default style if the user selected style no longer exists
-		if (!file_exists(PUN_ROOT.'style/'.$pun_user['style'].'.css'))
+		if (!@file_exists(PUN_ROOT.'style/'.$pun_user['style'].'.css'))
 			$pun_user['style'] = $pun_config['o_default_style'];
 
@@ -81,4 +69,7 @@
 			$pun_user['disp_posts'] = $pun_config['o_disp_posts_default'];
 
+		if ($pun_user['save_pass'] == '0')
+			$expire = 0;
+
 		// Define this if you want this visit to affect the online list and the users last visit data
 		if (!defined('PUN_QUIET_VISIT'))
@@ -86,26 +77,5 @@
 			// Update the online list
 			if (!$pun_user['logged'])
-			{
-				$pun_user['logged'] = $now;
-
-				// With MySQL/MySQLi/SQLite, REPLACE INTO avoids a user having two rows in the online table
-				switch ($db_type)
-				{
-					case 'mysql':
-					case 'mysqli':
-					case 'mysql_innodb':
-					case 'mysqli_innodb':
-					case 'sqlite':
-						$db->query('REPLACE INTO '.$db->prefix.'online (user_id, ident, logged) VALUES('.$pun_user['id'].', \''.$db->escape($pun_user['username']).'\', '.$pun_user['logged'].')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
-						break;
-
-					default:
-						$db->query('INSERT INTO '.$db->prefix.'online (user_id, ident, logged) SELECT '.$pun_user['id'].', \''.$db->escape($pun_user['username']).'\', '.$pun_user['logged'].' WHERE NOT EXISTS (SELECT 1 FROM '.$db->prefix.'online WHERE user_id='.$pun_user['id'].')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
-						break;
-				}
-
-				// Reset tracked topics
-				set_tracked_topics(null);
-			}
+				$db->query('INSERT INTO '.$db->prefix.'online (user_id, ident, logged) VALUES('.$pun_user['id'].', \''.$db->escape($pun_user['username']).'\', '.$now.')') or error('Impossbile d\'insÃ©rer dans la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 			else
 			{
@@ -113,24 +83,14 @@
 				if ($pun_user['logged'] < ($now-$pun_config['o_timeout_visit']))
 				{
-					$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Unable to update user visit data', __FILE__, __LINE__, $db->error());
+					$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Impossible de mettre Ã  jour les donnÃ©es de visite de l\'utilisateur', __FILE__, __LINE__, $db->error());
 					$pun_user['last_visit'] = $pun_user['logged'];
 				}
 
 				$idle_sql = ($pun_user['idle'] == '1') ? ', idle=0' : '';
-				$db->query('UPDATE '.$db->prefix.'online SET logged='.$now.$idle_sql.' WHERE user_id='.$pun_user['id']) or error('Unable to update online list', __FILE__, __LINE__, $db->error());
-
-				// Update tracked topics with the current expire time
-				if (isset($_COOKIE[$cookie_name.'_track']))
-					forum_setcookie($cookie_name.'_track', $_COOKIE[$cookie_name.'_track'], $now + $pun_config['o_timeout_visit']);
+				$db->query('UPDATE '.$db->prefix.'online SET logged='.$now.$idle_sql.' WHERE user_id='.$pun_user['id']) or error('Impossible de mettre Ã  jour la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 			}
 		}
-		else
-		{
-			if (!$pun_user['logged'])
-				$pun_user['logged'] = $pun_user['last_visit'];
-		}
 
 		$pun_user['is_guest'] = false;
-		$pun_user['is_admmod'] = $pun_user['g_id'] == PUN_ADMIN || $pun_user['g_moderator'] == '1';
 	}
 	else
@@ -140,112 +100,16 @@
 
 //
-// Converts the CDATA end sequence ]]> into ]]&gt;
-//
-function escape_cdata($str)
-{
-	return str_replace(']]>', ']]&gt;', $str);
-}
-
-
-//
-// Authenticates the provided username and password against the user database
-// $user can be either a user ID (integer) or a username (string)
-// $password can be either a plaintext password or a password hash including salt ($password_is_hash must be set accordingly)
-//
-function authenticate_user($user, $password, $password_is_hash = false)
-{
-	global $db, $pun_user;
-
-	// Check if there's a user matching $user and $password
-	$result = $db->query('SELECT u.*, g.*, o.logged, o.idle FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id LEFT JOIN '.$db->prefix.'online AS o ON o.user_id=u.id WHERE '.(is_int($user) ? 'u.id='.intval($user) : 'u.username=\''.$db->escape($user).'\'')) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-	$pun_user = $db->fetch_assoc($result);
-
-	if (!isset($pun_user['id']) ||
-		($password_is_hash && $password != $pun_user['password']) ||
-		(!$password_is_hash && pun_hash($password) != $pun_user['password']))
-		set_default_user();
-	else
-		$pun_user['is_guest'] = false;
-}
-
-
-//
-// Try to determine the current URL
-//
-function get_current_url($max_length = 0)
-{
-	$protocol = get_current_protocol();
-	$port = (isset($_SERVER['SERVER_PORT']) && (($_SERVER['SERVER_PORT'] != '80' && $protocol == 'http') || ($_SERVER['SERVER_PORT'] != '443' && $protocol == 'https')) && strpos($_SERVER['HTTP_HOST'], ':') === false) ? ':'.$_SERVER['SERVER_PORT'] : '';
-
-	$url = urldecode($protocol.'://'.$_SERVER['HTTP_HOST'].$port.$_SERVER['REQUEST_URI']);
-
-	if (strlen($url) <= $max_length || $max_length == 0)
-		return $url;
-
-	// We can't find a short enough url
-	return null;
-}
-
-
-//
-// Fetch the current protocol in use - http or https
-//
-function get_current_protocol()
-{
-	$protocol = 'http';
-
-	// Check if the server is claiming to using HTTPS
-	if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off')
-		$protocol = 'https';
-
-	// If we are behind a reverse proxy try to decide which protocol it is using
-	if (defined('FORUM_BEHIND_REVERSE_PROXY'))
-	{
-		// Check if we are behind a Microsoft based reverse proxy
-		if (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) != 'off')
-			$protocol = 'https';
-
-		// Check if we're behind a "proper" reverse proxy, and what protocol it's using
-		if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']))
-			$protocol = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']);
-	}
-
-	return $protocol;
-}
-
-//
-// Fetch the base_url, optionally support HTTPS and HTTP
-//
-function get_base_url($support_https = false)
-{
-	global $pun_config;
-	static $base_url;
-
-	if (!$support_https)
-		return $pun_config['o_base_url'];
-
-	if (!isset($base_url))
-	{
-		// Make sure we are using the correct protocol
-		$base_url = str_replace(array('http://', 'https://'), get_current_protocol().'://', $pun_config['o_base_url']);
-	}
-
-	return $base_url;
-}
-
-
-//
 // Fill $pun_user with default values (for guests)
 //
 function set_default_user()
 {
-	global $db, $db_type, $pun_user, $pun_config;
+	global $db, $pun_user, $pun_config;
 
 	$remote_addr = get_remote_address();
 
 	// Fetch guest user
-	$result = $db->query('SELECT u.*, g.*, o.logged, o.last_post, o.last_search FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$db->prefix.'online AS o ON o.ident=\''.$remote_addr.'\' WHERE u.id=1') or error('Unable to fetch guest information', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT u.*, g.*, o.logged FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON u.group_id=g.g_id LEFT JOIN '.$db->prefix.'online AS o ON o.ident=\''.$remote_addr.'\' WHERE u.id=1') or error('Impossible de retrouver les informations d\'invitÃ©', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
-		exit('Unable to fetch guest information. Your database must contain both a guest user and a guest user group.');
+		exit('Impossible de retrouver les informations invitÃ©. La table \''.$db->prefix.'users\' doit contenir une entrÃ©e avec un id = 1 qui reprÃ©sente les utilisateurs anonymes.');
 
 	$pun_user = $db->fetch_assoc($result);
@@ -253,98 +117,29 @@
 	// Update online list
 	if (!$pun_user['logged'])
-	{
-		$pun_user['logged'] = time();
-
-		// With MySQL/MySQLi/SQLite, REPLACE INTO avoids a user having two rows in the online table
-		switch ($db_type)
-		{
-			case 'mysql':
-			case 'mysqli':
-			case 'mysql_innodb':
-			case 'mysqli_innodb':
-			case 'sqlite':
-				$db->query('REPLACE INTO '.$db->prefix.'online (user_id, ident, logged) VALUES(1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
-				break;
-
-			default:
-				$db->query('INSERT INTO '.$db->prefix.'online (user_id, ident, logged) SELECT 1, \''.$db->escape($remote_addr).'\', '.$pun_user['logged'].' WHERE NOT EXISTS (SELECT 1 FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($remote_addr).'\')') or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
-				break;
-		}
-	}
+		$db->query('INSERT INTO '.$db->prefix.'online (user_id, ident, logged) VALUES(1, \''.$db->escape($remote_addr).'\', '.time().')') or error('Impossbile d\'insÃ©rer dans la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 	else
-		$db->query('UPDATE '.$db->prefix.'online SET logged='.time().' WHERE ident=\''.$db->escape($remote_addr).'\'') or error('Unable to update online list', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'online SET logged='.time().' WHERE ident=\''.$db->escape($remote_addr).'\'') or error('Impossible de mettre Ã  jour la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 
 	$pun_user['disp_topics'] = $pun_config['o_disp_topics_default'];
 	$pun_user['disp_posts'] = $pun_config['o_disp_posts_default'];
-	$pun_user['timezone'] = $pun_config['o_default_timezone'];
-	$pun_user['dst'] = $pun_config['o_default_dst'];
+	$pun_user['timezone'] = $pun_config['o_server_timezone'];
 	$pun_user['language'] = $pun_config['o_default_lang'];
 	$pun_user['style'] = $pun_config['o_default_style'];
 	$pun_user['is_guest'] = true;
-	$pun_user['is_admmod'] = false;
-}
-
-
-//
-// SHA1 HMAC with PHP 4 fallback
-//
-function forum_hmac($data, $key, $raw_output = false)
-{
-	if (function_exists('hash_hmac'))
-		return hash_hmac('sha1', $data, $key, $raw_output);
-
-	// If key size more than blocksize then we hash it once
-	if (strlen($key) > 64)
-		$key = pack('H*', sha1($key)); // we have to use raw output here to match the standard
-
-	// Ensure we're padded to exactly one block boundary
-	$key = str_pad($key, 64, chr(0x00));
-
-	$hmac_opad = str_repeat(chr(0x5C), 64);
-	$hmac_ipad = str_repeat(chr(0x36), 64);
-
-	// Do inner and outer padding
-	for ($i = 0;$i < 64;$i++) {
-		$hmac_opad[$i] = $hmac_opad[$i] ^ $key[$i];
-		$hmac_ipad[$i] = $hmac_ipad[$i] ^ $key[$i];
-	}
-
-	// Finally, calculate the HMAC
-	$hash = sha1($hmac_opad.pack('H*', sha1($hmac_ipad.$data)));
-
-	// If we want raw output then we need to pack the final result
-	if ($raw_output)
-		$hash = pack('H*', $hash);
-
-	return $hash;
-}
-
-
-//
-// Set a cookie, FluxBB style!
-// Wrapper for forum_setcookie
+
+}
+
+
+//
+// Set a cookie, PunBB style!
 //
 function pun_setcookie($user_id, $password_hash, $expire)
 {
-	global $cookie_name, $cookie_seed;
-
-	forum_setcookie($cookie_name, $user_id.'|'.forum_hmac($password_hash, $cookie_seed.'_password_hash').'|'.$expire.'|'.forum_hmac($user_id.'|'.$expire, $cookie_seed.'_cookie_hash'), $expire);
-}
-
-
-//
-// Set a cookie, FluxBB style!
-//
-function forum_setcookie($name, $value, $expire)
-{
-	global $cookie_path, $cookie_domain, $cookie_secure;
-
-	// Enable sending of a P3P header
-	header('P3P: CP="CUR ADM"');
-
-	if (version_compare(PHP_VERSION, '5.2.0', '>='))
-		setcookie($name, $value, $expire, $cookie_path, $cookie_domain, $cookie_secure, true);
-	else
-		setcookie($name, $value, $expire, $cookie_path.'; HttpOnly', $cookie_domain, $cookie_secure);
+	global $cookie_name, $cookie_path, $cookie_domain, $cookie_secure, $cookie_seed;
+
+	// Enable sending of a P3P header by removing // from the following line (try this if login is failing in IE6)
+//	@header('P3P: CP="CUR ADM"');
+
+	setcookie($cookie_name, serialize(array($user_id, md5($cookie_seed.$password_hash))), $expire, $cookie_path, $cookie_domain, $cookie_secure);
 }
 
@@ -357,15 +152,11 @@
 	global $db, $pun_config, $lang_common, $pun_user, $pun_bans;
 
-	// Admins and moderators aren't affected
-	if ($pun_user['is_admmod'] || !$pun_bans)
+	// Admins aren't affected
+	if ($pun_user['g_id'] == PUN_ADMIN || !$pun_bans)
 		return;
 
-	// Add a dot or a colon (depending on IPv4/IPv6) at the end of the IP address to prevent banned address
-	// 192.168.0.5 from matching e.g. 192.168.0.50
-	$user_ip = get_remote_address();
-	$user_ip .= (strpos($user_ip, '.') !== false) ? '.' : ':';
-
+	// Add a dot at the end of the IP address to prevent banned address 192.168.0.5 from matching e.g. 192.168.0.50
+	$user_ip = get_remote_address().'.';
 	$bans_altered = false;
-	$is_banned = false;
 
 	foreach ($pun_bans as $cur_ban)
@@ -374,11 +165,14 @@
 		if ($cur_ban['expire'] != '' && $cur_ban['expire'] <= time())
 		{
-			$db->query('DELETE FROM '.$db->prefix.'bans WHERE id='.$cur_ban['id']) or error('Unable to delete expired ban', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'bans WHERE id='.$cur_ban['id']) or error('Impossible de supprimÃ© le bannissement expirÃ©', __FILE__, __LINE__, $db->error());
 			$bans_altered = true;
 			continue;
 		}
 
-		if ($cur_ban['username'] != '' && utf8_strtolower($pun_user['username']) == utf8_strtolower($cur_ban['username']))
-			$is_banned = true;
+		if ($cur_ban['username'] != '' && !strcasecmp($pun_user['username'], $cur_ban['username']))
+		{
+			$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($pun_user['username']).'\'') or error('Impossible de supprimer de la liste des utilisateur en ligne', __FILE__, __LINE__, $db->error());
+			message($lang_common['Ban message'].' '.(($cur_ban['expire'] != '') ? $lang_common['Ban message 2'].' '.strtolower(format_time($cur_ban['expire'], true)).'. ' : '').(($cur_ban['message'] != '') ? $lang_common['Ban message 3'].'<br /><br /><strong>'.pun_htmlspecialchars($cur_ban['message']).'</strong><br /><br />' : '<br /><br />').$lang_common['Ban message 4'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
+		}
 
 		if ($cur_ban['ip'] != '')
@@ -386,26 +180,15 @@
 			$cur_ban_ips = explode(' ', $cur_ban['ip']);
 
-			$num_ips = count($cur_ban_ips);
-			for ($i = 0; $i < $num_ips; ++$i)
+			for ($i = 0; $i < count($cur_ban_ips); ++$i)
 			{
-				// Add the proper ending to the ban
-				if (strpos($user_ip, '.') !== false)
-					$cur_ban_ips[$i] = $cur_ban_ips[$i].'.';
-				else
-					$cur_ban_ips[$i] = $cur_ban_ips[$i].':';
+				$cur_ban_ips[$i] = $cur_ban_ips[$i].'.';
 
 				if (substr($user_ip, 0, strlen($cur_ban_ips[$i])) == $cur_ban_ips[$i])
 				{
-					$is_banned = true;
-					break;
+					$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($pun_user['username']).'\'') or error('Impossible de supprimer de la liste des utilisateur en ligne', __FILE__, __LINE__, $db->error());
+					message($lang_common['Ban message'].' '.(($cur_ban['expire'] != '') ? $lang_common['Ban message 2'].' '.strtolower(format_time($cur_ban['expire'], true)).'. ' : '').(($cur_ban['message'] != '') ? $lang_common['Ban message 3'].'<br /><br /><strong>'.pun_htmlspecialchars($cur_ban['message']).'</strong><br /><br />' : '<br /><br />').$lang_common['Ban message 4'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
 				}
 			}
 		}
-
-		if ($is_banned)
-		{
-			$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($pun_user['username']).'\'') or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
-			message($lang_common['Ban message'].' '.(($cur_ban['expire'] != '') ? $lang_common['Ban message 2'].' '.strtolower(format_time($cur_ban['expire'], true)).'. ' : '').(($cur_ban['message'] != '') ? $lang_common['Ban message 3'].'<br /><br /><strong>'.pun_htmlspecialchars($cur_ban['message']).'</strong><br /><br />' : '<br /><br />').$lang_common['Ban message 4'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
-		}
 	}
 
@@ -413,7 +196,5 @@
 	if ($bans_altered)
 	{
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
+		require_once PUN_ROOT.'include/cache.php';
 		generate_bans_cache();
 	}
@@ -422,70 +203,19 @@
 
 //
-// Check username
-//
-function check_username($username, $exclude_id = null)
-{
-	global $db, $pun_config, $errors, $lang_prof_reg, $lang_register, $lang_common, $pun_bans;
-
-	// Convert multiple whitespace characters into one (to prevent people from registering with indistinguishable usernames)
-	$username = preg_replace('%\s+%s', ' ', $username);
-
-	// Validate username
-	if (pun_strlen($username) < 2)
-		$errors[] = $lang_prof_reg['Username too short'];
-	else if (pun_strlen($username) > 25) // This usually doesn't happen since the form element only accepts 25 characters
-		$errors[] = $lang_prof_reg['Username too long'];
-	else if (!strcasecmp($username, 'Guest') || !strcasecmp($username, $lang_common['Guest']))
-		$errors[] = $lang_prof_reg['Username guest'];
-	else if (preg_match('%[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}%', $username) || preg_match('%((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))%', $username))
-		$errors[] = $lang_prof_reg['Username IP'];
-	else if ((strpos($username, '[') !== false || strpos($username, ']') !== false) && strpos($username, '\'') !== false && strpos($username, '"') !== false)
-		$errors[] = $lang_prof_reg['Username reserved chars'];
-	else if (preg_match('%(?:\[/?(?:b|u|s|ins|del|em|i|h|colou?r|quote|code|img|url|email|list|\*|topic|post|forum|user)\]|\[(?:img|url|quote|list)=)%i', $username))
-		$errors[] = $lang_prof_reg['Username BBCode'];
-
-	// Check username for any censored words
-	if ($pun_config['o_censoring'] == '1' && censor_words($username) != $username)
-		$errors[] = $lang_register['Username censor'];
-
-	// Check that the username (or a too similar username) is not already registered
-	$query = ($exclude_id) ? ' AND id!='.$exclude_id : '';
-
-	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE (UPPER(username)=UPPER(\''.$db->escape($username).'\') OR UPPER(username)=UPPER(\''.$db->escape(ucp_preg_replace('%[^\p{L}\p{N}]%u', '', $username)).'\')) AND id>1'.$query) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-
-	if ($db->num_rows($result))
-	{
-		$busy = $db->result($result);
-		$errors[] = $lang_register['Username dupe 1'].' '.pun_htmlspecialchars($busy).'. '.$lang_register['Username dupe 2'];
-	}
-
-	// Check username for any banned usernames
-	foreach ($pun_bans as $cur_ban)
-	{
-		if ($cur_ban['username'] != '' && utf8_strtolower($username) == utf8_strtolower($cur_ban['username']))
-		{
-			$errors[] = $lang_prof_reg['Banned username'];
-			break;
-		}
-	}
-}
-
-
-//
 // Update "Users online"
 //
 function update_users_online()
 {
-	global $db, $pun_config;
+	global $db, $pun_config, $pun_user;
 
 	$now = time();
 
 	// Fetch all online list entries that are older than "o_timeout_online"
-	$result = $db->query('SELECT user_id, ident, logged, idle FROM '.$db->prefix.'online WHERE logged<'.($now-$pun_config['o_timeout_online'])) or error('Unable to fetch old entries from online list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT * FROM '.$db->prefix.'online WHERE logged<'.($now-$pun_config['o_timeout_online'])) or error('Impossible de retrouver les anciennes entrÃ©es de la liste des utilisateurs', __FILE__, __LINE__, $db->error());
 	while ($cur_user = $db->fetch_assoc($result))
 	{
 		// If the entry is a guest, delete it
 		if ($cur_user['user_id'] == '1')
-			$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($cur_user['ident']).'\'') or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape($cur_user['ident']).'\'') or error('Impossible de supprimer de la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 		else
 		{
@@ -493,11 +223,69 @@
 			if ($cur_user['logged'] < ($now-$pun_config['o_timeout_visit']))
 			{
-				$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$cur_user['logged'].' WHERE id='.$cur_user['user_id']) or error('Unable to update user visit data', __FILE__, __LINE__, $db->error());
-				$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$cur_user['user_id']) or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
+				$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$cur_user['logged'].' WHERE id='.$cur_user['user_id']) or error('Impossible de mettre Ã  jour les donnÃ©es de visite de l\'utilisateur', __FILE__, __LINE__, $db->error());
+				$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$cur_user['user_id']) or error('Impossible de supprimer de la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 			}
 			else if ($cur_user['idle'] == '0')
-				$db->query('UPDATE '.$db->prefix.'online SET idle=1 WHERE user_id='.$cur_user['user_id']) or error('Unable to insert into online list', __FILE__, __LINE__, $db->error());
-		}
-	}
+				$db->query('UPDATE '.$db->prefix.'online SET idle=1 WHERE user_id='.$cur_user['user_id']) or error('Impossible d\'insÃ©rer Ã  la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
+		}
+	}
+}
+
+
+//
+// Generate the "navigator" that appears at the top of every page
+//
+function generate_navlinks()
+{
+	global $pun_config, $lang_common, $pun_user;
+
+	// Index and Userlist should always be displayed
+	$links[] = '<li id="navindex"><a href="index.php">'.$lang_common['Index'].'</a>';
+	$links[] = '<li id="navuserlist"><a href="userlist.php">'.$lang_common['User list'].'</a>';
+
+	if ($pun_config['o_rules'] == '1')
+		$links[] = '<li id="navrules"><a href="misc.php?action=rules">'.$lang_common['Rules'].'</a>';
+
+	if ($pun_user['is_guest'])
+	{
+		if ($pun_user['g_search'] == '1')
+			$links[] = '<li id="navsearch"><a href="search.php">'.$lang_common['Search'].'</a>';
+
+		$links[] = '<li id="navregister"><a href="register.php">'.$lang_common['Register'].'</a>';
+		$links[] = '<li id="navlogin"><a href="login.php">'.$lang_common['Login'].'</a>';
+
+		$info = $lang_common['Not logged in'];
+	}
+	else
+	{
+		if ($pun_user['g_id'] > PUN_MOD)
+		{
+			if ($pun_user['g_search'] == '1')
+				$links[] = '<li id="navsearch"><a href="search.php">'.$lang_common['Search'].'</a>';
+
+			$links[] = '<li id="navprofile"><a href="profile.php?id='.$pun_user['id'].'">'.$lang_common['Profile'].'</a>';
+			$links[] = '<li id="navlogout"><a href="login.php?action=out&amp;id='.$pun_user['id'].'">'.$lang_common['Logout'].'</a>';
+		}
+		else
+		{
+			$links[] = '<li id="navsearch"><a href="search.php">'.$lang_common['Search'].'</a>';
+			$links[] = '<li id="navprofile"><a href="profile.php?id='.$pun_user['id'].'">'.$lang_common['Profile'].'</a>';
+			$links[] = '<li id="navadmin"><a href="admin_index.php">'.$lang_common['Admin'].'</a>';
+			$links[] = '<li id="navlogout"><a href="login.php?action=out&amp;id='.$pun_user['id'].'">'.$lang_common['Logout'].'</a>';
+		}
+	}
+
+	// Are there any additional navlinks we should insert into the array before imploding it?
+	if ($pun_config['o_additional_navlinks'] != '')
+	{
+		if (preg_match_all('#([0-9]+)\s*=\s*(.*?)\n#s', $pun_config['o_additional_navlinks']."\n", $extra_links))
+		{
+			// Insert any additional links into the $links array (at the correct index)
+			for ($i = 0; $i < count($extra_links[1]); ++$i)
+				array_splice($links, $extra_links[1][$i], 0, array('<li id="navextra'.($i + 1).'">'.$extra_links[2][$i]));
+		}
+	}
+
+	return '<ul>'."\n\t\t\t\t".implode($lang_common['Link separator'].'</li>'."\n\t\t\t\t", $links).'</li>'."\n\t\t\t".'</ul>';
 }
 
@@ -520,8 +308,8 @@
 					<li<?php if ($page == 'personal') echo ' class="isactive"'; ?>><a href="profile.php?section=personal&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section personal'] ?></a></li>
 					<li<?php if ($page == 'messaging') echo ' class="isactive"'; ?>><a href="profile.php?section=messaging&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section messaging'] ?></a></li>
-<?php if ($pun_config['o_avatars'] == '1' || $pun_config['o_signatures'] == '1'): ?>					<li<?php if ($page == 'personality') echo ' class="isactive"'; ?>><a href="profile.php?section=personality&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section personality'] ?></a></li>
-<?php endif; ?>					<li<?php if ($page == 'display') echo ' class="isactive"'; ?>><a href="profile.php?section=display&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section display'] ?></a></li>
+					<li<?php if ($page == 'personality') echo ' class="isactive"'; ?>><a href="profile.php?section=personality&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section personality'] ?></a></li>
+					<li<?php if ($page == 'display') echo ' class="isactive"'; ?>><a href="profile.php?section=display&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section display'] ?></a></li>
 					<li<?php if ($page == 'privacy') echo ' class="isactive"'; ?>><a href="profile.php?section=privacy&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section privacy'] ?></a></li>
-<?php if ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && $pun_user['g_mod_ban_users'] == '1')): ?>					<li<?php if ($page == 'admin') echo ' class="isactive"'; ?>><a href="profile.php?section=admin&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section admin'] ?></a></li>
+<?php if ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_ban_users'] == '1')): ?>					<li<?php if ($page == 'admin') echo ' class="isactive"'; ?>><a href="profile.php?section=admin&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Section admin'] ?></a></li>
 <?php endif; ?>				</ul>
 			</div>
@@ -534,111 +322,5 @@
 
 //
-// Outputs markup to display a user's avatar
-//
-function generate_avatar_markup($user_id)
-{
-	global $pun_config;
-
-	$filetypes = array('jpg', 'gif', 'png');
-	$avatar_markup = '';
-
-	foreach ($filetypes as $cur_type)
-	{
-		$path = $pun_config['o_avatars_dir'].'/'.$user_id.'.'.$cur_type;
-
-		if (file_exists(PUN_ROOT.$path) && $img_size = getimagesize(PUN_ROOT.$path))
-		{
-			$avatar_markup = '<img src="'.pun_htmlspecialchars(get_base_url(true).'/'.$path.'?m='.filemtime(PUN_ROOT.$path)).'" '.$img_size[3].' alt="" />';
-			break;
-		}
-	}
-
-	return $avatar_markup;
-}
-
-
-//
-// Generate browser's title
-//
-function generate_page_title($page_title, $p = null)
-{
-	global $pun_config, $lang_common;
-
-	$page_title = array_reverse($page_title);
-
-	if ($p != null)
-		$page_title[0] .= ' ('.sprintf($lang_common['Page'], forum_number_format($p)).')';
-
-	$crumbs = implode($lang_common['Title separator'], $page_title);
-
-	return $crumbs;
-}
-
-
-//
-// Save array of tracked topics in cookie
-//
-function set_tracked_topics($tracked_topics)
-{
-	global $cookie_name, $cookie_path, $cookie_domain, $cookie_secure, $pun_config;
-
-	$cookie_data = '';
-	if (!empty($tracked_topics))
-	{
-		// Sort the arrays (latest read first)
-		arsort($tracked_topics['topics'], SORT_NUMERIC);
-		arsort($tracked_topics['forums'], SORT_NUMERIC);
-
-		// Homebrew serialization (to avoid having to run unserialize() on cookie data)
-		foreach ($tracked_topics['topics'] as $id => $timestamp)
-			$cookie_data .= 't'.$id.'='.$timestamp.';';
-		foreach ($tracked_topics['forums'] as $id => $timestamp)
-			$cookie_data .= 'f'.$id.'='.$timestamp.';';
-
-		// Enforce a byte size limit (4096 minus some space for the cookie name - defaults to 4048)
-		if (strlen($cookie_data) > FORUM_MAX_COOKIE_SIZE)
-		{
-			$cookie_data = substr($cookie_data, 0, FORUM_MAX_COOKIE_SIZE);
-			$cookie_data = substr($cookie_data, 0, strrpos($cookie_data, ';')).';';
-		}
-	}
-
-	forum_setcookie($cookie_name.'_track', $cookie_data, time() + $pun_config['o_timeout_visit']);
-	$_COOKIE[$cookie_name.'_track'] = $cookie_data; // Set it directly in $_COOKIE as well
-}
-
-
-//
-// Extract array of tracked topics from cookie
-//
-function get_tracked_topics()
-{
-	global $cookie_name;
-
-	$cookie_data = isset($_COOKIE[$cookie_name.'_track']) ? $_COOKIE[$cookie_name.'_track'] : false;
-	if (!$cookie_data)
-		return array('topics' => array(), 'forums' => array());
-
-	if (strlen($cookie_data) > 4048)
-		return array('topics' => array(), 'forums' => array());
-
-	// Unserialize data from cookie
-	$tracked_topics = array('topics' => array(), 'forums' => array());
-	$temp = explode(';', $cookie_data);
-	foreach ($temp as $t)
-	{
-		$type = substr($t, 0, 1) == 'f' ? 'forums' : 'topics';
-		$id = intval(substr($t, 1));
-		$timestamp = intval(substr($t, strpos($t, '=') + 1));
-		if ($id > 0 && $timestamp > 0)
-			$tracked_topics[$type][$id] = $timestamp;
-	}
-
-	return $tracked_topics;
-}
-
-
-//
-// Update posts, topics, last_post, last_post_id and last_poster for a forum
+// Update posts, topics, last_post, last_post_id and last_poster for a forum (redirect topics are not included)
 //
 function update_forum($forum_id)
@@ -646,36 +328,18 @@
 	global $db;
 
-	$result = $db->query('SELECT COUNT(id), SUM(num_replies) FROM '.$db->prefix.'topics WHERE forum_id='.$forum_id) or error('Unable to fetch forum topic count', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT COUNT(id), SUM(num_replies) FROM '.$db->prefix.'topics WHERE moved_to IS NULL AND forum_id='.$forum_id) or error('Impossible de retrouver le total de discussions du forum', __FILE__, __LINE__, $db->error());
 	list($num_topics, $num_posts) = $db->fetch_row($result);
 
-	$num_posts = $num_posts + $num_topics; // $num_posts is only the sum of all replies (we have to add the topic posts)
-
-	$result = $db->query('SELECT last_post, last_post_id, last_poster FROM '.$db->prefix.'topics WHERE forum_id='.$forum_id.' AND moved_to IS NULL ORDER BY last_post DESC LIMIT 1') or error('Unable to fetch last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
-	if ($db->num_rows($result)) // There are topics in the forum
+	$num_posts = $num_posts + $num_topics;		// $num_posts is only the sum of all replies (we have to add the topic posts)
+
+	$result = $db->query('SELECT last_post, last_post_id, last_poster FROM '.$db->prefix.'topics WHERE forum_id='.$forum_id.' AND moved_to IS NULL ORDER BY last_post DESC LIMIT 1') or error('Impossible de retrouver last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
+	if ($db->num_rows($result))		// There are topics in the forum
 	{
 		list($last_post, $last_post_id, $last_poster) = $db->fetch_row($result);
 
-		$db->query('UPDATE '.$db->prefix.'forums SET num_topics='.$num_topics.', num_posts='.$num_posts.', last_post='.$last_post.', last_post_id='.$last_post_id.', last_poster=\''.$db->escape($last_poster).'\' WHERE id='.$forum_id) or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
-	}
-	else // There are no topics
-		$db->query('UPDATE '.$db->prefix.'forums SET num_topics='.$num_topics.', num_posts='.$num_posts.', last_post=NULL, last_post_id=NULL, last_poster=NULL WHERE id='.$forum_id) or error('Unable to update last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
-}
-
-
-//
-// Deletes any avatars owned by the specified user ID
-//
-function delete_avatar($user_id)
-{
-	global $pun_config;
-
-	$filetypes = array('jpg', 'gif', 'png');
-
-	// Delete user avatar
-	foreach ($filetypes as $cur_type)
-	{
-		if (file_exists(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$user_id.'.'.$cur_type))
-			@unlink(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$user_id.'.'.$cur_type);
-	}
+		$db->query('UPDATE '.$db->prefix.'forums SET num_topics='.$num_topics.', num_posts='.$num_posts.', last_post='.$last_post.', last_post_id='.$last_post_id.', last_poster=\''.$db->escape($last_poster).'\' WHERE id='.$forum_id) or error('Impossible de mettre Ã  jour last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
+	}
+	else	// There are no topics
+		$db->query('UPDATE '.$db->prefix.'forums SET num_topics=0, num_posts=0, last_post=NULL, last_post_id=NULL, last_poster=NULL WHERE id='.$forum_id) or error('Impossible de mettre Ã  jour last_post/last_post_id/last_poster', __FILE__, __LINE__, $db->error());
 }
 
@@ -689,13 +353,13 @@
 
 	// Delete the topic and any redirect topics
-	$db->query('DELETE FROM '.$db->prefix.'topics WHERE id='.$topic_id.' OR moved_to='.$topic_id) or error('Unable to delete topic', __FILE__, __LINE__, $db->error());
-
-	// Create a list of the post IDs in this topic
+	$db->query('DELETE FROM '.$db->prefix.'topics WHERE id='.$topic_id.' OR moved_to='.$topic_id) or error('Impossible de supprimer le sujet', __FILE__, __LINE__, $db->error());
+
+	// Create a list of the post ID's in this topic
 	$post_ids = '';
-	$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id) or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id) or error('Impossible de retrouver les messages', __FILE__, __LINE__, $db->error());
 	while ($row = $db->fetch_row($result))
 		$post_ids .= ($post_ids != '') ? ','.$row[0] : $row[0];
 
-	// Make sure we have a list of post IDs
+	// Make sure we have a list of post ID's
 	if ($post_ids != '')
 	{
@@ -703,9 +367,9 @@
 
 		// Delete posts in topic
-		$db->query('DELETE FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id) or error('Unable to delete posts', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id) or error('Impossible de supprimer les messages', __FILE__, __LINE__, $db->error());
 	}
 
 	// Delete any subscriptions for this topic
-	$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE topic_id='.$topic_id) or error('Unable to delete subscriptions', __FILE__, __LINE__, $db->error());
+	$db->query('DELETE FROM '.$db->prefix.'subscriptions WHERE topic_id='.$topic_id) or error('Impossible de supprimer l\'abonnement', __FILE__, __LINE__, $db->error());
 }
 
@@ -718,15 +382,15 @@
 	global $db;
 
-	$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id.' ORDER BY id DESC LIMIT 2') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id.' ORDER BY id DESC LIMIT 2') or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
 	list($last_id, ,) = $db->fetch_row($result);
 	list($second_last_id, $second_poster, $second_posted) = $db->fetch_row($result);
 
 	// Delete the post
-	$db->query('DELETE FROM '.$db->prefix.'posts WHERE id='.$post_id) or error('Unable to delete post', __FILE__, __LINE__, $db->error());
+	$db->query('DELETE FROM '.$db->prefix.'posts WHERE id='.$post_id) or error('Impossible de supprimer le message', __FILE__, __LINE__, $db->error());
 
 	strip_search_index($post_id);
 
 	// Count number of replies in the topic
-	$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id) or error('Unable to fetch post count for topic', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'posts WHERE topic_id='.$topic_id) or error('Impossible de retrouver le total de messages pour la discussion', __FILE__, __LINE__, $db->error());
 	$num_replies = $db->result($result, 0) - 1;
 
@@ -736,27 +400,12 @@
 		// If there is a $second_last_id there is more than 1 reply to the topic
 		if (!empty($second_last_id))
-			$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$second_posted.', last_post_id='.$second_last_id.', last_poster=\''.$db->escape($second_poster).'\', num_replies='.$num_replies.' WHERE id='.$topic_id) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$second_posted.', last_post_id='.$second_last_id.', last_poster=\''.$db->escape($second_poster).'\', num_replies='.$num_replies.' WHERE id='.$topic_id) or error('Impossible de mettre Ã  jour la discussion', __FILE__, __LINE__, $db->error());
 		else
 			// We deleted the only reply, so now last_post/last_post_id/last_poster is posted/id/poster from the topic itself
-			$db->query('UPDATE '.$db->prefix.'topics SET last_post=posted, last_post_id=id, last_poster=poster, num_replies='.$num_replies.' WHERE id='.$topic_id) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'topics SET last_post=posted, last_post_id=id, last_poster=poster, num_replies='.$num_replies.' WHERE id='.$topic_id) or error('Impossible de mettre Ã  jour la discussion', __FILE__, __LINE__, $db->error());
 	}
 	else
 		// Otherwise we just decrement the reply counter
-		$db->query('UPDATE '.$db->prefix.'topics SET num_replies='.$num_replies.' WHERE id='.$topic_id) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
-}
-
-
-//
-// Delete every .php file in the forum's cache directory
-//
-function forum_clear_cache()
-{
-	$d = dir(FORUM_CACHE_DIR);
-	while (($entry = $d->read()) !== false)
-	{
-		if (substr($entry, -4) == '.php')
-			@unlink(FORUM_CACHE_DIR.$entry);
-	}
-	$d->close();
+		$db->query('UPDATE '.$db->prefix.'topics SET num_replies='.$num_replies.' WHERE id='.$topic_id) or error('Impossible de mettre Ã  jour la discussion', __FILE__, __LINE__, $db->error());
 }
 
@@ -773,19 +422,17 @@
 	if (!isset($search_for))
 	{
-		if (file_exists(FORUM_CACHE_DIR.'cache_censoring.php'))
-			include FORUM_CACHE_DIR.'cache_censoring.php';
-
-		if (!defined('PUN_CENSOR_LOADED'))
-		{
-			if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-				require PUN_ROOT.'include/cache.php';
-
-			generate_censoring_cache();
-			require FORUM_CACHE_DIR.'cache_censoring.php';
+		$result = $db->query('SELECT search_for, replace_with FROM '.$db->prefix.'censoring') or error('Impossible de retrouver la liste des mots Ã  censurer', __FILE__, __LINE__, $db->error());
+		$num_words = $db->num_rows($result);
+
+		$search_for = array();
+		for ($i = 0; $i < $num_words; ++$i)
+		{
+			list($search_for[$i], $replace_with[$i]) = $db->fetch_row($result);
+			$search_for[$i] = '/\b('.str_replace('\*', '\w*?', preg_quote($search_for[$i], '/')).')\b/i';
 		}
 	}
 
 	if (!empty($search_for))
-		$text = substr(ucp_preg_replace($search_for, $replace_with, ' '.$text.' '), 1, -1);
+		$text = substr(preg_replace($search_for, $replace_with, ' '.$text.' '), 1, -1);
 
 	return $text;
@@ -812,16 +459,12 @@
 
 	// If not already loaded in a previous call, load the cached ranks
-	if ($pun_config['o_ranks'] == '1' && !defined('PUN_RANKS_LOADED'))
-	{
-		if (file_exists(FORUM_CACHE_DIR.'cache_ranks.php'))
-			include FORUM_CACHE_DIR.'cache_ranks.php';
-
+	if ($pun_config['o_ranks'] == '1' && empty($pun_ranks))
+	{
+		@include PUN_ROOT.'cache/cache_ranks.php';
 		if (!defined('PUN_RANKS_LOADED'))
 		{
-			if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-				require PUN_ROOT.'include/cache.php';
-
+			require_once PUN_ROOT.'include/cache.php';
 			generate_ranks_cache();
-			require FORUM_CACHE_DIR.'cache_ranks.php';
+			require PUN_ROOT.'cache/cache_ranks.php';
 		}
 	}
@@ -844,7 +487,8 @@
 		if ($pun_config['o_ranks'] == '1' && !empty($pun_ranks))
 		{
-			foreach ($pun_ranks as $cur_rank)
+			@reset($pun_ranks);
+			while (list(, $cur_rank) = @each($pun_ranks))
 			{
-				if ($user['num_posts'] >= $cur_rank['min_posts'])
+				if (intval($user['num_posts']) >= $cur_rank['min_posts'])
 					$user_title = pun_htmlspecialchars($cur_rank['rank']);
 			}
@@ -863,8 +507,6 @@
 // Generate a string with numbered links (for multipage scripts)
 //
-function paginate($num_pages, $cur_page, $link)
-{
-	global $lang_common;
-
+function paginate($num_pages, $cur_page, $link_to)
+{
 	$pages = array();
 	$link_to_all = false;
@@ -878,44 +520,36 @@
 
 	if ($num_pages <= 1)
-		$pages = array('<strong class="item1">1</strong>');
+		$pages = array('<strong>1</strong>');
 	else
 	{
-		// Add a previous page link
-		if ($num_pages > 1 && $cur_page > 1)
-			$pages[] = '<a'.(empty($pages) ? ' class="item1"' : '').' href="'.$link.'&amp;p='.($cur_page - 1).'">'.$lang_common['Previous'].'</a>';
-
 		if ($cur_page > 3)
 		{
-			$pages[] = '<a'.(empty($pages) ? ' class="item1"' : '').' href="'.$link.'&amp;p=1">1</a>';
-
-			if ($cur_page > 5)
-				$pages[] = '<span class="spacer">'.$lang_common['Spacer'].'</span>';
+			$pages[] = '<a href="'.$link_to.'&amp;p=1">1</a>';
+
+			if ($cur_page != 4)
+				$pages[] = '&hellip;';
 		}
 
 		// Don't ask me how the following works. It just does, OK? :-)
-		for ($current = ($cur_page == 5) ? $cur_page - 3 : $cur_page - 2, $stop = ($cur_page + 4 == $num_pages) ? $cur_page + 4 : $cur_page + 3; $current < $stop; ++$current)
+		for ($current = $cur_page - 2, $stop = $cur_page + 3; $current < $stop; ++$current)
 		{
 			if ($current < 1 || $current > $num_pages)
 				continue;
 			else if ($current != $cur_page || $link_to_all)
-				$pages[] = '<a'.(empty($pages) ? ' class="item1"' : '').' href="'.$link.'&amp;p='.$current.'">'.forum_number_format($current).'</a>';
+				$pages[] = '<a href="'.$link_to.'&amp;p='.$current.'">'.$current.'</a>';
 			else
-				$pages[] = '<strong'.(empty($pages) ? ' class="item1"' : '').'>'.forum_number_format($current).'</strong>';
+				$pages[] = '<strong>'.$current.'</strong>';
 		}
 
 		if ($cur_page <= ($num_pages-3))
 		{
-			if ($cur_page != ($num_pages-3) && $cur_page != ($num_pages-4))
-				$pages[] = '<span class="spacer">'.$lang_common['Spacer'].'</span>';
-
-			$pages[] = '<a'.(empty($pages) ? ' class="item1"' : '').' href="'.$link.'&amp;p='.$num_pages.'">'.forum_number_format($num_pages).'</a>';
-		}
-
-		// Add a next page link
-		if ($num_pages > 1 && !$link_to_all && $cur_page < $num_pages)
-			$pages[] = '<a'.(empty($pages) ? ' class="item1"' : '').' href="'.$link.'&amp;p='.($cur_page +1).'">'.$lang_common['Next'].'</a>';
-	}
-
-	return implode(' ', $pages);
+			if ($cur_page != ($num_pages-3))
+				$pages[] = '&hellip;';
+
+			$pages[] = '<a href="'.$link_to.'&amp;p='.$num_pages.'">'.$num_pages.'</a>';
+		}
+	}
+
+	return implode('&#160;', $pages);
 }
 
@@ -926,10 +560,12 @@
 function message($message, $no_back_link = false)
 {
-	global $db, $lang_common, $pun_config, $pun_start, $tpl_main, $pun_user;
+
+	global $db, $lang_common, $pun_config, $pun_start, $tpl_main, $env;
 
 	if (!defined('PUN_HEADER'))
 	{
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Info']);
-		define('PUN_ACTIVE_PAGE', 'index');
+		global $pun_user;
+
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Info'];
 		require PUN_ROOT.'header.php';
 	}
@@ -941,6 +577,6 @@
 	<div class="box">
 		<div class="inbox">
-			<p><?php echo $message ?></p>
-<?php if (!$no_back_link): ?>			<p><a href="javascript: history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+		<p><?php echo $message ?></p>
+<?php if (!$no_back_link): ?>		<p><a href="javascript: history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 <?php endif; ?>		</div>
 	</div>
@@ -953,241 +589,148 @@
 
 //
-// Format a time string according to $time_format and time zones
-//
-function format_time($timestamp, $date_only = false, $date_format = null, $time_format = null, $time_only = false, $no_text = false)
-{
-	global $pun_config, $lang_common, $pun_user, $forum_date_formats, $forum_time_formats;
+// Format a time string according to $time_format and timezones
+//
+function format_time($timestamp, $date_only = false)
+{
+	global $pun_config, $lang_common, $pun_user;
 
 	if ($timestamp == '')
 		return $lang_common['Never'];
 
-	$diff = ($pun_user['timezone'] + $pun_user['dst']) * 3600;
+	$diff = ($pun_user['timezone'] - $pun_config['o_server_timezone']) * 3600;
 	$timestamp += $diff;
 	$now = time();
 
-	if($date_format == null)
-		$date_format = $forum_date_formats[$pun_user['date_format']];
-
-	if($time_format == null)
-		$time_format = $forum_time_formats[$pun_user['time_format']];
-
-	$date = gmdate($date_format, $timestamp);
-	$today = gmdate($date_format, $now+$diff);
-	$yesterday = gmdate($date_format, $now+$diff-86400);
-
-	if(!$no_text)
-	{
-		if ($date == $today)
-			$date = $lang_common['Today'];
-		else if ($date == $yesterday)
-			$date = $lang_common['Yesterday'];
-	}
-
-	if ($date_only)
+	$date = date($pun_config['o_date_format'], $timestamp);
+	$today = date($pun_config['o_date_format'], $now+$diff);
+	$yesterday = date($pun_config['o_date_format'], $now+$diff-86400);
+
+	if ($date == $today)
+		$date = $lang_common['Today'];
+	else if ($date == $yesterday)
+		$date = $lang_common['Yesterday'];
+
+	if (!$date_only)
+		return $date.' '.date($pun_config['o_time_format'], $timestamp);
+	else
 		return $date;
-	else if ($time_only)
-		return gmdate($time_format, $timestamp);
+}
+
+
+//
+// If we are running pre PHP 4.3.0, we add our own implementation of file_get_contents
+//
+if (!function_exists('file_get_contents'))
+{
+	function file_get_contents($filename, $use_include_path = 0)
+	{
+		$data = '';
+
+		if ($fh = fopen($filename, 'rb', $use_include_path))
+		{
+			$data = fread($fh, filesize($filename));
+			fclose($fh);
+		}
+
+		return $data;
+	}
+}
+
+
+//
+// Make sure that HTTP_REFERER matches $pun_config['o_base_url']/$script
+//
+function confirm_referrer($script)
+{
+	global $pun_config, $lang_common;
+
+	if (!preg_match('#^'.preg_quote(str_replace('www.', '', $pun_config['o_base_url']).'/'.$script, '#').'#i', str_replace('www.', '', (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''))))
+		message($lang_common['Bad referrer']);
+}
+
+
+//
+// Generate a random password of length $len
+//
+function random_pass($len)
+{
+	$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+
+	$password = '';
+	for ($i = 0; $i < $len; ++$i)
+		$password .= substr($chars, (mt_rand() % strlen($chars)), 1);
+
+	return $password;
+}
+
+
+//
+// Compute a hash of $str
+// Uses sha1() if available. If not, SHA1 through mhash() if available. If not, fall back on md5().
+//
+function pun_hash($str)
+{
+	if (function_exists('sha1'))	// Only in PHP 4.3.0+
+		return sha1($str);
+	else if (function_exists('mhash'))	// Only if Mhash library is loaded
+		return bin2hex(mhash(MHASH_SHA1, $str));
 	else
-		return $date.' '.gmdate($time_format, $timestamp);
-}
-
-
-//
-// A wrapper for PHP's number_format function
-//
-function forum_number_format($number, $decimals = 0)
+		return md5($str);
+}
+
+
+//
+// Try to determine the correct remote IP-address
+//
+function get_remote_address()
+{
+	return $_SERVER['REMOTE_ADDR'];
+}
+
+
+//
+// Equivalent to htmlspecialchars(), but allows &#[0-9]+ (for unicode)
+//
+function pun_htmlspecialchars($str)
+{
+	$str = preg_replace('/&(?!#[0-9]+;)/s', '&amp;', $str);
+	$str = str_replace(array('<', '>', '"'), array('&lt;', '&gt;', '&quot;'), $str);
+
+	return $str;
+}
+
+
+//
+// Equivalent to strlen(), but counts &#[0-9]+ as one character (for unicode)
+//
+function pun_strlen($str)
+{
+	return strlen(preg_replace('/&#([0-9]+);/', '!', $str));
+}
+
+
+//
+// Convert \r\n and \r to \n
+//
+function pun_linebreaks($str)
+{
+	return str_replace("\r", "\n", str_replace("\r\n", "\n", $str));
+}
+
+
+//
+// A more aggressive version of trim()
+//
+function pun_trim($str)
 {
 	global $lang_common;
 
-	return is_numeric($number) ? number_format($number, $decimals, $lang_common['lang_decimal_point'], $lang_common['lang_thousands_sep']) : $number;
-}
-
-
-//
-// Generate a random key of length $len
-//
-function random_key($len, $readable = false, $hash = false)
-{
-	$key = '';
-
-	if ($hash)
-		$key = substr(pun_hash(uniqid(rand(), true)), 0, $len);
-	else if ($readable)
-	{
-		$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-
-		for ($i = 0; $i < $len; ++$i)
-			$key .= substr($chars, (mt_rand() % strlen($chars)), 1);
+	if (strpos($lang_common['lang_encoding'], '8859') !== false)
+	{
+		$fishy_chars = array(chr(0x81), chr(0x8D), chr(0x8F), chr(0x90), chr(0x9D), chr(0xA0));
+		return trim(str_replace($fishy_chars, ' ', $str));
 	}
 	else
-	{
-		for ($i = 0; $i < $len; ++$i)
-			$key .= chr(mt_rand(33, 126));
-	}
-
-	return $key;
-}
-
-
-//
-// Make sure that HTTP_REFERER matches base_url/script
-//
-function confirm_referrer($script, $error_msg = false)
-{
-	global $pun_config, $lang_common;
-
-	// There is no referrer
-	if (empty($_SERVER['HTTP_REFERER']))
-		message($error_msg ? $error_msg : $lang_common['Bad referrer']);
-
-	$referrer = parse_url(strtolower($_SERVER['HTTP_REFERER']));
-	// Remove www subdomain if it exists
-	if (strpos($referrer['host'], 'www.') === 0)
-		$referrer['host'] = substr($referrer['host'], 4);
-
-	$valid = parse_url(strtolower(get_base_url().'/'.$script));
-	// Remove www subdomain if it exists
-	if (strpos($valid['host'], 'www.') === 0)
-		$valid['host'] = substr($valid['host'], 4);
-
-	// Check the host and path match. Ignore the scheme, port, etc.
-	if ($referrer['host'] != $valid['host'] || $referrer['path'] != $valid['path'])
-		message($error_msg ? $error_msg : $lang_common['Bad referrer']);
-}
-
-
-//
-// Generate a random password of length $len
-// Compatibility wrapper for random_key
-//
-function random_pass($len)
-{
-	return random_key($len, true);
-}
-
-
-//
-// Compute a hash of $str
-//
-function pun_hash($str)
-{
-	return sha1($str);
-}
-
-
-//
-// Try to determine the correct remote IP-address
-//
-function get_remote_address()
-{
-	$remote_addr = $_SERVER['REMOTE_ADDR'];
-
-	// If we are behind a reverse proxy try to find the real users IP
-	if (defined('FORUM_BEHIND_REVERSE_PROXY'))
-	{
-		if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
-		{
-			// The general format of the field is:
-			// X-Forwarded-For: client1, proxy1, proxy2
-			// where the value is a comma+space separated list of IP addresses, the left-most being the farthest downstream client,
-			// and each successive proxy that passed the request adding the IP address where it received the request from.
-			$forwarded_for = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
-			$forwarded_for = trim($forwarded_for[0]);
-
-			if (@preg_match('%^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$%', $forwarded_for) || @preg_match('%^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$%', $forwarded_for))
-				$remote_addr = $forwarded_for;
-		}
-	}
-
-	return $remote_addr;
-}
-
-
-//
-// Calls htmlspecialchars with a few options already set
-//
-function pun_htmlspecialchars($str)
-{
-	return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
-}
-
-
-//
-// Calls htmlspecialchars_decode with a few options already set
-//
-function pun_htmlspecialchars_decode($str)
-{
-	if (function_exists('htmlspecialchars_decode'))
-		return htmlspecialchars_decode($str, ENT_QUOTES);
-
-	static $translations;
-	if (!isset($translations))
-	{
-		$translations = get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES);
-		$translations['&#039;'] = '\''; // get_html_translation_table doesn't include &#039; which is what htmlspecialchars translates ' to, but apparently that is okay?! http://bugs.php.net/bug.php?id=25927
-		$translations = array_flip($translations);
-	}
-
-	return strtr($str, $translations);
-}
-
-
-//
-// A wrapper for utf8_strlen for compatibility
-//
-function pun_strlen($str)
-{
-	return utf8_strlen($str);
-}
-
-
-//
-// Convert \r\n and \r to \n
-//
-function pun_linebreaks($str)
-{
-	return str_replace("\r", "\n", str_replace("\r\n", "\n", $str));
-}
-
-
-//
-// A wrapper for utf8_trim for compatibility
-//
-function pun_trim($str, $charlist = false)
-{
-	return utf8_trim($str, $charlist);
-}
-
-//
-// Checks if a string is in all uppercase
-//
-function is_all_uppercase($string)
-{
-	return utf8_strtoupper($string) == $string && utf8_strtolower($string) != $string;
-}
-
-
-//
-// Inserts $element into $input at $offset
-// $offset can be either a numerical offset to insert at (eg: 0 inserts at the beginning of the array)
-// or a string, which is the key that the new element should be inserted before
-// $key is optional: it's used when inserting a new key/value pair into an associative array
-//
-function array_insert(&$input, $offset, $element, $key = null)
-{
-	if ($key == null)
-		$key = $offset;
-
-	// Determine the proper offset if we're using a string
-	if (!is_int($offset))
-		$offset = array_search($offset, array_keys($input), true);
-
-	// Out of bounds checks
-	if ($offset > count($input))
-		$offset = count($input);
-	else if ($offset < 0)
-		$offset = 0;
-
-	$input = array_merge(array_slice($input, 0, $offset), array($key => $element), array_slice($input, $offset));
+		return trim($str);
 }
 
@@ -1199,13 +742,4 @@
 {
 	global $db, $pun_config, $lang_common, $pun_user;
-
-	// Send no-cache headers
-	header('Expires: Thu, 21 Jul 1977 07:30:00 GMT'); // When yours truly first set eyes on this world! :)
-	header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: post-check=0, pre-check=0', false);
-	header('Pragma: no-cache'); // For HTTP/1.0 compatibility
-
-	// Send the Content-type header in case the web server is setup to send something else
-	header('Content-type: text/html; charset=utf-8');
 
 	// Deal with newlines, tabs and multiple spaces
@@ -1214,42 +748,7 @@
 	$message = str_replace($pattern, $replace, $pun_config['o_maintenance_message']);
 
-	if (file_exists(PUN_ROOT.'style/'.$pun_user['style'].'/maintenance.tpl'))
-	{
-		$tpl_file = PUN_ROOT.'style/'.$pun_user['style'].'/maintenance.tpl';
-		$tpl_inc_dir = PUN_ROOT.'style/'.$pun_user['style'].'/';
-	}
-	else
-	{
-		$tpl_file = PUN_ROOT.'include/template/maintenance.tpl';
-		$tpl_inc_dir = PUN_ROOT.'include/user/';
-	}
-
-	$tpl_maint = file_get_contents($tpl_file);
-
-	// START SUBST - <pun_include "*">
-	preg_match_all('%<pun_include "([^/\\\\]*?)\.(php[45]?|inc|html?|txt)">%i', $tpl_maint, $pun_includes, PREG_SET_ORDER);
-
-	foreach ($pun_includes as $cur_include)
-	{
-		ob_start();
-
-		// Allow for overriding user includes, too.
-		if (file_exists($tpl_inc_dir.$cur_include[1].'.'.$cur_include[2]))
-			require $tpl_inc_dir.$cur_include[1].'.'.$cur_include[2];
-		else if (file_exists(PUN_ROOT.'include/user/'.$cur_include[1].'.'.$cur_include[2]))
-			require PUN_ROOT.'include/user/'.$cur_include[1].'.'.$cur_include[2];
-		else
-			error(sprintf($lang_common['Pun include error'], htmlspecialchars($cur_include[0]), basename($tpl_file)));
-
-		$tpl_temp = ob_get_contents();
-		$tpl_maint = str_replace($cur_include[0], $tpl_temp, $tpl_maint);
-		ob_end_clean();
-	}
-	// END SUBST - <pun_include "*">
-
-
-	// START SUBST - <pun_language>
-	$tpl_maint = str_replace('<pun_language>', $lang_common['lang_identifier'], $tpl_maint);
-	// END SUBST - <pun_language>
+
+	// Load the maintenance template
+	$tpl_maint = trim(file_get_contents(PUN_ROOT.'include/template/maintenance.tpl'));
 
 
@@ -1259,11 +758,14 @@
 
 
+	// START SUBST - <pun_char_encoding>
+	$tpl_maint = str_replace('<pun_char_encoding>', $lang_common['lang_encoding'], $tpl_maint);
+	// END SUBST - <pun_char_encoding>
+
+
 	// START SUBST - <pun_head>
 	ob_start();
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Maintenance']);
-
 ?>
-<title><?php echo generate_page_title($page_title) ?></title>
+<title><?php echo pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Maintenance'] ?></title>
 <link rel="stylesheet" type="text/css" href="style/<?php echo $pun_user['style'].'.css' ?>" />
 <?php
@@ -1275,22 +777,12 @@
 
 
-	// START SUBST - <pun_maint_main>
-	ob_start();
-
-?>
-<div class="block">
-	<h2><?php echo $lang_common['Maintenance'] ?></h2>
-	<div class="box">
-		<div class="inbox">
-			<p><?php echo $message ?></p>
-		</div>
-	</div>
-</div>
-<?php
-
-	$tpl_temp = trim(ob_get_contents());
-	$tpl_maint = str_replace('<pun_maint_main>', $tpl_temp, $tpl_maint);
-	ob_end_clean();
-	// END SUBST - <pun_maint_main>
+	// START SUBST - <pun_maint_heading>
+	$tpl_maint = str_replace('<pun_maint_heading>', $lang_common['Maintenance'], $tpl_maint);
+	// END SUBST - <pun_maint_heading>
+
+
+	// START SUBST - <pun_maint_message>
+	$tpl_maint = str_replace('<pun_maint_message>', $message, $tpl_maint);
+	// END SUBST - <pun_maint_message>
 
 
@@ -1299,4 +791,19 @@
 
 
+	// START SUBST - <pun_include "*">
+	while (preg_match('#<pun_include "([^/\\\\]*?)">#', $tpl_maint, $cur_include))
+	{
+		if (!file_exists(PUN_ROOT.'include/user/'.$cur_include[1]))
+	 	   error('Impossible de procÃ©der Ã  l\'inclusion utilisateur &lt;pun_include "'.htmlspecialchars($cur_include[1]).'"&gt; depuis le template main.tpl. Il n\'y a pas de fichier dans le rÃ©pertoire /include/user/');
+
+		ob_start();
+		include PUN_ROOT.'include/user/'.$cur_include[1];
+		$tpl_temp = ob_get_contents();
+		$tpl_redir = str_replace($cur_include[0], $tpl_temp, $tpl_redir);
+	    ob_end_clean();
+	}
+	// END SUBST - <pun_include "*">
+
+
 	// Close the db connection (and free up any result data)
 	$db->close();
@@ -1313,10 +820,6 @@
 	global $db, $pun_config, $lang_common, $pun_user;
 
-	// Prefix with base_url (unless there's already a valid URI)
-	if (strpos($destination_url, 'http://') !== 0 && strpos($destination_url, 'https://') !== 0 && strpos($destination_url, '/') !== 0)
-		$destination_url = get_base_url(true).'/'.$destination_url;
-
-	// Do a little spring cleaning
-	$destination_url = preg_replace('%([\r\n])|(\%0[ad])|(;\s*data\s*:)%i', '', $destination_url);
+	if ($destination_url == '')
+		$destination_url = 'index.php';
 
 	// If the delay is 0 seconds, we might as well skip the redirect all together
@@ -1324,51 +827,7 @@
 		header('Location: '.str_replace('&amp;', '&', $destination_url));
 
-	// Send no-cache headers
-	header('Expires: Thu, 21 Jul 1977 07:30:00 GMT'); // When yours truly first set eyes on this world! :)
-	header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: post-check=0, pre-check=0', false);
-	header('Pragma: no-cache'); // For HTTP/1.0 compatibility
-
-	// Send the Content-type header in case the web server is setup to send something else
-	header('Content-type: text/html; charset=utf-8');
-
-	if (file_exists(PUN_ROOT.'style/'.$pun_user['style'].'/redirect.tpl'))
-	{
-		$tpl_file = PUN_ROOT.'style/'.$pun_user['style'].'/redirect.tpl';
-		$tpl_inc_dir = PUN_ROOT.'style/'.$pun_user['style'].'/';
-	}
-	else
-	{
-		$tpl_file = PUN_ROOT.'include/template/redirect.tpl';
-		$tpl_inc_dir = PUN_ROOT.'include/user/';
-	}
-
-	$tpl_redir = file_get_contents($tpl_file);
-
-	// START SUBST - <pun_include "*">
-	preg_match_all('%<pun_include "([^/\\\\]*?)\.(php[45]?|inc|html?|txt)">%i', $tpl_redir, $pun_includes, PREG_SET_ORDER);
-
-	foreach ($pun_includes as $cur_include)
-	{
-		ob_start();
-
-		// Allow for overriding user includes, too.
-		if (file_exists($tpl_inc_dir.$cur_include[1].'.'.$cur_include[2]))
-			require $tpl_inc_dir.$cur_include[1].'.'.$cur_include[2];
-		else if (file_exists(PUN_ROOT.'include/user/'.$cur_include[1].'.'.$cur_include[2]))
-			require PUN_ROOT.'include/user/'.$cur_include[1].'.'.$cur_include[2];
-		else
-			error(sprintf($lang_common['Pun include error'], htmlspecialchars($cur_include[0]), basename($tpl_file)));
-
-		$tpl_temp = ob_get_contents();
-		$tpl_redir = str_replace($cur_include[0], $tpl_temp, $tpl_redir);
-		ob_end_clean();
-	}
-	// END SUBST - <pun_include "*">
-
-
-	// START SUBST - <pun_language>
-	$tpl_redir = str_replace('<pun_language>', $lang_common['lang_identifier'], $tpl_redir);
-	// END SUBST - <pun_language>
+
+	// Load the redirect template
+	$tpl_redir = trim(file_get_contents(PUN_ROOT.'include/template/redirect.tpl'));
 
 
@@ -1378,12 +837,15 @@
 
 
+	// START SUBST - <pun_char_encoding>
+	$tpl_redir = str_replace('<pun_char_encoding>', $lang_common['lang_encoding'], $tpl_redir);
+	// END SUBST - <pun_char_encoding>
+
+
 	// START SUBST - <pun_head>
 	ob_start();
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Redirecting']);
-
 ?>
 <meta http-equiv="refresh" content="<?php echo $pun_config['o_redirect_delay'] ?>;URL=<?php echo str_replace(array('<', '>', '"'), array('&lt;', '&gt;', '&quot;'), $destination_url) ?>" />
-<title><?php echo generate_page_title($page_title) ?></title>
+<title><?php echo pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Redirecting'] ?></title>
 <link rel="stylesheet" type="text/css" href="style/<?php echo $pun_user['style'].'.css' ?>" />
 <?php
@@ -1395,22 +857,13 @@
 
 
-	// START SUBST - <pun_redir_main>
-	ob_start();
-
-?>
-<div class="block">
-	<h2><?php echo $lang_common['Redirecting'] ?></h2>
-	<div class="box">
-		<div class="inbox">
-			<p><?php echo $message.'<br /><br /><a href="'.$destination_url.'">'.$lang_common['Click redirect'].'</a>' ?></p>
-		</div>
-	</div>
-</div>
-<?php
-
-	$tpl_temp = trim(ob_get_contents());
-	$tpl_redir = str_replace('<pun_redir_main>', $tpl_temp, $tpl_redir);
-	ob_end_clean();
-	// END SUBST - <pun_redir_main>
+	// START SUBST - <pun_redir_heading>
+	$tpl_redir = str_replace('<pun_redir_heading>', $lang_common['Redirecting'], $tpl_redir);
+	// END SUBST - <pun_redir_heading>
+
+
+	// START SUBST - <pun_redir_text>
+	$tpl_temp = $message.'<br /><br />'.'<a href="'.$destination_url.'">'.$lang_common['Click redirect'].'</a>';
+	$tpl_redir = str_replace('<pun_redir_text>', $tpl_temp, $tpl_redir);
+	// END SUBST - <pun_redir_text>
 
 
@@ -1431,4 +884,16 @@
 
 
+	// START SUBST - <pun_include "*">
+	while (preg_match('<pun_include "(.*?)">', $tpl_redir, $cur_include))
+	{
+		ob_start();
+		include PUN_ROOT.$cur_include[1];
+		$tpl_temp = ob_get_contents();
+		$tpl_redir = str_replace('<'.$cur_include[0].'>', $tpl_temp, $tpl_redir);
+	    ob_end_clean();
+	}
+	// END SUBST - <pun_include "*">
+
+
 	// Close the db connection (and free up any result data)
 	$db->close();
@@ -1441,49 +906,25 @@
 // Display a simple error message
 //
-function error($message, $file = null, $line = null, $db_error = false)
-{
-	global $pun_config, $lang_common;
-
-	// Set some default settings if the script failed before $pun_config could be populated
+function error($message, $file, $line, $db_error = false)
+{
+	global $pun_config;
+
+	// Set a default title if the script failed before $pun_config could be populated
 	if (empty($pun_config))
-	{
-		$pun_config = array(
-			'o_board_title'	=> 'FluxBB',
-			'o_gzip'		=> '0'
-		);
-	}
-
-	// Set some default translations if the script failed before $lang_common could be populated
-	if (empty($lang_common))
-	{
-		$lang_common = array(
-			'Title separator'	=> ' / ',
-			'Page'				=> 'Page %s'
-		);
-	}
-
-	// Empty all output buffers and stop buffering
-	while (@ob_end_clean());
+		$pun_config['o_board_title'] = 'PunBB';
+
+	// Empty output buffer and stop buffering
+	@ob_end_clean();
 
 	// "Restart" output buffering if we are using ob_gzhandler (since the gzip header is already sent)
-	if ($pun_config['o_gzip'] && extension_loaded('zlib'))
+	if (!empty($pun_config['o_gzip']) && extension_loaded('zlib') && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false || strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') !== false))
 		ob_start('ob_gzhandler');
-
-	// Send no-cache headers
-	header('Expires: Thu, 21 Jul 1977 07:30:00 GMT'); // When yours truly first set eyes on this world! :)
-	header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
-	header('Cache-Control: post-check=0, pre-check=0', false);
-	header('Pragma: no-cache'); // For HTTP/1.0 compatibility
-
-	// Send the Content-type header in case the web server is setup to send something else
-	header('Content-type: text/html; charset=utf-8');
 
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
+<html dir="ltr">
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<?php $page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), 'Error') ?>
-<title><?php echo generate_page_title($page_title) ?></title>
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo $lang_common["lang_encoding"] ?>" />
+<title><?php echo pun_htmlspecialchars($pun_config['o_board_title']) ?> / Error</title>
 <style type="text/css">
 <!--
@@ -1498,22 +939,22 @@
 
 <div id="errorbox">
-	<h2>An error was encountered</h2>
+	<h2>Une erreur s'est produite</h2>
 	<div>
 <?php
 
-	if (defined('PUN_DEBUG') && $file !== null && $line !== null)
-	{
-		echo "\t\t".'<strong>File:</strong> '.$file.'<br />'."\n\t\t".'<strong>Line:</strong> '.$line.'<br /><br />'."\n\t\t".'<strong>FluxBB reported</strong>: '.$message."\n";
+	if (defined('PUN_DEBUG'))
+	{
+		echo "\t\t".'<strong>Fichier :</strong> '.$file.'<br />'."\n\t\t".'<strong>Ligne :</strong> '.$line.'<br /><br />'."\n\t\t".'<strong>PunBB a rapportÃ© :</strong> '.$message."\n";
 
 		if ($db_error)
 		{
-			echo "\t\t".'<br /><br /><strong>Database reported:</strong> '.pun_htmlspecialchars($db_error['error_msg']).(($db_error['error_no']) ? ' (Errno: '.$db_error['error_no'].')' : '')."\n";
+			echo "\t\t".'<br /><br /><strong>La base de donnÃ©es a rapportÃ© :</strong> '.pun_htmlspecialchars($db_error['error_msg']).(($db_error['error_no']) ? ' (Errno: '.$db_error['error_no'].')' : '')."\n";
 
 			if ($db_error['error_sql'] != '')
-				echo "\t\t".'<br /><br /><strong>Failed query:</strong> '.pun_htmlspecialchars($db_error['error_sql'])."\n";
+				echo "\t\t".'<br /><br /><strong>RequÃªte Ã©chouÃ©e :</strong> '.pun_htmlspecialchars($db_error['error_sql'])."\n";
 		}
 	}
 	else
-		echo "\t\t".'Error: <strong>'.$message.'.</strong>'."\n";
+		echo "\t\t".'Erreur : <strong>'.$message.'.</strong>'."\n";
 
 ?>
@@ -1530,445 +971,4 @@
 
 	exit;
-}
-
-
-//
-// Unset any variables instantiated as a result of register_globals being enabled
-//
-function forum_unregister_globals()
-{
-	$register_globals = ini_get('register_globals');
-	if ($register_globals === '' || $register_globals === '0' || strtolower($register_globals) === 'off')
-		return;
-
-	// Prevent script.php?GLOBALS[foo]=bar
-	if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']))
-		exit('I\'ll have a steak sandwich and... a steak sandwich.');
-
-	// Variables that shouldn't be unset
-	$no_unset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
-
-	// Remove elements in $GLOBALS that are present in any of the superglobals
-	$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
-	foreach ($input as $k => $v)
-	{
-		if (!in_array($k, $no_unset) && isset($GLOBALS[$k]))
-		{
-			unset($GLOBALS[$k]);
-			unset($GLOBALS[$k]); // Double unset to circumvent the zend_hash_del_key_or_index hole in PHP <4.4.3 and <5.1.4
-		}
-	}
-}
-
-
-//
-// Removes any "bad" characters (characters which mess with the display of a page, are invisible, etc) from user input
-//
-function forum_remove_bad_characters()
-{
-	$_GET = remove_bad_characters($_GET);
-	$_POST = remove_bad_characters($_POST);
-	$_COOKIE = remove_bad_characters($_COOKIE);
-	$_REQUEST = remove_bad_characters($_REQUEST);
-}
-
-//
-// Removes any "bad" characters (characters which mess with the display of a page, are invisible, etc) from the given string
-// See: http://kb.mozillazine.org/Network.IDN.blacklist_chars
-//
-function remove_bad_characters($array)
-{
-	static $bad_utf8_chars;
-
-	if (!isset($bad_utf8_chars))
-	{
-		$bad_utf8_chars = array(
-			"\xcc\xb7"		=> '',		// COMBINING SHORT SOLIDUS OVERLAY		0337	*
-			"\xcc\xb8"		=> '',		// COMBINING LONG SOLIDUS OVERLAY		0338	*
-			"\xe1\x85\x9F"	=> '',		// HANGUL CHOSEONG FILLER				115F	*
-			"\xe1\x85\xA0"	=> '',		// HANGUL JUNGSEONG FILLER				1160	*
-			"\xe2\x80\x8b"	=> '',		// ZERO WIDTH SPACE						200B	*
-			"\xe2\x80\x8c"	=> '',		// ZERO WIDTH NON-JOINER				200C
-			"\xe2\x80\x8d"	=> '',		// ZERO WIDTH JOINER					200D
-			"\xe2\x80\x8e"	=> '',		// LEFT-TO-RIGHT MARK					200E
-			"\xe2\x80\x8f"	=> '',		// RIGHT-TO-LEFT MARK					200F
-			"\xe2\x80\xaa"	=> '',		// LEFT-TO-RIGHT EMBEDDING				202A
-			"\xe2\x80\xab"	=> '',		// RIGHT-TO-LEFT EMBEDDING				202B
-			"\xe2\x80\xac"	=> '', 		// POP DIRECTIONAL FORMATTING			202C
-			"\xe2\x80\xad"	=> '',		// LEFT-TO-RIGHT OVERRIDE				202D
-			"\xe2\x80\xae"	=> '',		// RIGHT-TO-LEFT OVERRIDE				202E
-			"\xe2\x80\xaf"	=> '',		// NARROW NO-BREAK SPACE				202F	*
-			"\xe2\x81\x9f"	=> '',		// MEDIUM MATHEMATICAL SPACE			205F	*
-			"\xe2\x81\xa0"	=> '',		// WORD JOINER							2060
-			"\xe3\x85\xa4"	=> '',		// HANGUL FILLER						3164	*
-			"\xef\xbb\xbf"	=> '',		// ZERO WIDTH NO-BREAK SPACE			FEFF
-			"\xef\xbe\xa0"	=> '',		// HALFWIDTH HANGUL FILLER				FFA0	*
-			"\xef\xbf\xb9"	=> '',		// INTERLINEAR ANNOTATION ANCHOR		FFF9	*
-			"\xef\xbf\xba"	=> '',		// INTERLINEAR ANNOTATION SEPARATOR		FFFA	*
-			"\xef\xbf\xbb"	=> '',		// INTERLINEAR ANNOTATION TERMINATOR	FFFB	*
-			"\xef\xbf\xbc"	=> '',		// OBJECT REPLACEMENT CHARACTER			FFFC	*
-			"\xef\xbf\xbd"	=> '',		// REPLACEMENT CHARACTER				FFFD	*
-			"\xe2\x80\x80"	=> ' ',		// EN QUAD								2000	*
-			"\xe2\x80\x81"	=> ' ',		// EM QUAD								2001	*
-			"\xe2\x80\x82"	=> ' ',		// EN SPACE								2002	*
-			"\xe2\x80\x83"	=> ' ',		// EM SPACE								2003	*
-			"\xe2\x80\x84"	=> ' ',		// THREE-PER-EM SPACE					2004	*
-			"\xe2\x80\x85"	=> ' ',		// FOUR-PER-EM SPACE					2005	*
-			"\xe2\x80\x86"	=> ' ',		// SIX-PER-EM SPACE						2006	*
-			"\xe2\x80\x87"	=> ' ',		// FIGURE SPACE							2007	*
-			"\xe2\x80\x88"	=> ' ',		// PUNCTUATION SPACE					2008	*
-			"\xe2\x80\x89"	=> ' ',		// THIN SPACE							2009	*
-			"\xe2\x80\x8a"	=> ' ',		// HAIR SPACE							200A	*
-			"\xE3\x80\x80"	=> ' ',		// IDEOGRAPHIC SPACE					3000	*
-		);
-	}
-
-	if (is_array($array))
-		return array_map('remove_bad_characters', $array);
-
-	// Strip out any invalid characters
-	$array = utf8_bad_strip($array);
-
-	// Remove control characters
-	$array = preg_replace('%[\x{00}-\x{08}\x{0b}-\x{0c}\x{0e}-\x{1f}]%', '', $array);
-
-	// Replace some "bad" characters
-	$array = str_replace(array_keys($bad_utf8_chars), array_values($bad_utf8_chars), $array);
-
-	return $array;
-}
-
-
-//
-// Converts the file size in bytes to a human readable file size
-//
-function file_size($size)
-{
-	global $lang_common;
-
-	$units = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB');
-
-	for ($i = 0; $size > 1024; $i++)
-		$size /= 1024;
-
-	return sprintf($lang_common['Size unit '.$units[$i]], round($size, 2));;
-}
-
-
-//
-// Fetch a list of available styles
-//
-function forum_list_styles()
-{
-	$styles = array();
-
-	$d = dir(PUN_ROOT.'style');
-	while (($entry = $d->read()) !== false)
-	{
-		if ($entry{0} == '.')
-			continue;
-
-		if (substr($entry, -4) == '.css')
-			$styles[] = substr($entry, 0, -4);
-	}
-	$d->close();
-
-	natcasesort($styles);
-
-	return $styles;
-}
-
-
-//
-// Fetch a list of available language packs
-//
-function forum_list_langs()
-{
-	$languages = array();
-
-	$d = dir(PUN_ROOT.'lang');
-	while (($entry = $d->read()) !== false)
-	{
-		if ($entry{0} == '.')
-			continue;
-
-		if (is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/common.php'))
-			$languages[] = $entry;
-	}
-	$d->close();
-
-	natcasesort($languages);
-
-	return $languages;
-}
-
-
-//
-// Generate a cache ID based on the last modification time for all stopwords files
-//
-function generate_stopwords_cache_id()
-{
-	$files = glob(PUN_ROOT.'lang/*/stopwords.txt');
-	if ($files === false)
-		return 'cache_id_error';
-
-	$hash = array();
-
-	foreach ($files as $file)
-	{
-		$hash[] = $file;
-		$hash[] = filemtime($file);
-	}
-
-	return sha1(implode('|', $hash));
-}
-
-
-//
-// Fetch a list of available admin plugins
-//
-function forum_list_plugins($is_admin)
-{
-	$plugins = array();
-
-	$d = dir(PUN_ROOT.'plugins');
-	while (($entry = $d->read()) !== false)
-	{
-		if ($entry{0} == '.')
-			continue;
-
-		$prefix = substr($entry, 0, strpos($entry, '_'));
-		$suffix = substr($entry, strlen($entry) - 4);
-
-		if ($suffix == '.php' && ((!$is_admin && $prefix == 'AMP') || ($is_admin && ($prefix == 'AP' || $prefix == 'AMP'))))
-			$plugins[$entry] = substr($entry, strpos($entry, '_') + 1, -4);
-	}
-	$d->close();
-
-	natcasesort($plugins);
-
-	return $plugins;
-}
-
-
-//
-// Split text into chunks ($inside contains all text inside $start and $end, and $outside contains all text outside)
-//
-function split_text($text, $start, $end, &$errors, $retab = true)
-{
-	global $pun_config, $lang_common;
-
-	$result = array(0 => array(), 1 => array()); // 0 = inside, 1 = outside
-
-	// split the text into parts
-	$parts = preg_split('%'.preg_quote($start, '%').'(.*)'.preg_quote($end, '%').'%Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
-	$num_parts = count($parts);
-
-	// preg_split results in outside parts having even indices, inside parts having odd
-	for ($i = 0;$i < $num_parts;$i++)
-		$result[1 - ($i % 2)][] = $parts[$i];
-
-	if ($pun_config['o_indent_num_spaces'] != 8 && $retab)
-	{
-		$spaces = str_repeat(' ', $pun_config['o_indent_num_spaces']);
-		$result[1] = str_replace("\t", $spaces, $result[1]);
-	}
-
-	return $result;
-}
-
-
-//
-// Extract blocks from a text with a starting and ending string
-// This function always matches the most outer block so nesting is possible
-//
-function extract_blocks($text, $start, $end, &$errors = array(), $retab = true)
-{
-	global $pun_config;
-
-	$code = array();
-	$start_len = strlen($start);
-	$end_len = strlen($end);
-	$regex = '%(?:'.preg_quote($start, '%').'|'.preg_quote($end, '%').')%';
-	$matches = array();
-
-	if (preg_match_all($regex, $text, $matches))
-	{
-		$counter = $offset = 0;
-		$start_pos = $end_pos = false;
-
-		foreach ($matches[0] as $match)
-		{
-			if ($match == $start)
-			{
-				if ($counter == 0)
-					$start_pos = strpos($text, $start);
-				$counter++;
-			}
-			elseif ($match == $end)
-			{
-				$counter--;
-				if ($counter == 0)
-					$end_pos = strpos($text, $end, $offset + 1);
-				$offset = strpos($text, $end, $offset + 1);
-			}
-
-			if ($start_pos !== false && $end_pos !== false)
-			{
-				$code[] = substr($text, $start_pos + $start_len,
-					$end_pos - $start_pos - $start_len);
-				$text = substr_replace($text, "\1", $start_pos,
-					$end_pos - $start_pos + $end_len);
-				$start_pos = $end_pos = false;
-				$offset = 0;
-			}
-		}
-	}
-
-	if ($pun_config['o_indent_num_spaces'] != 8 && $retab)
-	{
-		$spaces = str_repeat(' ', $pun_config['o_indent_num_spaces']);
-		$text = str_replace("\t", $spaces, $text);
-	}
-
-	return array($code, $text);
-}
-
-
-//
-// function url_valid($url) {
-//
-// Return associative array of valid URI components, or FALSE if $url is not
-// RFC-3986 compliant. If the passed URL begins with: "www." or "ftp.", then
-// "http://" or "ftp://" is prepended and the corrected full-url is stored in
-// the return array with a key name "url". This value should be used by the caller.
-//
-// Return value: FALSE if $url is not valid, otherwise array of URI components:
-// e.g.
-// Given: "http://www.jmrware.com:80/articles?height=10&width=75#fragone"
-// Array(
-//	  [scheme] => http
-//	  [authority] => www.jmrware.com:80
-//	  [userinfo] =>
-//	  [host] => www.jmrware.com
-//	  [IP_literal] =>
-//	  [IPV6address] =>
-//	  [ls32] =>
-//	  [IPvFuture] =>
-//	  [IPv4address] =>
-//	  [regname] => www.jmrware.com
-//	  [port] => 80
-//	  [path_abempty] => /articles
-//	  [query] => height=10&width=75
-//	  [fragment] => fragone
-//	  [url] => http://www.jmrware.com:80/articles?height=10&width=75#fragone
-// )
-function url_valid($url)
-{
-	if (strpos($url, 'www.') === 0) $url = 'http://'. $url;
-	if (strpos($url, 'ftp.') === 0) $url = 'ftp://'. $url;
-	if (!preg_match('/# Valid absolute URI having a non-empty, valid DNS host.
-		^
-		(?P<scheme>[A-Za-z][A-Za-z0-9+\-.]*):\/\/
-		(?P<authority>
-		  (?:(?P<userinfo>(?:[A-Za-z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*)@)?
-		  (?P<host>
-			(?P<IP_literal>
-			  \[
-			  (?:
-				(?P<IPV6address>
-				  (?:												 (?:[0-9A-Fa-f]{1,4}:){6}
-				  |												   ::(?:[0-9A-Fa-f]{1,4}:){5}
-				  | (?:							 [0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}
-				  | (?:(?:[0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}
-				  | (?:(?:[0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}
-				  | (?:(?:[0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::	[0-9A-Fa-f]{1,4}:
-				  | (?:(?:[0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::
-				  )
-				  (?P<ls32>[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}
-				  | (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
-					   (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
-				  )
-				|	(?:(?:[0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::	[0-9A-Fa-f]{1,4}
-				|	(?:(?:[0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::
-				)
-			  | (?P<IPvFuture>[Vv][0-9A-Fa-f]+\.[A-Za-z0-9\-._~!$&\'()*+,;=:]+)
-			  )
-			  \]
-			)
-		  | (?P<IPv4address>(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
-							   (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
-		  | (?P<regname>(?:[A-Za-z0-9\-._~!$&\'()*+,;=]|%[0-9A-Fa-f]{2})+)
-		  )
-		  (?::(?P<port>[0-9]*))?
-		)
-		(?P<path_abempty>(?:\/(?:[A-Za-z0-9\-._~!$&\'()*+,;=:@]|%[0-9A-Fa-f]{2})*)*)
-		(?:\?(?P<query>		  (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
-		(?:\#(?P<fragment>	  (?:[A-Za-z0-9\-._~!$&\'()*+,;=:@\\/?]|%[0-9A-Fa-f]{2})*))?
-		$
-		/mx', $url, $m)) return FALSE;
-	switch ($m['scheme'])
-	{
-	case 'https':
-	case 'http':
-		if ($m['userinfo']) return FALSE; // HTTP scheme does not allow userinfo.
-		break;
-	case 'ftps':
-	case 'ftp':
-		break;
-	default:
-		return FALSE;	// Unrecognised URI scheme. Default to FALSE.
-	}
-	// Validate host name conforms to DNS "dot-separated-parts".
-	if ($m{'regname'}) // If host regname specified, check for DNS conformance.
-	{
-		if (!preg_match('/# HTTP DNS host name.
-			^					   # Anchor to beginning of string.
-			(?!.{256})			   # Overall host length is less than 256 chars.
-			(?:					   # Group dot separated host part alternatives.
-			  [0-9A-Za-z]\.		   # Either a single alphanum followed by dot
-			|					   # or... part has more than one char (63 chars max).
-			  [0-9A-Za-z]		   # Part first char is alphanum (no dash).
-			  [\-0-9A-Za-z]{0,61}  # Internal chars are alphanum plus dash.
-			  [0-9A-Za-z]		   # Part last char is alphanum (no dash).
-			  \.				   # Each part followed by literal dot.
-			)*					   # One or more parts before top level domain.
-			(?:					   # Explicitly specify top level domains.
-			  com|edu|gov|int|mil|net|org|biz|
-			  info|name|pro|aero|coop|museum|
-			  asia|cat|jobs|mobi|tel|travel|
-			  [A-Za-z]{2})		   # Country codes are exqactly two alpha chars.
-			$					   # Anchor to end of string.
-			/ix', $m['host'])) return FALSE;
-	}
-	$m['url'] = $url;
-	for ($i = 0; isset($m[$i]); ++$i) unset($m[$i]);
-	return $m; // return TRUE == array of useful named $matches plus the valid $url.
-}
-
-//
-// Replace string matching regular expression
-//
-// This function takes care of possibly disabled unicode properties in PCRE builds
-//
-function ucp_preg_replace($pattern, $replace, $subject)
-{
-	$replaced = preg_replace($pattern, $replace, $subject);
-
-	// If preg_replace() returns false, this probably means unicode support is not built-in, so we need to modify the pattern a little
-	if ($replaced === false)
-	{
-		if (is_array($pattern))
-		{
-			foreach ($pattern as $cur_key => $cur_pattern)
-				$pattern[$cur_key] = str_replace('\p{L}\p{N}', '\w', $cur_pattern);
-
-			$replaced = preg_replace($pattern, $replace, $subject);
-		}
-		else
-			$replaced = preg_replace(str_replace('\p{L}\p{N}', '\w', $pattern), $replace, $subject);
-	}
-
-	return $replaced;
 }
 
@@ -1994,6 +994,6 @@
 			<thead>
 				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_common['Query times'] ?></th>
-					<th class="tcr" scope="col"><?php echo $lang_common['Query'] ?></th>
+					<th class="tcl" scope="col">Temps (s)</th>
+					<th class="tcr" scope="col">RequÃªte</th>
 				</tr>
 			</thead>
@@ -2002,5 +1002,5 @@
 
 	$query_time_total = 0.0;
-	foreach ($saved_queries as $cur_query)
+	while (list(, $cur_query) = @each($saved_queries))
 	{
 		$query_time_total += $cur_query[1];
@@ -2017,5 +1017,5 @@
 ?>
 				<tr>
-					<td class="tcl" colspan="2"><?php printf($lang_common['Total query time'], $query_time_total.' s') ?></td>
+					<td class="tcl" colspan="2">Temps total requÃªte : <?php echo $query_time_total ?> s</td>
 				</tr>
 			</tbody>
@@ -2030,4 +1030,26 @@
 
 //
+// Unset any variables instantiated as a result of register_globals being enabled
+//
+function unregister_globals()
+{
+	// Prevent script.php?GLOBALS[foo]=bar
+	if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']))
+		exit('I\'ll have a steak sandwich and... a steak sandwich.');
+	
+	// Variables that shouldn't be unset
+	$no_unset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
+	
+	// Remove elements in $GLOBALS that are present in any of the superglobals
+	$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
+	foreach ($input as $k => $v)
+	{
+		if (!in_array($k, $no_unset) && isset($GLOBALS[$k]))
+			unset($GLOBALS[$k]);
+	}
+}
+
+
+//
 // Dump contents of variable(s)
 //
Index: trunk/web/punbb/include/index.html
===================================================================
--- trunk/web/punbb/include/index.html	(revision 10)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<html><head><title>.</title></head><body>.</body></html>
Index: trunk/web/punbb/include/parser.php
===================================================================
--- trunk/web/punbb/include/parser.php	(revision 10)
+++ trunk/web/punbb/include/parser.php	(revision 1)
@@ -1,9 +1,25 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
 
 // Make sure no one attempts to run this script "directly"
@@ -11,52 +27,14 @@
 	exit;
 
-// Global variables
-/* regular expression to match nested BBCode LIST tags
-'%
-\[list                # match opening bracket and tag name of outermost LIST tag
-(?:=([1a*]))?+        # optional attribute capture in group 1
-\]                    # closing bracket of outermost opening LIST tag
-(                     # capture contents of LIST tag in group 2
-  (?:                 # non capture group for either contents or whole nested LIST
-	[^\[]*+           # unroll the loop! consume everything up to next [ (normal *)
-	(?:               # (See "Mastering Regular Expressions" chapter 6 for details)
-	  (?!             # negative lookahead ensures we are NOT on [LIST*] or [/LIST]
-		\[list        # opening LIST tag
-		(?:=[1a*])?+  # with optional attribute
-		\]            # closing bracket of opening LIST tag
-		|             # or...
-		\[/list\]     # a closing LIST tag
-	  )               # end negative lookahead assertion (we are not on a LIST tag)
-	  \[              # match the [ which is NOT the start of LIST tag (special)
-	  [^\[]*+         # consume everything up to next [ (normal *)
-	)*+               # finish up "unrolling the loop" technique (special (normal*))*
-  |                   # or...
-	(?R)              # recursively match a whole nested LIST element
-  )*                  # as many times as necessary until deepest nested LIST tag grabbed
-)                     # end capturing contents of LIST tag into group 2
-\[/list\]             # match outermost closing LIST tag
-%iex' */
-$re_list = '%\[list(?:=([1a*]))?+\]((?:[^\[]*+(?:(?!\[list(?:=[1a*])?+\]|\[/list\])\[[^\[]*+)*+|(?R))*)\[/list\]%ie';
-
-// Here you can add additional smilies if you like (please note that you must escape single quote and backslash)
-$smilies = array(
-	':)' => 'smile.png',
-	'=)' => 'smile.png',
-	':|' => 'neutral.png',
-	'=|' => 'neutral.png',
-	':(' => 'sad.png',
-	'=(' => 'sad.png',
-	':D' => 'big_smile.png',
-	'=D' => 'big_smile.png',
-	':o' => 'yikes.png',
-	':O' => 'yikes.png',
-	';)' => 'wink.png',
-	':/' => 'hmm.png',
-	':P' => 'tongue.png',
-	':p' => 'tongue.png',
-	':lol:' => 'lol.png',
-	':mad:' => 'mad.png',
-	':rolleyes:' => 'roll.png',
-	':cool:' => 'cool.png');
+
+// Load cache smiley
+@include_once PUN_ROOT.'cache/cache_smilies.php';
+if (!defined('PUN_CACHE_SMILEY'))
+{
+	require_once PUN_ROOT.'include/cache_smilies.php';
+	generate_smiley_cache();
+	require PUN_ROOT.'cache/cache_smilies.php';
+}
+
 
 //
@@ -65,800 +43,384 @@
 function preparse_bbcode($text, &$errors, $is_signature = false)
 {
-	global $pun_config, $lang_common, $lang_post, $re_list;
-
-	if ($is_signature)
-	{
-		global $lang_profile;
-
-		if (preg_match('%\[/?(?:quote|code|list|h)\b[^\]]*\]%i', $text))
-			$errors[] = $lang_profile['Signature quote/code/list/h'];
-	}
+	// Change all simple BBCodes to lower case
+	$a = array('[B]', '[I]', '[U]', '[/B]', '[/I]', '[/U]');
+	$b = array('[b]', '[i]', '[u]', '[/b]', '[/i]', '[/u]');
+	$text = str_replace($a, $b, $text);
+
+	// Do the more complex BBCodes (also strip excessive whitespace and useless quotes)
+	$a = array( '#\[url=("|\'|)(.*?)\\1\]\s*#i',
+				'#\[url\]\s*#i',
+				'#\s*\[/url\]#i',
+				'#\[email=("|\'|)(.*?)\\1\]\s*#i',
+				'#\[email\]\s*#i',
+				'#\s*\[/email\]#i',
+				'#\[img\]\s*(.*?)\s*\[/img\]#is',
+				'#\[colou?r=("|\'|)(.*?)\\1\](.*?)\[/colou?r\]#is');
+
+	$b = array(	'[url=$2]',
+				'[url]',
+				'[/url]',
+				'[email=$2]',
+				'[email]',
+				'[/email]',
+				'[img]$1[/img]',
+				'[color=$2]$3[/color]');
+
+	if (!$is_signature)
+	{
+		// For non-signatures, we have to do the quote and code tags as well
+		$a[] = '#\[quote=(&quot;|"|\'|)(.*?)\\1\]\s*#i';
+		$a[] = '#\[quote\]\s*#i';
+		$a[] = '#\s*\[/quote\]\s*#i';
+		$a[] = '#\[code\][\r\n]*(.*?)\s*\[/code\]\s*#is';
+
+		$b[] = '[quote=$1$2$1]';
+		$b[] = '[quote]';
+		$b[] = '[/quote]'."\n";
+		$b[] = '[code]$1[/code]'."\n";
+	}
+
+	// Run this baby!
+	$text = preg_replace($a, $b, $text);
+
+	if (!$is_signature)
+	{
+		$overflow = check_tag_order($text, $error);
+
+		if ($error)
+			// A BBCode error was spotted in check_tag_order()
+			$errors[] = $error;
+		else if ($overflow)
+			// The quote depth level was too high, so we strip out the inner most quote(s)
+			$text = substr($text, 0, $overflow[0]).substr($text, $overflow[1], (strlen($text) - $overflow[0]));
+	}
+	else
+	{
+		global $lang_prof_reg;
+
+		if (preg_match('#\[quote=(&quot;|"|\'|)(.*)\\1\]|\[quote\]|\[/quote\]|\[code\]|\[/code\]#i', $text))
+			message($lang_prof_reg['Signature quote/code']);
+	}
+
+	return trim($text);
+}
+
+
+//
+// Parse text and make sure that [code] and [quote] syntax is correct
+//
+function check_tag_order($text, &$error)
+{
+	global $lang_common;
+
+	// The maximum allowed quote depth
+	$max_depth = 3;
+
+	$cur_index = 0;
+	$q_depth = 0;
+
+	while (true)
+	{
+		// Look for regular code and quote tags
+		$c_start = strpos($text, '[code]');
+		$c_end = strpos($text, '[/code]');
+		$q_start = strpos($text, '[quote]');
+		$q_end = strpos($text, '[/quote]');
+
+		// Look for [quote=username] style quote tags
+		if (preg_match('#\[quote=(&quot;|"|\'|)(.*)\\1\]#sU', $text, $matches))
+			$q2_start = strpos($text, $matches[0]);
+		else
+			$q2_start = 65536;
+
+		// Deal with strpos() returning false when the string is not found
+		// (65536 is one byte longer than the maximum post length)
+		if ($c_start === false) $c_start = 65536;
+		if ($c_end === false) $c_end = 65536;
+		if ($q_start === false) $q_start = 65536;
+		if ($q_end === false) $q_end = 65536;
+
+		// If none of the strings were found
+		if (min($c_start, $c_end, $q_start, $q_end, $q2_start) == 65536)
+			break;
+
+		// We are interested in the first quote (regardless of the type of quote)
+		$q3_start = ($q_start < $q2_start) ? $q_start : $q2_start;
+
+		// We found a [quote] or a [quote=username]
+		if ($q3_start < min($q_end, $c_start, $c_end))
+		{
+			$step = ($q_start < $q2_start) ? 7 : strlen($matches[0]);
+
+			$cur_index += $q3_start + $step;
+
+			// Did we reach $max_depth?
+			if ($q_depth == $max_depth)
+				$overflow_begin = $cur_index - $step;
+
+			++$q_depth;
+			$text = substr($text, $q3_start + $step);
+		}
+
+		// We found a [/quote]
+		else if ($q_end < min($q_start, $c_start, $c_end))
+		{
+			if ($q_depth == 0)
+			{
+				$error = $lang_common['BBCode error'].' '.$lang_common['BBCode error 1'];
+				return;
+			}
+
+			$q_depth--;
+			$cur_index += $q_end+8;
+
+			// Did we reach $max_depth?
+			if ($q_depth == $max_depth)
+				$overflow_end = $cur_index;
+
+			$text = substr($text, $q_end+8);
+		}
+
+		// We found a [code]
+		else if ($c_start < min($c_end, $q_start, $q_end))
+		{
+			// Make sure there's a [/code] and that any new [code] doesn't occur before the end tag
+			$tmp = strpos($text, '[/code]');
+			$tmp2 = strpos(substr($text, $c_start+6), '[code]');
+			if ($tmp2 !== false)
+				$tmp2 += $c_start+6;
+				
+			if ($tmp === false || ($tmp2 !== false && $tmp2 < $tmp))
+			{
+				$error = $lang_common['BBCode error'].' '.$lang_common['BBCode error 2'];
+				return;
+			}
+			else
+				$text = substr($text, $tmp+7);
+
+			$cur_index += $tmp+7;
+		}
+
+		// We found a [/code] (this shouldn't happen since we handle both start and end tag in the if clause above)
+		else if ($c_end < min($c_start, $q_start, $q_end))
+		{
+			$error = $lang_common['BBCode error'].' '.$lang_common['BBCode error 3'];
+			return;
+		}
+	}
+
+	// If $q_depth <> 0 something is wrong with the quote syntax
+	if ($q_depth)
+	{
+		$error = $lang_common['BBCode error'].' '.$lang_common['BBCode error 4'];
+		return;
+	}
+	else if ($q_depth < 0)
+	{
+		$error = $lang_common['BBCode error'].' '.$lang_common['BBCode error 5'];
+		return;
+	}
+
+	// If the quote depth level was higher than $max_depth we return the index for the
+	// beginning and end of the part we should strip out
+	if (isset($overflow_begin))
+		return array($overflow_begin, $overflow_end);
+	else
+		return null;
+}
+
+
+//
+// Split text into chunks ($inside contains all text inside $start and $end, and $outside contains all text outside)
+//
+function split_text($text, $start, $end)
+{
+	global $pun_config;
+
+	$tokens = explode($start, $text);
+
+	$outside[] = $tokens[0];
+
+	$num_tokens = count($tokens);
+	for ($i = 1; $i < $num_tokens; ++$i)
+	{
+		$temp = explode($end, $tokens[$i]);
+		$inside[] = $temp[0];
+		$outside[] = $temp[1];
+	}
+
+	if ($pun_config['o_indent_num_spaces'] != 8 && $start == '[code]')
+	{
+		$spaces = str_repeat(' ', $pun_config['o_indent_num_spaces']);
+		$inside = str_replace("\t", $spaces, $inside);
+	}
+
+	return array($inside, $outside);
+}
+
+
+//
+// Truncate URL if longer than 55 characters (add http:// or ftp:// if missing)
+//
+function handle_url_tag($url, $link = '')
+{
+	global $pun_user;
+
+	$full_url = str_replace(array(' ', '\'', '`'), array('%20', '', ''), $url);
+	if (strpos($url, 'www.') === 0)			// If it starts with www, we add http://
+		$full_url = 'http://'.$full_url;
+	else if (strpos($url, 'ftp.') === 0)	// Else if it starts with ftp, we add ftp://
+		$full_url = 'ftp://'.$full_url;
+	else if (!preg_match('#^([a-z0-9]{3,6})://#', $url, $bah)) 	// Else if it doesn't start with abcdef://, we add http://
+		$full_url = 'http://'.$full_url;
+
+	// Ok, not very pretty :-)
+	$link = ($link == '' || $link == $url) ? ((strlen($url) > 55) ? substr($url, 0 , 39).' &hellip; '.substr($url, -10) : $url) : stripslashes($link);
+
+	return '<a href="'.$full_url.'" target=\"_blank\">'.$link.'</a>';
+}
+
+
+//
+// Turns an URL from the [img] tag into an <img> tag or a <a href...> tag
+//
+function handle_img_tag($url, $is_signature = false)
+{
+	global $lang_common, $pun_config, $pun_user;
+
+	$img_tag = '<a href="'.$url.'">&lt;'.$lang_common['Image link'].'&gt;</a>';
+
+	if ($is_signature && $pun_user['show_img_sig'] != '0')
+		$img_tag = '<img class="sigimage" src="'.$url.'" alt="'.htmlspecialchars($url).'" />';
+	else if (!$is_signature && $pun_user['show_img'] != '0')
+		$img_tag = '<img class="postimg" src="'.$url.'" alt="'.htmlspecialchars($url).'" />';
+
+	return $img_tag;
+}
+
+
+//
+// Convert BBCodes to their HTML equivalent
+//
+function do_bbcode($text)
+{
+	global $lang_common, $pun_user;
+
+	if (strpos($text, 'quote') !== false)
+	{
+		$text = str_replace('[quote]', '</p><blockquote><div class="incqbox"><p>', $text);
+		$text = preg_replace('#\[quote=(&quot;|"|\'|)(.*)\\1\]#seU', '"</p><blockquote><div class=\"incqbox\"><h4>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), \'$2\')." ".$lang_common[\'wrote\'].":</h4><p>"', $text);
+		$text = preg_replace('#\[\/quote\]\s*#', '</p></div></blockquote><p>', $text);
+	}
+	
+	$pattern = array('#\[b\](.*?)\[/b\]#s',
+					 '#\[i\](.*?)\[/i\]#s',
+					 '#\[u\](.*?)\[/u\]#s',
+					 '#\[url\]([^\[]*?)\[/url\]#e',
+					 '#\[url=([^\[]*?)\](.*?)\[/url\]#e',
+					 '#\[email\]([^\[]*?)\[/email\]#',
+					 '#\[email=([^\[]*?)\](.*?)\[/email\]#',
+					 '#\[color=([a-zA-Z]*|\#?[0-9a-fA-F]{6})](.*?)\[/color\]#s',
+					 '#\[font=(.*?)](.*?)\[/font\]#s',
+					 '#\[align=(.*?)\](.*?)\[/align\]#s',
+					 '#\[hr /\]#',
+					 '#\[hr\]#',
+					 '#\[s\](.*?)\[/s\]#s',
+					 '#\[h\](.*?)\[/h\]#s',
+                               '#\[size=([0-9]{1,2})](.*?)\[/size\]#s');
+
+	$replace = array('<strong>$1</strong>',
+					 '<em>$1</em>',
+					 '<span class="bbu">$1</span>',
+					 'handle_url_tag(\'$1\')',
+					 'handle_url_tag(\'$1\', \'$2\')',
+					 '<a href="mailto:$1">$1</a>',
+					 '<a href="mailto:$1">$2</a>',
+					 '<span style="color: $1">$2</span>',
+					 '<span style="font-family: $1">$2</span>',
+					 '<div align="$1">$2</div>',
+					 '<hr />',
+					 '<hr />',
+					 '<del>$1</del>',
+					 '<span style="background-color: #FFFF00; color: #000000">$1</span>',
+                               '<span style="font-size: $1pt;">$2</span>');
+
+	// This thing takes a while! :)
+	$text = preg_replace($pattern, $replace, $text);
+
+	return $text;
+}
+
+
+//
+// Make hyperlinks clickable
+//
+function do_clickable($text)
+{
+	global $pun_user;
+
+	$text = ' '.$text;
+
+	$text = preg_replace('#([\s\(\)])(https?|ftp|news){1}://([\w\-]+\.([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^"\s\(\)<\[]*)?)#ie', '\'$1\'.handle_url_tag(\'$2://$3\')', $text);
+	$text = preg_replace('#([\s\(\)])(www|ftp)\.(([\w\-]+\.)*[\w]+(:[0-9]+)?(/[^"\s\(\)<\[]*)?)#ie', '\'$1\'.handle_url_tag(\'$2.$3\', \'$2.$3\')', $text);
+
+	return substr($text, 1);
+}
+
+
+//
+// Convert a series of smilies to images
+//
+function do_smilies($text)
+{
+	global $smiley_text, $smiley_img;
+
+	$text = ' '.$text.' ';
+
+	$num_smilies = count($smiley_text);
+	for ($i = 0; $i < $num_smilies; ++$i)
+		$text = preg_replace("#(?<=.\W|\W.|^\W)".preg_quote($smiley_text[$i], '#')."(?=.\W|\W.|\W$)#m", '$1<img src="'.PUN_ROOT.'img/smilies/'.$smiley_img[$i].'" alt="'.substr($smiley_img[$i], 0, strrpos($smiley_img[$i], '.')).'" />$2', $text);
+
+	return substr($text, 1, -1);
+}
+
+
+//
+// Parse message text
+//
+function parse_message($text, $hide_smilies)
+{
+	global $pun_config, $lang_common, $pun_user;
+
+	if ($pun_config['o_censoring'] == '1')
+		$text = censor_words($text);
+
+	// Convert applicable characters to HTML entities
+	$text = pun_htmlspecialchars($text);
 
 	// If the message contains a code tag we have to split it up (text within [code][/code] shouldn't be touched)
 	if (strpos($text, '[code]') !== false && strpos($text, '[/code]') !== false)
-		list($inside, $text) = extract_blocks($text, '[code]', '[/code]', $errors);
-
-	// Tidy up lists
-	$temp = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\', $errors)', $text);
-
-	// If the regex failed
-	if ($temp === null)
-		$errors[] = $lang_common['BBCode list size error'];
-	else
-		$text = str_replace('*'."\0".']', '*]', $temp);
+	{
+		list($inside, $outside) = split_text($text, '[code]', '[/code]');
+		$outside = array_map('ltrim', $outside);
+		$text = implode('<">', $outside);
+	}
 
 	if ($pun_config['o_make_links'] == '1')
 		$text = do_clickable($text);
 
-	// If we split up the message before we have to concatenate it together again (code tags)
-	if (isset($inside))
-	{
-		$outside = explode("\1", $text);
-		$text = '';
-
-		$num_tokens = count($outside);
-		for ($i = 0; $i < $num_tokens; ++$i)
-		{
-			$text .= $outside[$i];
-			if (isset($inside[$i]))
-				$text .= '[code]'.$inside[$i].'[/code]';
-		}
-
-		unset($inside);
-	}
-
-	$temp_text = false;
-	if (empty($errors))
-		$temp_text = preparse_tags($text, $errors, $is_signature);
-
-	if ($temp_text !== false)
-		$text = $temp_text;
-
-	// Remove empty tags
-	while (($new_text = strip_empty_bbcode($text, $errors)) !== false)
-	{
-		if ($new_text != $text)
-		{
-			$text = $new_text;
-			if ($new_text == '')
-			{
-				$errors[] = $lang_post['Empty after strip'];
-				break;
-			}
-		}
-		else
-			break;
-	}
-
-	return pun_trim($text);
-}
-
-
-//
-// Strip empty bbcode tags from some text
-//
-function strip_empty_bbcode($text, &$errors)
-{
-	// If the message contains a code tag we have to split it up (empty tags within [code][/code] are fine)
-	if (strpos($text, '[code]') !== false && strpos($text, '[/code]') !== false)
-		list($inside, $text) = extract_blocks($text, '[code]', '[/code]', $errors);
-
-	// Remove empty tags
-	while (($new_text = preg_replace('%\[(b|u|s|ins|del|em|i|h|colou?r|quote|img|url|email|list|topic|post|forum|user)(?:\=[^\]]*)?\]\s*\[/\1\]%', '', $text)) !== NULL)
-	{
-		if ($new_text != $text)
-			$text = $new_text;
-		else
-			break;
-	}
-
-	// If we split up the message before we have to concatenate it together again (code tags)
-    if (isset($inside)) {
-        $parts = explode("\1", $text);
-        $text = '';
-        foreach ($parts as $i => $part)
-        {
-            $text .= $part;
-            if (isset($inside[$i]))
-                $text .= '[code]'.$inside[$i].'[/code]';
-        }
-    }
-
-	// Remove empty code tags
-	while (($new_text = preg_replace('%\[(code)\]\s*\[/\1\]%', '', $text)) !== NULL)
-	{
-		if ($new_text != $text)
-			$text = $new_text;
-		else
-			break;
-	}
-
-	return $text;
-}
-
-
-//
-// Check the structure of bbcode tags and fix simple mistakes where possible
-//
-function preparse_tags($text, &$errors, $is_signature = false)
-{
-	global $lang_common, $pun_config;
-
-	// Start off by making some arrays of bbcode tags and what we need to do with each one
-
-	// List of all the tags
-	$tags = array('quote', 'code', 'b', 'i', 'u', 's', 'ins', 'del', 'em', 'color', 'colour', 'url', 'email', 'img', 'list', '*', 'h', 'topic', 'post', 'forum', 'user');
-	// List of tags that we need to check are open (You could not put b,i,u in here then illegal nesting like [b][i][/b][/i] would be allowed)
-	$tags_opened = $tags;
-	// and tags we need to check are closed (the same as above, added it just in case)
-	$tags_closed = $tags;
-	// Tags we can nest and the depth they can be nested to
-	$tags_nested = array('quote' => $pun_config['o_quote_depth'], 'list' => 5, '*' => 5);
-	// Tags to ignore the contents of completely (just code)
-	$tags_ignore = array('code');
-	// Block tags, block tags can only go within another block tag, they cannot be in a normal tag
-	$tags_block = array('quote', 'code', 'list', 'h', '*');
-	// Inline tags, we do not allow new lines in these
-	$tags_inline = array('b', 'i', 'u', 's', 'ins', 'del', 'em', 'color', 'colour', 'h', 'topic', 'post', 'forum', 'user');
-	// Tags we trim interior space
-	$tags_trim = array('img');
-	// Tags we remove quotes from the argument
-	$tags_quotes = array('url', 'email', 'img', 'topic', 'post', 'forum', 'user');
-	// Tags we limit bbcode in
-	$tags_limit_bbcode = array(
-		'*' 	=> array('b', 'i', 'u', 's', 'ins', 'del', 'em', 'color', 'colour', 'url', 'email', 'list', 'img', 'code', 'topic', 'post', 'forum', 'user'),
-		'list' 	=> array('*'),
-		'url' 	=> array('img'),
-		'email' => array('img'),
-		'topic' => array('img'),
-		'post'  => array('img'),
-		'forum' => array('img'),
-		'user'  => array('img'),
-		'img' 	=> array(),
-		'h'		=> array('b', 'i', 'u', 's', 'ins', 'del', 'em', 'color', 'colour', 'url', 'email', 'topic', 'post', 'forum', 'user'),
-	);
-	// Tags we can automatically fix bad nesting
-	$tags_fix = array('quote', 'b', 'i', 'u', 's', 'ins', 'del', 'em', 'color', 'colour', 'url', 'email', 'h', 'topic', 'post', 'forum', 'user');
-
-	$split_text = preg_split('%(\[[\*a-zA-Z0-9-/]*?(?:=.*?)?\])%', $text, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
-
-	$open_tags = array('fluxbb-bbcode');
-	$open_args = array('');
-	$opened_tag = 0;
-	$new_text = '';
-	$current_ignore = '';
-	$current_nest = '';
-	$current_depth = array();
-	$limit_bbcode = $tags;
-	$count_ignored = array();
-
-	foreach ($split_text as $current)
-	{
-		if ($current == '')
-			continue;
-
-		// Are we dealing with a tag?
-		if (substr($current, 0, 1) != '[' || substr($current, -1, 1) != ']')
-		{
-			// It's not a bbcode tag so we put it on the end and continue
-			// If we are nested too deeply don't add to the end
-			if ($current_nest)
-				continue;
-
-			$current = str_replace("\r\n", "\n", $current);
-			$current = str_replace("\r", "\n", $current);
-			if (in_array($open_tags[$opened_tag], $tags_inline) && strpos($current, "\n") !== false)
-			{
-				// Deal with new lines
-				$split_current = preg_split('%(\n\n+)%', $current, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
-				$current = '';
-
-				if (!pun_trim($split_current[0], "\n")) // The first part is a linebreak so we need to handle any open tags first
-					array_unshift($split_current, '');
-
-				for ($i = 1; $i < count($split_current); $i += 2)
-				{
-					$temp_opened = array();
-					$temp_opened_arg = array();
-					$temp = $split_current[$i - 1];
-					while (!empty($open_tags))
-					{
-						$temp_tag = array_pop($open_tags);
-						$temp_arg = array_pop($open_args);
-
-						if (in_array($temp_tag , $tags_inline))
-						{
-							array_push($temp_opened, $temp_tag);
-							array_push($temp_opened_arg, $temp_arg);
-							$temp .= '[/'.$temp_tag.']';
-						}
-						else
-						{
-							array_push($open_tags, $temp_tag);
-							array_push($open_args, $temp_arg);
-							break;
-						}
-					}
-					$current .= $temp.$split_current[$i];
-					$temp = '';
-					while (!empty($temp_opened))
-					{
-						$temp_tag = array_pop($temp_opened);
-						$temp_arg = array_pop($temp_opened_arg);
-						if (empty($temp_arg))
-							$temp .= '['.$temp_tag.']';
-						else
-							$temp .= '['.$temp_tag.'='.$temp_arg.']';
-						array_push($open_tags, $temp_tag);
-						array_push($open_args, $temp_arg);
-					}
-					$current .= $temp;
-				}
-
-				if (array_key_exists($i - 1, $split_current))
-					$current .= $split_current[$i - 1];
-			}
-
-			if (in_array($open_tags[$opened_tag], $tags_trim))
-				$new_text .= pun_trim($current);
-			else
-				$new_text .= $current;
-
-			continue;
-		}
-
-		// Get the name of the tag
-		$current_arg = '';
-		if (strpos($current, '/') === 1)
-		{
-			$current_tag = substr($current, 2, -1);
-		}
-		else if (strpos($current, '=') === false)
-		{
-			$current_tag = substr($current, 1, -1);
-		}
-		else
-		{
-			$current_tag = substr($current, 1, strpos($current, '=')-1);
-			$current_arg = substr($current, strpos($current, '=')+1, -1);
-		}
-		$current_tag = strtolower($current_tag);
-
-		// Is the tag defined?
-		if (!in_array($current_tag, $tags))
-		{
-			// It's not a bbcode tag so we put it on the end and continue
-			if (!$current_nest)
-				$new_text .= $current;
-
-			continue;
-		}
-
-		// We definitely have a bbcode tag
-
-		// Make the tag string lower case
-		if ($equalpos = strpos($current,'='))
-		{
-			// We have an argument for the tag which we don't want to make lowercase
-			if (strlen(substr($current, $equalpos)) == 2)
-			{
-				// Empty tag argument
-				$errors[] = sprintf($lang_common['BBCode error empty attribute'], $current_tag);
-				return false;
-			}
-			$current = strtolower(substr($current, 0, $equalpos)).substr($current, $equalpos);
-		}
-		else
-			$current = strtolower($current);
-
-		// This is if we are currently in a tag which escapes other bbcode such as code
-		// We keep a cound of ignored bbcodes (code tags) so we can nest them, but
-		// only balanced sets of tags can be nested
-		if ($current_ignore)
-		{
-			// Increase the current ignored tags counter
-			if ('['.$current_ignore.']' == $current)
-			{
-				if (!isset($count_ignored[$current_tag]))
-					$count_ignored[$current_tag] = 2;
-				else
-					$count_ignored[$current_tag]++;
-			}
-
-			// Decrease the current ignored tags counter
-			if ('[/'.$current_ignore.']' == $current)
-				$count_ignored[$current_tag]--;
-
-			if ('[/'.$current_ignore.']' == $current && $count_ignored[$current_tag] == 0)
-			{
-				// We've finished the ignored section
-				$current = '[/'.$current_tag.']';
-				$current_ignore = '';
-				$count_ignored = array();
-			}
-
-			$new_text .= $current;
-
-			continue;
-		}
-
-		if ($current_nest)
-		{
-			// We are currently too deeply nested so lets see if we are closing the tag or not
-			if ($current_tag != $current_nest)
-				continue;
-
-			if (substr($current, 1, 1) == '/')
-				$current_depth[$current_nest]--;
-			else
-				$current_depth[$current_nest]++;
-
-			if ($current_depth[$current_nest] <= $tags_nested[$current_nest])
-				$current_nest = '';
-
-			continue;
-		}
-
-		// Check the current tag is allowed here
-		if (!in_array($current_tag, $limit_bbcode) && $current_tag != $open_tags[$opened_tag])
-		{
-			$errors[] = sprintf($lang_common['BBCode error invalid nesting'], $current_tag, $open_tags[$opened_tag]);
-			return false;
-		}
-
-		if (substr($current, 1, 1) == '/')
-		{
-			// This is if we are closing a tag
-			if ($opened_tag == 0 || !in_array($current_tag, $open_tags))
-			{
-				// We tried to close a tag which is not open
-				if (in_array($current_tag, $tags_opened))
-				{
-					$errors[] = sprintf($lang_common['BBCode error no opening tag'], $current_tag);
-					return false;
-				}
-			}
-			else
-			{
-				// Check nesting
-				while (true)
-				{
-					// Nesting is ok
-					if ($open_tags[$opened_tag] == $current_tag)
-					{
-						array_pop($open_tags);
-						array_pop($open_args);
-						$opened_tag--;
-						break;
-					}
-
-					// Nesting isn't ok, try to fix it
-					if (in_array($open_tags[$opened_tag], $tags_closed) && in_array($current_tag, $tags_closed))
-					{
-						if (in_array($current_tag, $open_tags))
-						{
-							$temp_opened = array();
-							$temp_opened_arg = array();
-							$temp = '';
-							while (!empty($open_tags))
-							{
-								$temp_tag = array_pop($open_tags);
-								$temp_arg = array_pop($open_args);
-
-								if (!in_array($temp_tag, $tags_fix))
-								{
-									// We couldn't fix nesting
-									$errors[] = sprintf($lang_common['BBCode error no closing tag'], array_pop($temp_opened));
-									return false;
-								}
-								array_push($temp_opened, $temp_tag);
-								array_push($temp_opened_arg, $temp_arg);
-
-								if ($temp_tag == $current_tag)
-									break;
-								else
-									$temp .= '[/'.$temp_tag.']';
-							}
-							$current = $temp.$current;
-							$temp = '';
-							array_pop($temp_opened);
-							array_pop($temp_opened_arg);
-
-							while (!empty($temp_opened))
-							{
-								$temp_tag = array_pop($temp_opened);
-								$temp_arg = array_pop($temp_opened_arg);
-								if (empty($temp_arg))
-									$temp .= '['.$temp_tag.']';
-								else
-									$temp .= '['.$temp_tag.'='.$temp_arg.']';
-								array_push($open_tags, $temp_tag);
-								array_push($open_args, $temp_arg);
-							}
-							$current .= $temp;
-							$opened_tag--;
-							break;
-						}
-						else
-						{
-							// We couldn't fix nesting
-							$errors[] = sprintf($lang_common['BBCode error no opening tag'], $current_tag);
-							return false;
-						}
-					}
-					else if (in_array($open_tags[$opened_tag], $tags_closed))
-						break;
-					else
-					{
-						array_pop($open_tags);
-						array_pop($open_args);
-						$opened_tag--;
-					}
-				}
-			}
-
-			if (in_array($current_tag, array_keys($tags_nested)))
-			{
-				if (isset($current_depth[$current_tag]))
-					$current_depth[$current_tag]--;
-			}
-
-			if (in_array($open_tags[$opened_tag], array_keys($tags_limit_bbcode)))
-				$limit_bbcode = $tags_limit_bbcode[$open_tags[$opened_tag]];
-			else
-				$limit_bbcode = $tags;
-
-			$new_text .= $current;
-
-			continue;
-		}
-		else
-		{
-			// We are opening a tag
-			if (in_array($current_tag, array_keys($tags_limit_bbcode)))
-				$limit_bbcode = $tags_limit_bbcode[$current_tag];
-			else
-				$limit_bbcode = $tags;
-
-			if (in_array($current_tag, $tags_block) && !in_array($open_tags[$opened_tag], $tags_block) && $opened_tag != 0)
-			{
-				// We tried to open a block tag within a non-block tag
-				$errors[] = sprintf($lang_common['BBCode error invalid nesting'], $current_tag, $open_tags[$opened_tag]);
-				return false;
-			}
-
-			if (in_array($current_tag, $tags_ignore))
-			{
-				// It's an ignore tag so we don't need to worry about what's inside it
-				$current_ignore = $current_tag;
-				$new_text .= $current;
-				continue;
-			}
-
-			// Deal with nested tags
-			if (in_array($current_tag, $open_tags) && !in_array($current_tag, array_keys($tags_nested)))
-			{
-				// We nested a tag we shouldn't
-				$errors[] = sprintf($lang_common['BBCode error invalid self-nesting'], $current_tag);
-				return false;
-			}
-			else if (in_array($current_tag, array_keys($tags_nested)))
-			{
-				// We are allowed to nest this tag
-
-				if (isset($current_depth[$current_tag]))
-					$current_depth[$current_tag]++;
-				else
-					$current_depth[$current_tag] = 1;
-
-				// See if we are nested too deep
-				if ($current_depth[$current_tag] > $tags_nested[$current_tag])
-				{
-					$current_nest = $current_tag;
-					continue;
-				}
-			}
-
-			// Remove quotes from arguments for certain tags
-			if (strpos($current, '=') !== false && in_array($current_tag, $tags_quotes))
-			{
-				$current = preg_replace('%\['.$current_tag.'=("|\'|)(.*?)\\1\]\s*%i', '['.$current_tag.'=$2]', $current);
-			}
-
-			if (in_array($current_tag, array_keys($tags_limit_bbcode)))
-				$limit_bbcode = $tags_limit_bbcode[$current_tag];
-
-			$open_tags[] = $current_tag;
-			$open_args[] = $current_arg;
-			$opened_tag++;
-			$new_text .= $current;
-			continue;
-		}
-	}
-
-	// Check we closed all the tags we needed to
-	foreach ($tags_closed as $check)
-	{
-		if (in_array($check, $open_tags))
-		{
-			// We left an important tag open
-			$errors[] = sprintf($lang_common['BBCode error no closing tag'], $check);
-			return false;
-		}
-	}
-
-	if ($current_ignore)
-	{
-		// We left an ignore tag open
-		$errors[] = sprintf($lang_common['BBCode error no closing tag'], $current_ignore);
-		return false;
-	}
-
-	return $new_text;
-}
-
-
-//
-// Preparse the contents of [list] bbcode
-//
-function preparse_list_tag($content, $type = '*', &$errors)
-{
-	global $lang_common, $re_list;
-
-	if (strlen($type) != 1)
-		$type = '*';
-
-	if (strpos($content,'[list') !== false)
-	{
-		$content = preg_replace($re_list, 'preparse_list_tag(\'$2\', \'$1\', $errors)', $content);
-	}
-
-	$items = explode('[*]', str_replace('\"', '"', $content));
-
-	$content = '';
-	foreach ($items as $item)
-	{
-		if (pun_trim($item) != '')
-			$content .= '[*'."\0".']'.str_replace('[/*]', '', pun_trim($item)).'[/*'."\0".']'."\n";
-	}
-
-	return '[list='.$type.']'."\n".$content.'[/list]';
-}
-
-
-//
-// Truncate URL if longer than 55 characters (add http:// or ftp:// if missing)
-//
-function handle_url_tag($url, $link = '', $bbcode = false)
-{
-	$url = pun_trim($url);
-	$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
-	if (strpos($url, 'www.') === 0) // If it starts with www, we add http://
-		$full_url = 'http://'.$full_url;
-	else if (strpos($url, 'ftp.') === 0) // Else if it starts with ftp, we add ftp://
-		$full_url = 'ftp://'.$full_url;
-	else if (strpos($url, '/') === 0) // Allow for relative URLs that start with a slash
-		$full_url = get_base_url(true).$full_url;
-	else if (!preg_match('#^([a-z0-9]{3,6})://#', $url)) // Else if it doesn't start with abcdef://, we add http://
-		$full_url = 'http://'.$full_url;
-
-	// Ok, not very pretty :-)
-	if ($bbcode)
-	{
-		if ($full_url == $link)
-			return '[url]'.$link.'[/url]';
-		else
-			return '[url='.$full_url.']'.$link.'[/url]';
-	}
-	else
-	{
-		if ($link == '' || $link == $url)
-		{
-			$url = pun_htmlspecialchars_decode($url);
-			$link = utf8_strlen($url) > 55 ? utf8_substr($url, 0 , 39).' âŠ '.utf8_substr($url, -10) : $url;
-			$link = pun_htmlspecialchars($link);
-		}
-		else
-			$link = stripslashes($link);
-
-		return '<a href="'.$full_url.'">'.$link.'</a>';
-	}
-}
-
-
-//
-// Turns an URL from the [img] tag into an <img> tag or a <a href...> tag
-//
-function handle_img_tag($url, $is_signature = false, $alt = null)
-{
-	global $lang_common, $pun_user;
-
-	if ($alt == null)
-		$alt = basename($url);
-
-	$img_tag = '<a href="'.$url.'">&lt;'.$lang_common['Image link'].' - '.$alt.'&gt;</a>';
-
-	if ($is_signature && $pun_user['show_img_sig'] != '0')
-		$img_tag = '<img class="sigimage" src="'.$url.'" alt="'.$alt.'" />';
-	else if (!$is_signature && $pun_user['show_img'] != '0')
-		$img_tag = '<span class="postimg"><img src="'.$url.'" alt="'.$alt.'" /></span>';
-
-	return $img_tag;
-}
-
-
-//
-// Parse the contents of [list] bbcode
-//
-function handle_list_tag($content, $type = '*')
-{
-	global $re_list;
-
-	if (strlen($type) != 1)
-		$type = '*';
-
-	if (strpos($content,'[list') !== false)
-	{
-		$content = preg_replace($re_list, 'handle_list_tag(\'$2\', \'$1\')', $content);
-	}
-
-	$content = preg_replace('#\s*\[\*\](.*?)\[/\*\]\s*#s', '<li><p>$1</p></li>', pun_trim($content));
-
-	if ($type == '*')
-		$content = '<ul>'.$content.'</ul>';
-	else
-		if ($type == 'a')
-			$content = '<ol class="alpha">'.$content.'</ol>';
-		else
-			$content = '<ol class="decimal">'.$content.'</ol>';
-
-	return '</p>'.$content.'<p>';
-}
-
-
-//
-// Convert BBCodes to their HTML equivalent
-//
-function do_bbcode($text, $is_signature = false)
-{
-	global $lang_common, $pun_user, $pun_config, $re_list;
-
-	if (strpos($text, '[quote') !== false)
-	{
-		$text = preg_replace('%\[quote\]\s*%', '</p><div class="quotebox"><blockquote><div><p>', $text);
-		$text = preg_replace('%\[quote=(&quot;|&\#039;|"|\'|)(.*?)\\1\]%se', '"</p><div class=\"quotebox\"><cite>".str_replace(array(\'[\', \'\\"\'), array(\'&#91;\', \'"\'), \'$2\')." ".$lang_common[\'wrote\']."</cite><blockquote><div><p>"', $text);
-		$text = preg_replace('%\s*\[\/quote\]%S', '</p></div></blockquote></div><p>', $text);
-	}
-
-	if (!$is_signature)
-	{
-		$pattern[] = $re_list;
-		$replace[] = 'handle_list_tag(\'$2\', \'$1\')';
-	}
-
-	$pattern[] = '%\[b\](.*?)\[/b\]%ms';
-	$pattern[] = '%\[i\](.*?)\[/i\]%ms';
-	$pattern[] = '%\[u\](.*?)\[/u\]%ms';
-	$pattern[] = '%\[s\](.*?)\[/s\]%ms';
-	$pattern[] = '%\[del\](.*?)\[/del\]%ms';
-	$pattern[] = '%\[ins\](.*?)\[/ins\]%ms';
-	$pattern[] = '%\[em\](.*?)\[/em\]%ms';
-	$pattern[] = '%\[colou?r=([a-zA-Z]{3,20}|\#[0-9a-fA-F]{6}|\#[0-9a-fA-F]{3})](.*?)\[/colou?r\]%ms';
-	$pattern[] = '%\[h\](.*?)\[/h\]%ms';
-
-	$replace[] = '<strong>$1</strong>';
-	$replace[] = '<em>$1</em>';
-	$replace[] = '<span class="bbu">$1</span>';
-	$replace[] = '<span class="bbs">$1</span>';
-	$replace[] = '<del>$1</del>';
-	$replace[] = '<ins>$1</ins>';
-	$replace[] = '<em>$1</em>';
-	$replace[] = '<span style="color: $1">$2</span>';
-	$replace[] = '</p><h5>$1</h5><p>';
-
-	if (($is_signature && $pun_config['p_sig_img_tag'] == '1') || (!$is_signature && $pun_config['p_message_img_tag'] == '1'))
-	{
-		$pattern[] = '%\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%e';
-		$pattern[] = '%\[img=([^\[]*?)\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%e';
-		if ($is_signature)
-		{
-			$replace[] = 'handle_img_tag(\'$1$3\', true)';
-			$replace[] = 'handle_img_tag(\'$2$4\', true, \'$1\')';
-		}
-		else
-		{
-			$replace[] = 'handle_img_tag(\'$1$3\', false)';
-			$replace[] = 'handle_img_tag(\'$2$4\', false, \'$1\')';
-		}
-	}
-
-	$pattern[] = '%\[url\]([^\[]*?)\[/url\]%e';
-	$pattern[] = '%\[url=([^\[]+?)\](.*?)\[/url\]%e';
-	$pattern[] = '%\[email\]([^\[]*?)\[/email\]%';
-	$pattern[] = '%\[email=([^\[]+?)\](.*?)\[/email\]%';
-	$pattern[] = '%\[topic\]([^\[]*?)\[/topic\]%e';
-	$pattern[] = '%\[topic=([^\[]+?)\](.*?)\[/topic\]%e';
-	$pattern[] = '%\[post\]([^\[]*?)\[/post\]%e';
-	$pattern[] = '%\[post=([^\[]+?)\](.*?)\[/post\]%e';
-	$pattern[] = '%\[forum\]([^\[]*?)\[/forum\]%e';
-	$pattern[] = '%\[forum=([^\[]+?)\](.*?)\[/forum\]%e';
-	$pattern[] = '%\[user\]([^\[]*?)\[/user\]%e';
-	$pattern[] = '%\[user=([^\[]+?)\](.*?)\[/user\]%e';
-
-	$replace[] = 'handle_url_tag(\'$1\')';
-	$replace[] = 'handle_url_tag(\'$1\', \'$2\')';
-	$replace[] = '<a href="mailto:$1">$1</a>';
-	$replace[] = '<a href="mailto:$1">$2</a>';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=$1\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?id=$1\', \'$2\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=$1#p$1\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewtopic.php?pid=$1#p$1\', \'$2\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=$1\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/viewforum.php?id=$1\', \'$2\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\')';
-	$replace[] = 'handle_url_tag(\''.get_base_url(true).'/profile.php?id=$1\', \'$2\')';
-
-	// This thing takes a while! :)
-	$text = preg_replace($pattern, $replace, $text);
-
-	return $text;
-}
-
-
-//
-// Make hyperlinks clickable
-//
-function do_clickable($text)
-{
-	$text = ' '.$text;
-
-	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(https?|ftp|news){1}://([\p{L}\p{N}\-]+\.([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/[^\s\[]*[^\s.,?!\[;:-])?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5://$6\', \'$5://$6\', true).stripslashes(\'$4$10$11$12\')', $text);
-	$text = ucp_preg_replace('%(?<=[\s\]\)])(<)?(\[)?(\()?([\'"]?)(www|ftp)\.(([\p{L}\p{N}\-]+\.)*[\p{L}\p{N}]+(:[0-9]+)?(/[^\s\[]*[^\s.,?!\[;:-])?)\4(?(3)(\)))(?(2)(\]))(?(1)(>))(?![^\s]*\[/(?:url|img)\])%uie', 'stripslashes(\'$1$2$3$4\').handle_url_tag(\'$5.$6\', \'$5.$6\', true).stripslashes(\'$4$10$11$12\')', $text);
-
-	return substr($text, 1);
-}
-
-
-//
-// Convert a series of smilies to images
-//
-function do_smilies($text)
-{
-	global $pun_config, $smilies;
-
-	$text = ' '.$text.' ';
-
-	foreach ($smilies as $smiley_text => $smiley_img)
-	{
-		if (strpos($text, $smiley_text) !== false)
-			$text = ucp_preg_replace('%(?<=[>\s])'.preg_quote($smiley_text, '%').'(?=[^\p{L}\p{N}])%um', '<img src="'.pun_htmlspecialchars(get_base_url(true).'/img/smilies/'.$smiley_img).'" width="15" height="15" alt="'.substr($smiley_img, 0, strrpos($smiley_img, '.')).'" />', $text);
-	}
-
-	return substr($text, 1, -1);
-}
-
-
-//
-// Parse message text
-//
-function parse_message($text, $hide_smilies)
-{
-	global $pun_config, $lang_common, $pun_user;
-
-	if ($pun_config['o_censoring'] == '1')
-		$text = censor_words($text);
-
-	// Convert applicable characters to HTML entities
-	$text = pun_htmlspecialchars($text);
-
-	// If the message contains a code tag we have to split it up (text within [code][/code] shouldn't be touched)
-	if (strpos($text, '[code]') !== false && strpos($text, '[/code]') !== false)
-		list($inside, $text) = extract_blocks($text, '[code]', '[/code]', $errors);
-
-	if ($pun_config['p_message_bbcode'] == '1' && strpos($text, '[') !== false && strpos($text, ']') !== false)
-		$text = do_bbcode($text);
-
 	if ($pun_config['o_smilies'] == '1' && $pun_user['show_smilies'] == '1' && $hide_smilies == '0')
 		$text = do_smilies($text);
+
+	if ($pun_config['p_message_bbcode'] == '1' && strpos($text, '[') !== false && strpos($text, ']') !== false)
+	{
+		$text = do_bbcode($text);
+
+		if ($pun_config['p_message_img_tag'] == '1')
+		{
+//			$text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\.(jpg|jpeg|png|gif)\[/img\]#e', 'handle_img_tag(\'$1$3.$4\')', $text);
+			$text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]#e', 'handle_img_tag(\'$1$3\')', $text);
+		}
+	}
 
 	// Deal with newlines, tabs and multiple spaces
@@ -868,22 +430,35 @@
 
 	// If we split up the message before we have to concatenate it together again (code tags)
-    if (isset($inside)) {
-        $parts = explode("\1", $text);
-        $text = '';
-        foreach ($parts as $i => $part)
-        {
-            $text .= $part;
-            if (isset($inside[$i]))
-            {
-                $num_lines = (substr_count($inside[$i], "\n"));
-                $text .= '</p><div class="codebox"><pre'.(($num_lines > 28) ? ' class="vscroll"' : '').'><code>'.pun_trim($inside[$i], "\n\r").'</code></pre></div><p>';
-            }
-        }
-    }
+	if (isset($inside))
+	{
+		$outside = explode('<">', $text);
+		$text = '';
+
+		$num_tokens = count($outside);
+
+		for ($i = 0; $i < $num_tokens; ++$i)
+		{
+			$text .= $outside[$i];
+			if (isset($inside[$i]))
+			{
+				$num_lines = ((substr_count($inside[$i], "\n")) + 3) * 1.5;
+				$height_str = ($num_lines > 35) ? '35em' : $num_lines.'em';
+				$text .= '</p><div class="codebox"><div class="incqbox"><h4>'.$lang_common['Code'].':</h4><div class="scrollbox" style="height: '.$height_str.'"><pre>'.$inside[$i].'</pre></div></div></div><p>';
+			}
+		}
+	}
 
 	// Add paragraph tag around post, but make sure there are no empty paragraphs
-	$text = preg_replace('%<br />\s*?<br />((\s*<br />)*)%i', "</p>$1<p>", $text);
-	$text = str_replace('<p><br />', '<p>', $text);
 	$text = str_replace('<p></p>', '', '<p>'.$text.'</p>');
+
+	// Mod: Flash MP3 Player (8 nouvelles lignes suivent)
+	$player_url     = 'dewplayer-multi.swf';
+	$player_bgcolor = 'ffffff';
+	$player_width   = 240;
+	$player_height  = 20;
+	$player_param   = '?bgcolor='.$player_bgcolor.'&amp;mp3=$1';  // Pour plus d'options: http://www.alsacreations.fr/?dewplayer
+	$player_alternative = '<strong>Flash non dÃ©tÃ©ctÃ©</strong>';
+	$player_code = "\n\t\t\t\t\t<object type=\"application/x-shockwave-flash\" data=\"".$player_url.$player_param."\" width=\"".$player_width."\" height=\"".$player_height."\">\n\t\t\t\t\t  <param name=\"movie\" value=\"".$player_url.$player_param."\" />\n\t\t\t\t\t  <param name=\"bgcolor\" value=\"#".$player_bgcolor."\" />\n\t\t\t\t\t  ".$player_alternative."\n\t\t\t\t\t</object>\n\t\t\t\t\t";
+	$text = preg_replace("/\[mp3 url=([^ ]+)\]/", $player_code, $text);
 
 	return $text;
@@ -901,13 +476,22 @@
 		$text = censor_words($text);
 
-	// Convert applicable characters to HTML entities
 	$text = pun_htmlspecialchars($text);
 
+	if ($pun_config['o_make_links'] == '1')
+		$text = do_clickable($text);
+
+	if ($pun_config['o_smilies_sig'] == '1' && $pun_user['show_smilies'] != '0')
+		$text = do_smilies($text);
+
 	if ($pun_config['p_sig_bbcode'] == '1' && strpos($text, '[') !== false && strpos($text, ']') !== false)
-		$text = do_bbcode($text, true);
-
-	if ($pun_config['o_smilies_sig'] == '1' && $pun_user['show_smilies'] == '1')
-		$text = do_smilies($text);
-
+	{
+		$text = do_bbcode($text);
+
+		if ($pun_config['p_sig_img_tag'] == '1')
+		{
+//			$text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\.(jpg|jpeg|png|gif)\[/img\]#e', 'handle_img_tag(\'$1$3.$4\', true)', $text);
+			$text = preg_replace('#\[img\]((ht|f)tps?://)([^\s<"]*?)\[/img\]#e', 'handle_img_tag(\'$1$3\', true)', $text);
+		}
+	}
 
 	// Deal with newlines, tabs and multiple spaces
@@ -916,9 +500,5 @@
 	$text = str_replace($pattern, $replace, $text);
 
-	// Add paragraph tag around post, but make sure there are no empty paragraphs
-	$text = preg_replace('%<br />\s*?<br />((\s*<br />)*)%i', "</p>$1<p>", $text);
-	$text = str_replace('<p><br />', '<p>', $text);
-	$text = str_replace('<p></p>', '', '<p>'.$text.'</p>');
-
 	return $text;
 }
+?>
Index: trunk/web/punbb/include/search_idx.php
===================================================================
--- trunk/web/punbb/include/search_idx.php	(revision 10)
+++ trunk/web/punbb/include/search_idx.php	(revision 1)
@@ -1,12 +1,29 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // The contents of this file are very much inspired by the file functions_search.php
-// from the phpBB Group forum software phpBB2 (http://www.phpbb.com)
+// from the phpBB Group forum software phpBB2 (http://www.phpbb.com). 
 
 
@@ -16,138 +33,50 @@
 
 
-// Make a regex that will match CJK or Hangul characters
-define('PUN_CJK_HANGUL_REGEX', '['.
-	'\x{1100}-\x{11FF}'.		// Hangul Jamo							1100-11FF		(http://www.fileformat.info/info/unicode/block/hangul_jamo/index.htm)
-	'\x{3130}-\x{318F}'.		// Hangul Compatibility Jamo			3130-318F		(http://www.fileformat.info/info/unicode/block/hangul_compatibility_jamo/index.htm)
-	'\x{AC00}-\x{D7AF}'.		// Hangul Syllables						AC00-D7AF		(http://www.fileformat.info/info/unicode/block/hangul_syllables/index.htm)
-
-	// Hiragana
-	'\x{3040}-\x{309F}'.		// Hiragana								3040-309F		(http://www.fileformat.info/info/unicode/block/hiragana/index.htm)
-
-	// Katakana
-	'\x{30A0}-\x{30FF}'.		// Katakana								30A0-30FF		(http://www.fileformat.info/info/unicode/block/katakana/index.htm)
-	'\x{31F0}-\x{31FF}'.		// Katakana Phonetic Extensions			31F0-31FF		(http://www.fileformat.info/info/unicode/block/katakana_phonetic_extensions/index.htm)
-
-	// CJK Unified Ideographs	(http://en.wikipedia.org/wiki/CJK_Unified_Ideographs)
-	'\x{2E80}-\x{2EFF}'.		// CJK Radicals Supplement				2E80-2EFF		(http://www.fileformat.info/info/unicode/block/cjk_radicals_supplement/index.htm)
-	'\x{2F00}-\x{2FDF}'.		// Kangxi Radicals						2F00-2FDF		(http://www.fileformat.info/info/unicode/block/kangxi_radicals/index.htm)
-	'\x{2FF0}-\x{2FFF}'.		// Ideographic Description Characters	2FF0-2FFF		(http://www.fileformat.info/info/unicode/block/ideographic_description_characters/index.htm)
-	'\x{3000}-\x{303F}'.		// CJK Symbols and Punctuation			3000-303F		(http://www.fileformat.info/info/unicode/block/cjk_symbols_and_punctuation/index.htm)
-	'\x{31C0}-\x{31EF}'.		// CJK Strokes							31C0-31EF		(http://www.fileformat.info/info/unicode/block/cjk_strokes/index.htm)
-	'\x{3200}-\x{32FF}'.		// Enclosed CJK Letters and Months		3200-32FF		(http://www.fileformat.info/info/unicode/block/enclosed_cjk_letters_and_months/index.htm)
-	'\x{3400}-\x{4DBF}'.		// CJK Unified Ideographs Extension A	3400-4DBF		(http://www.fileformat.info/info/unicode/block/cjk_unified_ideographs_extension_a/index.htm)
-	'\x{4E00}-\x{9FFF}'.		// CJK Unified Ideographs				4E00-9FFF		(http://www.fileformat.info/info/unicode/block/cjk_unified_ideographs/index.htm)
-	'\x{20000}-\x{2A6DF}'.		// CJK Unified Ideographs Extension B	20000-2A6DF		(http://www.fileformat.info/info/unicode/block/cjk_unified_ideographs_extension_b/index.htm)
-']');
-
-
 //
 // "Cleans up" a text string and returns an array of unique words
 // This function depends on the current locale setting
 //
-function split_words($text, $idx)
+function split_words($text)
 {
-	// Remove BBCode
-	$text = preg_replace('%\[/?(b|u|s|ins|del|em|i|h|colou?r|quote|code|img|url|email|list)(?:\=[^\]]*)?\]%', ' ', $text);
-
-	// Remove any apostrophes or dashes which aren't part of words
-	$text = substr(ucp_preg_replace('%((?<=[^\p{L}\p{N}])[\'\-]|[\'\-](?=[^\p{L}\p{N}]))%u', '', ' '.$text.' '), 1, -1);
-
-	// Remove punctuation and symbols (actually anything that isn't a letter or number), allow apostrophes and dashes (and % * if we aren't indexing)
-	$text = ucp_preg_replace('%(?![\'\-'.($idx ? '' : '\%\*').'])[^\p{L}\p{N}]+%u', ' ', $text);
-
-	// Replace multiple whitespace or dashes
-	$text = preg_replace('%(\s){2,}%u', '\1', $text);
+	global $pun_user;
+	static $noise_match, $noise_replace, $stopwords;
+
+	if (empty($noise_match))
+	{
+		$noise_match = array('[quote', '[code', '[url', '[img', '[email', '[color', '[colour', 'quote]', 'code]', 'url]', 'img]', 'email]', 'color]', 'colour]', '^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '~', '+', '[', ']', '{', '}', ':', '\\', '/', '=', '#', ';', '!', '*');
+		$noise_replace = array('',       '',      '',     '',     '',       '',       '',        '',       '',      '',     '',     '',       '',       '',        ' ', ' ', ' ', ' ', ' ', ' ', ' ', '',  '',   ' ', ' ', ' ', ' ', '',  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '' ,  ' ', ' ', ' ', ' ', ' ', ' ');
+
+		$stopwords = (array)@file(PUN_ROOT.'lang/'.$pun_user['language'].'/stopwords.txt');
+		$stopwords = array_map('trim', $stopwords);
+	}
+
+	// Clean up
+	$patterns[] = '#&[\#a-z0-9]+?;#i';
+	$patterns[] = '#\b[\w]+:\/\/[a-z0-9\.\-]+(\/[a-z0-9\?\.%_\-\+=&\/~]+)?#';
+	$patterns[] = '#\[\/?[a-z\*=\+\-]+(\:?[0-9a-z]+)?:[a-z0-9]{10,}(\:[a-z0-9]+)?=?.*?\]#';
+	$text = preg_replace($patterns, ' ', ' '.strtolower($text).' ');
+
+	// Filter out junk
+	$text = str_replace($noise_match, $noise_replace, $text);
+
+	// Strip out extra whitespace between words
+	$text = trim(preg_replace('#\s+#', ' ', $text));
 
 	// Fill an array with all the words
-	$words = array_unique(explode(' ', $text));
-
-	// Remove any words that should not be indexed
-	foreach ($words as $key => $value)
-	{
-		// If the word shouldn't be indexed, remove it
-		if (!validate_search_word($value, $idx))
-			unset($words[$key]);
-	}
-
-	return $words;
-}
-
-
-//
-// Checks if a word is a valid searchable word
-//
-function validate_search_word($word, $idx)
-{
-	static $stopwords;
-
-	// If the word is a keyword we don't want to index it, but we do want to be allowed to search it
-	if (is_keyword($word))
-		return !$idx;
-
-	if (!isset($stopwords))
-	{
-		if (file_exists(FORUM_CACHE_DIR.'cache_stopwords.php'))
-			include FORUM_CACHE_DIR.'cache_stopwords.php';
-
-		if (!defined('PUN_STOPWORDS_LOADED'))
-		{
-			if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-				require PUN_ROOT.'include/cache.php';
-
-			generate_stopwords_cache();
-			require FORUM_CACHE_DIR.'cache_stopwords.php';
-		}
-	}
-
-	// If it is a stopword it isn't valid
-	if (in_array($word, $stopwords))
-		return false;
-
-	// If the word if CJK we don't want to index it, but we do want to be allowed to search it
-	if (is_cjk($word))
-		return !$idx;
-
-	// Check the word is within the min/max length
-	$num_chars = pun_strlen($word);
-	return $num_chars >= PUN_SEARCH_MIN_WORD && $num_chars <= PUN_SEARCH_MAX_WORD;
-}
-
-
-//
-// Check a given word is a search keyword.
-//
-function is_keyword($word)
-{
-	return $word == 'and' || $word == 'or' || $word == 'not';
-}
-
-
-//
-// Check if a given word is CJK or Hangul.
-//
-function is_cjk($word)
-{
-	return preg_match('%^'.PUN_CJK_HANGUL_REGEX.'+$%u', $word) ? true : false;
-}
-
-
-//
-// Strip [img] [url] and [email] out of the message so we don't index their contents
-//
-function strip_bbcode($text)
-{
-	static $patterns;
-
-	if (!isset($patterns))
-	{
-		$patterns = array(
-			'%\[img=([^\]]*+)\]([^[]*+)\[/img\]%'									=>	'$2 $1',	// Keep the url and description
-			'%\[(url|email)=([^\]]*+)\]([^[]*+(?:(?!\[/\1\])\[[^[]*+)*)\[/\1\]%'	=>	'$2 $3',	// Keep the url and text
-			'%\[(img|url|email)\]([^[]*+(?:(?!\[/\1\])\[[^[]*+)*)\[/\1\]%'			=>	'$2',		// Keep the url
-		);
-	}
-
-	return preg_replace(array_keys($patterns), array_values($patterns), $text);
+	$words = explode(' ', $text);
+
+	if (!empty($words))
+	{
+		while (list($i, $word) = @each($words))
+		{
+			$words[$i] = trim($word, '.');
+			$num_chars = pun_strlen($word);
+
+			if ($num_chars < 3 || $num_chars > 20 || in_array($word, $stopwords))
+				unset($words[$i]);
+		}
+	}
+
+	return array_unique($words);
 }
 
@@ -160,17 +89,11 @@
 	global $db_type, $db;
 
-	$message = utf8_strtolower($message);
-	$subject = utf8_strtolower($subject);
-
-	// Remove any bbcode that we shouldn't index
-	$message = strip_bbcode($message);
-
 	// Split old and new post/subject to obtain array of 'words'
-	$words_message = split_words($message, true);
-	$words_subject = ($subject) ? split_words($subject, true) : array();
+	$words_message = split_words($message);
+	$words_subject = ($subject) ? split_words($subject) : array();
 
 	if ($mode == 'edit')
 	{
-		$result = $db->query('SELECT w.id, w.word, m.subject_match FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON w.id=m.word_id WHERE m.post_id='.$post_id, true) or error('Unable to fetch search index words', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT w.id, w.word, m.subject_match FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON w.id=m.word_id WHERE m.post_id='.$post_id, true) or error('Impossible de retrouver les mots index de recherches', __FILE__, __LINE__, $db->error());
 
 		// Declare here to stop array_keys() and array_diff() from complaining if not set
@@ -207,5 +130,5 @@
 	if (!empty($unique_words))
 	{
-		$result = $db->query('SELECT id, word FROM '.$db->prefix.'search_words WHERE word IN(\''.implode('\',\'', array_map(array($db, 'escape'), $unique_words)).'\')', true) or error('Unable to fetch search index words', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT id, word FROM '.$db->prefix.'search_words WHERE word IN('.implode(',', preg_replace('#^(.*)$#', '\'\1\'', $unique_words)).')', true) or error('Impossible de retrouver les mots index de recherches', __FILE__, __LINE__, $db->error());
 
 		$word_ids = array();
@@ -224,12 +147,10 @@
 				case 'mysql':
 				case 'mysqli':
-				case 'mysql_innodb':
-				case 'mysqli_innodb':
-					$db->query('INSERT INTO '.$db->prefix.'search_words (word) VALUES(\''.implode('\'),(\'', array_map(array($db, 'escape'), $new_words)).'\')');
+					$db->query('INSERT INTO '.$db->prefix.'search_words (word) VALUES'.implode(',', preg_replace('#^(.*)$#', '(\'\1\')', $new_words))) or error('Impossible d\'ajouter les mots index de recherche', __FILE__, __LINE__, $db->error());
 					break;
 
 				default:
-					foreach ($new_words as $word)
-						$db->query('INSERT INTO '.$db->prefix.'search_words (word) VALUES(\''.$db->escape($word).'\')');
+					while (list(, $word) = @each($new_words))
+						$db->query('INSERT INTO '.$db->prefix.'search_words (word) VALUES(\''.$word.'\')') or error('Impossible d\'ajouter les mots index de recherche', __FILE__, __LINE__, $db->error());
 					break;
 			}
@@ -240,5 +161,5 @@
 
 	// Delete matches (only if editing a post)
-	foreach ($words['del'] as $match_in => $wordlist)
+	while (list($match_in, $wordlist) = @each($words['del']))
 	{
 		$subject_match = ($match_in == 'subject') ? 1 : 0;
@@ -247,18 +168,18 @@
 		{
 			$sql = '';
-			foreach ($wordlist as $word)
+			while (list(, $word) = @each($wordlist))
 				$sql .= (($sql != '') ? ',' : '').$cur_words[$match_in][$word];
 
-			$db->query('DELETE FROM '.$db->prefix.'search_matches WHERE word_id IN('.$sql.') AND post_id='.$post_id.' AND subject_match='.$subject_match) or error('Unable to delete search index word matches', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'search_matches WHERE word_id IN('.$sql.') AND post_id='.$post_id.' AND subject_match='.$subject_match) or error('Impossible de supprimer des mots index de recherche', __FILE__, __LINE__, $db->error());
 		}
 	}
 
 	// Add new matches
-	foreach ($words['add'] as $match_in => $wordlist)
+	while (list($match_in, $wordlist) = @each($words['add']))
 	{
 		$subject_match = ($match_in == 'subject') ? 1 : 0;
 
 		if (!empty($wordlist))
-			$db->query('INSERT INTO '.$db->prefix.'search_matches (post_id, word_id, subject_match) SELECT '.$post_id.', id, '.$subject_match.' FROM '.$db->prefix.'search_words WHERE word IN(\''.implode('\',\'', array_map(array($db, 'escape'), $wordlist)).'\')') or error('Unable to insert search index word matches', __FILE__, __LINE__, $db->error());
+			$db->query('INSERT INTO '.$db->prefix.'search_matches (post_id, word_id, subject_match) SELECT '.$post_id.', id, '.$subject_match.' FROM '.$db->prefix.'search_words WHERE word IN('.implode(',', preg_replace('#^(.*)$#', '\'\1\'', $wordlist)).')') or error('Impossible d\'ajouter les correspondances index de recherche', __FILE__, __LINE__, $db->error());
 	}
 
@@ -278,8 +199,6 @@
 		case 'mysql':
 		case 'mysqli':
-		case 'mysql_innodb':
-		case 'mysqli_innodb':
-		{
-			$result = $db->query('SELECT word_id FROM '.$db->prefix.'search_matches WHERE post_id IN('.$post_ids.') GROUP BY word_id') or error('Unable to fetch search index word match', __FILE__, __LINE__, $db->error());
+		{
+			$result = $db->query('SELECT word_id FROM '.$db->prefix.'search_matches WHERE post_id IN('.$post_ids.') GROUP BY word_id') or error('Impossible de retrouver les correspondances de mots index de recherche', __FILE__, __LINE__, $db->error());
 
 			if ($db->num_rows($result))
@@ -289,5 +208,5 @@
 					$word_ids .= ($word_ids != '') ? ','.$row[0] : $row[0];
 
-				$result = $db->query('SELECT word_id FROM '.$db->prefix.'search_matches WHERE word_id IN('.$word_ids.') GROUP BY word_id HAVING COUNT(word_id)=1') or error('Unable to fetch search index word match', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT word_id FROM '.$db->prefix.'search_matches WHERE word_id IN('.$word_ids.') GROUP BY word_id HAVING COUNT(word_id)=1') or error('Impossible de retrouver les correspondances de mots index de recherche', __FILE__, __LINE__, $db->error());
 
 				if ($db->num_rows($result))
@@ -297,5 +216,5 @@
 						$word_ids .= ($word_ids != '') ? ','.$row[0] : $row[0];
 
-					$db->query('DELETE FROM '.$db->prefix.'search_words WHERE id IN('.$word_ids.')') or error('Unable to delete search index word', __FILE__, __LINE__, $db->error());
+					$db->query('DELETE FROM '.$db->prefix.'search_words WHERE id IN('.$word_ids.')') or error('Impossible de supprimer des mots index de recherche', __FILE__, __LINE__, $db->error());
 				}
 			}
@@ -305,8 +224,8 @@
 
 		default:
-			$db->query('DELETE FROM '.$db->prefix.'search_words WHERE id IN(SELECT word_id FROM '.$db->prefix.'search_matches WHERE word_id IN(SELECT word_id FROM '.$db->prefix.'search_matches WHERE post_id IN('.$post_ids.') GROUP BY word_id) GROUP BY word_id HAVING COUNT(word_id)=1)') or error('Unable to delete from search index', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'search_words WHERE id IN(SELECT word_id FROM '.$db->prefix.'search_matches WHERE word_id IN(SELECT word_id FROM '.$db->prefix.'search_matches WHERE post_id IN('.$post_ids.') GROUP BY word_id) GROUP BY word_id HAVING COUNT(word_id)=1)') or error('Impossible de supprimer depuis l\'index de recherche', __FILE__, __LINE__, $db->error());
 			break;
 	}
 
-	$db->query('DELETE FROM '.$db->prefix.'search_matches WHERE post_id IN('.$post_ids.')') or error('Unable to delete search index word match', __FILE__, __LINE__, $db->error());
+	$db->query('DELETE FROM '.$db->prefix.'search_matches WHERE post_id IN('.$post_ids.')') or error('Impossible de supprimer des correspondances de mots index de recherche', __FILE__, __LINE__, $db->error());
 }
Index: trunk/web/punbb/include/template/admin.tpl
===================================================================
--- trunk/web/punbb/include/template/admin.tpl	(revision 10)
+++ trunk/web/punbb/include/template/admin.tpl	(revision 1)
@@ -1,14 +1,13 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<pun_language>" lang="<pun_language>" dir="<pun_content_direction>">
+
+<html dir="<pun_content_direction>">
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Type" content="text/html; charset=<pun_char_encoding>" />
 <pun_head>
 </head>
-
 <body>
 
+<div id="punwrap">
 <div id="punadmin" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
 
 <div id="brdheader" class="block">
@@ -25,12 +24,9 @@
 <pun_announcement>
 
-<div id="brdmain">
 <pun_main>
-</div>
 
 <pun_footer>
 
 </div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
 </div>
 
Index: trunk/web/punbb/include/template/help.tpl
===================================================================
--- trunk/web/punbb/include/template/help.tpl	(revision 10)
+++ trunk/web/punbb/include/template/help.tpl	(revision 1)
@@ -1,21 +1,17 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<pun_language>" lang="<pun_language>" dir="<pun_content_direction>">
+
+<html dir="<pun_content_direction>">
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Type" content="text/html; charset=<pun_char_encoding>" />
 <pun_head>
 </head>
-
 <body>
 
-<div id="punhelp" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
+<div id="punwrap">
+<div id="helpfile" class="pun">
 
-<div id="brdmain">
 <pun_main>
-</div>
 
 </div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
 </div>
 
Index: trunk/web/punbb/include/template/index.html
===================================================================
--- trunk/web/punbb/include/template/index.html	(revision 10)
+++ trunk/web/punbb/include/template/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/include/template/main.tpl
===================================================================
--- trunk/web/punbb/include/template/main.tpl	(revision 10)
+++ trunk/web/punbb/include/template/main.tpl	(revision 1)
@@ -1,19 +1,15 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<pun_language>" lang="<pun_language>" dir="<pun_content_direction>">
+
+<html dir="<pun_content_direction>">
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Type" content="text/html; charset=<pun_char_encoding>" />
 <pun_head>
 </head>
-
 <body>
-
+<div id="punwrap">
 <div id="pun<pun_page>" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div id="brdheader" class="block">
+  <div id="brdheader" class="block">
 	<div class="box">
 		<div id="brdtitle" class="inbox">
-			<pun_title>
 			<pun_desc>
 		</div>
@@ -21,16 +17,13 @@
 		<pun_status>
 	</div>
-</div>
+  </div>
 
 <pun_announcement>
 
-<div id="brdmain">
 <pun_main>
-</div>
 
 <pun_footer>
 
 </div>
-<div class="end-box"><div><!-- Bottom corners --></div></div>
 </div>
 
Index: trunk/web/punbb/include/template/maintenance.tpl
===================================================================
--- trunk/web/punbb/include/template/maintenance.tpl	(revision 10)
+++ trunk/web/punbb/include/template/maintenance.tpl	(revision 1)
@@ -1,21 +1,24 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<pun_language>" lang="<pun_language>" dir="<pun_content_direction>">
+
+<html dir="<pun_content_direction>">
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Type" content="text/html; charset=<pun_char_encoding>" />
 <pun_head>
 </head>
-
 <body>
 
+<div id="punwrap">
 <div id="punmaint" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
 
-<div id="brdmain">
-<pun_maint_main>
+<div class="block">
+	<h2><pun_maint_heading></h2>
+	<div class="box">
+		<div class="inbox">
+			<p><pun_maint_message></p>
+		</div>
+	</div>
 </div>
 
 </div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
 </div>
 
Index: trunk/web/punbb/include/template/redirect.tpl
===================================================================
--- trunk/web/punbb/include/template/redirect.tpl	(revision 10)
+++ trunk/web/punbb/include/template/redirect.tpl	(revision 1)
@@ -1,17 +1,21 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<pun_language>" lang="<pun_language>" dir="<pun_content_direction>">
+
+<html dir="<pun_content_direction>">
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Type" content="text/html; charset=<pun_char_encoding>" />
 <pun_head>
 </head>
-
 <body>
 
+<div id="punwrap">
 <div id="punredirect" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
 
-<div id="brdmain">
-<pun_redir_main>
+<div class="block">
+	<h2><pun_redir_heading></h2>
+	<div class="box">
+		<div class="inbox">
+			<p><pun_redir_text></p>
+		</div>
+	</div>
 </div>
 
@@ -19,5 +23,4 @@
 
 </div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
 </div>
 
Index: trunk/web/punbb/index.php
===================================================================
--- trunk/web/punbb/index.php	(revision 10)
+++ trunk/web/punbb/index.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -18,43 +35,18 @@
 require PUN_ROOT.'lang/'.$pun_user['language'].'/index.php';
 
-// Get list of forums and topics with new posts since last visit
-if (!$pun_user['is_guest'])
-{
-	$result = $db->query('SELECT t.forum_id, t.id, t.last_post FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.last_post>'.$pun_user['last_visit'].' AND t.moved_to IS NULL') or error('Unable to fetch new topics', __FILE__, __LINE__, $db->error());
-
-	$new_topics = array();
-	while ($cur_topic = $db->fetch_assoc($result))
-		$new_topics[$cur_topic['forum_id']][$cur_topic['id']] = $cur_topic['last_post'];
-
-	$tracked_topics = get_tracked_topics();
-}
-
-if ($pun_config['o_feed_type'] == '1')
-	$page_head = array('feed' => '<link rel="alternate" type="application/rss+xml" href="extern.php?action=feed&amp;type=rss" title="'.$lang_common['RSS active topics feed'].'" />');
-else if ($pun_config['o_feed_type'] == '2')
-	$page_head = array('feed' => '<link rel="alternate" type="application/atom+xml" href="extern.php?action=feed&amp;type=atom" title="'.$lang_common['Atom active topics feed'].'" />');
-
-$forum_actions = array();
-
-// Display a "mark all as read" link
-if (!$pun_user['is_guest'])
-	$forum_actions[] = '<a href="misc.php?action=markread">'.$lang_common['Mark all as read'].'</a>';
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']));
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']);
 define('PUN_ALLOW_INDEX', 1);
-define('PUN_ACTIVE_PAGE', 'index');
 require PUN_ROOT.'header.php';
 
 // Print the categories and forums
-$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Impossible de retrouver la liste des catÃ©gories et des forums.', __FILE__, __LINE__, $db->error());
 
 $cur_category = 0;
 $cat_count = 0;
-$forum_count = 0;
 while ($cur_forum = $db->fetch_assoc($result))
 {
 	$moderators = '';
 
-	if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
+	if ($cur_forum['cid'] != $cur_category)	// A new category since last iteration?
 	{
 		if ($cur_category != 0)
@@ -62,5 +54,4 @@
 
 		++$cat_count;
-		$forum_count = 0;
 
 ?>
@@ -84,24 +75,14 @@
 	}
 
-	++$forum_count;
-	$item_status = ($forum_count % 2 == 0) ? 'roweven' : 'rowodd';
-	$forum_field_new = '';
+	$item_status = '';
+	$icon_text = $lang_common['Normal icon'];
 	$icon_type = 'icon';
 
-	// Are there new posts since our last visit?
-	if (!$pun_user['is_guest'] && $cur_forum['last_post'] > $pun_user['last_visit'] && (empty($tracked_topics['forums'][$cur_forum['fid']]) || $cur_forum['last_post'] > $tracked_topics['forums'][$cur_forum['fid']]))
-	{
-		// There are new posts in this forum, but have we read all of them already?
-		foreach ($new_topics[$cur_forum['fid']] as $check_topic_id => $check_last_post)
-		{
-			if ((empty($tracked_topics['topics'][$check_topic_id]) || $tracked_topics['topics'][$check_topic_id] < $check_last_post) && (empty($tracked_topics['forums'][$cur_forum['fid']]) || $tracked_topics['forums'][$cur_forum['fid']] < $check_last_post))
-			{
-				$item_status .= ' inew';
-				$forum_field_new = '<span class="newtext">[ <a href="search.php?action=show_new&amp;fid='.$cur_forum['fid'].'">'.$lang_common['New posts'].'</a> ]</span>';
-				$icon_type = 'icon icon-new';
-
-				break;
-			}
-		}
+	// Are there new posts?
+	if (!$pun_user['is_guest'] && $cur_forum['last_post'] > $pun_user['last_visit'])
+	{
+		$item_status = 'inew';
+		$icon_text = $lang_common['New icon'];
+		$icon_type = 'icon inew';
 	}
 
@@ -109,12 +90,13 @@
 	if ($cur_forum['redirect_url'] != '')
 	{
-		$forum_field = '<h3><span class="redirtext">'.$lang_index['Link to'].'</span> <a href="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" title="'.$lang_index['Link to'].' '.pun_htmlspecialchars($cur_forum['redirect_url']).'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
-		$num_topics = $num_posts = '-';
-		$item_status .= ' iredirect';
+		$forum_field = '<h3><a href="'.pun_htmlspecialchars($cur_forum['redirect_url']).'" title="'.$lang_index['Link to'].' '.pun_htmlspecialchars($cur_forum['redirect_url']).'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
+		$num_topics = $num_posts = '&#160;';
+		$item_status = 'iredirect';
+		$icon_text = $lang_common['Redirect icon'];
 		$icon_type = 'icon';
 	}
 	else
 	{
-		$forum_field = '<h3><a href="viewforum.php?id='.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a>'.(!empty($forum_field_new) ? ' '.$forum_field_new : '').'</h3>';
+		$forum_field = '<h3><a href="viewforum.php?id='.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</a></h3>';
 		$num_topics = $cur_forum['num_topics'];
 		$num_posts = $cur_forum['num_posts'];
@@ -122,13 +104,12 @@
 
 	if ($cur_forum['forum_desc'] != '')
-		$forum_field .= "\n\t\t\t\t\t\t\t\t".'<div class="forumdesc">'.$cur_forum['forum_desc'].'</div>';
-
-	// If there is a last_post/last_poster
+		$forum_field .= "\n\t\t\t\t\t\t\t\t".$cur_forum['forum_desc'];
+
+
+	// If there is a last_post/last_poster.
 	if ($cur_forum['last_post'] != '')
 		$last_post = '<a href="viewtopic.php?pid='.$cur_forum['last_post_id'].'#p'.$cur_forum['last_post_id'].'">'.format_time($cur_forum['last_post']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_forum['last_poster']).'</span>';
-	else if ($cur_forum['redirect_url'] != '')
-		$last_post = '- - -';
 	else
-		$last_post = $lang_common['Never'];
+		$last_post = '&#160;';
 
 	if ($cur_forum['moderators'] != '')
@@ -137,27 +118,22 @@
 		$moderators = array();
 
-		foreach ($mods_array as $mod_username => $mod_id)
-		{
-			if ($pun_user['g_view_users'] == '1')
-				$moderators[] = '<a href="profile.php?id='.$mod_id.'">'.pun_htmlspecialchars($mod_username).'</a>';
-			else
-				$moderators[] = pun_htmlspecialchars($mod_username);
-		}
-
-		$moderators = "\t\t\t\t\t\t\t\t".'<p class="modlist">(<em>'.$lang_common['Moderated by'].'</em> '.implode(', ', $moderators).')</p>'."\n";
-	}
-
-?>
-				<tr class="<?php echo $item_status ?>">
+		while (list($mod_username, $mod_id) = @each($mods_array))
+			$moderators[] = '<a href="profile.php?id='.$mod_id.'">'.pun_htmlspecialchars($mod_username).'</a>';
+
+		$moderators = "\t\t\t\t\t\t\t\t".'<p><em>('.$lang_common['Moderated by'].'</em> '.implode(', ', $moderators).')</p>'."\n";
+	}
+
+?>
+ 				<tr<?php if ($item_status != '') echo ' class="'.$item_status.'"'; ?>>
 					<td class="tcl">
-						<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo forum_number_format($forum_count) ?></div></div>
-						<div class="tclcon">
-							<div>
+						<div class="intd">
+							<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo $icon_text ?></div></div>
+							<div class="tclcon">
 								<?php echo $forum_field."\n".$moderators ?>
 							</div>
 						</div>
 					</td>
-					<td class="tc2"><?php echo forum_number_format($num_topics) ?></td>
-					<td class="tc3"><?php echo forum_number_format($num_posts) ?></td>
+					<td class="tc2"><?php echo $num_topics ?></td>
+					<td class="tc3"><?php echo $num_posts ?></td>
 					<td class="tcr"><?php echo $last_post ?></td>
 				</tr>
@@ -172,37 +148,14 @@
 	echo '<div id="idx0" class="block"><div class="box"><div class="inbox"><p>'.$lang_index['Empty board'].'</p></div></div></div>';
 
+
 // Collect some statistics from the database
-if (file_exists(FORUM_CACHE_DIR.'cache_users_info.php'))
-	include FORUM_CACHE_DIR.'cache_users_info.php';
-
-if (!defined('PUN_USERS_INFO_LOADED'))
-{
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
-	generate_users_info_cache();
-	require FORUM_CACHE_DIR.'cache_users_info.php';
-}
-
-$result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Unable to fetch topic/post count', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT COUNT(id)-1 FROM '.$db->prefix.'users') or error('Impossible de retrouver le nombre total d\utilisateurs', __FILE__, __LINE__, $db->error());
+$stats['total_users'] = $db->result($result);
+
+$result = $db->query('SELECT id, username FROM '.$db->prefix.'users ORDER BY registered DESC LIMIT 1') or error('Impossible de retrouver le dernier membre inscrit', __FILE__, __LINE__, $db->error());
+$stats['last_user'] = $db->fetch_assoc($result);
+
+$result = $db->query('SELECT SUM(num_topics), SUM(num_posts) FROM '.$db->prefix.'forums') or error('Impossible de retrouver le nombre de discussions et de messages', __FILE__, __LINE__, $db->error());
 list($stats['total_topics'], $stats['total_posts']) = $db->fetch_row($result);
-
-if ($pun_user['g_view_users'] == '1')
-	$stats['newest_user'] = '<a href="profile.php?id='.$stats['last_user']['id'].'">'.pun_htmlspecialchars($stats['last_user']['username']).'</a>';
-else
-	$stats['newest_user'] = pun_htmlspecialchars($stats['last_user']['username']);
-
-if (!empty($forum_actions))
-{
-
-?>
-<div class="linksb">
-	<div class="inbox crumbsplus">
-		<p class="subscribelink clearb"><?php echo implode(' - ', $forum_actions); ?></p>
-	</div>
-</div>
-<?php
-
-}
 
 ?>
@@ -213,11 +166,11 @@
 			<dl class="conr">
 				<dt><strong><?php echo $lang_index['Board stats'] ?></strong></dt>
-				<dd><span><?php printf($lang_index['No of users'], '<strong>'.forum_number_format($stats['total_users']).'</strong>') ?></span></dd>
-				<dd><span><?php printf($lang_index['No of topics'], '<strong>'.forum_number_format($stats['total_topics']).'</strong>') ?></span></dd>
-				<dd><span><?php printf($lang_index['No of posts'], '<strong>'.forum_number_format($stats['total_posts']).'</strong>') ?></span></dd>
+				<dd><?php echo $lang_index['No of users'].': <strong>'. $stats['total_users'] ?></strong></dd>
+				<dd><?php echo $lang_index['No of topics'].': <strong>'.$stats['total_topics'] ?></strong></dd>
+				<dd><?php echo $lang_index['No of posts'].': <strong>'.$stats['total_posts'] ?></strong></dd>
 			</dl>
 			<dl class="conl">
 				<dt><strong><?php echo $lang_index['User info'] ?></strong></dt>
-				<dd><span><?php printf($lang_index['Newest user'], $stats['newest_user']) ?></span></dd>
+				<dd><?php echo $lang_index['Newest user'] ?>: <a href="profile.php?id=<?php echo $stats['last_user']['id'] ?>"><?php echo pun_htmlspecialchars($stats['last_user']['username']) ?></a></dd>
 <?php
 
@@ -227,15 +180,10 @@
 	$num_guests = 0;
 	$users = array();
-	$result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT user_id, ident FROM '.$db->prefix.'online WHERE idle=0 ORDER BY ident', true) or error('Impossible de retrouver la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 
 	while ($pun_user_online = $db->fetch_assoc($result))
 	{
 		if ($pun_user_online['user_id'] > 1)
-		{
-			if ($pun_user['g_view_users'] == '1')
-				$users[] = "\n\t\t\t\t".'<dd><a href="profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>';
-			else
-				$users[] = "\n\t\t\t\t".'<dd>'.pun_htmlspecialchars($pun_user_online['ident']);
-		}
+			$users[] = "\n\t\t\t\t".'<dd><a href="profile.php?id='.$pun_user_online['user_id'].'">'.pun_htmlspecialchars($pun_user_online['ident']).'</a>';
 		else
 			++$num_guests;
@@ -243,9 +191,9 @@
 
 	$num_users = count($users);
-	echo "\t\t\t\t".'<dd><span>'.sprintf($lang_index['Users online'], '<strong>'.forum_number_format($num_users).'</strong>').'</span></dd>'."\n\t\t\t\t".'<dd><span>'.sprintf($lang_index['Guests online'], '<strong>'.forum_number_format($num_guests).'</strong>').'</span></dd>'."\n\t\t\t".'</dl>'."\n";
+	echo "\t\t\t\t".'<dd>'. $lang_index['Users online'].': <strong>'.$num_users.'</strong></dd>'."\n\t\t\t\t".'<dd>'.$lang_index['Guests online'].': <strong>'.$num_guests.'</strong></dd>'."\n\t\t\t".'</dl>'."\n";
 
 
 	if ($num_users > 0)
-		echo "\t\t\t".'<dl id="onlinelist" class="clearb">'."\n\t\t\t\t".'<dt><strong>'.$lang_index['Online'].' </strong></dt>'."\t\t\t\t".implode(',</dd> ', $users).'</dd>'."\n\t\t\t".'</dl>'."\n";
+		echo "\t\t\t".'<dl id="onlinelist" class= "clearb">'."\n\t\t\t\t".'<dt><strong>'.$lang_index['Online'].':&#160;</strong></dt>'."\t\t\t\t".implode(',</dd> ', $users).'</dd>'."\n\t\t\t".'</dl>'."\n";
 	else
 		echo "\t\t\t".'<div class="clearer"></div>'."\n";
@@ -253,5 +201,5 @@
 }
 else
-	echo "\t\t\t".'</dl>'."\n\t\t\t".'<div class="clearer"></div>'."\n";
+	echo "\t\t".'</dl>'."\n\t\t\t".'<div class="clearer"></div>'."\n";
 
 
@@ -261,4 +209,125 @@
 </div>
 <?php
+$hide_smilies = 0;
+$nb_messages_max = 50;
+$nom_fichier = 'chatbox.txt';
+$hauteur_parloire = '200px';
+$largeur_parloire = '100%';
+$color_box = '#666666';
+$color_title = '#FFFFFF';
+
+$anti_flood_msg = '<strong>ATTENTION : Vous avez dÃ©jÃ  postÃ© exactement le mÃªme message dans la chatbox auparavant. Pour Ã©viter d\'encombrer la chatbox, votre message n\'a pas Ã©tÃ© postÃ©.</strong>';
+$anti_blanc_msg = '<strong>ATTENTION : Vous avez postÃ© un message sans aucun texte ! Votre "message" n\'a pas Ã©tÃ© postÃ©.</strong>';
+$no_membre_msg = '<strong>Vous devez Ãªtre membre pour accÃ©der Ã  la chatbox</strong>';
+$actualiser_msg = 'Actualiser';
+$poster_msg = 'Poster';
+
+
+require PUN_ROOT.'include/parser.php';
+
+$tpl_parloir = file_get_contents(PUN_ROOT.$nom_fichier);
+
+$messages = explode("</MESSAGE>", $tpl_parloir);
+
+$nb_messages = count($messages);
+
+$parloir = '';
+$parloir_txt = '';
+$anti_flood = 0;
+
+if (isset($_GET['option']) && isset($_POST['message']) && !$pun_user['is_guest'])
+  $parloir_tmp_flood = '<MESSAGE><ID>'.$pun_user['id'].'</ID><TEXTE>'.$_POST['message'].'</TEXTE>';
+else
+  $parloir_tmp_flood = '<no_post>';
+
+  
+for($i=0;$i<$nb_messages - 1;$i++)
+{
+  $grab = ereg("<ID>(.*)</ID>", $messages[$i], $mess_id);
+  $grab = ereg("<PSEUDO>(.*)</PSEUDO>", $messages[$i], $mess_pseudo);
+  $grab = ereg("<DATE>(.*)</DATE>", $messages[$i], $mess_date);
+  $grab = ereg("<TEXTE>(.*)</TEXTE>", $messages[$i], $mess_texte);
+
+  $parloir .= '<a href="profile.php?id='.$mess_id[1].'"><strong>'.pun_htmlspecialchars($mess_pseudo[1]).'</strong></a> - '.format_time($mess_date[1])."\n".'<br />'."\n".parse_message($mess_texte[1], $hide_smilies)."\n"."\n"."\n";
+  if ($i+1 < $nb_messages_max)
+  {
+
+  $parloir_txt_flood = '<MESSAGE><ID>'.$mess_id[1].'</ID><TEXTE>'.$mess_texte[1].'</TEXTE>';
+
+   if ($parloir_tmp_flood == $parloir_txt_flood)
+    $anti_flood = 1;
+
+    $parloir_txt .= '<MESSAGE>'."\r".' <ID>'.$mess_id[1].'</ID>'."\r".' <PSEUDO>'.$mess_pseudo[1].'</PSEUDO>'."\r".' <DATE>'.$mess_date[1].'</DATE>'."\r".' <TEXTE>'.$mess_texte[1].'</TEXTE>'."\r".'</MESSAGE>'."\n\n";
+
+  }
+
+}
+
+if (isset($_GET['option']) && isset($_POST['message']) && !$pun_user['is_guest'])
+{
+    if ($anti_flood == 0 && $_POST['message'] != '')
+    {
+      $fp = fopen(PUN_ROOT.$nom_fichier, "w");
+      if ($fp)
+      {
+        $parloir_txt = '<MESSAGE>'."\r".' <ID>'.$pun_user['id'].'</ID>'."\r".' <PSEUDO>'.$pun_user['username'].'</PSEUDO>'."\r".' <DATE>'.time().'</DATE>'."\r".' <TEXTE>'.$_POST['message'].'</TEXTE>'."\r".'</MESSAGE>'."\n\n".$parloir_txt;
+        $r = fwrite($fp, $parloir_txt);
+      }
+      fclose($fp); 
+      $parloir = '<a href="profile.php?id='.$pun_user['id'].'"><strong>'.pun_htmlspecialchars($pun_user['username']).'</strong></a> - '.format_time(time())."\n".'<br />'."\n".parse_message($_POST['message'], $hide_smilies)."\n"."\n"."\n".$parloir;
+    }
+    elseif ($anti_flood == 1)
+    {
+      $parloir = $anti_flood_msg."\n".'<br />'."\n".'<br />'."\n".$parloir;
+    }
+    else
+    {
+      $parloir = $anti_blanc_msg."\n".'<br />'."\n".'<br />'."\n".$parloir;
+    }
+}
+
+
+
+?>
+  <div style="border:1px solid <?php echo $color_box; ?>;width:<?php echo $largeur_parloire; ?>;">
+    <table border="0" cellspacing="0" cellpadding="0">
+          <tr style="background: <?php echo $color_box; ?>;color: <?php echo $color_title; ?>;">
+            <td style="border:none;"><strong>Chatbox</strong></td>
+          </tr>
+    </table>
+  <div style="background-color:#1f1f1f;padding:5px;margin:0;overflow:auto;height:<?php echo $hauteur_parloire; ?>;">
+<?php echo $parloir; ?>
+
+  </div>
+<?php
+
+if ($pun_user['is_guest'])
+{
+?>
+    <table border="0" cellspacing="0" cellpadding="0">
+          <tr style="background: <?php echo $color_box; ?>;color: <?php echo $color_title; ?>;">
+            <td style="border:none;"><?php echo $no_membre_msg; ?></td>
+          </tr>
+    </table>
+<?php
+}
+else
+{
+?>
+    <table border="0" cellspacing="0" cellpadding="0">
+          <tr style="background: <?php echo $color_box; ?>;color: <?php echo $color_title; ?>;">
+            <td style="border:none;vertical-align:middle;">
+          <form method="post" name="form_parloir" action="?option=post">
+            <NOBR><strong>Message : </strong> <input type="text" name="message"  size="35" maxlength="255" /> <input type="submit" name="ajouter" value="<?php echo $poster_msg; ?>" /> <a href="?refresh=1"><input type="button" value="<?php echo $actualiser_msg; ?>" /></a></NOBR>
+                </form>
+        </td>
+          </tr>
+    </table>
+<?php
+}
+
+?>
+  </div>
+<?php
 
 $footer_style = 'index';
Index: trunk/web/punbb/install.php
===================================================================
--- trunk/web/punbb/install.php	(revision 10)
+++ trunk/web/punbb/install.php	(revision 1)
@@ -1,235 +1,60 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-// The FluxBB version this script installs
-define('FORUM_VERSION', '1.4.7');
-
-define('FORUM_DB_REVISION', 15);
-define('FORUM_SI_REVISION', 2);
-define('FORUM_PARSER_REVISION', 2);
-
-define('MIN_PHP_VERSION', '4.4.0');
-define('MIN_MYSQL_VERSION', '4.1.2');
-define('MIN_PGSQL_VERSION', '7.0.0');
-define('PUN_SEARCH_MIN_WORD', 3);
-define('PUN_SEARCH_MAX_WORD', 20);
-
-
-define('PUN_ROOT', dirname(__FILE__).'/');
-
-// Load the functions script
-require PUN_ROOT.'include/functions.php';
-
-// Load UTF-8 functions
-require PUN_ROOT.'include/utf8/utf8.php';
-
-// Strip out "bad" UTF-8 characters
-forum_remove_bad_characters();
-
-// Reverse the effect of register_globals
-forum_unregister_globals();
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+// The PunBB version this script installs
+$punbb_version = '1.2.10';
+$punbb_version_fr = '1.2.10';
+
+
+define('PUN_ROOT', './');
+if (file_exists(PUN_ROOT.'config.php'))
+	exit('Le fichier \'config.php\' existe dÃ©jÃ , ce qui signifie trÃšs probablement que PunBB est dÃ©jÃ  installÃ©. Vous devriez plutÃŽt <a href="index.php">aller ici</a>.');
+
+
+// Make sure we are running at least PHP 4.1.0
+if (intval(str_replace('.', '', phpversion())) < 410)
+	exit('Vous utilisez la version '.PHP_VERSION.' de PHP. PunBB nÃ©cÃ©ssite au minimum PHP 4.1.0 pour fonctionner correctement. Vous devez mettre Ã  jour votre installation de PHP afin que vous ne puissiez continuer.');
 
 // Disable error reporting for uninitialized variables
 error_reporting(E_ALL);
 
-// Force POSIX locale (to prevent functions such as strtolower() from messing up UTF-8 strings)
-setlocale(LC_CTYPE, 'C');
-
-// Turn off magic_quotes_runtime
-if (get_magic_quotes_runtime())
-	set_magic_quotes_runtime(0);
-
-// Strip slashes from GET/POST/COOKIE (if magic_quotes_gpc is enabled)
-if (get_magic_quotes_gpc())
-{
-	function stripslashes_array($array)
-	{
-		return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array);
-	}
-
-	$_GET = stripslashes_array($_GET);
-	$_POST = stripslashes_array($_POST);
-	$_COOKIE = stripslashes_array($_COOKIE);
-	$_REQUEST = stripslashes_array($_REQUEST);
-}
-
 // Turn off PHP time limit
 @set_time_limit(0);
 
 
-// If we've been passed a default language, use it
-$install_lang = isset($_REQUEST['install_lang']) ? trim($_REQUEST['install_lang']) : 'English';
-
-// If such a language pack doesn't exist, or isn't up-to-date enough to translate this page, default to English
-if (!file_exists(PUN_ROOT.'lang/'.$install_lang.'/install.php'))
-	$install_lang = 'English';
-
-require PUN_ROOT.'lang/'.$install_lang.'/install.php';
-
-if (file_exists(PUN_ROOT.'config.php'))
-{
-	// Check to see whether FluxBB is already installed
-	include PUN_ROOT.'config.php';
-
-	// If we have the 1.3-legacy constant defined, define the proper 1.4 constant so we don't get an incorrect "need to install" message
-	if (defined('FORUM'))
-		define('PUN', FORUM);
-
-	// If PUN is defined, config.php is probably valid and thus the software is installed
-	if (defined('PUN'))
-		exit($lang_install['Already installed']);
-}
-
-// Define PUN because email.php requires it
-define('PUN', 1);
-
-// If the cache directory is not specified, we use the default setting
-if (!defined('FORUM_CACHE_DIR'))
-	define('FORUM_CACHE_DIR', PUN_ROOT.'cache/');
-
-// Make sure we are running at least MIN_PHP_VERSION
-if (!function_exists('version_compare') || version_compare(PHP_VERSION, MIN_PHP_VERSION, '<'))
-	exit(sprintf($lang_install['You are running error'], 'PHP', PHP_VERSION, FORUM_VERSION, MIN_PHP_VERSION));
-
-
-//
-// Generate output to be used for config.php
-//
-function generate_config_file()
-{
-	global $db_type, $db_host, $db_name, $db_username, $db_password, $db_prefix, $cookie_name, $cookie_seed;
-
-	return '<?php'."\n\n".'$db_type = \''.$db_type."';\n".'$db_host = \''.$db_host."';\n".'$db_name = \''.addslashes($db_name)."';\n".'$db_username = \''.addslashes($db_username)."';\n".'$db_password = \''.addslashes($db_password)."';\n".'$db_prefix = \''.addslashes($db_prefix)."';\n".'$p_connect = false;'."\n\n".'$cookie_name = '."'".$cookie_name."';\n".'$cookie_domain = '."'';\n".'$cookie_path = '."'/';\n".'$cookie_secure = 0;'."\n".'$cookie_seed = \''.random_key(16, false, true)."';\n\ndefine('PUN', 1);\n";
-}
-
-
-if (isset($_POST['generate_config']))
-{
-	header('Content-Type: text/x-delimtext; name="config.php"');
-	header('Content-disposition: attachment; filename=config.php');
-
-	$db_type = $_POST['db_type'];
-	$db_host = $_POST['db_host'];
-	$db_name = $_POST['db_name'];
-	$db_username = $_POST['db_username'];
-	$db_password = $_POST['db_password'];
-	$db_prefix = $_POST['db_prefix'];
-	$cookie_name = $_POST['cookie_name'];
-	$cookie_seed = $_POST['cookie_seed'];
-
-	echo generate_config_file();
-	exit;
-}
-
-
 if (!isset($_POST['form_sent']))
-{
-	// Make an educated guess regarding base_url
-	$base_url  = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';	// protocol
-	$base_url .= preg_replace('%:(80|443)$%', '', $_SERVER['HTTP_HOST']);							// host[:port]
-	$base_url .= str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME']));							// path
-
-	if (substr($base_url, -1) == '/')
-		$base_url = substr($base_url, 0, -1);
-
-	$db_type = $db_name = $db_username = $db_prefix = $username = $email = '';
-	$db_host = 'localhost';
-	$title = $lang_install['My FluxBB Forum'];
-	$description = '<p><span>'.$lang_install['Description'].'</span></p>';
-	$default_lang = $install_lang;
-	$default_style = 'Air';
-}
-else
-{
-	$db_type = $_POST['req_db_type'];
-	$db_host = pun_trim($_POST['req_db_host']);
-	$db_name = pun_trim($_POST['req_db_name']);
-	$db_username = pun_trim($_POST['db_username']);
-	$db_password = pun_trim($_POST['db_password']);
-	$db_prefix = pun_trim($_POST['db_prefix']);
-	$username = pun_trim($_POST['req_username']);
-	$email = strtolower(pun_trim($_POST['req_email']));
-	$password1 = pun_trim($_POST['req_password1']);
-	$password2 = pun_trim($_POST['req_password2']);
-	$title = pun_trim($_POST['req_title']);
-	$description = pun_trim($_POST['desc']);
-	$base_url = pun_trim($_POST['req_base_url']);
-	$default_lang = pun_trim($_POST['req_default_lang']);
-	$default_style = pun_trim($_POST['req_default_style']);
-	$alerts = array();
-
-	// Make sure base_url doesn't end with a slash
-	if (substr($base_url, -1) == '/')
-		$base_url = substr($base_url, 0, -1);
-
-	// Validate username and passwords
-	if (pun_strlen($username) < 2)
-		$alerts[] = $lang_install['Username 1'];
-	else if (pun_strlen($username) > 25) // This usually doesn't happen since the form element only accepts 25 characters
-		$alerts[] = $lang_install['Username 2'];
-	else if (!strcasecmp($username, 'Guest'))
-		$alerts[] = $lang_install['Username 3'];
-	else if (preg_match('%[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}%', $username) || preg_match('%((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))%', $username))
-		$alerts[] = $lang_install['Username 4'];
-	else if ((strpos($username, '[') !== false || strpos($username, ']') !== false) && strpos($username, '\'') !== false && strpos($username, '"') !== false)
-		$alerts[] = $lang_install['Username 5'];
-	else if (preg_match('%(?:\[/?(?:b|u|i|h|colou?r|quote|code|img|url|email|list)\]|\[(?:code|quote|list)=)%i', $username))
-		$alerts[] = $lang_install['Username 6'];
-
-	if (pun_strlen($password1) < 4)
-		$alerts[] = $lang_install['Short password'];
-	else if ($password1 != $password2)
-		$alerts[] = $lang_install['Passwords not match'];
-
-	// Validate email
-	require PUN_ROOT.'include/email.php';
-
-	if (!is_valid_email($email))
-		$alerts[] = $lang_install['Wrong email'];
-
-	if ($title == '')
-		$alerts[] = $lang_install['No board title'];
-
-	$languages = forum_list_langs();
-	if (!in_array($default_lang, $languages))
-		$alerts[] = $lang_install['Error default language'];
-
-	$styles = forum_list_styles();
-	if (!in_array($default_style, $styles))
-		$alerts[] = $lang_install['Error default style'];
-}
-
-// Check if the cache directory is writable
-if (!@is_writable(FORUM_CACHE_DIR))
-	$alerts[] = sprintf($lang_install['Alert cache'], FORUM_CACHE_DIR);
-
-// Check if default avatar directory is writable
-if (!@is_writable(PUN_ROOT.'img/avatars/'))
-	$alerts[] = sprintf($lang_install['Alert avatar'], PUN_ROOT.'img/avatars/');
-
-if (!isset($_POST['form_sent']) || !empty($alerts))
 {
 	// Determine available database extensions
 	$dual_mysql = false;
 	$db_extensions = array();
-	$mysql_innodb = false;
 	if (function_exists('mysqli_connect'))
-	{
-		$db_extensions[] = array('mysqli', 'MySQL Improved');
-		$db_extensions[] = array('mysqli_innodb', 'MySQL Improved (InnoDB)');
-		$mysql_innodb = true;
-	}
+		$db_extensions[] = array('mysqli', 'MySQL amÃ©liorÃ© (MySQL Improved)');
 	if (function_exists('mysql_connect'))
 	{
 		$db_extensions[] = array('mysql', 'MySQL Standard');
-		$db_extensions[] = array('mysql_innodb', 'MySQL Standard (InnoDB)');
-		$mysql_innodb = true;
-
-		if (count($db_extensions) > 2)
+
+		if (count($db_extensions) > 1)
 			$dual_mysql = true;
 	}
@@ -240,141 +65,86 @@
 
 	if (empty($db_extensions))
-		error($lang_install['No DB extensions']);
-
-	// Fetch a list of installed languages
-	$languages = forum_list_langs();
+		exit('Cet environnement PHP n\'a le support pour aucune bases de donnÃ©es que PunBB peut utiliser. Afin d\'installer PunBB, PHP doit supporter soit MySQL, PostgreSQL ou SQLite.');
 
 ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
+
+<html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo $lang_install['FluxBB Installation'] ?></title>
-<link rel="stylesheet" type="text/css" href="style/<?php echo $default_style ?>.css" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title>Installation de PunBB</title>
+<link rel="stylesheet" type="text/css" href="style/Oxygen.css" />
 <script type="text/javascript">
-/* <![CDATA[ */
+<!--
 function process_form(the_form)
 {
-	var element_names = {
-		"req_db_type": "<?php echo $lang_install['Database type'] ?>",
-		"req_db_host": "<?php echo $lang_install['Database server hostname'] ?>",
-		"req_db_name": "<?php echo $lang_install['Database name'] ?>",
-		"db_prefix": "<?php echo $lang_install['Table prefix'] ?>",
-		"req_username": "<?php echo $lang_install['Administrator username'] ?>",
-		"req_password1": "<?php echo $lang_install['Administrator password 1'] ?>",
-		"req_password2": "<?php echo $lang_install['Administrator password 2'] ?>",
-		"req_email": "<?php echo $lang_install['Administrator email'] ?>",
-		"req_title": "<?php echo $lang_install['Board title'] ?>",
-		"req_base_url": "<?php echo $lang_install['Base URL'] ?>"
-	};
+	var element_names = new Object()
+	element_names["req_db_type"] = "Type de base de donnÃ©es"
+	element_names["req_db_host"] = "HÃŽte serveur de base de donnÃ©es"
+	element_names["req_db_name"] = "Nom de base de donnÃ©es"
+	element_names["db_prefix"] = "PrÃ©fixe tables"
+	element_names["req_username"] = "Nom utilisateur administrateur"
+	element_names["req_password1"] = "Mot de passe administrateur 1"
+	element_names["req_password2"] = "Mot de passe administrateur 2"
+	element_names["req_email"] = "E-mail administrateur"
+	element_names["req_base_url"] = "URL de base"
+
 	if (document.all || document.getElementById)
 	{
-		for (var i = 0; i < the_form.length; ++i)
+		for (i = 0; i < the_form.length; ++i)
 		{
-			var elem = the_form.elements[i];
-			if (elem.name && (/^req_/.test(elem.name)))
+			var elem = the_form.elements[i]
+			if (elem.name && elem.name.substring(0, 4) == "req_")
 			{
-				if (!elem.value && elem.type && (/^(?:text(?:area)?|password|file)$/i.test(elem.type)))
+				if (elem.type && (elem.type=="text" || elem.type=="textarea" || elem.type=="password" || elem.type=="file") && elem.value=='')
 				{
-					alert('"' + element_names[elem.name] + '" <?php echo $lang_install['Required field'] ?>');
-					elem.focus();
-					return false;
+					alert("\"" + element_names[elem.name] + "\" est un champ requis pour ce formulaire.")
+					elem.focus()
+					return false
 				}
 			}
 		}
 	}
-	return true;
+
+	return true
 }
-/* ]]> */
+// -->
 </script>
 </head>
-<body onload="document.getElementById('install').req_db_type.focus();document.getElementById('install').start.disabled=false;" onunload="">
-
-<div id="puninstall" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div id="brdheader" class="block">
+<body onload="document.getElementById('install').req_db_type.focus()">
+
+<div id="puninstall" style="margin: auto 10% auto 10%">
+<div class="pun">
+
+<div class="block">
+	<h2><span>Installation de PunBB</span></h2>
 	<div class="box">
-		<div id="brdtitle" class="inbox">
-			<h1><span><?php echo $lang_install['FluxBB Installation'] ?></span></h1>
-			<div id="brddesc"><p><?php echo $lang_install['Install message'] ?></p><p><?php echo $lang_install['Welcome'] ?></p></div>
+		<div class="inbox">
+			<p>Bienvenue sur l'application d'installation de  PunBB ! Vous vous apprÃªtez Ã  installer PunBB. Afin d'installer celui-ci vous devez remplir le formulaire ci-dessous. Si vous rencontrez des difficultÃ©s avec l'installation, veuillez s'il vous plait vous rÃ©fÃ©rer Ã  la documentation.</p>
 		</div>
 	</div>
 </div>
 
-<div id="brdmain">
-<?php if (count($languages) > 1): ?><div class="blockform">
-	<h2><span><?php echo $lang_install['Choose install language'] ?></span></h2>
-	<div class="box">
-		<form id="install" method="post" action="install.php">
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_install['Install language'] ?></legend>
-					<div class="infldset">
-						<p><?php echo $lang_install['Choose install language info'] ?></p>
-						<label><strong><?php echo $lang_install['Install language'] ?></strong>
-						<br /><select name="install_lang">
-<?php
-
-		foreach ($languages as $temp)
-		{
-			if ($temp == $install_lang)
-				echo "\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.$temp.'</option>'."\n";
-			else
-				echo "\t\t\t\t\t".'<option value="'.$temp.'">'.$temp.'</option>'."\n";
-		}
-
-?>
-						</select>
-						<br /></label>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="start" value="<?php echo $lang_install['Change language'] ?>" /></p>
-		</form>
-	</div>
-</div>
-<?php endif; ?>
-
 <div class="blockform">
-	<h2><span><?php echo $lang_install['Install'] ?></span></h2>
+	<h2><span>Installer PunBB</span></h2>
 	<div class="box">
 		<form id="install" method="post" action="install.php" onsubmit="this.start.disabled=true;if(process_form(this)){return true;}else{this.start.disabled=false;return false;}">
-		<div><input type="hidden" name="form_sent" value="1" /><input type="hidden" name="install_lang" value="<?php echo pun_htmlspecialchars($install_lang) ?>" /></div>
-			<div class="inform">
-<?php if (!empty($alerts)): ?>				<div class="forminfo error-info">
-					<h3><?php echo $lang_install['Errors'] ?></h3>
-					<ul class="error-list">
-<?php
-
-foreach ($alerts as $cur_alert)
-	echo "\t\t\t\t\t\t".'<li><strong>'.$cur_alert.'</strong></li>'."\n";
-?>
-					</ul>
-				</div>
-<?php endif; ?>			</div>
+		<div><input type="hidden" name="form_sent" value="1" /></div>
 			<div class="inform">
 				<div class="forminfo">
-					<h3><?php echo $lang_install['Database setup'] ?></h3>
-					<p><?php echo $lang_install['Info 1'] ?></p>
+					<h3>RÃ©glages de la base de donnÃ©es</h3>
+					<p>Afin d'installer votre base de donnÃ©es pour PunBB, veuillez saisir les informations demandÃ©es ci-dessous. Vous devez connaÃ®tre toutes les informations demandÃ©es avant de procÃ©der Ã  l'installation.</p>
 				</div>
 				<fieldset>
-				<legend><?php echo $lang_install['Select database'] ?></legend>
+				<legend>SÃ©lectionnez le type de votre base de donnÃ©es</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 2'] ?></p>
-<?php if ($dual_mysql): ?>						<p><?php echo $lang_install['Dual MySQL'] ?></p>
-<?php endif; ?><?php if ($mysql_innodb): ?>						<p><?php echo $lang_install['InnoDB'] ?></p>
-<?php endif; ?>						<label class="required"><strong><?php echo $lang_install['Database type'] ?> <span><?php echo $lang_install['Required'] ?></span></strong>
+						<p>PunBB supporte actuellement MySQL, PostgreSQL et SQLite. Si votre base de donnÃ©es est absente du menu dÃ©roulant ci-dessous, cela signifie que cet environnement <acronym title="PHP: Hypertext Preprocessor" lang="en">PHP</acronym> n'a pas le support pour cette base de donnÃ©es particuliÃšre. Plus d'information concernant le support des versions particuliÃšres de chaque base de donnÃ©es pourra Ãªtre trouvÃ©e dans la <acronym title="Frequently Asked Questions" lang="en">FAQ</acronym>.</p>
+<?php if ($dual_mysql): ?>						<p>PunBB a dÃ©tectÃ© que votre environnement PHP supporte deux maniÃšres diffÃ©rentes de communiquer avec MySQL. Les deux options s'appellent "standard" (MySQL) et "amÃ©liorÃ©" (MySQLi ; "i" comme "improved"). Si vous n'Ãªtes pas certain de laquelle utiliser, commencez par essayer "amÃ©liorÃ©" et si cela Ã©choue, essayez "standard".</p>
+<?php endif; ?>						<label><strong>Type de base de donnÃ©es</strong>
 						<br /><select name="req_db_type">
 <?php
 
-	foreach ($db_extensions as $temp)
-	{
-		if ($temp[0] == $db_type)
-			echo "\t\t\t\t\t\t\t".'<option value="'.$temp[0].'" selected="selected">'.$temp[1].'</option>'."\n";
-		else
-			echo "\t\t\t\t\t\t\t".'<option value="'.$temp[0].'">'.$temp[1].'</option>'."\n";
-	}
+	foreach ($db_extensions as $db_type)
+		echo "\t\t\t\t\t\t\t".'<option value="'.$db_type[0].'">'.$db_type[1].'</option>'."\n";
 
 ?>
@@ -386,8 +156,8 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Database hostname'] ?></legend>
+					<legend>Saisissez l'adresse de votre serveur de base de donnÃ©es</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 3'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Database server hostname'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="text" name="req_db_host" value="<?php echo pun_htmlspecialchars($db_host) ?>" size="50" /><br /></label>
+						<p>L'adresse du serveur de base de donnÃ©es  (exemples : localhost, db.monhote.com ou 192.168.0.15). Vous pouvez indiquer un numÃ©ro de port personnalisÃ© au cas oÃ¹ votre base de donnÃ©e ne fonctionne pas sur le port par dÃ©faut  (exemple : localhost:3580). Pour le support de SQLite, Ã©crivez n'importe quoi ou laissez 'localhost'.</p>
+						<label><strong>HÃŽte serveur de base de donnÃ©es</strong><br /><input type="text" name="req_db_host" value="localhost" size="50" maxlength="100" /><br /></label>
 					</div>
 				</fieldset>
@@ -395,8 +165,8 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Database enter name'] ?></legend>
+					<legend>Saisissez le nom de votre base de donnÃ©es</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 4'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Database name'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_db_name" type="text" name="req_db_name" value="<?php echo pun_htmlspecialchars($db_name) ?>" size="30" /><br /></label>
+						<p>Le nom de la base de donnÃ©es sur laquelle PunBB sera installÃ©. La base de donnÃ©es doit exister. Pour SQLite, il s'agit du chemin relatif vers le fichier de base de donnÃ©es. Si ce fichier de base de donnÃ©es SQLite n'existe pas, PunBB essayera de le crÃ©er.</p>
+						<label for="req_db_name"><strong>Nom de la base de donnÃ©es</strong><br /><input id="req_db_name" type="text" name="req_db_name" size="30" maxlength="50" /><br /></label>
 					</div>
 				</fieldset>
@@ -404,9 +174,9 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Database enter informations'] ?></legend>
+					<legend>Saisissez votre nom d'utilisateur et votre mot de passe de la base de donnÃ©es</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 5'] ?></p>
-						<label class="conl"><?php echo $lang_install['Database username'] ?><br /><input type="text" name="db_username" value="<?php echo pun_htmlspecialchars($db_username) ?>" size="30" /><br /></label>
-						<label class="conl"><?php echo $lang_install['Database password'] ?><br /><input type="password" name="db_password" size="30" /><br /></label>
+						<p>Saisissez le nom d'utilisateur et le mot de passe que vous utilisez pour vous connecter Ã  la base de donnÃ©es. Ignorez pour SQLite.</p>
+						<label class="conl">Nom d'utilisateur <acronym title="Base de donnÃ©es">BDD</acronym><br /><input type="text" name="db_username" size="30" maxlength="50" /><br /></label>
+						<label class="conl">Mot de passe <acronym title="Base de donnÃ©es">BDD</acronym><br /><input type="text" name="db_password" size="30" maxlength="50" /><br /></label>
 						<div class="clearer"></div>
 					</div>
@@ -415,8 +185,8 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Database enter prefix'] ?></legend>
+					<legend>Saisissez le prÃ©fixe des tables</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 6'] ?></p>
-						<label><?php echo $lang_install['Table prefix'] ?><br /><input id="db_prefix" type="text" name="db_prefix" value="<?php echo pun_htmlspecialchars($db_prefix) ?>" size="20" maxlength="30" /><br /></label>
+						<p>Si vous le souhaitez vous pouvez indiquer un prÃ©fixe de tables. De cette faÃ§on vous pouvez utiliser plusieurs installations de PunBB sur la mÃªme base de donnÃ©es. (exemple : pun_).</p>
+						<label>PrÃ©fixe tables<br /><input id="db_prefix" type="text" name="db_prefix" size="20" maxlength="30" /><br /></label>
 					</div>
 				</fieldset>
@@ -424,12 +194,12 @@
 			<div class="inform">
 				<div class="forminfo">
-					<h3><?php echo $lang_install['Administration setup'] ?></h3>
-					<p><?php echo $lang_install['Info 7'] ?></p>
+					<h3>RÃ©glages d'administration</h3>
+					<p>Veuillez saisir les informations demandÃ©es ci-dessous afin de dÃ©finir un administrateur pour votre installation de PunBB.</p>
 				</div>
 				<fieldset>
-					<legend><?php echo $lang_install['Admin enter username'] ?></legend>
+					<legend>Saisissez le nom d'utilisateur de l'administrateur</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 8'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Administrator username'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="text" name="req_username" value="<?php echo pun_htmlspecialchars($username) ?>" size="25" maxlength="25" /><br /></label>
+						<p>Le nom d'utilisateur de l'administrateur des forums. Vous pourrez par la suite crÃ©er de nouveaux administrateurs ainsi que des modÃ©rateurs. Ce nom d'utilisateur peut faire entre 2 et 25 caractÃšres de long.</p>
+						<label><strong>Nom d'utilisateur administrateur</strong><br /><input type="text" name="req_username" size="25" maxlength="25" /><br /></label>
 					</div>
 				</fieldset>
@@ -437,9 +207,9 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Admin enter password'] ?></legend>
+					<legend>Saisissez et confirmez le mot de passe administrateur</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 9'] ?></p>
-						<label class="conl required"><strong><?php echo $lang_install['Password'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_password1" type="password" name="req_password1" size="16" /><br /></label>
-						<label class="conl required"><strong><?php echo $lang_install['Confirm password'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input type="password" name="req_password2" size="16" /><br /></label>
+					<p>Les mots de passe peuvent faire entre 4 et 16 caractÃšres de long. Les mots de passe sont sensibles Ã  la casse.</p>
+						<label class="conl"><strong>Mot de passe</strong><br /><input id="req_password1" type="text" name="req_password1" size="16" maxlength="16" /><br /></label>
+						<label class="conl"><strong>Confirmez le mot de passe</strong><br /><input type="text" name="req_password2" size="16" maxlength="16" /><br /></label>
 						<div class="clearer"></div>
 					</div>
@@ -448,21 +218,8 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Admin enter email'] ?></legend>
+					<legend>Saisissez l'adresse e-mail de l'administrateur</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 10'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Administrator email'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_email" type="text" name="req_email" value="<?php echo pun_htmlspecialchars($email) ?>" size="50" maxlength="80" /><br /></label>
-					</div>
-				</fieldset>
-			</div>
-			<div class="inform">
-				<div class="forminfo">
-					<h3><?php echo $lang_install['Board setup'] ?></h3>
-					<p><?php echo $lang_install['Info 11'] ?></p>
-				</div>
-				<fieldset>
-					<legend><?php echo $lang_install['Enter board title'] ?></legend>
-					<div class="infldset">
-						<p><?php echo $lang_install['Info 12'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Board title'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_title" type="text" name="req_title" value="<?php echo pun_htmlspecialchars($title) ?>" size="60" maxlength="255" /><br /></label>
+						<p>L'adresse e-mail de l'administrateur des forums.</p>
+						<label for="req_email"><strong>E-mail administrateur</strong><br /><input id="req_email" type="text" name="req_email" size="50" maxlength="50" /><br /></label>
 					</div>
 				</fieldset>
@@ -470,72 +227,17 @@
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_install['Enter board description'] ?></legend>
+					<legend>Saisissez l'<acronym title="Uniform Resource Locator" lang="en">URL</acronym> de base de votre installation de PunBB</legend>
 					<div class="infldset">
-						<p><?php echo $lang_install['Info 13'] ?></p>
-						<label><?php echo $lang_install['Board description'] ?><br /><input id="desc" type="text" name="desc" value="<?php echo pun_htmlspecialchars($description) ?>" size="60" maxlength="255" /><br /></label>
+						<p>L'<acronym title="Uniform Resource Locator" lang="en">URL</acronym> de base (sans slash Ã  la fin) de vos forums PunBB (exemple : http://forum.mondomaine.com ou http://monhote.com/~utilisateur). Ceci <strong>doit Ãªtre correct</strong> ou les administrateurs et modÃ©rateurs ne pourront valider aucun des formulaires. Veuillez noter que la valeur prÃ©-rÃ©glÃ©e ci-dessous est juste une proposition devinÃ©e par PunBB.</p>
+						<label><strong><acronym title="Uniform Resource Locator" lang="en">URL</acronym> de base</strong><br /><input type="text" name="req_base_url" value="http://<?php echo $_SERVER['SERVER_NAME'].str_replace('\\', '/', dirname($_SERVER['SCRIPT_NAME'])) ?>" size="60" maxlength="100" /><br /></label>
 					</div>
 				</fieldset>
 			</div>
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_install['Enter base URL'] ?></legend>
-					<div class="infldset">
-						<p><?php echo $lang_install['Info 14'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Base URL'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><input id="req_base_url" type="text" name="req_base_url" value="<?php echo pun_htmlspecialchars($base_url) ?>" size="60" maxlength="100" /><br /></label>
-					</div>
-				</fieldset>
-			</div>
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_install['Choose the default language'] ?></legend>
-					<div class="infldset">
-						<p><?php echo $lang_install['Info 15'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Default language'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><select id="req_default_lang" name="req_default_lang">
-<?php
-
-		$languages = forum_list_langs();
-		foreach ($languages as $temp)
-		{
-			if ($temp == $default_lang)
-				echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.$temp.'</option>'."\n";
-			else
-				echo "\t\t\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'">'.$temp.'</option>'."\n";
-		}
-
-?>
-						</select><br /></label>
-					</div>
-				</fieldset>
-			</div>
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_install['Choose the default style'] ?></legend>
-					<div class="infldset">
-						<p><?php echo $lang_install['Info 16'] ?></p>
-						<label class="required"><strong><?php echo $lang_install['Default style'] ?> <span><?php echo $lang_install['Required'] ?></span></strong><br /><select id="req_default_style" name="req_default_style">
-<?php
-
-		$styles = forum_list_styles();
-		foreach ($styles as $temp)
-		{
-			if ($temp == $default_style)
-				echo "\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.str_replace('_', ' ', $temp).'</option>'."\n";
-			else
-				echo "\t\t\t\t\t\t\t\t\t".'<option value="'.$temp.'">'.str_replace('_', ' ', $temp).'</option>'."\n";
-		}
-
-?>
-						</select><br /></label>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="start" value="<?php echo $lang_install['Start install'] ?>" /></p>
+			<p><input type="submit" name="start" value="Lancer l'installation" /></p>
 		</form>
 	</div>
 </div>
+
 </div>
-
-</div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
 </div>
 
@@ -547,4 +249,87 @@
 else
 {
+	//
+	// Strip slashes only if magic_quotes_gpc is on.
+	//
+	function unescape($str)
+	{
+		return (get_magic_quotes_gpc() == 1) ? stripslashes($str) : $str;
+	}
+
+
+	//
+	// Compute a hash of $str.
+	// Uses sha1() if available. If not, SHA1 through mhash() if available. If not, fall back on md5().
+	//
+	function pun_hash($str)
+	{
+		if (function_exists('sha1'))	// Only in PHP 4.3.0+
+			return sha1($str);
+		else if (function_exists('mhash'))	// Only if Mhash library is loaded
+			return bin2hex(mhash(MHASH_SHA1, $str));
+		else
+			return md5($str);
+	}
+
+
+	//
+	// A temporary replacement for the full error handler found in functions.php.
+	// It's here because a function called error() must be callable in the database abstraction layer.
+	//
+	function error($message, $file = false, $line = false, $db_error = false)
+	{
+		if ($file !== false && $line !== false)
+			echo '<strong style="color: A00000">Une erreur s\'est produite Ã  la ligne '.$line.' dans le fichier '.$file.'.</strong><br /><br />';
+		else
+			echo '<strong style="color: A00000">Une erreur s\'est produite.</strong><br /><br />';
+
+		echo '<strong>PunBB a rapportÃ©&#160;:</strong> '.htmlspecialchars($message).'<br /><br />';
+
+		if ($db_error !== false)
+			echo '<strong>La base de donnÃ©es a rapportÃ©&#160;:</strong> '.htmlspecialchars($db_error['error_msg']).(($db_error['error_no']) ? ' (Errno: '.$db_error['error_no'].')' : '');
+
+		exit;
+	}
+
+
+	$db_type = $_POST['req_db_type'];
+	$db_host = trim($_POST['req_db_host']);
+	$db_name = trim($_POST['req_db_name']);
+	$db_username = unescape(trim($_POST['db_username']));
+	$db_password = unescape(trim($_POST['db_password']));
+	$db_prefix = trim($_POST['db_prefix']);
+	$username = unescape(trim($_POST['req_username']));
+	$email = strtolower(trim($_POST['req_email']));
+	$password1 = unescape(trim($_POST['req_password1']));
+	$password2 = unescape(trim($_POST['req_password2']));
+
+
+	// Make sure base_url doesn't end with a slash
+	if (substr($_POST['req_base_url'], -1) == '/')
+		$base_url = substr($_POST['req_base_url'], 0, -1);
+	else
+		$base_url = $_POST['req_base_url'];
+
+
+	// Validate username and passwords
+	if (strlen($username) < 2)
+		error('Le nom d\'utilisateur administrateur doit faire au moins 2 caractÃšres de long. Veuillez retourner en arriÃšre et corriger.');
+	if (strlen($password1) < 4)
+		error('Le mot de passe administrateur doit faire au moins 4 caractÃšres de long. Veuillez retourner en arriÃšre et corriger.');
+	if ($password1 != $password2)
+		error('Les mots de passe administrateur ne correspondent pas. Veuillez retourner en arriÃšre et corriger.');
+	if (!strcasecmp($username, 'invitÃ©'))
+		error('Le nom d\'utilisateur \'invitÃ©\' est rÃ©servÃ©. Veuillez retourner en arriÃšre et corriger.');
+	if (!strcasecmp($username, 'guest'))
+		error('Le nom d\'utilisateur \'guest\' est rÃ©servÃ©. Veuillez retourner en arriÃšre et corriger.');
+	if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $username))
+		error('Les noms d\'utilisateur ne peuvent Ãªtre de la forme d\'une adresse IP. Veuillez retourner en arriÃšre et corriger.');
+	if (preg_match('#\[b\]|\[/b\]|\[u\]|\[/u\]|\[i\]|\[/i\]|\[color|\[/color\]|\[quote\]|\[/quote\]|\[code\]|\[/code\]|\[img\]|\[/img\]|\[url|\[/url\]|\[email|\[/email\]#i', $username))
+		error('Le nom d\'utilisateur ne peut contenir aucune des balise de formatage (BBCode) que les forums utilisent. Veuillez retourner en arriÃšre et corriger.');
+
+	if (strlen($email) > 50 || !preg_match('/^(([^<>()[\]\\.,;:\s@"\']+(\.[^<>()[\]\\.,;:\s@"\']+)*)|("[^"\']+"))@((\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])|(([a-zA-Z\d\-]+\.)+[a-zA-Z]{2,}))$/', $email))
+		error('L\'adresse e-mail administrateur que vous avez saisie est incorrecte. Veuillez retourner en arriÃšre et corriger.');
+
+
 	// Load the appropriate DB layer class
 	switch ($db_type)
@@ -554,16 +339,8 @@
 			break;
 
-		case 'mysql_innodb':
-			require PUN_ROOT.'include/dblayer/mysql_innodb.php';
-			break;
-
 		case 'mysqli':
 			require PUN_ROOT.'include/dblayer/mysqli.php';
 			break;
 
-		case 'mysqli_innodb':
-			require PUN_ROOT.'include/dblayer/mysqli_innodb.php';
-			break;
-
 		case 'pgsql':
 			require PUN_ROOT.'include/dblayer/pgsql.php';
@@ -573,7 +350,7 @@
 			require PUN_ROOT.'include/dblayer/sqlite.php';
 			break;
-
+			
 		default:
-			error(sprintf($lang_install['DB type not valid'], pun_htmlspecialchars($db_type)));
+			error('\''.$db_type.'\' n\'est pas un type de base de donnÃ©es valable.');
 	}
 
@@ -581,7 +358,4 @@
 	$db = new DBLayer($db_host, $db_username, $db_password, $db_name, $db_prefix, false);
 
-	// Validate prefix
-	if (strlen($db_prefix) > 0 && (!preg_match('%^[a-zA-Z_][a-zA-Z0-9_]*$%', $db_prefix) || strlen($db_prefix) > 40))
-		error(sprintf($lang_install['Table prefix error'], $db->prefix));
 
 	// Do some DB type specific checks
@@ -590,1010 +364,933 @@
 		case 'mysql':
 		case 'mysqli':
-		case 'mysql_innodb':
-		case 'mysqli_innodb':
-			$mysql_info = $db->get_version();
-			if (version_compare($mysql_info['version'], MIN_MYSQL_VERSION, '<'))
-				error(sprintf($lang_install['You are running error'], 'MySQL', $mysql_info['version'], FORUM_VERSION, MIN_MYSQL_VERSION));
-			break;
-
-		case 'pgsql':
-			$pgsql_info = $db->get_version();
-			if (version_compare($pgsql_info['version'], MIN_PGSQL_VERSION, '<'))
-				error(sprintf($lang_install['You are running error'], 'PostgreSQL', $pgsql_info['version'], FORUM_VERSION, MIN_PGSQL_VERSION));
+			break;
+
+		case 'pgsql':
+			// Make sure we are running at least PHP 4.3.0 (needed only for PostgreSQL)
+			if (version_compare(PHP_VERSION, '4.3.0', '<'))
+				error('Vous utilisez la version '.PHP_VERSION.'de PHP. PunBB nÃ©cÃ©ssite au minimum PHP 4.3.0 pour fonctionner correctement avec PostgreSQL. Vous devez mettre Ã  jour votre installation de PHP ou utiliser une base de donnÃ©es diffÃ©rente pour continuer.');
 			break;
 
 		case 'sqlite':
 			if (strtolower($db_prefix) == 'sqlite_')
-				error($lang_install['Prefix reserved']);
-			break;
-	}
-
-
-	// Make sure FluxBB isn't already installed
+				error('Le prÃ©fixe de tables \'sqlite_\' est rÃ©servÃ© pour l\'utilisation du moteur SQLite. Veuillez choisir un prÃ©fixe diffÃ©rent.');
+			break;
+	}
+
+
+	// Make sure PunBB isn't already installed
 	$result = $db->query('SELECT 1 FROM '.$db_prefix.'users WHERE id=1');
 	if ($db->num_rows($result))
-		error(sprintf($lang_install['Existing table error'], $db_prefix, $db_name));
-
-	// Check if InnoDB is available
-	if ($db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-	{
-		$result = $db->query('SHOW VARIABLES LIKE \'have_innodb\'');
-		list (, $result) = $db->fetch_row($result);
-		if ((strtoupper($result) != 'YES'))
-			error($lang_install['InnoDB off']);
-	}
-
-
-	// Start a transaction
-	$db->start_transaction();
+		error('Une table nommÃ©e "'.$db_prefix.'users" est dÃ©jÃ  prÃ©sente dans la base de donnÃ©es "'.$db_name.'". Ceci pourrait signifier que PunBB est dÃ©jÃ  installÃ© ou qu\'un autre logiciel est installÃ© et occupe un ou plusieurs des noms de tables nÃ©cÃ©ssaires Ã  PunBB. Si vous souhaitez installer plusieurs copies de PunBB sur la mÃªme base de donnÃ©s, vous devez choisir des prÃ©fixes de tables diffÃ©rents.');
 
 
 	// Create all tables
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'username'		=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> true
-			),
-			'ip'			=> array(
-				'datatype'		=> 'VARCHAR(255)',
-				'allow_null'	=> true
-			),
-			'email'			=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> true
-			),
-			'message'		=> array(
-				'datatype'		=> 'VARCHAR(255)',
-				'allow_null'	=> true
-			),
-			'expire'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'ban_creator'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('id'),
-		'INDEXES'		=> array(
-			'username_idx'	=> array('username')
-		)
-	);
-
-	if ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-		$schema['INDEXES']['username_idx'] = array('username(25)');
-
-	$db->create_table('bans', $schema) or error('Unable to create bans table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'cat_name'		=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> false,
-				'default'		=> '\'New Category\''
-			),
-			'disp_position'	=> array(
-				'datatype'		=> 'INT(10)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('id')
-	);
-
-	$db->create_table('categories', $schema) or error('Unable to create categories table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'search_for'	=> array(
-				'datatype'		=> 'VARCHAR(60)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'replace_with'	=> array(
-				'datatype'		=> 'VARCHAR(60)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			)
-		),
-		'PRIMARY KEY'	=> array('id')
-	);
-
-	$db->create_table('censoring', $schema) or error('Unable to create censoring table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'conf_name'		=> array(
-				'datatype'		=> 'VARCHAR(255)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'conf_value'	=> array(
-				'datatype'		=> 'TEXT',
-				'allow_null'	=> true
-			)
-		),
-		'PRIMARY KEY'	=> array('conf_name')
-	);
-
-	$db->create_table('config', $schema) or error('Unable to create config table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'group_id'		=> array(
-				'datatype'		=> 'INT(10)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'forum_id'		=> array(
-				'datatype'		=> 'INT(10)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'read_forum'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'post_replies'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'post_topics'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			)
-		),
-		'PRIMARY KEY'	=> array('group_id', 'forum_id')
-	);
-
-	$db->create_table('forum_perms', $schema) or error('Unable to create forum_perms table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'forum_name'	=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> false,
-				'default'		=> '\'New forum\''
-			),
-			'forum_desc'	=> array(
-				'datatype'		=> 'TEXT',
-				'allow_null'	=> true
-			),
-			'redirect_url'	=> array(
-				'datatype'		=> 'VARCHAR(100)',
-				'allow_null'	=> true
-			),
-			'moderators'	=> array(
-				'datatype'		=> 'TEXT',
-				'allow_null'	=> true
-			),
-			'num_topics'	=> array(
-				'datatype'		=> 'MEDIUMINT(8) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'num_posts'		=> array(
-				'datatype'		=> 'MEDIUMINT(8) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'last_post'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'last_post_id'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'last_poster'	=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> true
-			),
-			'sort_by'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'disp_position'	=> array(
-				'datatype'		=> 'INT(10)',
-				'allow_null'	=> false,
-				'default'		=>	'0'
-			),
-			'cat_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=>	'0'
-			)
-		),
-		'PRIMARY KEY'	=> array('id')
-	);
-
-	$db->create_table('forums', $schema) or error('Unable to create forums table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'g_id'						=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'g_title'					=> array(
-				'datatype'		=> 'VARCHAR(50)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'g_user_title'				=> array(
-				'datatype'		=> 'VARCHAR(50)',
-				'allow_null'	=> true
-			),
-			'g_moderator'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'g_mod_edit_users'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'g_mod_rename_users'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'g_mod_change_passwords'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'g_mod_ban_users'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'g_read_board'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_view_users'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_post_replies'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_post_topics'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_edit_posts'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_delete_posts'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_delete_topics'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_set_title'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_search'					=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_search_users'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_send_email'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'g_post_flood'				=> array(
-				'datatype'		=> 'SMALLINT(6)',
-				'allow_null'	=> false,
-				'default'		=> '30'
-			),
-			'g_search_flood'			=> array(
-				'datatype'		=> 'SMALLINT(6)',
-				'allow_null'	=> false,
-				'default'		=> '30'
-			),
-			'g_email_flood'				=> array(
-				'datatype'		=> 'SMALLINT(6)',
-				'allow_null'	=> false,
-				'default'		=> '60'
-			),
-			'g_report_flood'			=> array(
-				'datatype'		=> 'SMALLINT(6)',
-				'allow_null'	=> false,
-				'default'		=> '60'
-			)
-		),
-		'PRIMARY KEY'	=> array('g_id')
-	);
-
-	$db->create_table('groups', $schema) or error('Unable to create groups table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'user_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'ident'			=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'logged'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'idle'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'last_post'			=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'last_search'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-		),
-		'UNIQUE KEYS'	=> array(
-			'user_id_ident_idx'	=> array('user_id', 'ident')
-		),
-		'INDEXES'		=> array(
-			'ident_idx'		=> array('ident'),
-			'logged_idx'	=> array('logged')
-		)
-	);
-
-	if ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-	{
-		$schema['UNIQUE KEYS']['user_id_ident_idx'] = array('user_id', 'ident(25)');
-		$schema['INDEXES']['ident_idx'] = array('ident(25)');
-	}
-
-	if ($db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-		$schema['ENGINE'] = 'InnoDB';
-
-	$db->create_table('online', $schema) or error('Unable to create online table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'poster'		=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'poster_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'poster_ip'		=> array(
-				'datatype'		=> 'VARCHAR(39)',
-				'allow_null'	=> true
-			),
-			'poster_email'	=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> true
-			),
-			'message'		=> array(
-				'datatype'		=> 'MEDIUMTEXT',
-				'allow_null'	=> true
-			),
-			'hide_smilies'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'posted'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'edited'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'edited_by'		=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> true
-			),
-			'topic_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('id'),
-		'INDEXES'		=> array(
-			'topic_id_idx'	=> array('topic_id'),
-			'multi_idx'		=> array('poster_id', 'topic_id')
-		)
-	);
-
-	$db->create_table('posts', $schema) or error('Unable to create posts table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'rank'			=> array(
-				'datatype'		=> 'VARCHAR(50)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'min_posts'		=> array(
-				'datatype'		=> 'MEDIUMINT(8) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('id')
-	);
-
-	$db->create_table('ranks', $schema) or error('Unable to create ranks table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'post_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'topic_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'forum_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'reported_by'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'created'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'message'		=> array(
-				'datatype'		=> 'TEXT',
-				'allow_null'	=> true
-			),
-			'zapped'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'zapped_by'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			)
-		),
-		'PRIMARY KEY'	=> array('id'),
-		'INDEXES'		=> array(
-			'zapped_idx'	=> array('zapped')
-		)
-	);
-
-	$db->create_table('reports', $schema) or error('Unable to create reports table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'ident'			=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'search_data'	=> array(
-				'datatype'		=> 'MEDIUMTEXT',
-				'allow_null'	=> true
-			)
-		),
-		'PRIMARY KEY'	=> array('id'),
-		'INDEXES'		=> array(
-			'ident_idx'	=> array('ident')
-		)
-	);
-
-	if ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-		$schema['INDEXES']['ident_idx'] = array('ident(8)');
-
-	$db->create_table('search_cache', $schema) or error('Unable to create search_cache table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'post_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'word_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'subject_match'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'INDEXES'		=> array(
-			'word_id_idx'	=> array('word_id'),
-			'post_id_idx'	=> array('post_id')
-		)
-	);
-
-	$db->create_table('search_matches', $schema) or error('Unable to create search_matches table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'word'			=> array(
-				'datatype'		=> 'VARCHAR(20)',
-				'allow_null'	=> false,
-				'default'		=> '\'\'',
-				'collation'		=> 'bin'
-			)
-		),
-		'PRIMARY KEY'	=> array('word'),
-		'INDEXES'		=> array(
-			'id_idx'	=> array('id')
-		)
-	);
-
-	if ($db_type == 'sqlite')
-	{
-		$schema['PRIMARY KEY'] = array('id');
-		$schema['UNIQUE KEYS'] = array('word_idx'	=> array('word'));
-	}
-
-	$db->create_table('search_words', $schema) or error('Unable to create search_words table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'user_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'topic_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('user_id', 'topic_id')
-	);
-
-	$db->create_table('topic_subscriptions', $schema) or error('Unable to create topic subscriptions table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'user_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'forum_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('user_id', 'forum_id')
-	);
-
-	$db->create_table('forum_subscriptions', $schema) or error('Unable to create forum subscriptions table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'			=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'poster'		=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'subject'		=> array(
-				'datatype'		=> 'VARCHAR(255)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'posted'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'first_post_id'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'last_post'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'last_post_id'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'last_poster'	=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> true
-			),
-			'num_views'		=> array(
-				'datatype'		=> 'MEDIUMINT(8) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'num_replies'	=> array(
-				'datatype'		=> 'MEDIUMINT(8) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'closed'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'sticky'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'moved_to'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'forum_id'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			)
-		),
-		'PRIMARY KEY'	=> array('id'),
-		'INDEXES'		=> array(
-			'forum_id_idx'		=> array('forum_id'),
-			'moved_to_idx'		=> array('moved_to'),
-			'last_post_idx'		=> array('last_post'),
-			'first_post_id_idx'	=> array('first_post_id')
-		)
-	);
-
-	$db->create_table('topics', $schema) or error('Unable to create topics table', __FILE__, __LINE__, $db->error());
-
-
-	$schema = array(
-		'FIELDS'		=> array(
-			'id'				=> array(
-				'datatype'		=> 'SERIAL',
-				'allow_null'	=> false
-			),
-			'group_id'			=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '3'
-			),
-			'username'			=> array(
-				'datatype'		=> 'VARCHAR(200)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'password'			=> array(
-				'datatype'		=> 'VARCHAR(40)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'email'				=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> false,
-				'default'		=> '\'\''
-			),
-			'title'				=> array(
-				'datatype'		=> 'VARCHAR(50)',
-				'allow_null'	=> true
-			),
-			'realname'			=> array(
-				'datatype'		=> 'VARCHAR(40)',
-				'allow_null'	=> true
-			),
-			'url'				=> array(
-				'datatype'		=> 'VARCHAR(100)',
-				'allow_null'	=> true
-			),
-			'jabber'			=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> true
-			),
-			'icq'				=> array(
-				'datatype'		=> 'VARCHAR(12)',
-				'allow_null'	=> true
-			),
-			'msn'				=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> true
-			),
-			'aim'				=> array(
-				'datatype'		=> 'VARCHAR(30)',
-				'allow_null'	=> true
-			),
-			'yahoo'				=> array(
-				'datatype'		=> 'VARCHAR(30)',
-				'allow_null'	=> true
-			),
-			'location'			=> array(
-				'datatype'		=> 'VARCHAR(30)',
-				'allow_null'	=> true
-			),
-			'signature'			=> array(
-				'datatype'		=> 'TEXT',
-				'allow_null'	=> true
-			),
-			'disp_topics'		=> array(
-				'datatype'		=> 'TINYINT(3) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'disp_posts'		=> array(
-				'datatype'		=> 'TINYINT(3) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'email_setting'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'notify_with_post'	=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'auto_notify'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'show_smilies'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'show_img'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'show_img_sig'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'show_avatars'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'show_sig'			=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '1'
-			),
-			'timezone'			=> array(
-				'datatype'		=> 'FLOAT',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'dst'				=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'time_format'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'date_format'		=> array(
-				'datatype'		=> 'TINYINT(1)',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'language'			=> array(
-				'datatype'		=> 'VARCHAR(25)',
-				'allow_null'	=> false,
-				'default'		=> '\''.$db->escape($default_lang).'\''
-			),
-			'style'				=> array(
-				'datatype'		=> 'VARCHAR(25)',
-				'allow_null'	=> false,
-				'default'		=> '\''.$db->escape($default_style).'\''
-			),
-			'num_posts'			=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'last_post'			=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'last_search'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'last_email_sent'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'last_report_sent'	=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> true
-			),
-			'registered'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'registration_ip'	=> array(
-				'datatype'		=> 'VARCHAR(39)',
-				'allow_null'	=> false,
-				'default'		=> '\'0.0.0.0\''
-			),
-			'last_visit'		=> array(
-				'datatype'		=> 'INT(10) UNSIGNED',
-				'allow_null'	=> false,
-				'default'		=> '0'
-			),
-			'admin_note'		=> array(
-				'datatype'		=> 'VARCHAR(30)',
-				'allow_null'	=> true
-			),
-			'activate_string'	=> array(
-				'datatype'		=> 'VARCHAR(80)',
-				'allow_null'	=> true
-			),
-			'activate_key'		=> array(
-				'datatype'		=> 'VARCHAR(8)',
-				'allow_null'	=> true
-			),
-		),
-		'PRIMARY KEY'	=> array('id'),
-		'UNIQUE KEYS'	=> array(
-			'username_idx'		=> array('username')
-		),
-		'INDEXES'		=> array(
-			'registered_idx'	=> array('registered')
-		)
-	);
-
-	if ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb')
-		$schema['UNIQUE KEYS']['username_idx'] = array('username(25)');
-
-	$db->create_table('users', $schema) or error('Unable to create users table', __FILE__, __LINE__, $db->error());
-
-
-	$now = time();
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."bans (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					username VARCHAR(200),
+					ip VARCHAR(255),
+					email VARCHAR(50),
+					message VARCHAR(255),
+					expire INT(10) UNSIGNED,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$db->start_transaction();
+
+			$sql = 'CREATE TABLE '.$db_prefix."bans (
+					id SERIAL,
+					username VARCHAR(200),
+					ip VARCHAR(255),
+					email VARCHAR(50),
+					message VARCHAR(255),
+					expire INT,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$db->start_transaction();
+
+			$sql = 'CREATE TABLE '.$db_prefix."bans (
+					id INTEGER NOT NULL,
+					username VARCHAR(200),
+					ip  VARCHAR(255),
+					email VARCHAR(50),
+					message VARCHAR(255),
+					expire INTEGER,
+					PRIMARY KEY (id)
+					)";
+			break;
+			
+		
+		default:  
+			error('\''.$db_type.'\' n\'est pas un type de base de donnÃ©es correct.'); 
+
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'bans. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."categories (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					cat_name VARCHAR(80) NOT NULL DEFAULT 'New Category',
+					disp_position INT(10) NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."categories (
+					id SERIAL,
+					cat_name VARCHAR(80) NOT NULL DEFAULT 'New Category',
+					disp_position INT NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."categories (
+					id INTEGER NOT NULL,
+					cat_name VARCHAR(80) NOT NULL DEFAULT 'New Category',
+					disp_position INTEGER NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'categories. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."censoring (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					search_for VARCHAR(60) NOT NULL DEFAULT '',
+					replace_with VARCHAR(60) NOT NULL DEFAULT '',
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."censoring (
+					id SERIAL,
+					search_for VARCHAR(60) NOT NULL DEFAULT '',
+					replace_with VARCHAR(60) NOT NULL DEFAULT '',
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."censoring (
+					id INTEGER NOT NULL,
+					search_for VARCHAR(60) NOT NULL DEFAULT '',
+					replace_with VARCHAR(60) NOT NULL DEFAULT '',
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'censoring. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."config (
+					conf_name VARCHAR(255) NOT NULL DEFAULT '',
+					conf_value TEXT,
+					PRIMARY KEY (conf_name)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."config (
+					conf_name VARCHAR(255) NOT NULL DEFAULT '',
+					conf_value TEXT,
+					PRIMARY KEY (conf_name)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."config (
+					conf_name VARCHAR(255) NOT NULL DEFAULT '',
+					conf_value TEXT,
+					PRIMARY KEY (conf_name)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'config. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."forum_perms (
+					group_id INT(10) NOT NULL DEFAULT 0,
+					forum_id INT(10) NOT NULL DEFAULT 0,
+					read_forum TINYINT(1) NOT NULL DEFAULT 1,
+					post_replies TINYINT(1) NOT NULL DEFAULT 1,
+					post_topics TINYINT(1) NOT NULL DEFAULT 1,
+					PRIMARY KEY (group_id, forum_id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."forum_perms (
+					group_id INT NOT NULL DEFAULT 0,
+					forum_id INT NOT NULL DEFAULT 0,
+					read_forum SMALLINT NOT NULL DEFAULT 1,
+					post_replies SMALLINT NOT NULL DEFAULT 1,
+					post_topics SMALLINT NOT NULL DEFAULT 1,
+					PRIMARY KEY (group_id, forum_id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."forum_perms (
+					group_id INTEGER NOT NULL DEFAULT 0,
+					forum_id INTEGER NOT NULL DEFAULT 0,
+					read_forum INTEGER NOT NULL DEFAULT 1,
+					post_replies INTEGER NOT NULL DEFAULT 1,
+					post_topics INTEGER NOT NULL DEFAULT 1,
+					PRIMARY KEY (group_id, forum_id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'forum_perms. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."forums (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					forum_name VARCHAR(80) NOT NULL DEFAULT 'New forum',
+					forum_desc TEXT,
+					redirect_url VARCHAR(100),
+					moderators TEXT,
+					num_topics MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0,
+					num_posts MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0,
+					last_post INT(10) UNSIGNED,
+					last_post_id INT(10) UNSIGNED,
+					last_poster VARCHAR(200),
+					sort_by TINYINT(1) NOT NULL DEFAULT 0,
+					disp_position INT(10) NOT NULL DEFAULT 0,
+					cat_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."forums (
+					id SERIAL,
+					forum_name VARCHAR(80) NOT NULL DEFAULT 'New forum',
+					forum_desc TEXT,
+					redirect_url VARCHAR(100),
+					moderators TEXT,
+					num_topics INT NOT NULL DEFAULT 0,
+					num_posts INT NOT NULL DEFAULT 0,
+					last_post INT,
+					last_post_id INT,
+					last_poster VARCHAR(200),
+					sort_by SMALLINT NOT NULL DEFAULT 0,
+					disp_position INT NOT NULL DEFAULT 0,
+					cat_id INT NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."forums (
+					id INTEGER NOT NULL,
+					forum_name VARCHAR(80) NOT NULL DEFAULT 'New forum',
+					forum_desc TEXT,
+					redirect_url VARCHAR(100),
+					moderators TEXT,
+					num_topics INTEGER NOT NULL DEFAULT 0,
+					num_posts INTEGER NOT NULL DEFAULT 0,
+					last_post INTEGER,
+					last_post_id INTEGER,
+					last_poster VARCHAR(200),
+					sort_by INTEGER NOT NULL DEFAULT 0,
+					disp_position INTEGER NOT NULL DEFAULT 0,
+					cat_id INTEGER NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'forums. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."groups (
+					g_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					g_title VARCHAR(50) NOT NULL DEFAULT '',
+					g_user_title VARCHAR(50),
+					g_read_board TINYINT(1) NOT NULL DEFAULT 1,
+					g_post_replies TINYINT(1) NOT NULL DEFAULT 1,
+					g_post_topics TINYINT(1) NOT NULL DEFAULT 1,
+					g_post_polls TINYINT(1) NOT NULL DEFAULT 1,
+					g_edit_posts TINYINT(1) NOT NULL DEFAULT 1,
+					g_delete_posts TINYINT(1) NOT NULL DEFAULT 1,
+					g_delete_topics TINYINT(1) NOT NULL DEFAULT 1,
+					g_set_title TINYINT(1) NOT NULL DEFAULT 1,
+					g_search TINYINT(1) NOT NULL DEFAULT 1,
+					g_search_users TINYINT(1) NOT NULL DEFAULT 1,
+					g_edit_subjects_interval SMALLINT(6) NOT NULL DEFAULT 300,
+					g_post_flood SMALLINT(6) NOT NULL DEFAULT 30,
+					g_search_flood SMALLINT(6) NOT NULL DEFAULT 30,
+					PRIMARY KEY (g_id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."groups (
+					g_id SERIAL,
+					g_title VARCHAR(50) NOT NULL DEFAULT '',
+					g_user_title VARCHAR(50),
+					g_read_board SMALLINT NOT NULL DEFAULT 1,
+					g_post_replies SMALLINT NOT NULL DEFAULT 1,
+					g_post_topics SMALLINT NOT NULL DEFAULT 1,
+					g_post_polls SMALLINT NOT NULL DEFAULT 1,
+					g_edit_posts SMALLINT NOT NULL DEFAULT 1,
+					g_delete_posts SMALLINT NOT NULL DEFAULT 1,
+					g_delete_topics SMALLINT NOT NULL DEFAULT 1,
+					g_set_title SMALLINT NOT NULL DEFAULT 1,
+					g_search SMALLINT NOT NULL DEFAULT 1,
+					g_search_users SMALLINT NOT NULL DEFAULT 1,
+					g_edit_subjects_interval SMALLINT NOT NULL DEFAULT 300,
+					g_post_flood SMALLINT NOT NULL DEFAULT 30,
+					g_search_flood SMALLINT NOT NULL DEFAULT 30,
+					PRIMARY KEY (g_id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."groups (
+					g_id INTEGER NOT NULL,
+					g_title VARCHAR(50) NOT NULL DEFAULT '',
+					g_user_title VARCHAR(50),
+					g_read_board INTEGER NOT NULL DEFAULT 1,
+					g_post_replies INTEGER NOT NULL DEFAULT 1,
+					g_post_topics INTEGER NOT NULL DEFAULT 1,
+					g_post_polls INTEGER NOT NULL DEFAULT 1,
+					g_edit_posts INTEGER NOT NULL DEFAULT 1,
+					g_delete_posts INTEGER NOT NULL DEFAULT 1,
+					g_delete_topics INTEGER NOT NULL DEFAULT 1,
+					g_set_title INTEGER NOT NULL DEFAULT 1,
+					g_search INTEGER NOT NULL DEFAULT 1,
+					g_search_users INTEGER NOT NULL DEFAULT 1,
+					g_edit_subjects_interval INTEGER NOT NULL DEFAULT 300,
+					g_post_flood INTEGER NOT NULL DEFAULT 30,
+					g_search_flood INTEGER NOT NULL DEFAULT 30,
+					PRIMARY KEY (g_id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'groups. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."online (
+					user_id INT(10) UNSIGNED NOT NULL DEFAULT 1,
+					ident VARCHAR(200) NOT NULL DEFAULT '',
+					logged INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					idle TINYINT(1) NOT NULL DEFAULT 0
+					) TYPE=HEAP;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."online (
+					user_id INT NOT NULL DEFAULT 1,
+					ident VARCHAR(200) NOT NULL DEFAULT '',
+					logged INT NOT NULL DEFAULT 0,
+					idle SMALLINT NOT NULL DEFAULT 0
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."online (
+					user_id INTEGER NOT NULL DEFAULT 1,
+					ident VARCHAR(200) NOT NULL DEFAULT '',
+					logged INTEGER NOT NULL DEFAULT 0,
+					idle INTEGER NOT NULL DEFAULT 0
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'online. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."posts (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					poster VARCHAR(200) NOT NULL DEFAULT '',
+					poster_id INT(10) UNSIGNED NOT NULL DEFAULT 1,
+					poster_ip VARCHAR(15),
+					poster_email VARCHAR(50),
+					message TEXT NOT NULL DEFAULT '',
+					hide_smilies TINYINT(1) NOT NULL DEFAULT 0,
+					posted INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					edited INT(10) UNSIGNED,
+					edited_by VARCHAR(200),
+					topic_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."posts (
+					id SERIAL,
+					poster VARCHAR(200) NOT NULL DEFAULT '',
+					poster_id INT NOT NULL DEFAULT 1,
+					poster_ip VARCHAR(15),
+					poster_email VARCHAR(50),
+					message TEXT NOT NULL DEFAULT '',
+					hide_smilies SMALLINT NOT NULL DEFAULT 0,
+					posted INT NOT NULL DEFAULT 0,
+					edited INT,
+					edited_by VARCHAR(200),
+					topic_id INT NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."posts (
+					id INTEGER NOT NULL,
+					poster VARCHAR(200) NOT NULL DEFAULT '',
+					poster_id INTEGER NOT NULL DEFAULT 1,
+					poster_ip VARCHAR(15),
+					poster_email VARCHAR(50),
+					message TEXT NOT NULL DEFAULT '',
+					hide_smilies INTEGER NOT NULL DEFAULT 0,
+					posted INTEGER NOT NULL DEFAULT 0,
+					edited INTEGER,
+					edited_by VARCHAR(200),
+					topic_id INTEGER NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'posts. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."ranks (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					rank VARCHAR(50) NOT NULL DEFAULT '',
+					min_posts MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."ranks (
+					id SERIAL,
+					rank VARCHAR(50) NOT NULL DEFAULT '',
+					min_posts INT NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."ranks (
+					id INTEGER NOT NULL,
+					rank VARCHAR(50) NOT NULL DEFAULT '',
+					min_posts INTEGER NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'titles. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."reports (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					post_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					topic_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					forum_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					reported_by INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					created INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					message TEXT NOT NULL DEFAULT '',
+					zapped INT(10) UNSIGNED,
+					zapped_by INT(10) UNSIGNED,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."reports (
+					id SERIAL,
+					post_id INT NOT NULL DEFAULT 0,
+					topic_id INT NOT NULL DEFAULT 0,
+					forum_id INT NOT NULL DEFAULT 0,
+					reported_by INT NOT NULL DEFAULT 0,
+					created INT NOT NULL DEFAULT 0,
+					message TEXT NOT NULL DEFAULT '',
+					zapped INT,
+					zapped_by INT,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."reports (
+					id INTEGER NOT NULL,
+					post_id INTEGER NOT NULL DEFAULT 0,
+					topic_id INTEGER NOT NULL DEFAULT 0,
+					forum_id INTEGER NOT NULL DEFAULT 0,
+					reported_by INTEGER NOT NULL DEFAULT 0,
+					created INTEGER NOT NULL DEFAULT 0,
+					message TEXT NOT NULL DEFAULT '',
+					zapped INTEGER,
+					zapped_by INTEGER,
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'reports. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."search_cache (
+					id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					ident VARCHAR(200) NOT NULL DEFAULT '',
+					search_data TEXT NOT NULL DEFAULT '',
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."search_cache (
+					id INT NOT NULL DEFAULT 0,
+					ident VARCHAR(200) NOT NULL DEFAULT '',
+					search_data TEXT NOT NULL DEFAULT '',
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."search_cache (
+					id INTEGER NOT NULL DEFAULT 0,
+					ident VARCHAR(200) NOT NULL DEFAULT '',
+					search_data TEXT NOT NULL DEFAULT '',
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'search_cache. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."search_matches (
+					post_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					word_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0,
+					subject_match TINYINT(1) NOT NULL DEFAULT 0
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."search_matches (
+					post_id INT NOT NULL DEFAULT 0,
+					word_id INT NOT NULL DEFAULT 0,
+					subject_match SMALLINT NOT NULL DEFAULT 0
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."search_matches (
+					post_id INTEGER NOT NULL DEFAULT 0,
+					word_id INTEGER NOT NULL DEFAULT 0,
+					subject_match INTEGER NOT NULL DEFAULT 0
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'search_matches. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."search_words (
+					id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
+					word VARCHAR(20) BINARY NOT NULL DEFAULT '',
+					PRIMARY KEY (word),
+					KEY ".$db_prefix."search_words_id_idx (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."search_words (
+					id SERIAL,
+					word VARCHAR(20) NOT NULL DEFAULT '',
+					PRIMARY KEY (word)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."search_words (
+					id INTEGER NOT NULL,
+					word VARCHAR(20) NOT NULL DEFAULT '',
+					PRIMARY KEY (id),
+					UNIQUE (word)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'search_words. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."subscriptions (
+					user_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					topic_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					PRIMARY KEY (user_id, topic_id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."subscriptions (
+					user_id INT NOT NULL DEFAULT 0,
+					topic_id INT NOT NULL DEFAULT 0,
+					PRIMARY KEY (user_id, topic_id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."subscriptions (
+					user_id INTEGER NOT NULL DEFAULT 0,
+					topic_id INTEGER NOT NULL DEFAULT 0,
+					PRIMARY KEY (user_id, topic_id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'subscriptions. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."topics (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					poster VARCHAR(200) NOT NULL DEFAULT '',
+					subject VARCHAR(255) NOT NULL DEFAULT '',
+					posted INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					last_post INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					last_post_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					last_poster VARCHAR(200),
+					num_views MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0,
+					num_replies MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0,
+					closed TINYINT(1) NOT NULL DEFAULT 0,
+					sticky TINYINT(1) NOT NULL DEFAULT 0,
+					moved_to INT(10) UNSIGNED,
+					forum_id INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."topics (
+					id SERIAL,
+					poster VARCHAR(200) NOT NULL DEFAULT '',
+					subject VARCHAR(255) NOT NULL DEFAULT '',
+					posted INT NOT NULL DEFAULT 0,
+					last_post INT NOT NULL DEFAULT 0,
+					last_post_id INT NOT NULL DEFAULT 0,
+					last_poster VARCHAR(200),
+					num_views INT NOT NULL DEFAULT 0,
+					num_replies INT NOT NULL DEFAULT 0,
+					closed SMALLINT NOT NULL DEFAULT 0,
+					sticky SMALLINT NOT NULL DEFAULT 0,
+					moved_to INT,
+					forum_id INT NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."topics (
+					id INTEGER NOT NULL,
+					poster VARCHAR(200) NOT NULL DEFAULT '',
+					subject VARCHAR(255) NOT NULL DEFAULT '',
+					posted INTEGER NOT NULL DEFAULT 0,
+					last_post INTEGER NOT NULL DEFAULT 0,
+					last_post_id INTEGER NOT NULL DEFAULT 0,
+					last_poster VARCHAR(200),
+					num_views INTEGER NOT NULL DEFAULT 0,
+					num_replies INTEGER NOT NULL DEFAULT 0,
+					closed INTEGER NOT NULL DEFAULT 0,
+					sticky INTEGER NOT NULL DEFAULT 0,
+					moved_to INTEGER,
+					forum_id INTEGER NOT NULL DEFAULT 0,
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'topics. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'CREATE TABLE '.$db_prefix."users (
+					id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+					group_id INT(10) UNSIGNED NOT NULL DEFAULT 4,
+					username VARCHAR(200) NOT NULL DEFAULT '',
+					password VARCHAR(40) NOT NULL DEFAULT '',
+					email VARCHAR(50) NOT NULL DEFAULT '',
+					title VARCHAR(50),
+					realname VARCHAR(40),
+					url VARCHAR(100),
+					jabber VARCHAR(75),
+					icq VARCHAR(12),
+					msn VARCHAR(50),
+					aim VARCHAR(30),
+					yahoo VARCHAR(30),
+					location VARCHAR(30),
+					use_avatar TINYINT(1) NOT NULL DEFAULT 0,
+					signature TEXT,
+					disp_topics TINYINT(3) UNSIGNED,
+					disp_posts TINYINT(3) UNSIGNED,
+					email_setting TINYINT(1) NOT NULL DEFAULT 1,
+					save_pass TINYINT(1) NOT NULL DEFAULT 1,
+					notify_with_post TINYINT(1) NOT NULL DEFAULT 0,
+					show_smilies TINYINT(1) NOT NULL DEFAULT 1,
+					show_img TINYINT(1) NOT NULL DEFAULT 1,
+					show_img_sig TINYINT(1) NOT NULL DEFAULT 1,
+					show_avatars TINYINT(1) NOT NULL DEFAULT 1,
+					show_sig TINYINT(1) NOT NULL DEFAULT 1,
+					timezone FLOAT NOT NULL DEFAULT 0,
+					language VARCHAR(25) NOT NULL DEFAULT 'English',
+					style VARCHAR(25) NOT NULL DEFAULT 'Oxygen',
+					num_posts INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					last_post INT(10) UNSIGNED,
+					registered INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					registration_ip VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
+					last_visit INT(10) UNSIGNED NOT NULL DEFAULT 0,
+					admin_note VARCHAR(30),
+					activate_string VARCHAR(50),
+					activate_key VARCHAR(8),
+					PRIMARY KEY (id)
+					) TYPE=MyISAM;";
+			break;
+
+		case 'pgsql':
+			$sql = 'CREATE TABLE '.$db_prefix."users (
+					id SERIAL,
+					group_id INT NOT NULL DEFAULT 4,
+					username VARCHAR(200) NOT NULL DEFAULT '',
+					password VARCHAR(40) NOT NULL DEFAULT '',
+					email VARCHAR(50) NOT NULL DEFAULT '',
+					title VARCHAR(50),
+					realname VARCHAR(40),
+					url VARCHAR(100),
+					jabber VARCHAR(75),
+					icq VARCHAR(12),
+					msn VARCHAR(50),
+					aim VARCHAR(30),
+					yahoo VARCHAR(30),
+					location VARCHAR(30),
+					use_avatar SMALLINT NOT NULL DEFAULT 0,
+					signature TEXT,
+					disp_topics SMALLINT,
+					disp_posts SMALLINT,
+					email_setting SMALLINT NOT NULL DEFAULT 1,
+					save_pass SMALLINT NOT NULL DEFAULT 1,
+					notify_with_post SMALLINT NOT NULL DEFAULT 0,
+					show_smilies SMALLINT NOT NULL DEFAULT 1,
+					show_img SMALLINT NOT NULL DEFAULT 1,
+					show_img_sig SMALLINT NOT NULL DEFAULT 1,
+					show_avatars SMALLINT NOT NULL DEFAULT 1,
+					show_sig SMALLINT NOT NULL DEFAULT 1,
+					timezone REAL NOT NULL DEFAULT 0,
+					language VARCHAR(25) NOT NULL DEFAULT 'English',
+					style VARCHAR(25) NOT NULL DEFAULT 'Oxygen',
+					num_posts INT NOT NULL DEFAULT 0,
+					last_post INT,
+					registered INT NOT NULL DEFAULT 0,
+					registration_ip VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
+					last_visit INT NOT NULL DEFAULT 0,
+					admin_note VARCHAR(30),
+					activate_string VARCHAR(50),
+					activate_key VARCHAR(8),
+					PRIMARY KEY (id)
+					)";
+			break;
+
+		case 'sqlite':
+			$sql = 'CREATE TABLE '.$db_prefix."users (
+					id INTEGER NOT NULL,
+					group_id INTEGER NOT NULL DEFAULT 4,
+					username VARCHAR(200) NOT NULL DEFAULT '',
+					password VARCHAR(40) NOT NULL DEFAULT '',
+					email VARCHAR(50) NOT NULL DEFAULT '',
+					title VARCHAR(50),
+					realname VARCHAR(40),
+					url VARCHAR(100),
+					jabber VARCHAR(75),
+					icq VARCHAR(12),
+					msn VARCHAR(50),
+					aim VARCHAR(30),
+					yahoo VARCHAR(30),
+					location VARCHAR(30),
+					use_avatar INTEGER NOT NULL DEFAULT 0,
+					signature TEXT,
+					disp_topics INTEGER,
+					disp_posts INTEGER,
+					email_setting INTEGER NOT NULL DEFAULT 1,
+					save_pass INTEGER NOT NULL DEFAULT 1,
+					notify_with_post INTEGER NOT NULL DEFAULT 0,
+					show_smilies INTEGER NOT NULL DEFAULT 1,
+					show_img INTEGER NOT NULL DEFAULT 1,
+					show_img_sig INTEGER NOT NULL DEFAULT 1,
+					show_avatars INTEGER NOT NULL DEFAULT 1,
+					show_sig INTEGER NOT NULL DEFAULT 1,
+					timezone FLOAT NOT NULL DEFAULT 0,
+					language VARCHAR(25) NOT NULL DEFAULT 'English',
+					style VARCHAR(25) NOT NULL DEFAULT 'Oxygen',
+					num_posts INTEGER NOT NULL DEFAULT 0,
+					last_post INTEGER,
+					registered INTEGER NOT NULL DEFAULT 0,
+					registration_ip VARCHAR(15) NOT NULL DEFAULT '0.0.0.0',
+					last_visit INTEGER NOT NULL DEFAULT 0,
+					admin_note VARCHAR(30),
+					activate_string VARCHAR(50),
+					activate_key VARCHAR(8),
+					PRIMARY KEY (id)
+					)";
+			break;
+	}
+
+	$db->query($sql) or error('Impossible de crÃ©er la table '.$db_prefix.'users. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
+
+	// Add some indexes
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			// We use MySQL's ALTER TABLE ... ADD INDEX syntax instead of CREATE INDEX to avoid problems with users lacking the INDEX privilege
+			$queries[] = 'ALTER TABLE '.$db_prefix.'online ADD INDEX '.$db_prefix.'online_user_id_idx(user_id)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'posts ADD INDEX '.$db_prefix.'posts_topic_id_idx(topic_id)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'posts ADD INDEX '.$db_prefix.'posts_multi_idx(poster_id, topic_id)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'reports ADD INDEX '.$db_prefix.'reports_zapped_idx(zapped)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'search_matches ADD INDEX '.$db_prefix.'search_matches_word_id_idx(word_id)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'search_matches ADD INDEX '.$db_prefix.'search_matches_post_id_idx(post_id)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'topics ADD INDEX '.$db_prefix.'topics_forum_id_idx(forum_id)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'topics ADD INDEX '.$db_prefix.'topics_moved_to_idx(moved_to)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'users ADD INDEX '.$db_prefix.'users_registered_idx(registered)';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'search_cache ADD INDEX '.$db_prefix.'search_cache_ident_idx(ident(8))';
+			$queries[] = 'ALTER TABLE '.$db_prefix.'users ADD INDEX '.$db_prefix.'users_username_idx(username(8))';
+			break;
+
+		default:
+			$queries[] = 'CREATE INDEX '.$db_prefix.'online_user_id_idx ON '.$db_prefix.'online(user_id)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'posts_topic_id_idx ON '.$db_prefix.'posts(topic_id)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'posts_multi_idx ON '.$db_prefix.'posts(poster_id, topic_id)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'reports_zapped_idx ON '.$db_prefix.'reports(zapped)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'search_matches_word_id_idx ON '.$db_prefix.'search_matches(word_id)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'search_matches_post_id_idx ON '.$db_prefix.'search_matches(post_id)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'topics_forum_id_idx ON '.$db_prefix.'topics(forum_id)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'topics_moved_to_idx ON '.$db_prefix.'topics(moved_to)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'users_registered_idx ON '.$db_prefix.'users(registered)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'users_username_idx ON '.$db_prefix.'users(username)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'search_cache_ident_idx ON '.$db_prefix.'search_cache(ident)';
+			$queries[] = 'CREATE INDEX '.$db_prefix.'search_words_id_idx ON '.$db_prefix.'search_words(id)';
+			break;
+	}
+
+	@reset($queries);
+	while (list(, $sql) = @each($queries))
+		$db->query($sql) or error('Impossible de crÃ©er les index. Veuillez vÃ©rifier vos rÃ©glages et essayer Ã  nouveau.',  __FILE__, __LINE__, $db->error());
+
 
 	// Insert the four preset groups
-	$db->query('INSERT INTO '.$db->prefix.'groups ('.($db_type != 'pgsql' ? 'g_id, ' : '').'g_title, g_user_title, g_moderator, g_mod_edit_users, g_mod_rename_users, g_mod_change_passwords, g_mod_ban_users, g_read_board, g_view_users, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_send_email, g_post_flood, g_search_flood, g_email_flood, g_report_flood) VALUES('.($db_type != 'pgsql' ? '1, ' : '').'\''.$db->escape($lang_install['Administrators']).'\', \''.$db->escape($lang_install['Administrator']).'\', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0)') or error('Unable to add group', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db->prefix.'groups ('.($db_type != 'pgsql' ? 'g_id, ' : '').'g_title, g_user_title, g_moderator, g_mod_edit_users, g_mod_rename_users, g_mod_change_passwords, g_mod_ban_users, g_read_board, g_view_users, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_send_email, g_post_flood, g_search_flood, g_email_flood, g_report_flood) VALUES('.($db_type != 'pgsql' ? '2, ' : '').'\''.$db->escape($lang_install['Moderators']).'\', \''.$db->escape($lang_install['Moderator']).'\', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0)') or error('Unable to add group', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db->prefix.'groups ('.($db_type != 'pgsql' ? 'g_id, ' : '').'g_title, g_user_title, g_moderator, g_mod_edit_users, g_mod_rename_users, g_mod_change_passwords, g_mod_ban_users, g_read_board, g_view_users, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_send_email, g_post_flood, g_search_flood, g_email_flood, g_report_flood) VALUES('.($db_type != 'pgsql' ? '3, ' : '').'\''.$db->escape($lang_install['Guests']).'\', NULL, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 60, 30, 0, 0)') or error('Unable to add group', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db->prefix.'groups ('.($db_type != 'pgsql' ? 'g_id, ' : '').'g_title, g_user_title, g_moderator, g_mod_edit_users, g_mod_rename_users, g_mod_change_passwords, g_mod_ban_users, g_read_board, g_view_users, g_post_replies, g_post_topics, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_send_email, g_post_flood, g_search_flood, g_email_flood, g_report_flood) VALUES('.($db_type != 'pgsql' ? '4, ' : '').'\''.$db->escape($lang_install['Members']).'\', NULL, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 60, 30, 60, 60)') or error('Unable to add group', __FILE__, __LINE__, $db->error());
-
-	// Insert guest and first admin user
-	$db->query('INSERT INTO '.$db_prefix.'users (group_id, username, password, email) VALUES(3, \''.$db->escape($lang_install['Guest']).'\', \''.$db->escape($lang_install['Guest']).'\', \''.$db->escape($lang_install['Guest']).'\')')
-		or error('Unable to add guest user. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db_prefix.'users (group_id, username, password, email, language, style, num_posts, last_post, registered, registration_ip, last_visit) VALUES(1, \''.$db->escape($username).'\', \''.pun_hash($password1).'\', \''.$email.'\', \''.$db->escape($default_lang).'\', \''.$db->escape($default_style).'\', 1, '.$now.', '.$now.', \''.get_remote_address().'\', '.$now.')')
-		or error('Unable to add administrator user. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	// Enable/disable avatars depending on file_uploads setting in PHP configuration
-	$avatars = in_array(strtolower(@ini_get('file_uploads')), array('on', 'true', '1')) ? 1 : 0;
+	$db->query('INSERT INTO '.$db->prefix."groups (g_title, g_user_title, g_read_board, g_post_replies, g_post_topics, g_post_polls, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_edit_subjects_interval, g_post_flood, g_search_flood) VALUES('Administrateurs', 'Administrateur', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0)") or error('Impossible d\ajouter un groupe', __FILE__, __LINE__, $db->error());
+	$db->query('INSERT INTO '.$db->prefix."groups (g_title, g_user_title, g_read_board, g_post_replies, g_post_topics, g_post_polls, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_edit_subjects_interval, g_post_flood, g_search_flood) VALUES('ModÃ©rateurs', 'ModÃ©rateur', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0)") or error('Impossible d\ajouter un groupe', __FILE__, __LINE__, $db->error());
+	$db->query('INSERT INTO '.$db->prefix."groups (g_title, g_user_title, g_read_board, g_post_replies, g_post_topics, g_post_polls, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_edit_subjects_interval, g_post_flood, g_search_flood) VALUES('InvitÃ©s', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0)") or error('Impossible d\ajouter un groupe', __FILE__, __LINE__, $db->error());
+	$db->query('INSERT INTO '.$db->prefix."groups (g_title, g_user_title, g_read_board, g_post_replies, g_post_topics, g_post_polls, g_edit_posts, g_delete_posts, g_delete_topics, g_set_title, g_search, g_search_users, g_edit_subjects_interval, g_post_flood, g_search_flood) VALUES('Membres', NULL, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 300, 60, 30)") or error('Impossible d\ajouter un groupe', __FILE__, __LINE__, $db->error());
+
 
 	// Insert config data
 	$config = array(
-		'o_cur_version'				=> "'".FORUM_VERSION."'",
-		'o_database_revision'		=> "'".FORUM_DB_REVISION."'",
-		'o_searchindex_revision'	=> "'".FORUM_SI_REVISION."'",
-		'o_parser_revision'			=> "'".FORUM_PARSER_REVISION."'",
-		'o_board_title'				=> "'".$db->escape($title)."'",
-		'o_board_desc'				=> "'".$db->escape($description)."'",
-		'o_default_timezone'		=> "'0'",
+		'o_cur_version'				=> "'$punbb_version'",
+		'o_cur_version_fr'			=> "'$punbb_version_fr'",
+		'o_board_title'				=> "'Mon forum PunBB'",
+		'o_board_desc'				=> "'Malheureusement personne ne peut vous dire ce que PunBB est - vous devez le voir par vous-mÃªme.'",
+		'o_server_timezone'			=> "'0'",
 		'o_time_format'				=> "'H:i:s'",
-		'o_date_format'				=> "'Y-m-d'",
-		'o_timeout_visit'			=> "'1800'",
+		'o_date_format'				=> "'d-m-Y'",
+		'o_timeout_visit'			=> "'600'",
 		'o_timeout_online'			=> "'300'",
 		'o_redirect_delay'			=> "'1'",
@@ -1601,10 +1298,9 @@
 		'o_show_user_info'			=> "'1'",
 		'o_show_post_count'			=> "'1'",
-		'o_signatures'				=> "'1'",
 		'o_smilies'					=> "'1'",
 		'o_smilies_sig'				=> "'1'",
 		'o_make_links'				=> "'1'",
-		'o_default_lang'			=> "'".$db->escape($default_lang)."'",
-		'o_default_style'			=> "'".$db->escape($default_style)."'",
+		'o_default_lang'			=> "'French'",
+		'o_default_style'			=> "'Oxygen'",
 		'o_default_user_group'		=> "'4'",
 		'o_topic_review'			=> "'15'",
@@ -1612,5 +1308,4 @@
 		'o_disp_posts_default'		=> "'25'",
 		'o_indent_num_spaces'		=> "'4'",
-		'o_quote_depth'				=> "'3'",
 		'o_quickpost'				=> "'1'",
 		'o_users_online'			=> "'1'",
@@ -1618,5 +1313,4 @@
 		'o_ranks'					=> "'1'",
 		'o_show_dot'				=> "'0'",
-		'o_topic_views'				=> "'1'",
 		'o_quickjump'				=> "'1'",
 		'o_gzip'					=> "'0'",
@@ -1624,7 +1318,6 @@
 		'o_report_method'			=> "'0'",
 		'o_regs_report'				=> "'0'",
-		'o_default_email_setting'	=> "'1'",
-		'o_mailing_list'			=> "'".$email."'",
-		'o_avatars'					=> "'".$avatars."'",
+		'o_mailing_list'			=> "'$email'",
+		'o_avatars'					=> "'1'",
 		'o_avatars_dir'				=> "'img/avatars'",
 		'o_avatars_width'			=> "'60'",
@@ -1632,24 +1325,23 @@
 		'o_avatars_size'			=> "'10240'",
 		'o_search_all_forums'		=> "'1'",
-		'o_base_url'				=> "'".$db->escape($base_url)."'",
-		'o_admin_email'				=> "'".$email."'",
-		'o_webmaster_email'			=> "'".$email."'",
-		'o_forum_subscriptions'		=> "'1'",
-		'o_topic_subscriptions'		=> "'1'",
+		'o_base_url'				=> "'$base_url'",
+		'o_admin_email'				=> "'$email'",
+		'o_webmaster_email'			=> "'$email'",
+		'o_subscriptions'			=> "'1'",
 		'o_smtp_host'				=> "NULL",
 		'o_smtp_user'				=> "NULL",
 		'o_smtp_pass'				=> "NULL",
-		'o_smtp_ssl'				=> "'0'",
 		'o_regs_allow'				=> "'1'",
 		'o_regs_verify'				=> "'0'",
 		'o_announcement'			=> "'0'",
-		'o_announcement_message'	=> "'".$db->escape($lang_install['Announcement'])."'",
+		'o_announcement_message'	=> "'Saisissez votre annonce ici.'",
 		'o_rules'					=> "'0'",
-		'o_rules_message'			=> "'".$db->escape($lang_install['Rules'])."'",
+		'o_rules_message'			=> "'Saisissez vos rÃšgles ici.'",
 		'o_maintenance'				=> "'0'",
-		'o_maintenance_message'		=> "'".$db->escape($lang_install['Maintenance message'])."'",
-		'o_default_dst'				=> "'0'",
-		'o_feed_type'				=> "'2'",
-		'o_feed_ttl'				=> "'0'",
+		'o_maintenance_message'		=> "'Les forums sont temporairement fermÃ©s pour des raisons de maintenance. Veuillez essayer Ã  nouveau dans quelques minutes.<br />\\n<br />\\n/Administrateur'",
+		'p_mod_edit_users'			=> "'1'",
+		'p_mod_rename_users'		=> "'0'",
+		'p_mod_change_passwords'	=> "'0'",
+		'p_mod_ban_users'			=> "'0'",
 		'p_message_bbcode'			=> "'1'",
 		'p_message_img_tag'			=> "'1'",
@@ -1666,65 +1358,56 @@
 	);
 
-	foreach ($config as $conf_name => $conf_value)
+	while (list($conf_name, $conf_value) = @each($config))
 	{
 		$db->query('INSERT INTO '.$db_prefix."config (conf_name, conf_value) VALUES('$conf_name', $conf_value)")
-			or error('Unable to insert into table '.$db_prefix.'config. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-	}
+			or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'config. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+	}
+
+
+	$now = time();
+	// Insert guest and first admin user
+	$db->query('INSERT INTO '.$db_prefix."users (group_id, username, password, email) VALUES(3, 'InvitÃ©', 'InvitÃ©', 'InvitÃ©')")
+		or error('Impossible d\'ajouter l\'utilisateur "invitÃ©".');
+
+	$db->query('INSERT INTO '.$db_prefix."users (group_id, username, password, email, num_posts, last_post, registered, registration_ip, last_visit) VALUES(1, '".$db->escape($username)."', '".pun_hash($password1)."', '$email', 1, ".$now.", ".$now.", '127.0.0.1', ".$now.')')
+		or error('Impossible d\'ajouter le compte administrateur.');
 
 	// Insert some other default data
-	$subject = $lang_install['Test post'];
-	$message = $lang_install['Message'];
-
-	$db->query('INSERT INTO '.$db_prefix.'ranks (rank, min_posts) VALUES(\''.$db->escape($lang_install['New member']).'\', 0)')
-		or error('Unable to insert into table '.$db_prefix.'ranks. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db_prefix.'ranks (rank, min_posts) VALUES(\''.$db->escape($lang_install['Member']).'\', 10)')
-		or error('Unable to insert into table '.$db_prefix.'ranks. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db_prefix.'categories (cat_name, disp_position) VALUES(\''.$db->escape($lang_install['Test category']).'\', 1)')
-		or error('Unable to insert into table '.$db_prefix.'categories. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db_prefix.'forums (forum_name, forum_desc, num_topics, num_posts, last_post, last_post_id, last_poster, disp_position, cat_id) VALUES(\''.$db->escape($lang_install['Test forum']).'\', \''.$db->escape($lang_install['This is just a test forum']).'\', 1, 1, '.$now.', 1, \''.$db->escape($username).'\', 1, 1)')
-		or error('Unable to insert into table '.$db_prefix.'forums. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db_prefix.'topics (poster, subject, posted, first_post_id, last_post, last_post_id, last_poster, forum_id) VALUES(\''.$db->escape($username).'\', \''.$db->escape($subject).'\', '.$now.', 1, '.$now.', 1, \''.$db->escape($username).'\', 1)')
-		or error('Unable to insert into table '.$db_prefix.'topics. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	$db->query('INSERT INTO '.$db_prefix.'posts (poster, poster_id, poster_ip, message, posted, topic_id) VALUES(\''.$db->escape($username).'\', 2, \''.get_remote_address().'\', \''.$db->escape($message).'\', '.$now.', 1)')
-		or error('Unable to insert into table '.$db_prefix.'posts. Please check your configuration and try again', __FILE__, __LINE__, $db->error());
-
-	// Index the test post so searching for it works
-	require PUN_ROOT.'include/search_idx.php';
-	$pun_config['o_default_lang'] = $default_lang;
-	update_search_index('post', 1, $message, $subject);
-
-	$db->end_transaction();
-
-
-	$alerts = array();
-
-	// Check if we disabled uploading avatars because file_uploads was disabled
-	if ($avatars == '0')
-		$alerts[] = $lang_install['Alert upload'];
-
-	// Add some random bytes at the end of the cookie name to prevent collisions
-	$cookie_name = 'pun_cookie_'.random_key(6, false, true);
-
-	// Generate the config.php file data
-	$config = generate_config_file();
-
-	// Attempt to write config.php and serve it up for download if writing fails
-	$written = false;
-	if (is_writable(PUN_ROOT))
-	{
-		$fh = @fopen(PUN_ROOT.'config.php', 'wb');
-		if ($fh)
-		{
-			fwrite($fh, $config);
-			fclose($fh);
-
-			$written = true;
-		}
-	}
+	$db->query('INSERT INTO '.$db_prefix."categories (cat_name, disp_position) VALUES('CatÃ©gorie test', 1)")
+		or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'categories. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+
+	$db->query('INSERT INTO '.$db_prefix."forums (forum_name, forum_desc, num_topics, num_posts, last_post, last_post_id, last_poster, disp_position, cat_id) VALUES('Forum test', 'Ceci est juste un forum de test.', 1, 1, ".$now.", 1, '".$db->escape($username)."', 1, 1)")
+		or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'forums. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+
+	$db->query('INSERT INTO '.$db_prefix."topics (poster, subject, posted, last_post, last_post_id, last_poster, forum_id) VALUES('".$db->escape($username)."', 'Message de test', ".$now.", ".$now.", 1, '".$db->escape($username)."', 1)")
+		or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'topics. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+
+	$db->query('INSERT INTO '.$db_prefix."posts (poster, poster_id, poster_ip, message, posted, topic_id) VALUES('".$db->escape($username)."', 2, '127.0.0.1', 'Si vous lisez ceci (et je devine que vous Ãªtes Ã©videment en train de la faire), l\'installation de PunBB semble avoir fonctionnÃ©e ! Maintenant identifiez vous au panneau de contrÃŽle d\'administration pour configurer vos forums.', ".$now.', 1)')
+		or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'posts. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+
+	$db->query('INSERT INTO '.$db_prefix."ranks (rank, min_posts) VALUES('Nouveau membre', 0)")
+		or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'ranks. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+
+	$db->query('INSERT INTO '.$db_prefix."ranks (rank, min_posts) VALUES('Membre', 10)")
+		or error('Impossible d\'insÃ©rer dans la table '.$db_prefix.'ranks. Veuillez vÃ©rifier votre configuration et essayez Ã  nouveau.');
+
+
+	if ($db_type == 'pgsql' || $db_type == 'sqlite')
+		$db->end_transaction();
+
+
+
+	$alerts = '';
+	// Check if the cache directory is writable
+	if (!@is_writable('./cache/'))
+		$alerts .= '<p style="font-size: 1.1em"><span style="color: #C03000"><strong>Le rÃ©pertoire du cache n\'est actuellement pas inscriptible !</strong></span> Afin que PunBB fonctionne corretement, le rÃ©pertoire nommÃ© <em>cache</em> doit Ãªtre inscriptible par PHP. Utilisez chmod pour rÃ©gler les permissions appropriÃ©e Ã  ce rÃ©pertoire. Si vous avez un doute, chmod 0777.</p>';
+
+	// Check if default avatar directory is writable
+	if (!@is_writable('./img/avatars/'))
+		$alerts .= '<p style="font-size: 1.1em"><span style="color: #C03000"><strong>Le rÃ©pertoire des avatars n\'est actuellement pas inscriptible !</strong></span> Si vous voulez que les utilisateurs puissent envoyer sur le serveur leur propres avatars vous devez rÃ©gler les permissions du dossier <em>img/avatars</em> pour que PHP puisse Ã©crire dedans. Utilisez chmod pour rÃ©gler les permissions appropriÃ©e Ã  ce rÃ©pertoire. Si vous avez un doute, chmod 0777.</p>';
+
+
+	/// Display config.php and give further instructions
+	$config = '<?php'."\n\n".'$db_type = \''.$db_type."';\n".'$db_host = \''.$db_host."';\n".'$db_name = \''.$db_name."';\n".'$db_username = \''.$db_username."';\n".'$db_password = \''.$db_password."';\n".'$db_prefix = \''.$db_prefix."';\n".'$p_connect = false;'."\n\n".'$cookie_name = '."'punbb_cookie';\n".'$cookie_domain = '."'';\n".'$cookie_path = '."'/';\n".'$cookie_secure = 0;'."\n".'$cookie_seed = \''.substr(md5(time()), -8)."';\n\ndefine('PUN', 1);";
 
 
@@ -1734,89 +1417,40 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title><?php echo $lang_install['FluxBB Installation'] ?></title>
-<link rel="stylesheet" type="text/css" href="style/<?php echo $default_style ?>.css" />
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+<title>Installation de PunBB</title>
+<link rel="stylesheet" type="text/css" href="style/Oxygen.css" />
 </head>
 <body>
 
-<div id="puninstall" class="pun">
-<div class="top-box"><div><!-- Top Corners --></div></div>
-<div class="punwrap">
-
-<div id="brdheader" class="block">
+<div id="puninstall" style="margin: auto 10% auto 10%">
+<div class="pun">
+
+<div class="blockform">
+	<h2>Instructions finales</h2>
 	<div class="box">
-		<div id="brdtitle" class="inbox">
-			<h1><span><?php echo $lang_install['FluxBB Installation'] ?></span></h1>
-			<div id="brddesc"><p><?php echo $lang_install['FluxBB has been installed'] ?></p></div>
+		<div class="fakeform">
+			<div class="inform">
+				<div class="forminfo">
+					<p>Afin de terminer l'installation tout ce que vous avez Ã  faire est de <strong>copier et coller le texte de la boite ci-dessous dans un fichier que vous nommerez <em>config.php</em> et qu'ensuite vous enverrez sur votre serveur dans le rÃ©pertoire racine de votre installation de PunBB</strong>. Assurez-vous qu'il n'y a aucun saut de ligne ou d'espace avant &lt;?php et aprÃšs ?&gt; dans ce fichier. Vous pourrez par la suite modifier config.php si vous reconfigurez votre installation (ex. modification du mot de passe base de donnÃ©s ... ).</p>
+<?php if ($alerts != ''): ?>					<?php echo $alerts."\n" ?>
+<?php endif; ?>				</div>
+				<fieldset>
+					<legend>Copiez ce contenu dans config.php</legend>
+					<div class="infldset">
+						<textarea cols="80" rows="20"><?php echo htmlspecialchars($config) ?></textarea>
+					</div>
+				</fieldset>
+			</div>
+			<div class="inform">
+				<div class="forminfo">
+					<p>Une fois que vous aurez crÃ©Ã© config.php avec le contenu ci-dessus, PunBB sera installÃ© !</p>
+					<p><a href="index.php">Aller Ã  l'index des forums</a></p>
+				</div>
+			</div>
 		</div>
 	</div>
 </div>
 
-<div id="brdmain">
-
-<div class="blockform">
-	<h2><span><?php echo $lang_install['Final instructions'] ?></span></h2>
-	<div class="box">
-<?php
-
-if (!$written)
-{
-
-?>
-		<form method="post" action="install.php">
-			<div class="inform">
-				<div class="forminfo">
-					<p><?php echo $lang_install['Info 17'] ?></p>
-					<p><?php echo $lang_install['Info 18'] ?></p>
-				</div>
-				<input type="hidden" name="generate_config" value="1" />
-				<input type="hidden" name="db_type" value="<?php echo $db_type; ?>" />
-				<input type="hidden" name="db_host" value="<?php echo $db_host; ?>" />
-				<input type="hidden" name="db_name" value="<?php echo pun_htmlspecialchars($db_name); ?>" />
-				<input type="hidden" name="db_username" value="<?php echo pun_htmlspecialchars($db_username); ?>" />
-				<input type="hidden" name="db_password" value="<?php echo pun_htmlspecialchars($db_password); ?>" />
-				<input type="hidden" name="db_prefix" value="<?php echo pun_htmlspecialchars($db_prefix); ?>" />
-				<input type="hidden" name="cookie_name" value="<?php echo pun_htmlspecialchars($cookie_name); ?>" />
-				<input type="hidden" name="cookie_seed" value="<?php echo pun_htmlspecialchars($cookie_seed); ?>" />
-
-<?php if (!empty($alerts)): ?>				<div class="forminfo error-info">
-					<ul class="error-list">
-<?php
-
-foreach ($alerts as $cur_alert)
-	echo "\t\t\t\t\t".'<li>'.$cur_alert.'</li>'."\n";
-?>
-					</ul>
-				</div>
-<?php endif; ?>			</div>
-			<p class="buttons"><input type="submit" value="<?php echo $lang_install['Download config.php file'] ?>" /></p>
-		</form>
-
-<?php
-
-}
-else
-{
-
-?>
-		<div class="fakeform">
-			<div class="inform">
-				<div class="forminfo">
-					<p><?php echo $lang_install['FluxBB fully installed'] ?></p>
-				</div>
-			</div>
-		</div>
-<?php
-
-}
-
-?>
-	</div>
 </div>
-
-</div>
-
-</div>
-<div class="end-box"><div><!-- Bottom Corners --></div></div>
 </div>
 
Index: trunk/web/punbb/lang/English/admin_bans.php
===================================================================
--- trunk/web/punbb/lang/English/admin_bans.php	(revision 10)
+++ 	(revision )
@@ -1,67 +1,0 @@
-<?php
-
-// Language definitions used in admin_bans.php
-$lang_admin_bans = array(
-
-'No user message'			=>	'No user by that username registered. If you want to add a ban not tied to a specific username just leave the username blank.',
-'No user ID message'		=>	'No user by that ID registered.',
-'User is admin message'		=>	'The user %s is an administrator and can\'t be banned. If you want to ban an administrator, you must first demote him/her.',
-'User is mod message'		=>	'The user %s is a moderator and can\'t be banned. If you want to ban a moderator, you must first demote him/her.',
-'Must enter message'		=>	'You must enter either a username, an IP address or an email address (at least).',
-'Cannot ban guest message'	=>	'The guest user cannot be banned.',
-'Invalid IP message'		=>	'You entered an invalid IP/IP-range.',
-'Invalid e-mail message'	=>	'The email address (e.g. user@domain.com) or partial email address domain (e.g. domain.com) you entered is invalid.',
-'Invalid date message'		=>	'You entered an invalid expire date.',
-'Invalid date reasons'		=>	'The format should be YYYY-MM-DD and the date must be at least one day in the future.',
-'Ban added redirect'		=>	'Ban added. Redirecting âŠ' ,
-'Ban edited redirect'		=>	'Ban edited. Redirecting âŠ',
-'Ban removed redirect'		=>	'Ban removed. Redirecting âŠ',
-
-'New ban head'				=>	'New ban',
-'Add ban subhead'			=>	'Add ban',
-'Username label'			=>	'Username',
-'Username help'				=>	'The username to ban (case-insensitive).',
-'Username advanced help'	=>	'The username to ban (case-insensitive). The next page will let you enter a custom IP and email. If you just want to ban a specific IP/IP-range or email just leave it blank.',
-
-'Ban search head'			=>	'Ban search',
-'Ban search subhead'		=>	'Enter search criteria',
-'Ban search info'			=>	'Search for bans in the database. You can enter one or more terms to search for. Wildcards in the form of asterisks (*) are accepted. To show all bans leave all fields empty.',
-'Date help'					=>	'(yyyy-mm-dd)',
-'Message label'				=>	'Message',
-'Expire after label'		=>	'Expire after',
-'Expire before label'		=>	'Expire before',
-'Order by label'			=>	'Order by',
-'Order by username'			=>	'Username',
-'Order by ip'				=>	'IP',
-'Order by e-mail'			=>	'Email',
-'Order by expire'			=>	'Expire date',
-'Ascending'					=>	'Ascending',
-'Descending'				=>	'Descending',
-'Submit search'				=>	'Submit search',
-
-'E-mail label'				=>	'Email',
-'E-mail help'				=>	'The email or email domain you wish to ban (e.g. someone@somewhere.com or somewhere.com). See "Allow banned email addresses" in Permissions for more info.',
-'IP label'					=>	'IP address/IP-ranges',
-'IP help'					=>	'The IP address or IP-ranges you wish to ban (e.g. 150.11.110.1 or 150.11.110). Separate addresses with spaces. If an IP is entered already it is the last known IP of this user in the database.',
-'IP help link'				=>	'Click %s to see IP statistics for this user.',
-'Ban advanced head'			=>	'Ban advanced settings',
-'Ban advanced subhead'		=>	'Supplement ban with IP and email',
-'Ban message label'			=>	'Ban message',
-'Ban message help'			=>	'A message that will be displayed to the banned user when he/she visits the board.',
-'Message expiry subhead'	=>	'Ban message and expiry',
-'Ban IP range info'			=>	'You should be very careful when banning an IP-range because of the possibility of multiple users matching the same partial IP.',
-'Expire date label'			=>	'Expire date',
-'Expire date help'			=>	'The date when this ban should be automatically removed (format: yyyy-mm-dd). Leave blank to remove manually.',
-
-'Results head'				=>	'Search Results',
-'Results username head'		=>	'Username',
-'Results e-mail head'		=>	'Email',
-'Results IP address head'	=>	'IP/IP-ranges',
-'Results expire head'		=>	'Expires',
-'Results message head'		=>	'Message',
-'Results banned by head'	=>	'Banned by',
-'Results actions head'		=>	'Actions',
-'No match'					=>	'No match',
-'Unknown'					=>	'Unknown',
-
-);
Index: trunk/web/punbb/lang/English/admin_categories.php
===================================================================
--- trunk/web/punbb/lang/English/admin_categories.php	(revision 10)
+++ 	(revision )
@@ -1,29 +1,0 @@
-<?php
-
-// Language definitions used in admin-categories.php
-$lang_admin_categories = array(
-
-'Must enter name message'		=>	'You must enter a name for the category',
-'Category added redirect'		=>	'Category added. Redirecting âŠ',
-'Category deleted redirect'		=>	'Category deleted. Redirecting âŠ',
-'Delete category head'			=>	'Delete category (together with all forums and posts it contains)',
-'Confirm delete subhead'		=>	'Confirm delete category',
-'Confirm delete info'			=>	'Are you sure that you want to delete the category <strong>%s</strong>?',
-'Delete category warn'			=>	'<strong>WARNING!</strong> Deleting a category will delete all forums and posts (if any) in this category!',
-'Must enter integer message'	=>	'Position must be a positive integer value.',
-'Categories updated redirect'	=>	'Categories updated. Redirecting âŠ',
-'Add categories head'			=>	'Add categories',
-'Add categories subhead'		=>	'Add categories',
-'Add category label'			=>	'Add a new category',
-'Add new submit'				=>	'Add new',
-'Add category help'				=>	'The name of the new category you want to add. You can edit the name of the category later (see below). Go to %s to add forums to your new category.',
-'Delete categories head'		=>	'Delete categories',
-'Delete categories subhead'		=>	'Delete categories',
-'Delete category label'			=>	'Delete a category',
-'Delete category help'			=>	'Select the name of the category you want to delete. You will be asked to confirm your choice of category for deletion before it is deleted.',
-'Edit categories head'			=>	'Edit categories',
-'Edit categories subhead'		=>	'Edit categories',
-'Category position label'		=>	'Position',
-'Category name label'			=>	'Name',
-
-);
Index: trunk/web/punbb/lang/English/admin_censoring.php
===================================================================
--- trunk/web/punbb/lang/English/admin_censoring.php	(revision 10)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php
-
-// Language definitions used in admin_censoring.php
-$lang_admin_censoring = array(
-
-'Must enter word message'	=>	'You must enter a word to censor.',
-'Word updated redirect'		=>	'Censor word updated. Redirecting âŠ',
-'Word added redirect'		=>	'Censor word added. Redirecting âŠ',
-'Word removed redirect'		=>	'Censor word removed. Redirecting âŠ',
-'Censoring head'			=>	'Censoring',
-'Add word subhead'			=>	'Add word',
-'Add word info'				=>	'Enter a word that you want to censor and the replacement text for this word. Wildcards are accepted (i.e. *some* would match somewhere and lonesome). Censor words also affect usernames. New users will not be able to register with usernames containing any censored words. The search is case insensitive.',
-'Censoring enabled'			=>	'<strong>Censoring is enabled in %s.</strong>',
-'Censoring disabled'		=>	'<strong>Censoring is disabled in %s.</strong>',
-'Censored word label'		=>	'Censored word',
-'Replacement label'			=>	'Replacement word(s)',
-'Action label'				=>	'Action',
-'Edit remove subhead'		=>	'Edit or remove words',
-'No words in list'			=>	'No censor words in list.',
-
-);
Index: trunk/web/punbb/lang/English/admin_common.php
===================================================================
--- trunk/web/punbb/lang/English/admin_common.php	(revision 10)
+++ 	(revision )
@@ -1,44 +1,0 @@
-<?php
-
-// Language definitions used in admin_common
-$lang_admin_common = array(
-
-// The menu
-'Admin menu'			=>	'Admin menu',
-'Plugins menu'			=>	'Plugins menu',
-'Moderator menu'		=>	'Moderator menu',
-'Index'					=>	'Index',
-'Categories'			=>	'Categories',
-'Forums'				=>	'Forums',
-'Users'					=>	'Users',
-'User groups'			=>	'User groups',
-'Options'				=>	'Options',
-'Permissions'			=>	'Permissions',
-'Censoring'				=>	'Censoring',
-'Ranks'					=>	'Ranks',
-'Bans'					=>	'Bans',
-'Prune'					=>	'Prune',
-'Maintenance'			=>	'Maintenance',
-'Reports'				=>	'Reports',
-
-'Admin'					=>	'Admin',
-'Go back'				=>	'Go back',
-'Delete'				=>	'Delete',
-'Update'				=>	'Update',
-'Add'					=>	'Add',
-'Edit'					=>	'Edit',
-'Remove'				=>	'Remove',
-'Yes'					=>	'Yes',
-'No'					=>	'No',
-'Save changes'			=>	'Save changes',
-'Save'					=>	'Save',
-'here'					=>	'here',
-'Action'				=>	'Action',
-'None'					=>	'None',
-'Maintenance mode'		=>	'maintenance mode', // Used for link text in more than one file
-
-// Admin loader
-'No plugin message'		=>	'There is no plugin called %s in the plugin directory.',
-'Plugin failed message'	=>	'Loading of the plugin - <strong>%s</strong> - failed.',
-
-);
Index: trunk/web/punbb/lang/English/admin_forums.php
===================================================================
--- trunk/web/punbb/lang/English/admin_forums.php	(revision 10)
+++ 	(revision )
@@ -1,53 +1,0 @@
-<?php
-
-// Language definitions used in admin-forums.php
-$lang_admin_forums = array(
-
-'Forum added redirect'		=>	'Forum added. Redirecting âŠ',
-'Forum deleted redirect'	=>	'Forum deleted. Redirecting âŠ',
-'Forums updated redirect'	=>	'Forums updated. Redirecting âŠ',
-'Forum updated redirect'	=>	'Forum updated. Redirecting âŠ',
-'Perms reverted redirect'	=>	'Permissions reverted to defaults. Redirecting âŠ',
-'Must enter name message'	=>	'You must enter a forum name.',
-'Must be integer message'	=>	'Position must be a positive integer value.',
-'New forum'					=>	'New forum',
-
-// Entry page
-'Add forum head'			=>	'Add forum',
-'Create new subhead'		=>	'Create a new forum',
-'Add forum label'			=>	'Add forum to category',
-'Add forum help'			=>	'Select the category to which you wish to add a new forum.',
-'Add forum'					=>	'Add forum',
-'No categories exist'		=>	'No categories exist',
-'Edit forums head'			=>	'Edit forums',
-'Category subhead'			=>	'Category:',
-'Forum label'				=>	'Forum',
-'Edit link'					=>	'Edit',
-'Delete link'				=>	'Delete',
-'Position label'			=>	'Position',
-'Update positions'			=>	'Update positions',
-'Confirm delete head'		=>	'Confirm delete forum',
-'Confirm delete subhead'	=>	'Important! Read before deleting',
-'Confirm delete info'		=>	'Are you sure that you want to delete the forum <strong>%s</strong>?',
-'Confirm delete warn'		=>	'WARNING! Deleting a forum will delete all posts (if any) in that forum!',
-
-// Detailed edit page
-'Edit forum head'			=>	'Edit forum',
-'Edit details subhead'		=>	'Edit forum details',
-'Forum name label'			=>	'Forum name',
-'Forum description label'	=>	'Description (HTML)',
-'Category label'			=>	'Category',
-'Sort by label'				=>	'Sort topics by',
-'Last post'					=>	'Last post',
-'Topic start'				=>	'Topic start',
-'Subject'					=>	'Subject',
-'Redirect label'			=>	'Redirect URL',
-'Redirect help'				=>	'Only available in empty forums',
-'Group permissions subhead'	=>	'Edit group permissions for this forum',
-'Group permissions info'	=>	'In this form, you can set the forum specific permissions for the different user groups. If you haven\'t made any changes to this forum\'s group permissions, what you see below is the default based on settings in %s. Administrators always have full permissions and are thus excluded. Permission settings that differ from the default permissions for the user group are marked red. The "Read forum" permission checkbox will be disabled if the group in question lacks the "Read board" permission. For redirect forums, only the "Read forum" permission is editable.',
-'Read forum label'			=>	'Read forum',
-'Post replies label'		=>	'Post replies',
-'Post topics label'			=>	'Post topics',
-'Revert to default'			=>	'Revert to default',
-
-);
Index: trunk/web/punbb/lang/English/admin_groups.php
===================================================================
--- trunk/web/punbb/lang/English/admin_groups.php	(revision 10)
+++ 	(revision )
@@ -1,84 +1,0 @@
-<?php
-
-// Language definitions used in admin-groups.php
-$lang_admin_groups = array(
-
-'Must enter title message'		=>	'You must enter a group title.',
-'Title already exists message'	=>	'There is already a group with the title <strong>%s</strong>.',
-'Default group redirect'		=>	'Default group set. Redirecting âŠ',
-'Cannot remove default message'	=>	'The default group cannot be removed. In order to delete this group, you must first setup a different group as the default.',
-'Group removed redirect'		=>	'Group removed. Redirecting âŠ',
-'Group added redirect'			=>	'Group added. Redirecting âŠ',
-'Group edited redirect'			=>	'Group edited. Redirecting âŠ',
-
-'Add groups head'				=>	'Add/setup groups',
-'Add group subhead'				=>	'Add new group',
-'New group label'				=>	'Base new group on',
-'New group help'				=>	'Select a user group from which the new group will inherit its permission settings. The next page will let you fine-tune its settings.',
-'Default group subhead'			=>	'Set default group',
-'Default group label'			=>	'Default group',
-'Default group help'			=>	'This is the default user group, e.g. the group users are placed in when they register. For security reasons, users can\'t be placed in either the moderator or administrator user groups by default.',
-'Existing groups head'			=>	'Existing groups',
-'Edit groups subhead'			=>	'Edit/delete groups',
-'Edit groups info'				=>	'The pre-defined groups Guests, Administrators, Moderators and Members cannot be removed. However, they can be edited. Please note that in some groups, some options are unavailable (e.g. the <em>edit posts</em> permission for guests). Administrators always have full permissions.',
-'Edit link'						=>	'Edit',
-'Delete link'					=>	'Delete',
-'Group delete head'				=>	'Group delete',
-'Confirm delete subhead'		=>	'Confirm delete group',
-'Confirm delete info'			=>	'Are you sure that you want to delete the group <strong>%s</strong>?',
-'Confirm delete warn'			=>	'WARNING! After you deleted a group you cannot restore it.',
-'Delete group head'				=>	'Delete group',
-'Move users subhead'			=>	'Move users currently in group',
-'Move users info'				=>	'The group <strong>%s</strong> currently has <strong>%s</strong> members. Please select a group to which these members will be assigned upon deletion.',
-'Move users label'				=>	'Move users to',
-'Delete group'					=>	'Delete group',
-
-'Group settings head'			=>	'Group settings',
-'Group settings subhead'		=>	'Setup group options and permissions',
-'Group settings info'			=>	'Below options and permissions are the default permissions for the user group. These options apply if no forum specific permissions are in effect.',
-'Group title label'				=>	'Group title',
-'User title label'				=>	'User title',
-'User title help'				=>	'This title will override any rank users in this group have attained. Leave blank to use default title or rank.',
-'Mod privileges label'			=>	'Allow users moderator privileges',
-'Mod privileges help'			=>	'In order for a user in this group to have moderator abilities, he/she must be assigned to moderate one or more forums. This is done via the user administration page of the user\'s profile.',
-'Edit profile label'			=>	'Allow moderators to edit user profiles',
-'Edit profile help'				=>	'If moderator privileges are enabled, allow users in this group to edit user profiles.',
-'Rename users label'			=>	'Allow moderators to rename users',
-'Rename users help'				=>	'If moderator privileges are enabled, allow users in this group to rename users.',
-'Change passwords label'		=>	'Allow moderators to change passwords',
-'Change passwords help'			=>	'If moderator privileges are enabled, allow users in this group to change user passwords.',
-'Ban users label'				=>	'Allow moderators to ban users',
-'Ban users help'				=>	'If moderator privileges are enabled, allow users in this group to ban users.',
-'Read board label'				=>	'Read board',
-'Read board help'				=>	'Allow users in this group to view the board. This setting applies to every aspect of the board and can therefore not be overridden by forum specific settings. If this is set to "No", users in this group will only be able to login/logout and register.',
-'View user info label'			=>	'View user information',
-'View user info help'			=>	'Allow users to view the user list and user profiles.',
-'Post replies label'			=>	'Post replies',
-'Post replies help'				=>	'Allow users in this group to post replies in topics.',
-'Post topics label'				=>	'Post topics',
-'Post topics help'				=>	'Allow users in this group to post new topics.',
-'Edit posts label'				=>	'Edit posts',
-'Edit posts help'				=>	'Allow users in this group to edit their own posts.',
-'Delete posts label'			=>	'Delete posts',
-'Delete posts help'				=>	'Allow users in this group to delete their own posts.',
-'Delete topics label'			=>	'Delete topics',
-'Delete topics help'			=>	'Allow users in this group to delete their own topics (including any replies).',
-'Set own title label'			=>	'Set own user title',
-'Set own title help'			=>	'Allow users in this group to set their own user title.',
-'User search label'				=>	'Use search',
-'User search help'				=>	'Allow users in this group to use the search feature.',
-'User list search label'		=>	'Search user list',
-'User list search help'			=>	'Allow users in this group to freetext search for users in the user list.',
-'Send e-mails label'			=>	'Send e-mails',
-'Send e-mails help'				=>	'Allow users in this group to send e-mails to other users.',
-'Post flood label'				=>	'Post flood interval',
-'Post flood help'				=>	'Number of seconds that users in this group have to wait between posts. Set to 0 to disable.',
-'Search flood label'			=>	'Search flood interval',
-'Search flood help'				=>	'Number of seconds that users in this group have to wait between searches. Set to 0 to disable.',
-'E-mail flood label'			=>	'Email flood interval',
-'E-mail flood help'				=>	'Number of seconds that users in this group have to wait between emails. Set to 0 to disable.',
-'Report flood label'			=>	'Report flood interval',
-'Report flood help'				=>	'Number of seconds that users in this group have to wait between reports. Set to 0 to disable.',
-'Moderator info'				=>	'Please note that in order for a user in this group to have moderator abilities, he/she must be assigned to moderate one or more forums. This is done via the user administration page of the user\'s profile.',
-
-);
Index: trunk/web/punbb/lang/English/admin_index.php
===================================================================
--- trunk/web/punbb/lang/English/admin_index.php	(revision 10)
+++ 	(revision )
@@ -1,51 +1,0 @@
-<?php
-
-// Language definitions used in admin_index.php
-$lang_admin_index = array(
-
-'fopen disabled message'			=>	'Unable to check for upgrade since \'allow_url_fopen\' is disabled on this system.',
-'Upgrade check failed message'		=>	'Check for upgrade failed for unknown reasons.',
-'Running latest version message'	=>	'You are running the latest version of FluxBB.',
-'New version available message'		=>	'A new version of FluxBB has been released. You can download the latest version at %s.',
-'PHPinfo disabled message'			=>	'The PHP function phpinfo() has been disabled on this server.',
-'Not available'						=>	'Not available',
-'Forum admin head'					=>	'Forum administration',
-'NA'								=>	'N/A',
-'Welcome to admin'					=>	'Welcome to the FluxBB administration control panel. From here you can control vital aspects of the board. Depending on whether you are an administrator or a moderator you can:',
-'Welcome 1'							=>	'Organize categories and forums.',
-'Welcome 2'							=>	'Set forum-wide options and preferences.',
-'Welcome 3'							=>	'Control permissions for users and guests.',
-'Welcome 4'							=>	'View IP statistics for users.',
-'Welcome 5'							=>	'Ban users.',
-'Welcome 6'							=>	'Censor words.',
-'Welcome 7'							=>	'Set up user ranks.',
-'Welcome 8'							=>	'Prune old posts.',
-'Welcome 9'							=>	'Handle post reports.',
-'Statistics head'					=>	'Statistics',
-'FluxBB version label'				=>	'FluxBB version',
-'Check for upgrade'					=>	'Check for upgrade',
-'FluxBB version data'				=>	'v%s - %s',
-'Server load label'					=>	'Server load',
-'Server load data'					=>	'%s - %s user(s) online',
-'Environment label'					=>	'Environment',
-'Environment data OS'				=>	'Operating system: %s',
-'Show info'							=>	'Show info',
-'Environment data version'			=>	'PHP: %s - %s',
-'Environment data acc'				=>	'Accelerator: %s',
-'Turck MMCache'						=>	'Turck MMCache',
-'Turck MMCache link'				=>	'turck-mmcache.sourceforge.net/',
-'ionCube PHP Accelerator'			=>	'ionCube PHP Accelerator',
-'ionCube PHP Accelerator link'		=>	'www.php-accelerator.co.uk/',
-'Alternative PHP Cache (APC)'		=>	'Alternative PHP Cache (APC)',
-'Alternative PHP Cache (APC) link'	=>	'www.php.net/apc/',
-'Zend Optimizer'					=>	'Zend Optimizer',
-'Zend Optimizer link'				=>	'www.zend.com/products/guard/zend-optimizer/',
-'eAccelerator'						=>	'eAccelerator',
-'eAccelerator link'					=>	'www.eaccelerator.net/',
-'XCache'							=>	'XCache',
-'XCache link'						=>	'xcache.lighttpd.net/',
-'Database label'					=>	'Database',
-'Database data rows'				=>	'Rows: %s',
-'Database data size'				=>	'Size: %s',
-
-);
Index: trunk/web/punbb/lang/English/admin_maintenance.php
===================================================================
--- trunk/web/punbb/lang/English/admin_maintenance.php	(revision 10)
+++ 	(revision )
@@ -1,40 +1,0 @@
-<?php
-
-// Language definitions used in admin_maintenance.php
-$lang_admin_maintenance = array(
-
-'Maintenance head'				=>	'Forum maintenance',
-'Rebuild index subhead'			=>	'Rebuild search index',
-'Rebuild index info'			=>	'If you\'ve added, edited or removed posts manually in the database or if you\'re having problems searching, you should rebuild the search index. For best performance, you should put the forum in %s during rebuilding. <strong>Rebuilding the search index can take a long time and will increase server load during the rebuild process!</strong>',
-'Posts per cycle label'			=>	'Posts per cycle',
-'Posts per cycle help'			=>	'The number of posts to process per pageview. E.g. if you were to enter 300, three hundred posts would be processed and then the page would refresh. This is to prevent the script from timing out during the rebuild process.',
-'Starting post label'			=>	'Starting post ID',
-'Starting post help'			=>	'The post ID to start rebuilding at. The default value is the first available ID in the database. Normally you wouldn\'t want to change this.',
-'Empty index label'				=>	'Empty index',
-'Empty index help'				=>	'Select this if you want the search index to be emptied before rebuilding (see below).',
-'Rebuild completed info'		=>	'Once the process has completed, you will be redirected back to this page. It is highly recommended that you have JavaScript enabled in your browser during rebuilding (for automatic redirect when a cycle has completed). If you are forced to abort the rebuild process, make a note of the last processed post ID and enter that ID+1 in "Starting post ID" when/if you want to continue ("Empty index" must not be selected).',
-'Rebuild index'					=>	'Rebuild index',
-'Rebuilding search index'		=>	'Rebuilding search index',
-'Rebuilding index info'			=>	'Rebuilding index. This might be a good time to put on some coffee :-)',
-'Processing post'				=>	'Processing post <strong>%s</strong> âŠ',
-'Click here'					=>	'Click here',
-'Javascript redirect failed'	=>	'JavaScript redirect unsuccessful. %s to continue âŠ',
-'Posts must be integer message'	=>	'Posts per cycle must be a positive integer value.',
-'Days must be integer message'	=>	'Days to prune must be a positive integer value.',
-'No old topics message'			=>	'There are no topics that are %s days old. Please decrease the value of "Days old" and try again.',
-'Posts pruned redirect'			=>	'Posts pruned. Redirecting âŠ',
-'Prune head'					=>	'Prune',
-'Prune subhead'					=>	'Prune old posts',
-'Days old label'				=>	'Days old',
-'Days old help'					=>	'The number of days "old" a topic must be to be pruned. E.g. if you were to enter 30, every topic that didn\'t contain a post dated less than 30 days old would be deleted.',
-'Prune sticky label'			=>	'Prune sticky topics',
-'Prune sticky help'				=>	'When enabled, sticky topics will also be pruned.',
-'Prune from label'				=>	'Prune from forum',
-'All forums'					=>	'All forums',
-'Prune from help'				=>	'The forum from which you want to prune posts.',
-'Prune info'					=>	'Use this feature with caution. <strong>Pruned posts can never be recovered.</strong> For best performance, you should put the forum in %s during pruning.',
-'Confirm prune subhead'			=>	'Confirm prune posts',
-'Confirm prune info'			=>	'Are you sure that you want to prune all topics older than %s days from %s (%s topics).',
-'Confirm prune warn'			=>	'WARNING! Pruning posts deletes them permanently.',
-
-);
Index: trunk/web/punbb/lang/English/admin_options.php
===================================================================
--- trunk/web/punbb/lang/English/admin_options.php	(revision 10)
+++ 	(revision )
@@ -1,228 +1,0 @@
-<?php
-
-// Language definitions used in admin-options.php
-$lang_admin_options = array(
-
-'Bad HTTP Referer message'			=>	'Bad HTTP_REFERER. If you have moved these forums from one location to another or switched domains, you need to update the Base URL manually in the database (look for o_base_url in the config table) and then clear the cache by deleting all .php files in the /cache directory.',
-'Must enter title message'			=>	'You must enter a board title.',
-'Invalid e-mail message'			=>	'The admin email address you entered is invalid.',
-'Invalid webmaster e-mail message'	=>	'The webmaster email address you entered is invalid.',
-'SMTP passwords did not match'		=>	'You need to enter the SMTP password twice exactly the same to change it.',
-'Enter announcement here'			=>	'Enter your announcement here.',
-'Enter rules here'					=>	'Enter your rules here.',
-'Default maintenance message'		=>	'The forums are temporarily down for maintenance. Please try again in a few minutes.',
-'Timeout error message'				=>	'The value of "Timeout online" must be smaller than the value of "Timeout visit".',
-'Options updated redirect'			=>	'Options updated. Redirecting âŠ',
-'Options head'						=>	'Options',
-
-// Essentials section
-'Essentials subhead'				=>	'Essentials',
-'Board title label'					=>	'Board title',
-'Board title help'					=>	'The title of this bulletin board (shown at the top of every page). This field may <strong>not</strong> contain HTML.',
-'Board desc label'					=>	'Board description',
-'Board desc help'					=>	'A short description of this bulletin board (shown at the top of every page). This field may contain HTML.',
-'Base URL label'					=>	'Base URL',
-'Base URL help'						=>	'The complete URL of the board without trailing slash (i.e. http://www.mydomain.com/forums). This <strong>must</strong> be correct in order for all admin and moderator features to work. If you get "Bad referer" errors, it\'s probably incorrect.',
-'Timezone label'					=>	'Default time zone',
-'Timezone help'						=>	'The default time zone for guests and users attempting to register for the board.',
-'DST label'							=>	'Adjust for DST',
-'DST help'							=>	'Check if daylight savings is in effect (advances times by 1 hour).',
-'Language label'					=>	'Default language',
-'Language help'						=>	'The default language for guests and users who haven\'t changed from the default in their profile. If you remove a language pack, this must be updated.',
-'Default style label'				=>	'Default style',
-'Default style help'				=>	'The default style for guests and users who haven\'t changed from the default in their profile.',
-
-// Essentials section timezone options
-'UTC-12:00'							=>	'(UTC-12:00) International Date Line West',
-'UTC-11:00'							=>	'(UTC-11:00) Niue, Samoa',
-'UTC-10:00'							=>	'(UTC-10:00) Hawaii-Aleutian, Cook Island',
-'UTC-09:30'							=>	'(UTC-09:30) Marquesas Islands',
-'UTC-09:00'							=>	'(UTC-09:00) Alaska, Gambier Island',
-'UTC-08:30'							=>	'(UTC-08:30) Pitcairn Islands',
-'UTC-08:00'							=>	'(UTC-08:00) Pacific',
-'UTC-07:00'							=>	'(UTC-07:00) Mountain',
-'UTC-06:00'							=>	'(UTC-06:00) Central',
-'UTC-05:00'							=>	'(UTC-05:00) Eastern',
-'UTC-04:00'							=>	'(UTC-04:00) Atlantic',
-'UTC-03:30'							=>	'(UTC-03:30) Newfoundland',
-'UTC-03:00'							=>	'(UTC-03:00) Amazon, Central Greenland',
-'UTC-02:00'							=>	'(UTC-02:00) Mid-Atlantic',
-'UTC-01:00'							=>	'(UTC-01:00) Azores, Cape Verde, Eastern Greenland',
-'UTC'								=>	'(UTC) Western European, Greenwich',
-'UTC+01:00'							=>	'(UTC+01:00) Central European, West African',
-'UTC+02:00'							=>	'(UTC+02:00) Eastern European, Central African',
-'UTC+03:00'							=>	'(UTC+03:00) Moscow, Eastern African',
-'UTC+03:30'							=>	'(UTC+03:30) Iran',
-'UTC+04:00'							=>	'(UTC+04:00) Gulf, Samara',
-'UTC+04:30'							=>	'(UTC+04:30) Afghanistan',
-'UTC+05:00'							=>	'(UTC+05:00) Pakistan, Yekaterinburg',
-'UTC+05:30'							=>	'(UTC+05:30) India, Sri Lanka',
-'UTC+05:45'							=>	'(UTC+05:45) Nepal',
-'UTC+06:00'							=>	'(UTC+06:00) Bangladesh, Bhutan, Novosibirsk',
-'UTC+06:30'							=>	'(UTC+06:30) Cocos Islands, Myanmar',
-'UTC+07:00'							=>	'(UTC+07:00) Indochina, Krasnoyarsk',
-'UTC+08:00'							=>	'(UTC+08:00) Greater China, Australian Western, Irkutsk',
-'UTC+08:45'							=>	'(UTC+08:45) Southeastern Western Australia',
-'UTC+09:00'							=>	'(UTC+09:00) Japan, Korea, Chita',
-'UTC+09:30'							=>	'(UTC+09:30) Australian Central',
-'UTC+10:00'							=>	'(UTC+10:00) Australian Eastern, Vladivostok',
-'UTC+10:30'							=>	'(UTC+10:30) Lord Howe',
-'UTC+11:00'							=>	'(UTC+11:00) Solomon Island, Magadan',
-'UTC+11:30'							=>	'(UTC+11:30) Norfolk Island',
-'UTC+12:00'							=>	'(UTC+12:00) New Zealand, Fiji, Kamchatka',
-'UTC+12:45'							=>	'(UTC+12:45) Chatham Islands',
-'UTC+13:00'							=>	'(UTC+13:00) Tonga, Phoenix Islands',
-'UTC+14:00'							=>	'(UTC+14:00) Line Islands',
-
-// Timeout Section
-'Timeouts subhead'					=>	'Time and timeouts',
-'Time format label'					=>	'Time format',
-'PHP manual'						=>	'PHP manual',
-'Time format help'					=>	'[Current format: %s]. See %s for formatting options.',
-'Date format label'					=>	'Date format',
-'Date format help'					=>	'[Current format: %s]. See %s for formatting options.',
-'Visit timeout label'				=>	'Visit timeout',
-'Visit timeout help'				=>	'Number of seconds a user must be idle before his/hers last visit data is updated (primarily affects new message indicators).',
-'Online timeout label'				=>	'Online timeout',
-'Online timeout help'				=>	'Number of seconds a user must be idle before being removed from the online users list.',
-'Redirect time label'				=>	'Redirect time',
-'Redirect time help'				=>	'Number of seconds to wait when redirecting. If set to 0, no redirect page will be displayed (not recommended).',
-
-// Display Section
-'Display subhead'					=>	'Display',
-'Version number label'				=>	'Version number',
-'Version number help'				=>	'Show FluxBB version number in footer.',
-'Info in posts label'				=>	'User info in posts',
-'Info in posts help'				=>	'Show information about the poster under the username in topic view. The information affected is location, register date, post count and the contact links (email and URL).',
-'Post count label'					=>	'User post count',
-'Post count help'					=>	'Show the number of posts a user has made (affects topic view, profile and user list).',
-'Smilies label'						=>	'Smilies in posts',
-'Smilies help'						=>	'Convert smilies to small graphic icons.',
-'Smilies sigs label'				=>	'Smilies in signatures',
-'Smilies sigs help'					=>	'Convert smilies to small graphic icons in user signatures.',
-'Clickable links label'				=>	'Make clickable links',
-'Clickable links help'				=>	'When enabled, FluxBB will automatically detect any URLs in posts and make them clickable hyperlinks.',
-'Topic review label'				=>	'Topic review',
-'Topic review help'					=>	'Maximum number of posts to display when posting (newest first). Set to 0 to disable.',
-'Topics per page label'				=>	'Topics per page',
-'Topics per page help'				=>	'The default number of topics to display per page in a forum. Users can personalize this setting.',
-'Posts per page label'				=>	'Posts per page',
-'Posts per page help'				=>	'The default number of posts to display per page in a topic. Users can personalize this setting.',
-'Indent label'						=>	'Indent size',
-'Indent help'						=>	'If set to 8, a regular tab will be used when displaying text within the [code][/code] tag. Otherwise this many spaces will be used to indent the text.',
-'Quote depth label'					=>	'Maximum [quote] depth',
-'Quote depth help'					=>	'The maximum times a [quote] tag can go inside other [quote] tags, any tags deeper than this will be discarded.',
-
-// Features section
-'Features subhead'					=>	'Features',
-'Quick post label'					=>	'Quick post',
-'Quick post help'					=>	'When enabled, FluxBB will add a quick post form at the bottom of topics. This way users can post directly from the topic view.',
-'Users online label'				=>	'Users online',
-'Users online help'					=>	'Display info on the index page about guests and registered users currently browsing the board.',
-'Censor words label'				=>	'Censor words',
-'Censor words help'					=>	'Enable this to censor specific words in the board. See %s for more info.',
-'Signatures label'					=>	'Signatures',
-'Signatures help'					=>	'Allow users to attach a signature to their posts.',
-'User ranks label'					=>	'User ranks',
-'User ranks help'					=>	'Enable this to use user ranks. See %s for more info.',
-'User has posted label'				=>	'User has posted earlier',
-'User has posted help'				=>	'This feature displays a dot in front of topics in viewforum.php in case the currently logged in user has posted in that topic earlier. Disable if you are experiencing high server load.',
-'Topic views label'					=>	'Topic views',
-'Topic views help'					=>	'Keep track of the number of views a topic has. Disable if you are experiencing high server load in a busy forum.',
-'Quick jump label'					=>	'Quick jump',
-'Quick jump help'					=>	'Enable the quick jump (jump to forum) drop list.',
-'GZip label'						=>	'GZip output',
-'GZip help'							=>	'If enabled, FluxBB will gzip the output sent to browsers. This will reduce bandwidth usage, but use a little more CPU. This feature requires that PHP is configured with zlib (--with-zlib). Note: If you already have one of the Apache modules mod_gzip or mod_deflate set up to compress PHP scripts, you should disable this feature.',
-'Search all label'					=>	'Search all forums',
-'Search all help'					=>	'When disabled, searches will only be allowed in one forum at a time. Disable if server load is high due to excessive searching.',
-'Menu items label'					=>	'Additional menu items',
-'Menu items help'					=>	'By entering HTML hyperlinks into this textbox, any number of items can be added to the navigation menu at the top of all pages. The format for adding new links is X = &lt;a href="URL"&gt;LINK&lt;/a&gt; where X is the position at which the link should be inserted (e.g. 0 to insert at the beginning and 2 to insert after "User list"). Separate entries with a linebreak.',
-
-// Feeds section
-'Feed subhead'						=>	'Syndication',
-'Default feed label'				=>	'Default feed type',
-'Default feed help'					=>	'Select the type of syndication feed to display. Note: Choosing none will not disable feeds, only hide them by default.',
-'None'								=>	'None',
-'RSS'								=>	'RSS',
-'Atom'								=>	'Atom',
-'Feed TTL label'					=>	'Duration to cache feeds',
-'Feed TTL help'						=>	'Feeds can be cached to lower the resource usage of feeds.',
-'No cache'							=>	'Don\'t cache',
-'Minutes'							=>	'%d minutes',
-
-// Reports section
-'Reports subhead'					=>	'Reports',
-'Reporting method label'			=>	'Reporting method',
-'Internal'							=>	'Internal',
-'By e-mail'							=>	'Email',
-'Both'								=>	'Both',
-'Reporting method help'				=>	'Select the method for handling topic/post reports. You can choose whether topic/post reports should be handled by the internal report system, emailed to the addresses on the mailing list (see below) or both.',
-'Mailing list label'				=>	'Mailing list',
-'Mailing list help'					=>	'A comma separated list of subscribers. The people on this list are the recipients of reports.',
-
-// Avatars section
-'Avatars subhead'					=>	'Avatars',
-'Use avatars label'					=>	'Use avatars',
-'Use avatars help'					=>	'When enabled, users will be able to upload an avatar which will be displayed under their title/rank.',
-'Upload directory label'			=>	'Upload directory',
-'Upload directory help'				=>	'The upload directory for avatars (relative to the FluxBB root directory). PHP must have write permissions to this directory.',
-'Max width label'					=>	'Max width',
-'Max width help'					=>	'The maximum allowed width of avatars in pixels (60 is recommended).',
-'Max height label'					=>	'Max height',
-'Max height help'					=>	'The maximum allowed height of avatars in pixels (60 is recommended).',
-'Max size label'					=>	'Max size',
-'Max size help'						=>	'The maximum allowed size of avatars in bytes (10240 is recommended).',
-
-// E-mail section
-'E-mail subhead'					=>	'Email',
-'Admin e-mail label'				=>	'Admin email',
-'Admin e-mail help'					=>	'The email address of the board administrator.',
-'Webmaster e-mail label'			=>	'Webmaster email',
-'Webmaster e-mail help'				=>	'This is the address that all emails sent by the board will be addressed from.',
-'Forum subscriptions label'			=>	'Forum subscriptions',
-'Forum subscriptions help'			=>	'Enable users to subscribe to forums (receive email when someone creates a new topic).',
-'Topic subscriptions label'			=>	'Topic subscriptions',
-'Topic subscriptions help'			=>	'Enable users to subscribe to topics (receive email when someone replies).',
-'SMTP address label'				=>	'SMTP server address',
-'SMTP address help'					=>	'The address of an external SMTP server to send emails with. You can specify a custom port number if the SMTP server doesn\'t run on the default port 25 (example: mail.myhost.com:3580). Leave blank to use the local mail program.',
-'SMTP username label'				=>	'SMTP username',
-'SMTP username help'				=>	'Username for SMTP server. Only enter a username if it is required by the SMTP server (most servers <strong>do not</strong> require authentication).',
-'SMTP password label'				=>	'SMTP password',
-'SMTP change password help'			=>	'Check this if you want to change or delete the currently stored password.',
-'SMTP password help'				=>	'Password for SMTP server. Only enter a password if it is required by the SMTP server (most servers <strong>do not</strong> require authentication). Please enter your password twice to confirm.',
-'SMTP SSL label'					=>	'Encrypt SMTP using SSL',
-'SMTP SSL help'						=>	'Encrypts the connection to the SMTP server using SSL. Should only be used if your SMTP server requires it and your version of PHP supports SSL.',
-
-// Registration Section
-'Registration subhead'				=>	'Registration',
-'Allow new label'					=>	'Allow new registrations',
-'Allow new help'					=>	'Controls whether this board accepts new registrations. Disable only under special circumstances.',
-'Verify label'						=>	'Verify registrations',
-'Verify help'						=>	'When enabled, users are emailed a random password when they register. They can then log in and change the password in their profile if they see fit. This feature also requires users to verify new email addresses if they choose to change from the one they registered with. This is an effective way of avoiding registration abuse and making sure that all users have "correct" email addresses in their profiles.',
-'Report new label'					=>	'Report new registrations',
-'Report new help'					=>	'If enabled, FluxBB will notify users on the mailing list (see above) when a new user registers in the forums.',
-'Use rules label'					=>	'User forum rules',
-'Use rules help'					=>	'When enabled, users must agree to a set of rules when registering (enter text below). The rules will always be available through a link in the navigation table at the top of every page.',
-'Rules label'						=>	'Enter your rules here',
-'Rules help'						=>	'Here you can enter any rules or other information that the user must review and accept when registering. If you enabled rules above you have to enter something here, otherwise it will be disabled. This text will not be parsed like regular posts and thus may contain HTML.',
-'E-mail default label'				=>	'Default email setting',
-'E-mail default help'				=>	'Choose the default privacy setting for new user registrations.',
-'Display e-mail label'				=>	'Display email address to other users.',
-'Hide allow form label'				=>	'Hide email address but allow form e-mail.',
-'Hide both label'					=>	'Hide email address and disallow form email.',
-
-// Announcement Section
-'Announcement subhead'				=>	'Announcements',
-'Display announcement label'		=>	'Display announcement',
-'Display announcement help'			=>	'Enable this to display the below message in the board.',
-'Announcement message label'		=>	'Announcement message',
-'Announcement message help'			=>	'This text will not be parsed like regular posts and thus may contain HTML.',
-
-// Maintenance Section
-'Maintenance subhead'				=>	'Maintenance',
-'Maintenance mode label'			=>	'Maintenance mode',
-'Maintenance mode help'				=>	'When enabled, the board will only be available to administrators. This should be used if the board needs to be taken down temporarily for maintenance. <strong>WARNING! Do not log out when the board is in maintenance mode.</strong> You will not be able to login again.',
-'Maintenance message label'			=>	'Maintenance message',
-'Maintenance message help'			=>	'The message that will be displayed to users when the board is in maintenance mode. If left blank, a default message will be used. This text will not be parsed like regular posts and thus may contain HTML.',
-
-);
Index: trunk/web/punbb/lang/English/admin_permissions.php
===================================================================
--- trunk/web/punbb/lang/English/admin_permissions.php	(revision 10)
+++ 	(revision )
@@ -1,36 +1,0 @@
-<?php
-
-// Language definitions used in admin-permissions.php
-$lang_admin_permissions = array(
-
-'Perms updated redirect'	=>	'Permissions updated. Redirecting âŠ',
-'Permissions head'			=>	'Permissions',
-'Posting subhead'			=>	'Posting',
-'BBCode label'				=>	'BBCode',
-'BBCode help'				=>	'Allow BBCode in posts (recommended).',
-'Image tag label'			=>	'Image tag',
-'Image tag help'			=>	'Allow the BBCode [img][/img] tag in posts.',
-'All caps message label'	=>	'All caps message',
-'All caps message help'		=>	'Allow a message to contain only capital letters.',
-'All caps subject label'	=>	'All caps subject',
-'All caps subject help'		=>	'Allow a subject to contain only capital letters.',
-'Require e-mail label'		=>	'Require guest email',
-'Require e-mail help'		=>	'Require guests to supply an email address when posting.',
-'Signatures subhead'		=>	'Signatures',
-'BBCode sigs label'			=>	'BBCodes in signatures',
-'BBCode sigs help'			=>	'Allow BBCodes in user signatures.',
-'Image tag sigs label'		=>	'Image tag in signatures',
-'Image tag sigs help'		=>	'Allow the BBCode [img][/img] tag in user signatures (not recommended).',
-'All caps sigs label'		=>	'All caps signature',
-'All caps sigs help'		=>	'Allow a signature to contain only capital letters.',
-'Max sig length label'		=>	'Maximum signature length',
-'Max sig length help'		=>	'The maximum number of characters a user signature may contain.',
-'Max sig lines label'		=>	'Maximum signature lines',
-'Max sig lines help'		=>	'The maximum number of lines a user signature may contain.',
-'Registration subhead'		=>	'Registration',
-'Banned e-mail label'		=>	'Allow banned email addresses',
-'Banned e-mail help'		=>	'Allow users to register with or change to a banned email address/domain. If left at its default setting (yes), this action will be allowed, but an alert email will be sent to the mailing list (an effective way of detecting multiple registrations).',
-'Duplicate e-mail label'	=>	'Allow duplicate email addresses',
-'Duplicate e-mail help'		=>	'Controls whether users should be allowed to register with an email address that another user already has. If allowed, an alert email will be sent to the mailing list if a duplicate is detected.',
-
-);
Index: trunk/web/punbb/lang/English/admin_ranks.php
===================================================================
--- trunk/web/punbb/lang/English/admin_ranks.php	(revision 10)
+++ 	(revision )
@@ -1,23 +1,0 @@
-<?php
-
-// Language definitions used in admin_ranks.php
-$lang_admin_ranks = array(
-
-'Must be integer message'	=>	'Minimum posts must be a positive integer value.',
-'Dupe min posts message'	=>	'There is already a rank with a minimun posts value of %s.',
-'Must enter title message'	=>	'You must enter a rank title.',
-'Rank added redirect'		=>	'Rank added. Redirecting âŠ',
-'Rank updated redirect'		=>	'Rank updated. Redirecting âŠ',
-'Rank removed redirect'		=>	'Rank removed. Redirecting âŠ',
-'Ranks head'				=>	'Ranks',
-'Add rank subhead'			=>	'Add rank',
-'Add rank info'				=>	'Enter a rank and the minimum number of posts a user must have made to attain the rank. Different ranks cannot have the same value for minimum posts. If a title is set for a user, the title will be displayed instead of any rank.',
-'Ranks enabled'				=>	'<strong>User ranks is enabled in %s.</strong>',
-'Ranks disabled'			=>	'<strong>User ranks is disabled in %s.</strong>',
-'Rank title label'			=>	'Rank title',
-'Minimum posts label'		=>	'Minimum posts',
-'Actions label'				=>	'Actions',
-'Edit remove subhead'		=>	'Edit/remove ranks',
-'No ranks in list'			=>	'No ranks in list',
-
-);
Index: trunk/web/punbb/lang/English/admin_reports.php
===================================================================
--- trunk/web/punbb/lang/English/admin_reports.php	(revision 10)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php
-
-// Language definitions used in admin_reports.php
-$lang_admin_reports = array(
-
-'Report zapped redirect'	=>	'Report marked as read. Redirecting âŠ',
-'New reports head'			=>	'New reports',
-'Deleted user'				=>	'Deleted user',
-'Deleted'					=>	'Deleted',
-'Post ID'					=>	'Post #%s',
-'Report subhead'			=>	'Reported %s',
-'Reported by'				=>	'Reported by %s',
-'Reason'					=>	'Reason',
-'Zap'						=>	'Mark as read',
-'No new reports'			=>	'There are no new reports.',
-'Last 10 head'				=>	'10 last read reports',
-'NA'						=>	'N/A',
-'Zapped subhead'			=>	'Marked as read %s by %s',
-'No zapped reports'			=>	'There are no read reports.',
-
-);
Index: trunk/web/punbb/lang/English/admin_users.php
===================================================================
--- trunk/web/punbb/lang/English/admin_users.php	(revision 10)
+++ 	(revision )
@@ -1,110 +1,0 @@
-<?php
-
-// Language definitions used in admin-users.php
-$lang_admin_users = array(
-
-'Non numeric message'		=>	'You entered a non-numeric value into a numeric only column.',
-'Invalid date time message'	=>	'You entered an invalid date/time.',
-'Not verified'				=>	'Not verified',
-
-// Actions: mass delete/ban etc.
-'No users selected'			=>	'No users selected.',
-'No move admins message'	=>	'For security reasons, you are not allowed to move multiple administrators to another group. If you want to move these administrators, you can do so on their respective user profiles.',
-'No delete admins message'	=>	'Administrators cannot be deleted. In order to delete administrators, you must first move them to a different user group.',
-'No ban admins message'		=>	'Administrators cannot be banned. In order to ban administrators, you must first move them to a different user group.',
-'No ban mods message'		=>	'Moderators cannot be banned. In order to ban moderators, you must first move them to a different user group.',
-'Move users'				=>	'Change user group',
-'Move users subhead'		=>	'Select new user group',
-'New group label'			=>	'New group',
-'New group help'			=>	'Select the group to which the selected users will be moved. For security reasons, it is not possible to move multiple users to the administrator group.',
-'Invalid group message'		=>	'Invalid group ID.',
-'Users move redirect'		=>	'User group changed. Redirecting âŠ',
-'Delete users'				=>	'Delete users',
-'Confirm delete legend'		=>	'Important: read before deleting users',
-'Confirm delete info'		=>	'Please confirm that you want to delete these users.',
-'Delete posts'				=>	'Delete any posts and topics these users have made.',
-'Delete warning'			=>	'Warning! Deleted users and/or posts cannot be restored. If you choose not to delete the posts made by these users, the posts can only be deleted manually at a later time.',
-'Users delete redirect'		=>	'Users deleted. Redirecting âŠ',
-'Ban users'					=>	'Ban users',
-'Message expiry subhead'	=>	'Ban message and expiry',
-'Ban message label'			=>	'Ban message',
-'Ban message help'			=>	'A message that will be displayed to the banned users when they visit the board.',
-'Expire date label'			=>	'Expire date',
-'Expire date help'			=>	'The date when these bans should be automatically removed (format: yyyy-mm-dd). Leave blank to remove manually.',
-'Ban IP label'				=>	'Ban IP addresses',
-'Ban IP help'				=>	'Also ban the IP addresses of the banned users to make registering a new account more difficult for them.',
-'Invalid date message'		=>	'You entered an invalid expire date.',
-'Invalid date reasons'		=>	'The format should be YYYY-MM-DD and the date must be at least one day in the future.',
-'Users banned redirect'		=>	'Users banned. Redirecting âŠ',
-
-'User search head'			=>	'User search',
-'User search subhead'		=>	'Enter search criteria',
-'User search info'			=>	'Search for users in the database. You can enter one or more terms to search for. Wildcards in the form of asterisks (*) are accepted.',
-'Username label'			=>	'Username',
-'E-mail address label'		=>	'Email address',
-'Title label'				=>	'Title',
-'Real name label'			=>	'Real name',
-'Website label'				=>	'Website',
-'Jabber label'				=>	'Jabber',
-'ICQ label'					=>	'ICQ',
-'MSN label'					=>	'MSN Messenger',
-'AOL label'					=>	'AOL IM',
-'Yahoo label'				=>	'Yahoo Messenger',
-'Location label'			=>	'Location',
-'Signature label'			=>	'Signature',
-'Admin note label'			=>	'Admin note',
-'Posts more than label'		=>	'Number of posts greater than',
-'Posts less than label'		=>	'Number of posts less than',
-'Last post after label'		=>	'Last post is after',
-'Date help'					=>	'(yyyy-mm-dd hh:mm:ss)',
-'Last post before label'	=>	'Last post is before',
-'Last visit after label'	=>	'Last visit is after',
-'Last visit before label'	=>	'Last visit is before',
-'Registered after label'	=>	'Registered after',
-'Registered before label'	=>	'Registered before',
-'Order by label'			=>	'Order by',
-'Order by username'			=>	'Username',
-'Order by e-mail'			=>	'Email',
-'Order by posts'			=>	'Number of posts',
-'Order by last post'		=>	'Last post',
-'Order by last visit'		=>	'Last visit',
-'Order by registered'		=>	'Registered',
-'Ascending'					=>	'Ascending',
-'Descending'				=>	'Descending',
-'User group label'			=>	'User group',
-'All groups'				=>	'All groups',
-'Unverified users'			=>	'Unverified users',
-'Submit search'				=>	'Submit search',
-'IP search head'			=>	'IP search',
-'IP search subhead'			=>	'Enter IP to search for',
-'IP address label'			=>	'IP address',
-'IP address help'			=>	'The IP address to search for in the post database.',
-'Find IP address'			=>	'Find IP address',
-
-'Results head'				=>	'Search Results',
-'Results username head'		=>	'Username',
-'Results e-mail head'		=>	'Email',
-'Results title head'		=>	'Title/Status',
-'Results posts head'		=>	'Posts',
-'Results admin note head'	=>	'Admin note',
-'Results actions head'		=>	'Actions',
-'Results IP address head'	=>	'IP address',
-'Results last used head'	=>	'Last used',
-'Results times found head'	=>	'Times found',
-'Results action head'		=>	'Action',
-'Results find more link'	=>	'Find more users for this ip',
-'Results no posts found'	=>	'There are currently no posts by that user in the forum.',
-'Select'					=>	'Select',
-'Select all'				=>	'Select all',
-'Unselect all'				=>	'Unselect all',
-'Ban'						=>	'Ban',
-'Delete'					=>	'Delete',
-'Change group'				=>	'Change group',
-'Bad IP message'			=>	'The supplied IP address is not correctly formatted.',
-'Results view IP link'		=>	'View IP stats',
-'Results show posts link'	=>	'Show posts',
-'Results guest'				=>	'Guest',
-'Results no IP found'		=>	'The supplied IP address could not be found in the database.',
-'No match'					=>	'No match'
-
-);
Index: trunk/web/punbb/lang/English/common.php
===================================================================
--- trunk/web/punbb/lang/English/common.php	(revision 10)
+++ trunk/web/punbb/lang/English/common.php	(revision 1)
@@ -1,163 +1,154 @@
 <?php
 
+/*
+// Determine what locale to use
+switch (PHP_OS)
+{
+	case 'WINNT':
+	case 'WIN32':
+		$locale = 'english';
+		break;
+
+	case 'FreeBSD':
+	case 'NetBSD':
+	case 'OpenBSD':
+		$locale = 'en_US.US-ASCII';
+		break;
+
+	default:
+		$locale = 'en_US';
+		break;
+}
+
+// Attempt to set the locale
+setlocale(LC_CTYPE, $locale);
+*/
+
 // Language definitions for frequently used strings
+
 $lang_common = array(
 
 // Text orientation and encoding
-'lang_direction'					=>	'ltr', // ltr (Left-To-Right) or rtl (Right-To-Left)
-'lang_identifier'					=>	'en',
-
-// Number formatting
-'lang_decimal_point'				=>	'.',
-'lang_thousands_sep'				=>	',',
+'lang_direction'		=>	'ltr',	// ltr (Left-To-Right) or rtl (Right-To-Left)
+'lang_encoding'			=>	'iso-8859-1',
+'lang_multibyte'		=>	false,
 
 // Notices
-'Bad request'						=>	'Bad request. The link you followed is incorrect or outdated.',
-'No view'							=>	'You do not have permission to view these forums.',
-'No permission'						=>	'You do not have permission to access this page.',
-'Bad referrer'						=>	'Bad HTTP_REFERER. You were referred to this page from an unauthorized source. If the problem persists please make sure that \'Base URL\' is correctly set in Admin/Options and that you are visiting the forum by navigating to that URL. More information regarding the referrer check can be found in the FluxBB documentation.',
-'No cookie'							=>	'You appear to have logged in successfully, however a cookie has not been set. Please check your settings and if applicable, enable cookies for this website.',
-'Pun include error'					=>	'Unable to process user include %s from template %s. There is no such file in neither the template directory nor in the user include directory.',
+'Bad request'			=>	'Bad request. The link you followed is incorrect or outdated.',
+'No view'				=>	'You do not have permission to view these forums.',
+'No permission'			=>	'You do not have permission to access this page.',
+'Bad referrer'			=>	'Bad HTTP_REFERER. You were referred to this page from an unauthorized source. If the problem persists please make sure that \'Base URL\' is correctly set in Admin/Options and that you are visiting the forum by navigating to that URL. More information regarding the referrer check can be found in the PunBB documentation.',
+
+// Topic/forum indicators
+'New icon'				=>	'There are new posts',
+'Normal icon'			=>	'<!-- -->',
+'Closed icon'			=>	'This topic is closed',
+'Redirect icon'			=>	'Redirected forum',
 
 // Miscellaneous
-'Announcement'						=>	'Announcement',
-'Options'							=>	'Options',
-'Submit'							=>	'Submit', // "Name" of submit buttons
-'Ban message'						=>	'You are banned from this forum.',
-'Ban message 2'						=>	'The ban expires at the end of',
-'Ban message 3'						=>	'The administrator or moderator that banned you left the following message:',
-'Ban message 4'						=>	'Please direct any inquiries to the forum administrator at',
-'Never'								=>	'Never',
-'Today'								=>	'Today',
-'Yesterday'							=>	'Yesterday',
-'Info'								=>	'Info', // A common table header
-'Go back'							=>	'Go back',
-'Maintenance'						=>	'Maintenance',
-'Redirecting'						=>	'Redirecting',
-'Click redirect'					=>	'Click here if you do not want to wait any longer (or if your browser does not automatically forward you)',
-'on'								=>	'on', // As in "BBCode is on"
-'off'								=>	'off',
-'Invalid email'						=>	'The email address you entered is invalid.',
-'Required'							=>	'(Required)',
-'required field'					=>	'is a required field in this form.', // For javascript form validation
-'Last post'							=>	'Last post',
-'by'								=>	'by', // As in last post by someuser
-'New posts'							=>	'New posts', // The link that leads to the first new post
-'New posts info'					=>	'Go to the first new post in this topic.', // The popup text for new posts links
-'Username'							=>	'Username',
-'Password'							=>	'Password',
-'Email'								=>	'Email',
-'Send email'						=>	'Send email',
-'Moderated by'						=>	'Moderated by',
-'Registered'						=>	'Registered',
-'Subject'							=>	'Subject',
-'Message'							=>	'Message',
-'Topic'								=>	'Topic',
-'Forum'								=>	'Forum',
-'Posts'								=>	'Posts',
-'Replies'							=>	'Replies',
-'Pages'								=>	'Pages:',
-'Page'								=>	'Page %s',
-'BBCode'							=>	'BBCode:', // You probably shouldn't change this
-'img tag'							=>	'[img] tag:',
-'Smilies'							=>	'Smilies:',
-'and'								=>	'and',
-'Image link'						=>	'image', // This is displayed (i.e. <image>) instead of images when "Show images" is disabled in the profile
-'wrote'								=>	'wrote:', // For [quote]'s
-'Mailer'							=>	'%s Mailer', // As in "MyForums Mailer" in the signature of outgoing emails
-'Important information'				=>	'Important information',
-'Write message legend'				=>	'Write your message and submit',
-'Previous'							=>	'Previous',
-'Next'								=>	'Next',
-'Spacer'							=>	'âŠ', // Ellipsis for paginate
+'Announcement'			=>	'Announcement',
+'Options'				=>	'Options',
+'Actions'				=>	'Actions',
+'Submit'				=>	'Submit',	// "name" of submit buttons
+'Ban message'			=>	'You are banned from this forum.',
+'Ban message 2'			=>	'The ban expires at the end of',
+'Ban message 3'			=>	'The administrator or moderator that banned you left the following message:',
+'Ban message 4'			=>	'Please direct any inquiries to the forum administrator at',
+'Never'					=>	'Never',
+'Today'					=>	'Today',
+'Yesterday'				=>	'Yesterday',
+'Info'					=>	'Info',		// a common table header
+'Go back'				=>	'Go back',
+'Maintenance'			=>	'Maintenance',
+'Redirecting'			=>	'Redirecting',
+'Click redirect'		=>	'Click here if you do not want to wait any longer (or if your browser does not automatically forward you)',
+'on'					=>	'on',		// as in "BBCode is on"
+'off'					=>	'off',
+'Invalid e-mail'		=>	'The e-mail address you entered is invalid.',
+'required field'		=>	'is a required field in this form.',	// for javascript form validation
+'Last post'				=>	'Last post',
+'by'					=>	'by',	// as in last post by someuser
+'New posts'				=>	'New&#160;posts',	// the link that leads to the first new post (use &#160; for spaces)
+'New posts info'		=>	'Go to the first new post in this topic.',	// the popup text for new posts links
+'Username'				=>	'Username',
+'Password'				=>	'Password',
+'E-mail'				=>	'E-mail',
+'Send e-mail'			=>	'Send e-mail',
+'Moderated by'			=>	'Moderated by',
+'Registered'			=>	'Registered',
+'Subject'				=>	'Subject',
+'Message'				=>	'Message',
+'Topic'					=>	'Topic',
+'Forum'					=>	'Forum',
+'Posts'					=>	'Posts',
+'Replies'				=>	'Replies',
+'Author'				=>	'Author',
+'Pages'					=>	'Pages',
+'BBCode'				=>	'BBCode',	// You probably shouldn't change this
+'img tag'				=>	'[img] tag',
+'Smilies'				=>	'Smilies',
+'and'					=>	'and',
+'Image link'			=>	'image',	// This is displayed (i.e. <image>) instead of images when "Show images" is disabled in the profile
+'wrote'					=>	'wrote',	// For [quote]'s
+'Code'					=>	'Code',		// For [code]'s
+'Mailer'				=>	'Mailer',	// As in "MyForums Mailer" in the signature of outgoing e-mails
+'Important information'	=>	'Important information',
+'Write message legend'	=>	'Write your message and submit',
 
 // Title
-'Title'								=>	'Title',
-'Member'							=>	'Member', // Default title
-'Moderator'							=>	'Moderator',
-'Administrator'						=>	'Administrator',
-'Banned'							=>	'Banned',
-'Guest'								=>	'Guest',
+'Title'					=>	'Title',
+'Member'				=>	'Member',	// Default title
+'Moderator'				=>	'Moderator',
+'Administrator'			=>	'Administrator',
+'Banned'				=>	'Banned',
+'Guest'					=>	'Guest',
 
 // Stuff for include/parser.php
-'BBCode error no opening tag'		=>	'[/%1$s] was found without a matching [%1$s]',
-'BBCode error invalid nesting'		=>	'[%1$s] was opened within [%2$s], this is not allowed',
-'BBCode error invalid self-nesting'	=>	'[%s] was opened within itself, this is not allowed',
-'BBCode error no closing tag'		=>	'[%1$s] was found without a matching [/%1$s]',
-'BBCode error empty attribute'		=>	'[%s] tag had an empty attribute section',
-'BBCode code problem'				=>	'There is a problem with your [code] tags',
-'BBCode list size error'			=>	'Your list was too long to parse, please make it smaller!',
+'BBCode error'			=>	'The BBCode syntax in the message is incorrect.',
+'BBCode error 1'		=>	'Missing start tag for [/quote].',
+'BBCode error 2'		=>	'Missing end tag for [code].',
+'BBCode error 3'		=>	'Missing start tag for [/code].',
+'BBCode error 4'		=>	'Missing one or more end tags for [quote].',
+'BBCode error 5'		=>	'Missing one or more start tags for [/quote].',
 
 // Stuff for the navigator (top of every page)
-'Index'								=>	'Index',
-'User list'							=>	'User list',
-'Rules'								=>	'Rules',
-'Search'							=>	'Search',
-'Register'							=>	'Register',
-'Login'								=>	'Login',
-'Not logged in'						=>	'You are not logged in.',
-'Profile'							=>	'Profile',
-'Logout'							=>	'Logout',
-'Logged in as'						=>	'Logged in as',
-'Admin'								=>	'Administration',
-'Last visit'						=>	'Last visit: %s',
-'Topic searches'					=>	'Topics:',
-'New posts header'					=>	'New',
-'Active topics'						=>	'Active',
-'Unanswered topics'					=>	'Unanswered',
-'Posted topics'						=>	'Posted',
-'Show new posts'					=>	'Find topics with new posts since your last visit.',
-'Show active topics'				=>	'Find topics with recent posts.',
-'Show unanswered topics'			=>	'Find topics with no replies.',
-'Show posted topics'				=>	'Find topics you have posted to.',
-'Mark all as read'					=>	'Mark all topics as read',
-'Mark forum read'					=>	'Mark this forum as read',
-'Title separator'					=>	' / ',
+'Index'					=>	'Index',
+'User list'				=>	'User list',
+'Rules'					=>  'Rules',
+'Search'				=>  'Search',
+'Register'				=>  'Register',
+'Login'					=>  'Login',
+'Not logged in'			=>  'You are not logged in.',
+'Profile'				=>	'Profile',
+'Logout'				=>	'Logout',
+'Logged in as'			=>	'Logged in as',
+'Admin'					=>	'Administration',
+'Last visit'			=>	'Last visit',
+'Show new posts'		=>	'Show new posts since last visit',
+'Mark all as read'		=>	'Mark all topics as read',
+'Link separator'		=>	'',	// The text that separates links in the navigator
 
 // Stuff for the page footer
-'Board footer'						=>	'Board footer',
-'Jump to'							=>	'Jump to',
-'Go'								=>	' Go ', // Submit button in forum jump
-'Moderate topic'					=>	'Moderate topic',
-'Move topic'						=>	'Move topic',
-'Open topic'						=>	'Open topic',
-'Close topic'						=>	'Close topic',
-'Unstick topic'						=>	'Unstick topic',
-'Stick topic'						=>	'Stick topic',
-'Moderate forum'					=>	'Moderate forum',
-'Powered by'						=>	'Powered by %s',
-
-// Debug information
-'Debug table'						=>	'Debug information',
-'Querytime'							=>	'Generated in %1$s seconds, %2$s queries executed',
-'Memory usage'						=>	'Memory usage: %1$s',
-'Peak usage'						=>	'(Peak: %1$s)',
-'Query times'						=>	'Time (s)',
-'Query'								=>	'Query',
-'Total query time'					=>	'Total query time: %s',
+'Board footer'			=>	'Board footer',
+'Search links'			=>	'Search links',
+'Show recent posts'		=>	'Show recent posts',
+'Show unanswered posts'	=>	'Show unanswered posts',
+'Show your posts'		=>	'Show your posts',
+'Show subscriptions'	=>	'Show your subscribed topics',
+'Jump to'				=>	'Jump to',
+'Go'					=>	' Go ',		// submit button in forum jump
+'Move topic'			=>  'Move topic',
+'Open topic'			=>  'Open topic',
+'Close topic'			=>  'Close topic',
+'Unstick topic'			=>  'Unstick topic',
+'Stick topic'			=>  'Stick topic',
+'Moderate forum'		=>	'Moderate forum',
+'Delete posts'			=>	'Delete multiple posts',
+'Debug table'			=>	'Debug information',
 
 // For extern.php RSS feed
-'RSS description'					=>	'The most recent topics at %s.',
-'RSS description topic'				=>	'The most recent posts in %s.',
-'RSS reply'							=>	'Re: ', // The topic subject will be appended to this string (to signify a reply)
-'RSS active topics feed'			=>	'RSS active topics feed',
-'Atom active topics feed'			=>	'Atom active topics feed',
-'RSS forum feed'					=>	'RSS forum feed',
-'Atom forum feed'					=>	'Atom forum feed',
-'RSS topic feed'					=>	'RSS topic feed',
-'Atom topic feed'					=>	'Atom topic feed',
-
-// Admin related stuff in the header
-'New reports'						=>	'There are new reports',
-'Maintenance mode enabled'			=>	'Maintenance mode is enabled!',
-
-// Units for file sizes
-'Size unit B'						=>	'%s B',
-'Size unit KiB'						=>	'%s KiB',
-'Size unit MiB'						=>	'%s MiB',
-'Size unit GiB'						=>	'%s GiB',
-'Size unit TiB'						=>	'%s TiB',
-'Size unit PiB'						=>	'%s PiB',
-'Size unit EiB'						=>	'%s EiB',
+'RSS Desc Active'		=>	'The most recently active topics at',	// board_title will be appended to this string
+'RSS Desc New'			=>	'The newest topics at',					// board_title will be appended to this string
+'Posted'				=>	'Posted'	// The date/time a topic was started
 
 );
Index: trunk/web/punbb/lang/English/delete.php
===================================================================
--- trunk/web/punbb/lang/English/delete.php	(revision 10)
+++ trunk/web/punbb/lang/English/delete.php	(revision 1)
@@ -5,12 +5,8 @@
 
 'Delete post'			=>	'Delete post',
-'Warning'				=>	'You are about to permanently delete this post.',
-'Topic warning'			=>	'Warning! This is the first post in the topic, the whole topic will be permanently deleted.',
-'Delete info'			=>	'The post you have chosen to delete is set out below for you to review before proceeding.',
-'Reply by'				=>	'Reply by %s - %s',
-'Topic by'				=>	'Topic started by %s - %s',
-'Delete'				=>	'Delete', // The submit button
-'Post del redirect'		=>	'Post deleted. Redirecting âŠ',
-'Topic del redirect'	=>	'Topic deleted. Redirecting âŠ'
+'Warning'				=>	'Warning! If this is the first post in the topic, the whole topic will be deleted.',
+'Delete'				=>	'Delete',	// The submit button
+'Post del redirect'		=>	'Post deleted. Redirection ...',
+'Topic del redirect'	=>	'Topic deleted. Redirection ...'
 
 );
Index: trunk/web/punbb/lang/English/forum.php
===================================================================
--- trunk/web/punbb/lang/English/forum.php	(revision 10)
+++ trunk/web/punbb/lang/English/forum.php	(revision 1)
@@ -6,12 +6,7 @@
 'Post topic'	=>	'Post new topic',
 'Views'			=>	'Views',
-'Moved'			=>	'Moved:',
-'Sticky'		=>	'Sticky:',
-'Closed'		=>	'Closed:',
-'Empty forum'	=>	'Forum is empty.',
-'Mod controls'	=>	'Moderator controls',
-'Is subscribed'	=>	'You are currently subscribed to this forum',
-'Unsubscribe'	=>	'Unsubscribe',
-'Subscribe'		=>	'Subscribe to this forum'
+'Moved'			=>	'Moved',
+'Sticky'		=>	'Sticky',
+'Empty forum'	=>	'Forum is empty.'
 
 );
Index: trunk/web/punbb/lang/English/help.php
===================================================================
--- trunk/web/punbb/lang/English/help.php	(revision 10)
+++ trunk/web/punbb/lang/English/help.php	(revision 1)
@@ -7,5 +7,4 @@
 'produces'				=>	'produces',
 
-'BBCode'				=>	'BBCode',
 'BBCode info 1'			=>	'BBCode is a collection of formatting tags that are used to change the look of text in this forum. BBCode is based on the same principal as, and is very similar to, HTML. Below is a list of all the available BBCodes and instructions on how to use them.',
 'BBCode info 2'			=>	'Administrators have the ability to enable or disable BBCode. You can tell if BBCode is enabled or disabled out in the left margin whenever you post a message or edit your signature.',
@@ -16,23 +15,11 @@
 'Underlined text'		=>	'Underlined text',
 'Italic text'			=>	'Italic text',
-'Strike-through text'	=>	'Strike-through text',
 'Red text'				=>	'Red text',
 'Blue text'				=>	'Blue text',
-'Heading text'			=>	'Heading text',
-'Deleted text'			=>	'Deleted text',
-'Inserted text'			=>	'Inserted text',
-'Emphasised text'		=>	'Emphasised text',
 
 'Links and images'		=>	'Links and images',
-'Links info'			=>	'You can create links to other documents or to email addresses using the following tags:',
-'This help page'		=>	'This help page',
-'My email address'		=>	'My email address',
-'Images info'			=>	'If you want to display an image you can use the img tag. The text appearing after the "=" sign in the opening tag is used for the alt attribute and should be included whenever possible.',
-'FluxBB bbcode test'	=>	'FluxBB bbcode test',
-
-'Test topic'			=>	'Test topic',
-'Test post'				=>	'Test post',
-'Test forum'			=>	'Test forum',
-'Test user'				=>	'Test user',
+'Links info'			=>	'You can create links to other documents or to e-mail addresses using the following tags:',
+'My e-mail address'		=>	'My e-mail address',
+'Images info'			=>	'If you want to display an image you can use the img tag.',
 
 'Quotes'				=>	'Quotes',
@@ -41,5 +28,4 @@
 'Quote text'			=>	'This is the text i want to quote.',
 'produces quote box'	=>	'produces a quote box like this:',
-'quote note'			=>	'Note: If a username contains the characters [ or ] you can enclose it in quote marks.',
 
 'Code'					=>	'Code',
@@ -52,14 +38,4 @@
 'Bold, underlined text'	=>	'Bold, underlined text',
 
-'Lists'					=>	'Lists',
-'List info'				=>	'To create a list you can use the list tag. You can create 3 types of lists using the list tag.',
-'List text 1'			=>	'Example list item 1.',
-'List text 2'			=>	'Example list item 2.',
-'List text 3'			=>	'Example list item 3.',
-'produces list'			=>	'produces a bulleted list.',
-'produces decimal list'	=>	'produces a numbered list.',
-'produces alpha list'	=>	'produces an alphabetically labelled list.',
-
-'Smilies'				=>	'Smilies',
 'Smilies info'			=>	'If you like (and if it is enabled), the forum can convert a series of smilies to images representations of that smiley. This forum recognizes the following smilies and replaces them with images:'
 
Index: trunk/web/punbb/lang/English/index.html
===================================================================
--- trunk/web/punbb/lang/English/index.html	(revision 10)
+++ trunk/web/punbb/lang/English/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/lang/English/index.php
===================================================================
--- trunk/web/punbb/lang/English/index.php	(revision 10)
+++ trunk/web/punbb/lang/English/index.php	(revision 1)
@@ -4,17 +4,18 @@
 $lang_index = array(
 
-'Topics'		=>	'Topics',
-'Link to'		=>	'Link to:', // As in "Link to: http://fluxbb.org/"
-'Empty board'	=>	'Board is empty.',
-'Newest user'	=>	'Newest registered user: %s',
-'Users online'	=>	'Registered users online: %s',
-'Guests online'	=>	'Guests online: %s',
-'No of users'	=>	'Total number of registered users: %s',
-'No of topics'	=>	'Total number of topics: %s',
-'No of posts'	=>	'Total number of posts: %s',
-'Online'		=>	'Online:', // As in "Online: User A, User B etc."
-'Board info'	=>	'Board information',
-'Board stats'	=>	'Board statistics',
-'User info'		=>	'User information'
+'Topics'				=>  'Topics',
+'Moderators'			=>  'Moderators',
+'Link to'				=>	'Link to',	// As in "Link to http://www.punbb.org/"
+'Empty board'			=>	'Board is empty.',
+'Newest user'			=>	'Newest registered user',
+'Users online'			=>	'Registered users online',
+'Guests online'			=>	'Guests online',
+'No of users'			=>	'Total number of registered users',
+'No of topics'			=>	'Total number of topics',
+'No of posts'			=>	'Total number of posts',
+'Online'				=>	'Online',	// As in "Online: User A, User B etc."
+'Board info'			=>	'Board information',
+'Board stats'			=>	'Board statistics',
+'User info'				=>	'User information'
 
 );
Index: trunk/web/punbb/lang/English/install.php
===================================================================
--- trunk/web/punbb/lang/English/install.php	(revision 10)
+++ 	(revision )
@@ -1,120 +1,0 @@
-<?php
-
-// Language definitions used in install.php, localized by adaur
-
-$lang_install = array(
-
-'Install message'				=>	'The file \'config.php\' doesn\'t exist or is corrupt. This implies that FluxBB has not yet been installed.',
-'Choose install language'		=>	'Choose the install script language',
-'Choose install language info'	=>	'The language used for this install script. The default language used for the board itself can be set below.',
-'Install language'				=>	'Install language',
-'Change language'				=>	'Change language',
-'Next'							=>	'Next',
-'Already installed'				=>	'It seems like FluxBB is already installed. You should go <a href="index.php">here</a> instead.',
-'You are running error'			=>	'You are running %1$s version %2$s. FluxBB %3$s requires at least %1$s %4$s to run properly. You must upgrade your %1$s installation before you can continue.',
-'My FluxBB Forum'				=>	'My FluxBB Forum',
-'Description'					=>	'Unfortunately no one can be told what FluxBB is - you have to see it for yourself.',
-'Username 1'					=>	'Usernames must be at least 2 characters long.',
-'Username 2'					=>	'Usernames must not be more than 25 characters long.',
-'Username 3'					=>	'The username guest is reserved.',
-'Username 4'					=>	'Usernames may not be in the form of an IP address.',
-'Username 5'					=>	'Usernames may not contain all the characters \', " and [ or ] at once.',
-'Username 6'					=>	'Usernames may not contain any of the text formatting tags (BBCode) that the forum uses.',
-'Short password'				=>	'Passwords must be at least 4 characters long.',
-'Passwords not match'			=>	'Passwords do not match.',
-'Wrong email'					=>	'The administrator email address you entered is invalid.',
-'No board title'				=>	'You must enter a board title.',
-'Error default language'		=>	'The default language chosen doesn\'t seem to exist.',
-'Error default style'			=>	'The default style chosen doesn\'t seem to exist.',
-'No DB extensions'				=>	'This PHP environment does not have support for any of the databases that FluxBB supports. PHP needs to have support for either MySQL, PostgreSQL or SQLite in order for FluxBB to be installed.',
-'Administrator username'		=>	'Administrator\'s username',
-'Administrator password 1'		=>	'Administrator password 1',
-'Administrator password 2'		=>	'Administrator password 2',
-'Administrator email'			=>	'Administrator\'s email',
-'Board title'					=>	'Board title',
-'Base URL'						=>	'Base URL',
-'Required field'				=>	'is a required field in this form.',
-'FluxBB Installation'			=>	'FluxBB Installation',
-'Welcome'						=>	'You are about to install FluxBB. In order to install FluxBB, you must complete the form set out below. If you encounter any difficulties with the installation, please refer to the documentation.',
-'Install'						=>	'Install FluxBB 1.4',
-'Errors'						=>	'The following errors need to be corrected:',
-'Database setup'				=>	'Database setup',
-'Info 1'						=>	'Please enter the requested information in order to setup your database for FluxBB. You must know all the information asked for before proceeding with the installation.',
-'Select database'				=>	'Select your database type',
-'Info 2'						=>	'FluxBB currently supports MySQL, PostgreSQL and SQLite. If your database of choice is missing from the drop-down menu below, it means this PHP environment does not have support for that particular database. More information regarding support for particular versions of each database can be found in the FAQ.',
-'Dual MySQL'					=>	'FluxBB has detected that your PHP environment supports two different ways of communicating with MySQL. The two options are called standard and improved. If you are uncertain which one to use, start by trying improved and if that fails, try standard.',
-'InnoDB'						=>	'FluxBB has detected that your MySQL server might support <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb.html">InnoDB</a>. This would be a good choice if you are planning to run a large forum. If you are uncertain, it is recommended that you do not use InnoDB.',
-'Database type'					=>	'Database type',
-'Required'						=>	'(Required)',
-'Database hostname'				=>	'Enter your database server hostname',
-'Info 3'						=>	'The address of the database server (example: localhost, db.myhost.com or 192.168.0.15). You can specify a custom port number if your database doesn\'t run on the default port (example: localhost:3580). For SQLite support, just enter anything or leave it at \'localhost\'.',
-'Database server hostname'		=>'Database server hostname',
-'Database enter name'			=>	'Enter the name of your database',
-'Info 4'						=>	'The name of the database that FluxBB will be installed into. The database must exist. For SQLite, this is the relative path to the database file. For security reasons, it is highly recommended to place the SQLite database in a private (not web accessible) directory whenever possible. If the SQLite database file does not exist, FluxBB will attempt to create it.',
-'Database name'					=>	'Database name',
-'Database enter informations'	=>	'Enter your database username and password',
-'Database username'				=>	'Database username',
-'Info 5'						=>	'Enter the username and password with which you connect to the database. Ignore for SQLite.',
-'Database password'				=>	'Database password',
-'Database enter prefix'			=>	'Enter database table prefix',
-'Info 6'						=>	'If you like, you can specify a table prefix. This way you can run multiple copies of FluxBB in the same database (example: foo_).',
-'Table prefix'					=>	'Table prefix',
-'Administration setup'			=>	'Administration setup',
-'Info 7'						=>	'Please enter the requested information in order to setup an administrator for your FluxBB installation.',
-'Admin enter username'			=>	'Enter Administrator\'s username',
-'Info 8'						=>	'The username of the forum administrator. You can later create more administrators and moderators. Usernames can be between 2 and 25 characters long.',
-'Admin enter password'			=>	'Enter and confirm Administrator\'s password',
-'Info 9'						=>	'Passwords must be at least 4 characters long. Passwords are case sensitive.',
-'Password'						=>	'Password',
-'Confirm password'				=>	'Confirm password',
-'Admin enter email'				=>	'Enter Administrator\'s email',
-'Info 10'						=>	'The email address of the forum administrator.',
-'Board setup'					=>	'Board setup',
-'Info 11'						=>	'Please enter the requested information in order to setup your FluxBB board.',
-'Enter board title'				=>	'Enter your board\'s title',
-'Info 12'						=>	'The title of this bulletin board (shown at the top of every page).',
-'Enter board description'		=>	'Enter your board\'s description',
-'Info 13'						=>	'A short description of this bulletin board (shown at the top of every page). This field may contain HTML.',
-'Board description'				=>	'Board description',
-'Enter base URL'				=>	'Enter the Base URL of your FluxBB installation',
-'Info 14'						=>	'The URL (without trailing slash) of your FluxBB forum (example: http://forum.myhost.com or http://myhost.com/~myuser). This <strong>must</strong> be correct, otherwise, administrators and moderators will not be able to submit any forms. Please note that the preset value below is just an educated guess by FluxBB.',
-'Choose the default language'	=>	'Choose the default language',
-'Info 15'						=>	'The default language used for guests and users who haven\'t changed from the default in their profile.',
-'Default language'				=>	'Default language',
-'Choose the default style'		=>	'Choose the default style',
-'Info 16'						=>	'The default style used for guests and users who haven\'t changed from the default in their profile.',
-'Default style'					=>	'Default style',
-'Start install'					=>	'Start install',
-'DB type not valid'				=>	'\'%s\' is not a valid database type',
-'Table prefix error'			=>	'The table prefix \'%s\' contains illegal characters or is too long. The prefix may contain the letters a to z, any numbers and the underscore character. They must however not start with a number. The maximum length is 40 characters. Please choose a different prefix',
-'Prefix reserved'				=>	'The table prefix \'sqlite_\' is reserved for use by the SQLite engine. Please choose a different prefix',
-'Existing table error'			=>	'A table called \'%susers\' is already present in the database \'%s\'. This could mean that FluxBB is already installed or that another piece of software is installed and is occupying one or more of the table names FluxBB requires. If you want to install multiple copies of FluxBB in the same database, you must choose a different table prefix',
-'InnoDB off'					=>	'InnoDB does not seem to be enabled. Please choose a database layer that does not have InnoDB support, or enable InnoDB on your MySQL server',
-'Administrators'				=>	'Administrators',
-'Administrator'					=>	'Administrator',
-'Moderators'					=>	'Moderators',
-'Moderator'						=>	'Moderator',
-'Guests'						=>	'Guests',
-'Guest'							=>	'Guest',
-'New member'					=>	'New member',
-'Members'						=>	'Members',
-'Member'						=>	'Member',
-'Announcement'					=>	'Enter your announcement here.',
-'Rules'							=>	'Enter your rules here',
-'Maintenance message'			=>	'The forums are temporarily down for maintenance. Please try again in a few minutes.',
-'Test post'						=>	'Test post',
-'Message'						=>	'If you are looking at this (which I guess you are), the install of FluxBB appears to have worked! Now log in and head over to the administration control panel to configure your forum.',
-'Test category'					=>	'Test category',
-'Test forum'					=>	'Test forum',
-'This is just a test forum'		=>	'This is just a test forum',
-'Alert cache'					=>	'<strong>The cache directory is currently not writable!</strong> In order for FluxBB to function properly, the directory <em>%s</em> must be writable by PHP. Use chmod to set the appropriate directory permissions. If in doubt, chmod to 0777.',
-'Alert avatar'					=>	'<strong>The avatar directory is currently not writable!</strong> If you want users to be able to upload their own avatar images you must see to it that the directory <em>%s</em> is writable by PHP. You can later choose to save avatar images in a different directory (see Admin/Options). Use chmod to set the appropriate directory permissions. If in doubt, chmod to 0777.',
-'Alert upload'					=>	'<strong>File uploads appear to be disallowed on this server!</strong> If you want users to be able to upload their own avatar images you must enable the file_uploads configuration setting in PHP. Once file uploads have been enabled, avatar uploads can be enabled in Administration/Options/Features.',
-'FluxBB has been installed'		=>	'FluxBB has been installed. To finalize the installation please follow the instructions below.',
-'Final instructions'			=>	'Final instructions',
-'Info 17'						=>	'To finalize the installation, you need to click on the button below to download a file called config.php. You then need to upload this file to the root directory of your FluxBB installation.',
-'Info 18'						=>	'Once you have uploaded config.php, FluxBB will be fully installed! At that point, you may <a href="index.php">go to the forum index</a>.',
-'Download config.php file'		=>	'Download config.php file',
-'FluxBB fully installed'		=>	'FluxBB has been fully installed! You may now <a href="index.php">go to the forum index</a>.',
-
-);
Index: trunk/web/punbb/lang/English/login.php
===================================================================
--- trunk/web/punbb/lang/English/login.php	(revision 10)
+++ trunk/web/punbb/lang/English/login.php	(revision 1)
@@ -1,26 +1,22 @@
 <?php
 
-// Language definitions used in login.php
+// Language definitions used in delete.php
 $lang_login = array(
 
 // Miscellaneous
-'Wrong user/pass'			=>	'Wrong username and/or password.',
-'Forgotten pass'			=>	'Forgotten your password?',
-'Login redirect'			=>	'Logged in successfully. Redirecting âŠ',
-'Logout redirect'			=>	'Logged out. Redirecting âŠ',
-'No email match'			=>	'There is no user registered with the email address',
-'Request pass'				=>	'Request password',
-'Request pass legend'		=>	'Enter the email address with which you registered',
-'Request pass info'			=>	'A new password together with a link to activate the new password will be sent to that address.',
-'Not registered'			=>	'Not registered yet?',
-'Login legend'				=>	'Enter your username and password below',
-'Remember me'				=>	'Log me in automatically each time I visit.',
-'Login info'				=>	'If you have not registered or have forgotten your password click on the appropriate link below.',
-'New password errors'		=>	'Password request error',
-'New passworderrors info'	=>	'The following error needs to be corrected before a new password can be sent:',
+'Wrong user/pass'		=>	'Wrong username and/or password.',
+'Forgotten pass'		=>	'Forgotten your password?',
+'Login redirect'		=>	'Logged in successfully. Redirection ...',
+'Logout redirect'		=>	'Logged out. Redirection ...',
+'No e-mail match'		=>	'There is no user registered with the e-mail address',
+'Request pass'			=>	'Request password',
+'Request pass legend'	=>	'Enter the e-mail address with which you registered',
+'Request pass info'		=>	'A new password together with a link to activate the new password will be sent to that address.',
+'Not registered'		=>	'Not registered yet?',
+'Login legend'			=>	'Enter your username and password below',
+'Login info'			=>	'If you have not registered or have forgotten your password click on the appropriate link below.',
 
 // Forget password mail stuff
-'Forget mail'				=>	'An email has been sent to the specified address with instructions on how to change your password. If it does not arrive you can contact the forum administrator at',
-'Email flood'				=>	'This account has already requested a password reset in the past hour. Please wait a while before requesting a new password again.'
+'Forget mail'			=>	'An e-mail has been sent to the specified address with instructions on how to change your password. If it does not arrive you can contact the forum administrator at'
 
 );
Index: trunk/web/punbb/lang/English/mail_templates/activate_email.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/activate_email.tpl	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/activate_email.tpl	(revision 1)
@@ -1,12 +1,12 @@
-Subject: Change email address requested
+Subject: Change e-mail address requested
 
 Hello <username>,
 
-You have requested to have a new email address assigned to your account in the discussion forum at <base_url>. If you didn't request this or if you don't want to change your email address you should just ignore this message. Only if you visit the activation page below will your email address be changed. In order for the activation page to work, you must be logged in to the forum.
+You have requested to have a new e-mail address assigned to your account in the discussion forum at <base_url>. If you didn't request this or if you don't want to change your e-mail address you should just ignore this message. Only if you visit the activation page below will your e-mail address be changed. In order for the activation page to work, you must be logged in to the forum.
 
-To change your email address, please visit the following page:
+To change your e-mail address, please visit the following page:
 <activation_url>
 
---
-<board_mailer> Mailer
+-- 
+<board_mailer>
 (Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/activate_password.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/activate_password.tpl	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/activate_password.tpl	(revision 1)
@@ -10,5 +10,5 @@
 <activation_url>
 
---
-<board_mailer> Mailer
+-- 
+<board_mailer>
 (Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/banned_email_change.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/banned_email_change.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Alert - Banned email detected
-
-User '<username>' changed to banned email address: <email>
-
-User profile: <profile_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/banned_email_post.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/banned_email_post.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Alert - Banned email detected
-
-User '<username>' posted with banned email address: <email>
-
-Post URL: <post_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/banned_email_register.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/banned_email_register.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Alert - Banned email detected
-
-User '<username>' registered with banned email address: <email>
-
-User profile: <profile_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/dupe_email_change.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/dupe_email_change.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Alert - Duplicate email detected
-
-User '<username>' changed to an email address that also belongs to: <dupe_list>
-
-User profile: <profile_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/dupe_email_register.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/dupe_email_register.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Alert - Duplicate email detected
-
-User '<username>' registered with an email address that also belongs to: <dupe_list>
-
-User profile: <profile_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/form_email.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/form_email.tpl	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/form_email.tpl	(revision 1)
@@ -1,5 +1,5 @@
 Subject: <mail_subject>
 
-<sender> from <board_title> has sent you a message. You can reply to <sender> by replying to this email.
+<sender> from <board_title> has sent you a message. You can reply to <sender> by replying to this e-mail.
 
 The message reads as follows:
@@ -10,4 +10,4 @@
 -----------------------------------------------------------------------
 
---
-<board_mailer> Mailer
+-- 
+<board_mailer>
Index: trunk/web/punbb/lang/English/mail_templates/index.html
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/index.html	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/lang/English/mail_templates/new_reply.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/new_reply.tpl	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/new_reply.tpl	(revision 1)
@@ -1,5 +1,5 @@
-Subject: Reply to topic: '<topic_subject>'
+Subject: Reply to topic: <topic_subject>
 
-<replier> has replied to the topic '<topic_subject>' to which you are subscribed. There may be more new replies, but this is the only notification you will receive until you visit the board again.
+<replier> has replied to the topic <topic_subject> to which you are subscribed. There may be more new replies, but this is the only notification you will receive until you visit the board again.
 
 The post is located at <post_url>
@@ -7,5 +7,5 @@
 You can unsubscribe by going to <unsubscribe_url>
 
---
-<board_mailer> Mailer
+-- 
+<board_mailer>
 (Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/new_reply_full.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/new_reply_full.tpl	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/new_reply_full.tpl	(revision 1)
@@ -1,5 +1,5 @@
-Subject: Reply to topic: '<topic_subject>'
+Subject: Reply to topic: <topic_subject>
 
-<replier> has replied to the topic '<topic_subject>' to which you are subscribed. There may be more new replies, but this is the only notification you will receive until you visit the board again.
+<replier> has replied to the topic <topic_subject> to which you are subscribed. There may be more new replies, but this is the only notification you will receive until you visit the board again.
 
 The message reads as follows:
@@ -14,5 +14,5 @@
 You can unsubscribe by going to <unsubscribe_url>
 
---
-<board_mailer> Mailer
+-- 
+<board_mailer>
 (Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/new_report.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/new_report.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Report(<forum_id>) - '<topic_subject>'
-
-User '<username>' has reported the following message: <post_url>
-
-Reason: <reason>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/new_topic.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/new_topic.tpl	(revision 10)
+++ 	(revision )
@@ -1,11 +1,0 @@
-Subject: New topic in forum: '<forum_name>'
-
-<poster> has posted a new topic '<topic_subject>' in the forum '<forum_name>', to which you are subscribed.
-
-The topic is located at <topic_url>
-
-You can unsubscribe by going to <unsubscribe_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/new_topic_full.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/new_topic_full.tpl	(revision 10)
+++ 	(revision )
@@ -1,18 +1,0 @@
-Subject: New topic in forum: '<forum_name>'
-
-<poster> has posted a new topic '<topic_subject>' in the forum '<forum_name>', to which you are subscribed.
-
-The message reads as follows:
------------------------------------------------------------------------
-
-<message>
-
------------------------------------------------------------------------
-
-The topic is located at <topic_url>
-
-You can unsubscribe by going to <unsubscribe_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/new_user.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/new_user.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Alert - New registration
-
-User '<username>' registered in the forums at <base_url>
-
-User profile: <profile_url>
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/rename.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/rename.tpl	(revision 10)
+++ 	(revision )
@@ -1,12 +1,0 @@
-Subject: User account renamed
-
-During an upgrade to the forums at <base_url> it was determined your username is too similar to an existing user. Your username has been changed accordingly.
-
-Old username: <old_username>
-New username: <new_username>
-
-We apologise for any inconvenience caused.
-
---
-<board_mailer> Mailer
-(Do not reply to this message)
Index: trunk/web/punbb/lang/English/mail_templates/welcome.tpl
===================================================================
--- trunk/web/punbb/lang/English/mail_templates/welcome.tpl	(revision 10)
+++ trunk/web/punbb/lang/English/mail_templates/welcome.tpl	(revision 1)
@@ -9,4 +9,4 @@
 
 --
-<board_mailer> Mailer
+<board_mailer>
 (Do not reply to this message)
Index: trunk/web/punbb/lang/English/misc.php
===================================================================
--- trunk/web/punbb/lang/English/misc.php	(revision 10)
+++ trunk/web/punbb/lang/English/misc.php	(revision 1)
@@ -4,90 +4,64 @@
 $lang_misc = array(
 
-'Mark read redirect'			=>	'All topics and forums have been marked as read. Redirecting âŠ',
-'Mark forum read redirect'		=>	'All topics in the specified forum have been marked as read. Redirecting âŠ',
+'Mark read redirect'		=>	'All topics and forums have been marked as read. Redirection ...',
 
-// Send email
-'Form email disabled'			=>	'The user you are trying to send an email to has disabled form email.',
-'No email subject'				=>	'You must enter a subject.',
-'No email message'				=>	'You must enter a message.',
-'Too long email message'		=>	'Messages cannot be longer than 65535 characters (64 KB).',
-'Email flood'					=>	'At least %s seconds have to pass between sent emails. Please wait a while and try sending again.',
-'Email sent redirect'			=>	'Email sent. Redirecting âŠ',
-'Send email to'					=>	'Send email to',
-'Email subject'					=>	'Subject',
-'Email message'					=>	'Message',
-'Email disclosure note'			=>	'Please note that by using this form, your email address will be disclosed to the recipient.',
-'Write email'					=>	'Write and submit your email message',
+// Send e-mail
+'Form e-mail disabled'		=>	'The user you are trying to send an e-mail to has disabled form e-mail.',
+'No e-mail subject'			=>	'You must enter a subject.',
+'No e-mail message'			=>	'You must enter a message.',
+'Too long e-mail message'	=>	'Messages cannot be longer than 65535 characters (64 KB).',
+'E-mail sent redirect'		=>	'E-mail sent. Redirection ...',
+'Send e-mail to'			=>	'Send e-mail to',
+'E-mail subject'			=>	'Subject',
+'E-mail message'			=>	'Message',
+'E-mail disclosure note'	=>	'Please note that by using this form, your e-mail address will be disclosed to the recipient.',
+'Write e-mail'				=>	'Write and submit your e-mail message',
 
 // Report
-'No reason'						=>	'You must enter a reason.',
-'Reason too long'				=>	'Your message must be under 65535 bytes (~64kb).',
-'Report flood'					=>	'At least %s seconds have to pass between reports. Please wait a while and try sending again.',
-'Report redirect'				=>	'Post reported. Redirecting âŠ',
-'Report post'					=>	'Report post',
-'Reason'						=>	'Reason',
-'Reason desc'					=>	'Please enter a short reason why you are reporting this post',
+'No reason'					=>	'You must enter a reason.',
+'Report redirect'			=>	'Post reported. Redirection ...',
+'Report post'				=>	'Report post',
+'Reason'					=>	'Reason',
+'Reason desc'				=>	'Please enter a short reason why you are reporting this post',
 
 // Subscriptions
-'Already subscribed topic'		=>	'You are already subscribed to this topic.',
-'Already subscribed forum'		=>	'You are already subscribed to this forum.',
-'Subscribe redirect'			=>	'Your subscription has been added. Redirecting âŠ',
-'Not subscribed topic'			=>	'You are not subscribed to this topic.',
-'Not subscribed forum'			=>	'You are not subscribed to this forum.',
-'Unsubscribe redirect'			=>	'Your subscription has been removed. Redirecting âŠ',
+'Already subscribed'		=>	'You are already subscribed to this topic.',
+'Subscribe redirect'		=>	'Your subscription has been added. Redirection ...',
+'Not subscribed'			=>	'You are not subscribed to this topic.',
+'Unsubscribe redirect'		=>	'Your subscription has been removed. Redirection ...',
 
 // General forum and topic moderation
-'Moderate'						=>	'Moderate',
-'Select'						=>	'Select', // the header of a column of checkboxes
-'Move'							=>	'Move',
-'Split'							=>	'Split',
-'Delete'						=>	'Delete',
-'Merge'							=>	'Merge',
+'Moderate'					=>	'Moderate',
+'Select'					=>	'Select',	// the header of a column of checkboxes
+'Move'						=>	'Move',
+'Delete'					=>	'Delete',
 
 // Moderate forum
-'Open'							=>	'Open',
-'Close'							=>	'Close',
-'Move topic'					=>	'Move topic',
-'Move topics'					=>	'Move topics',
-'Move legend'					=>	'Select destination of move',
-'Move to'						=>	'Move to',
-'Nowhere to move'				=>	'There are no forums into which you can move topics.',
-'Leave redirect'				=>	'Leave redirect topic(s)',
-'Move topic redirect'			=>	'Topic moved. Redirecting âŠ',
-'Move topics redirect'			=>	'Topics moved. Redirecting âŠ',
-'Confirm delete legend'			=>	'Please confirm deletion',
-'Delete topics'					=>	'Delete topics',
-'Delete topics comply'			=>	'Are you sure you want to delete the selected topics?',
-'Delete topics redirect'		=>	'Topics deleted. Redirecting âŠ',
-'Open topic redirect'			=>	'Topic opened. Redirecting âŠ',
-'Open topics redirect'			=>	'Topics opened. Redirecting âŠ',
-'Close topic redirect'			=>	'Topic closed. Redirecting âŠ',
-'Close topics redirect'			=>	'Topics closed. Redirecting âŠ',
-'No topics selected'			=>	'You must select at least one topic for move/delete/open/close.',
-'Not enough topics selected'	=>	'You must select at least two topics for merge.',
-'Stick topic redirect'			=>	'Topic sticked. Redirecting âŠ',
-'Unstick topic redirect'		=>	'Topic unsticked. Redirecting âŠ',
-'Merge topics'					=>	'Merge topics',
-'Merge topics redirect'			=>	'Topics merged. Redirecting âŠ',
-'Confirm merge legend'			=>	'Please confirm merge',
-'New subject'					=>	'New subject',
-
-// Split multiple posts in topic
-'Confirm split legend'			=>	'Please confirm split of selected posts and select destination of move.',
-'Split posts'					=>	'Split posts',
-'Split posts comply'			=>	'Are you sure you want to split the selected posts?',
-'Split posts redirect'			=>	'Posts have been split. Redirecting âŠ',
+'Open'						=>	'Open',
+'Close'						=>	'Close',
+'Move topic'				=>	'Move topic',
+'Move topics'				=>	'Move topics',
+'Move legend'				=>	'Select destination of move',
+'Move to'					=>	'Move to',
+'Leave redirect'			=>	'Leave redirect topic(s)',
+'Move topic redirect'		=>	'Topic moved. Redirection ...',
+'Move topics redirect'		=>	'Topics moved. Redirection ...',
+'Confirm delete legend'		=>	'Please confirm deletion',
+'Delete topics'				=>	'Delete topics',
+'Delete topics comply'		=>	'Are you sure you want to delete the selected topics?',
+'Delete topics redirect'	=>	'Topics deleted. Redirection ...',
+'Open topic redirect'		=>	'Topic opened. Redirection ...',
+'Open topics redirect'		=>	'Topics opened. Redirection ...',
+'Close topic redirect'		=>	'Topic closed. Redirection ...',
+'Close topics redirect'		=>	'Topics closed. Redirection ...',
+'No topics selected'		=>	'You must select at least one topic for move/delete/open/close.',
+'Stick topic redirect'		=>	'Topic sticked. Redirection ...',
+'Unstick topic redirect'	=>	'Topic unsticked. Redirection ...',
 
 // Delete multiple posts in topic
-'Delete posts'					=>	'Delete posts',
-'Cannot select first'			=>	'First post cannot be selected for split/delete.',
-'Delete posts comply'			=>	'Are you sure you want to delete the selected posts?',
-'Delete posts redirect'			=>	'Posts deleted. Redirecting âŠ',
-'No posts selected'				=>	'You must select at least one post for split/delete.',
-
-// Get host
-'Host info 1'					=>	'The IP address is: %s',
-'Host info 2'					=>	'The host name is: %s',
-'Show more users'				=>	'Show more users for this IP',
+'Delete posts'				=>	'Delete posts',
+'Delete posts comply'		=>	'Are you sure you want to delete the selected posts?',
+'Delete posts redirect'		=>	'Posts deleted. Redirection ...',
+'No posts selected'			=>	'You must select at least one post to be deleted.'
 
 );
Index: trunk/web/punbb/lang/English/post.php
===================================================================
--- trunk/web/punbb/lang/English/post.php	(revision 10)
+++ trunk/web/punbb/lang/English/post.php	(revision 1)
@@ -5,35 +5,29 @@
 
 // Post validation stuff (many are similiar to those in edit.php)
-'No subject'		=>	'Topics must contain a subject.',
-'No subject after censoring'	=>	'Topics must contain a subject. After applying censoring filters, your subject was empty.',
-'Too long subject'	=>	'Subjects cannot be longer than 70 characters.',
-'No message'		=>	'You must enter a message.',
-'No message after censoring'	=>	'You must enter a message. After applying censoring filters, your message was empty.',
-'Too long message'	=>	'Posts cannot be longer that %s bytes.',
-'All caps subject'	=>	'Subjects cannot contain only capital letters.',
-'All caps message'	=>	'Posts cannot contain only capital letters.',
-'Empty after strip'	=>	'It seems your post consisted of empty BBCodes only. It is possible that this happened because e.g. the innermost quote was discarded because of the maximum quote depth level.',
+'No subject'			=>	'Topics must contain a subject.',
+'Too long subject'		=>	'Subjects cannot be longer than 70 characters.',
+'No message'			=>	'You must enter a message.',
+'Too long message'		=>	'Posts cannot be longer that 65535 characters (64 KB).',
 
 // Posting
-'Post errors'		=>	'Post errors',
-'Post errors info'	=>	'The following errors need to be corrected before the message can be posted:',
-'Post preview'		=>	'Post preview',
-'Guest name'		=>	'Name', // For guests (instead of Username)
-'Post redirect'		=>	'Post entered. Redirecting âŠ',
-'Post a reply'		=>	'Post a reply',
-'Post new topic'	=>	'Post new topic',
-'Hide smilies'		=>	'Never show smilies as icons for this post',
-'Subscribe'			=>	'Subscribe to this topic',
-'Stay subscribed'	=>	'Stay subscribed to this topic',
-'Topic review'		=>	'Topic review (newest first)',
-'Flood start'		=>	'At least',
-'flood end'			=>	'seconds have to pass between posts. Please wait a little while and try posting again.',
-'Preview'			=>	'Preview', // submit button to preview message
+'Post errors'			=>	'Post errors',
+'Post errors info'		=>	'The following errors need to be corrected before the message can be posted:',
+'Post preview'			=>	'Post preview',
+'Guest name'			=>	'Name',	// For guests (instead of Username)
+'Post redirect'			=>	'Post entered. Redirection ...',
+'Post a reply'			=>	'Post a reply',
+'Post new topic'		=>	'Post new topic',
+'Hide smilies'			=>	'Never show smilies as icons for this post',
+'Subscribe'				=>	'Subscribe to this topic',
+'Topic review'			=>	'Topic review (newest first)',
+'Flood start'			=>	'At least',
+'flood end'				=>	'seconds have to pass between posts. Please wait a little while and try posting again.',
+'Preview'				=>	'Preview',	// submit button to preview message
 
 // Edit post
-'Edit post legend'	=>	'Edit the post and submit changes',
-'Silent edit'		=>	'Silent edit (don\'t display "Edited by ..." in topic view)',
-'Edit post'			=>	'Edit post',
-'Edit redirect'		=>	'Post updated. Redirecting âŠ'
+'Edit post legend'		=>	'Edit the post and submit changes',
+'Silent edit'			=>	'Silent edit (don\'t display "Edited by ..." in topic view)',
+'Edit post'				=>	'Edit post',
+'Edit redirect'			=>	'Post updated. Redirection ...'
 
 );
Index: trunk/web/punbb/lang/English/prof_reg.php
===================================================================
--- trunk/web/punbb/lang/English/prof_reg.php	(revision 10)
+++ trunk/web/punbb/lang/English/prof_reg.php	(revision 1)
@@ -4,76 +4,36 @@
 $lang_prof_reg = array(
 
-'Email legend'				=>	'Enter a valid email address',
-'Email legend 2'			=>	'Enter and confirm a valid email address',
+'E-mail legend'				=>	'Enter a valid e-mail address',
+'E-mail legend 2'			=>	'Enter and confirm a valid e-mail address',
 'Localisation legend'		=>	'Set your localisation options',
-'Time zone'					=>	'Time zone',
-'Time zone info'			=>	'For the forum to display times correctly you must select your local time zone. If Daylight Savings Time is in effect you should also check the option provided which will advance times by 1 hour.',
-'DST'						=>	'Daylight Savings Time is in effect (advance time by 1 hour).',
-'Time format'				=>	'Time format',
-'Date format'				=>	'Date format',
-'Default'					=>	'Default',
+'Timezone'					=>	'Timezone',
+'Timezone info'				=>	'For the forum to display times correctly you must select your local timezone.',
 'Language'					=>	'Language',
-'Email setting info'		=>	'Select whether you want your email address to be viewable to other users or not and if you want other users to be able to send you email via the forum (form email) or not.',
-'Email setting 1'			=>	'Display your email address.',
-'Email setting 2'			=>	'Hide your email address but allow form email.',
-'Email setting 3'			=>	'Hide your email address and disallow form email.',
+'Language info'				=>	'You can choose which language you wish to use to view the forum.',
+'E-mail setting info'		=>	'Select whether you want your e-mail address to be viewable to other users or not and if you want other users to be able to send you e-mail via the forum (form e-mail) or not.',
+'E-mail setting 1'			=>	'Display your e-mail address.',
+'E-mail setting 2'			=>	'Hide your e-mail address but allow form e-mail.',
+'E-mail setting 3'			=>	'Hide your e-mail address and disallow form e-mail.',
 'Privacy options legend'	=>	'Set your privacy options',
+'Save user/pass'			=>	'Save username and password between visits.',
+'Save user/pass info'		=>	'This option sets whether the forum should "remember" you between visits. If enabled, you will not have to login every time you visit the forum. You will be logged in automatically. Recommended.',
 'Confirm pass'				=>	'Confirm password',
 
 'Username too short'		=>	'Usernames must be at least 2 characters long. Please choose another (longer) username.',
-'Username too long'			=>	'Usernames must not be more than 25 characters long. Please choose another (shorter) username.',
 'Username guest'			=>	'The username guest is reserved. Please choose another username.',
 'Username IP'				=>	'Usernames may not be in the form of an IP address. Please choose another username.',
 'Username reserved chars'	=>	'Usernames may not contain all the characters \', " and [ or ] at once. Please choose another username.',
 'Username BBCode'			=>	'Usernames may not contain any of the text formatting tags (BBCode) that the forum uses. Please choose another username.',
-'Banned username'			=>	'The username you entered is banned in this forum. Please choose another username.',
+'Dupe username'				=>	'Someone else has already registered with that username. Please choose another username.',
 'Pass too short'			=>	'Passwords must be at least 4 characters long. Please choose another (longer) password.',
-'Pass not match'			=>	'Passwords do not match.',
-'Banned email'				=>	'The email address you entered is banned in this forum. Please choose another email address.',
-'Dupe email'				=>	'Someone else is already registered with that email address. Please choose another email address.',
-'Sig too long'				=>	'Signatures cannot be longer than %1$s characters. Please reduce your signature by %2$s characters.',
-'Sig too many lines'		=>	'Signatures cannot have more than %s lines.',
-'Bad ICQ'					=>	'You entered an invalid ICQ UIN. Please go back and correct.',
-
-'UTC-12:00'					=>	'(UTC-12:00) International Date Line West',
-'UTC-11:00'					=>	'(UTC-11:00) Niue, Samoa',
-'UTC-10:00'					=>	'(UTC-10:00) Hawaii-Aleutian, Cook Island',
-'UTC-09:30'					=>	'(UTC-09:30) Marquesas Islands',
-'UTC-09:00'					=>	'(UTC-09:00) Alaska, Gambier Island',
-'UTC-08:30'					=>	'(UTC-08:30) Pitcairn Islands',
-'UTC-08:00'					=>	'(UTC-08:00) Pacific',
-'UTC-07:00'					=>	'(UTC-07:00) Mountain',
-'UTC-06:00'					=>	'(UTC-06:00) Central',
-'UTC-05:00'					=>	'(UTC-05:00) Eastern',
-'UTC-04:00'					=>	'(UTC-04:00) Atlantic',
-'UTC-03:30'					=>	'(UTC-03:30) Newfoundland',
-'UTC-03:00'					=>	'(UTC-03:00) Amazon, Central Greenland',
-'UTC-02:00'					=>	'(UTC-02:00) Mid-Atlantic',
-'UTC-01:00'					=>	'(UTC-01:00) Azores, Cape Verde, Eastern Greenland',
-'UTC'						=>	'(UTC) Western European, Greenwich',
-'UTC+01:00'					=>	'(UTC+01:00) Central European, West African',
-'UTC+02:00'					=>	'(UTC+02:00) Eastern European, Central African',
-'UTC+03:00'					=>	'(UTC+03:00) Moscow, Eastern African',
-'UTC+03:30'					=>	'(UTC+03:30) Iran',
-'UTC+04:00'					=>	'(UTC+04:00) Gulf, Samara',
-'UTC+04:30'					=>	'(UTC+04:30) Afghanistan',
-'UTC+05:00'					=>	'(UTC+05:00) Pakistan, Yekaterinburg',
-'UTC+05:30'					=>	'(UTC+05:30) India, Sri Lanka',
-'UTC+05:45'					=>	'(UTC+05:45) Nepal',
-'UTC+06:00'					=>	'(UTC+06:00) Bangladesh, Bhutan, Novosibirsk',
-'UTC+06:30'					=>	'(UTC+06:30) Cocos Islands, Myanmar',
-'UTC+07:00'					=>	'(UTC+07:00) Indochina, Krasnoyarsk',
-'UTC+08:00'					=>	'(UTC+08:00) Greater China, Australian Western, Irkutsk',
-'UTC+08:45'					=>	'(UTC+08:45) Southeastern Western Australia',
-'UTC+09:00'					=>	'(UTC+09:00) Japan, Korea, Chita',
-'UTC+09:30'					=>	'(UTC+09:30) Australian Central',
-'UTC+10:00'					=>	'(UTC+10:00) Australian Eastern, Vladivostok',
-'UTC+10:30'					=>	'(UTC+10:30) Lord Howe',
-'UTC+11:00'					=>	'(UTC+11:00) Solomon Island, Magadan',
-'UTC+11:30'					=>	'(UTC+11:30) Norfolk Island',
-'UTC+12:00'					=>	'(UTC+12:00) New Zealand, Fiji, Kamchatka',
-'UTC+12:45'					=>	'(UTC+12:45) Chatham Islands',
-'UTC+13:00'					=>	'(UTC+13:00) Tonga, Phoenix Islands',
-'UTC+14:00'					=>	'(UTC+14:00) Line Islands'
+'Pass not match'			=>	'Passwords do not match. Please go back and correct.',
+'Banned e-mail'				=>	'The e-mail address you entered is banned in this forum. Please choose another e-mail address.',
+'Dupe e-mail'				=>	'Someone else is already registered with that e-mail address. Please choose another e-mail address.',
+'Sig too long'				=>	'Signatures cannot be longer than',
+'characters'				=>	'characters',
+'Sig too many lines'		=>	'Signatures cannot have more than',
+'lines'						=>	'lines',
+'Signature quote/code'		=>	'The quote and code BBCodes are not allowed in signatures. Please go back and correct.',
+'Bad ICQ'					=>	'You entered an invalid ICQ UIN. Please go back and correct.'
 
 );
Index: trunk/web/punbb/lang/English/profile.php
===================================================================
--- trunk/web/punbb/lang/English/profile.php	(revision 10)
+++ trunk/web/punbb/lang/English/profile.php	(revision 1)
@@ -5,137 +5,140 @@
 
 // Navigation and sections
-'Profile menu'					=>	'Profile menu',
-'Section essentials'			=>	'Essentials',
-'Section personal'				=>	'Personal',
-'Section messaging'				=>	'Messaging',
-'Section personality'			=>	'Personality',
-'Section display'				=>	'Display',
-'Section privacy'				=>	'Privacy',
-'Section admin'					=>	'Administration',
+'Profile menu'				=>	'Profile menu',
+'Section essentials'		=>	'Essentials',
+'Section personal'			=>	'Personal',
+'Section messaging'			=>	'Messaging',
+'Section personality'		=>	'Personality',
+'Section display'			=>	'Display',
+'Section privacy'			=>	'Privacy',
+'Section admin'				=>	'Administration',
 
 // Miscellaneous
-'Username and pass legend'		=>	'Enter your username and password',
-'Personal details legend'		=>	'Enter your personal details',
-'Contact details legend'		=>	'Enter your messaging details',
-'User activity'					=>	'User activity',
-'Paginate info'					=>	'Enter the number of topics and posts you wish to view on each page.',
+'Username and pass legend'	=>	'Enter your username and password',
+'Personal details legend'	=>	'Enter your personal details',
+'Contact details legend'	=>	'Enter your messaging details',
+'Options display'			=>	'Set your display options',
+'Options post'				=>	'Set your post viewing options',
+'User activity'				=>	'User activity',
+'Paginate info'				=>	'Enter the number of topics and posts you wish to view on each page.',
 
 // Password stuff
-'Pass key bad'					=>	'The specified password activation key was incorrect or has expired. Please re-request a new password. If that fails, contact the forum administrator at',
-'Pass updated'					=>	'Your password has been updated. You can now login with your new password.',
-'Pass updated redirect'			=>	'Password updated. Redirecting âŠ',
-'Wrong pass'					=>	'Wrong old password.',
-'Change pass'					=>	'Change password',
-'Change pass legend'			=>	'Enter and confirm your new password',
-'Old pass'						=>	'Old password',
-'New pass'						=>	'New password',
-'Confirm new pass'				=>	'Confirm new password',
-'Pass info'						=>	'Passwords must be at least 4 characters long. Passwords are case sensitive.',
+'Pass key bad'				=>	'The specified password activation key was incorrect or has expired. Please re-request a new password. If that fails, contact the forum administrator at',
+'Pass updated'				=>	'Your password has been updated. You can now login with your new password.',
+'Pass updated redirect'		=>	'Password updated. Redirection ...',
+'Wrong pass'				=>	'Wrong old password.',
+'Change pass'				=>	'Change password',
+'Change pass legend'		=>	'Enter and confirm your new password',
+'Old pass'					=>	'Old password',
+'New pass'					=>	'New password',
+'Confirm new pass'			=>	'Confirm new password',
 
-// Email stuff
-'Email key bad'					=>	'The specified email activation key was incorrect or has expired. Please re-request change of email address. If that fails, contact the forum administrator at',
-'Email updated'					=>	'Your email address has been updated.',
-'Activate email sent'			=>	'An email has been sent to the specified address with instructions on how to activate the new email address. If it doesn\'t arrive you can contact the forum administrator at',
-'Email legend'					=>	'Enter your new email address',
-'Email instructions'			=>	'An email will be sent to your new address with an activation link. You must click the link in the email you receive to activate the new address.',
-'Change email'					=>	'Change email address',
-'New email'						=>	'New email',
+// E-mail stuff
+'E-mail key bad'			=>	'The specified e-mail activation key was incorrect or has expired. Please re-request change of e-mail address. If that fails, contact the forum administrator at',
+'E-mail updated'			=>	'Your e-mail address has been updated.',
+'Activate e-mail sent'		=>	'An email has been sent to the specified address with instructions on how to activate the new e-mail address. If it doesn\'t arrive you can contact the forum administrator at',
+'E-mail legend'				=>	'Enter your new e-mail address',
+'E-mail instructions'		=>	'An e-mail will be sent to your new address with an activation link. You must click the link in the e-mail you receive to activate the new address.',
+'Change e-mail'				=>	'Change e-mail address',
+'New e-mail'				=>	'New e-mail',
 
 // Avatar upload stuff
-'Avatars disabled'				=>	'The administrator has disabled avatar support.',
-'Too large ini'					=>	'The selected file was too large to upload. The server didn\'t allow the upload.',
-'Partial upload'				=>	'The selected file was only partially uploaded. Please try again.',
-'No tmp directory'				=>	'PHP was unable to save the uploaded file to a temporary location.',
-'No file'						=>	'You did not select a file for upload.',
-'Bad type'						=>	'The file you tried to upload is not of an allowed type. Allowed types are gif, jpeg and png.',
-'Too wide or high'				=>	'The file you tried to upload is wider and/or higher than the maximum allowed',
-'Too large'						=>	'The file you tried to upload is larger than the maximum allowed',
-'pixels'						=>	'pixels',
-'bytes'							=>	'bytes',
-'Move failed'					=>	'The server was unable to save the uploaded file. Please contact the forum administrator at',
-'Unknown failure'				=>	'An unknown error occurred. Please try again.',
-'Avatar upload redirect'		=>	'Avatar uploaded. Redirecting âŠ',
-'Avatar deleted redirect'		=>	'Avatar deleted. Redirecting âŠ',
-'Avatar desc'					=>	'An avatar is a small image that will be displayed under your username in your posts. It must not be any bigger than',
-'Upload avatar'					=>	'Upload avatar',
-'Upload avatar legend'			=>	'Enter an avatar file to upload',
-'Delete avatar'					=>	'Delete avatar', // only for admins
-'File'							=>	'File',
-'Upload'						=>	'Upload', // submit button
+'Avatars disabled'			=>	'The administrator has disabled avatar support.',
+'Too large ini'				=>	'The selected file was too large to upload. The server didn\'t allow the upload.',
+'Partial upload'			=>	'The selected file was only partially uploaded. Please try again.',
+'No tmp directory'			=>	'PHP was unable to save the uploaded file to a temporary location.',
+'No file'					=>	'You did not select a file for upload.',
+'Bad type'					=>	'The file you tried to upload is not of an allowed type. Allowed types are gif, jpeg and png.',
+'Too wide or high'			=>	'The file you tried to upload is wider and/or higher than the maximum allowed',
+'Too large'					=>	'The file you tried to upload is larger than the maximum allowed',
+'pixels'					=>	'pixels',
+'bytes'						=>	'bytes',
+'Move failed'				=>	'The server was unable to save the uploaded file. Please contact the forum administrator at',
+'Unknown failure'			=>	'An unknown error occurred. Please try again.',
+'Avatar upload redirect'	=>	'Avatar uploaded. Redirection ...',
+'Avatar deleted redirect'	=>	'Avatar deleted. Redirection ...',
+'Avatar desc'				=>	'An avatar is a small image that will be displayed under your username in your posts. It must not be any bigger than',
+'Upload avatar'				=>	'Upload avatar',
+'Upload avatar legend'		=>	'Enter an avatar file to upload',
+'Delete avatar'				=>	'Delete avatar',	// only for admins
+'File'						=>	'File',
+'Upload'					=>	'Upload',	// submit button
 
 // Form validation stuff
-'Forbidden title'				=>	'The title you entered contains a forbidden word. You must choose a different title.',
-'Profile redirect'				=>	'Profile updated. Redirecting âŠ',
+'Dupe username'				=>	'Someone else has already registered with that username. Please go back and try a different username.',
+'Forbidden title'			=>	'The title you entered contains a forbidden word. You must choose a different title.',
+'Profile redirect'			=>	'Profile updated. Redirection ...',
 
 // Profile display stuff
-'Users profile'					=>	'%s\'s profile',
-'Username info'					=>	'Username: %s',
-'Email info'					=>	'Email: %s',
-'Posts info'					=>	'Posts: %s',
-'Registered info'				=>	'Registered: %s',
-'Last post info'				=>	'Last post: %s',
-'Last visit info'				=>	'Last visit: %s',
-'Show posts'					=>	'Show all posts',
-'Show topics'					=>	'Show all topics',
-'Show subscriptions'			=>	'Show all subscriptions',
-'Realname'						=>	'Real name',
-'Location'						=>	'Location',
-'Website'						=>	'Website',
-'Invalid website URL'					=>	'The website URL you entered is invalid.',
-'Jabber'						=>	'Jabber',
-'ICQ'							=>	'ICQ',
-'MSN'							=>	'MSN Messenger',
-'AOL IM'						=>	'AOL IM',
-'Yahoo'							=>	'Yahoo! Messenger',
-'Avatar'						=>	'Avatar',
-'Signature'						=>	'Signature',
-'Sig max size'					=>	'Max length: %s characters / Max lines: %s',
-'Avatar legend'					=>	'Set your avatar display options',
-'Avatar info'					=>	'An avatar is a small image that will be displayed with all your posts. You can upload an avatar by clicking the link below.',
-'Change avatar'					=>	'Change avatar',
-'Signature legend'				=>	'Compose your signature',
-'Signature info'				=>	'A signature is a small piece of text that is attached to your posts. In it, you can enter just about anything you like. Perhaps you would like to enter your favourite quote or your star sign. It\'s up to you! In your signature you can use BBCode if it is allowed in this particular forum. You can see the features that are allowed/enabled listed below whenever you edit your signature.',
-'Sig preview'					=>	'Current signature preview:',
-'No sig'						=>	'No signature currently stored in profile.',
-'Signature quote/code/list/h'	=>	'The quote, code, list, and heading BBCodes are not allowed in signatures.',
-'Topics per page'				=>	'Topics',
-'Posts per page'				=>	'Posts',
-'Leave blank'					=>	'Leave blank to use forum default.',
-'Subscription legend'			=>	'Set your subscription options',
-'Notify full'					=>	'Include a plain text version of new posts in subscription notification emails.',
-'Auto notify full'				=>	'Automatically subscribe to every topic you post in.',
-'Show smilies'					=>	'Show smilies as graphic icons.',
-'Show images'					=>	'Show images in posts.',
-'Show images sigs'				=>	'Show images in user signatures.',
-'Show avatars'					=>	'Show user avatars in posts.',
-'Show sigs'						=>	'Show user signatures.',
-'Style legend'					=>	'Select your preferred style',
-'Styles'						=>	'Styles',
-'Admin note'					=>	'Admin note',
-'Pagination legend'				=>	'Enter your pagination options',
-'Post display legend'			=>	'Set your options for viewing posts',
-'Post display info'				=>	'If you are on a slow connection, disabling these options, particularly showing images in posts and signatures, will make pages load faster.',
-'Instructions'					=>	'When you update your profile, you will be redirected back to this page.',
+'Not activated'				=>	'This user hasn\'t activated his/her account yet. The account is activated when he/she logs in the first time.',
+'Unknown'					=>	'(Unknown)',	// This is displayed when a user hasn't filled out profile field (e.g. Location)
+'Private'					=>	'(Private)',	// This is displayed when a user does not want to receive e-mails
+'No avatar'					=>	'(No avatar)',
+'Show posts'				=>	'Show all posts',
+'Realname'					=>	'Real name',
+'Location'					=>	'Location',
+'Website'					=>	'Website',
+'Jabber'					=>	'Jabber',
+'ICQ'						=>	'ICQ',
+'MSN'						=>	'MSN Messenger',
+'AOL IM'					=>	'AOL IM',
+'Yahoo'						=>	'Yahoo! Messenger',
+'Avatar'					=>	'Avatar',
+'Signature'					=>	'Signature',
+'Sig max length'			=>	'Max length',
+'Sig max lines'				=>	'Max lines',
+'Avatar legend'				=>	'Set your avatar display options',
+'Avatar info'				=>	'An avatar is a small image that will be displayed with all your posts. You can upload an avatar by clicking the link below. The checkbox \'Use avatar\' below must be checked in order for the avatar to be visible in your posts.',
+'Change avatar'				=>	'Change avatar',
+'Use avatar'				=>	'Use avatar.',
+'Signature legend'			=>	'Compose your signature',
+'Signature info'			=>	'A signature is a small piece of text that is attached to your posts. In it, you can enter just about anything you like. Perhaps you would like to enter your favourite quote or your star sign. It\'s up to you! In your signature you can use BBCode if it is allowed in this particular forum. You can see the features that are allowed/enabled listed below whenever you edit your signature.',
+'Sig preview'				=>	'Current signature preview:',
+'No sig'					=>	'No signature currently stored in profile.',
+'Topics per page'			=>	'Topics',
+'Topics per page info'		=>	'This setting controls how many topics are displayed per page when you view a forum. If you are uncertain about what to use, you can just leave it blank and the forum default will be used.',
+'Posts per page'			=>	'Posts',
+'Posts per page info'		=>	'This setting controls how many posts are displayed per page when you view a topic. If you are uncertain about what to use, you can just leave it blank and the forum default will be used.',
+'Leave blank'				=>	'Leave blank to use forum default.',
+'Notify full'				=>	'Include post in subscription e-mails.',
+'Notify full info'			=>	'With this enabled, a plain text version of the new post will be included in subscription notification e-mails.',
+'Show smilies'				=>	'Show smilies as graphic icons',
+'Show smilies info'			=>	'If you enable this option, small images will be displayed instead of text smilies.',
+'Show images'				=>	'Show images in posts.',
+'Show images info'			=>	'Disable this if you don\'t want to see images in posts (i.e. images displayed with the [img]-tag).',
+'Show images sigs'			=>	'Show images in user signatures.',
+'Show images sigs info'		=>	'Disable this if you don\'t want to see images in signatures (i.e. images displayed with the [img]-tag).',
+'Show avatars'				=>	'Show user avatars in posts.',
+'Show avatars info'			=>	'This option toggles whether user avatar images will be displayed in posts or not.',
+'Show sigs'					=>	'Show user signatures.',
+'Show sigs info'			=>	'Enable if you would like to see user signatures.',
+'Style legend'				=>	'Select your preferred style',
+'Style info'				=>	'If you like you can use a different visual style for this forum.',
+'Admin note'				=>	'Admin note',
+'Pagination legend'			=>	'Enter your pagination options',
+'Post display legend'		=>	'Set your options for viewing posts',
+'Post display info'			=>	'If you are on a slow connection, disabling these options, particularly showing images in posts and signatures, will make pages load faster.',
+'Instructions'				=>	'When you update your profile, you will be redirected back to this page.',
 
 // Administration stuff
-'Group membership legend'		=>	'Choose user group',
-'Save'							=>	'Save',
-'Set mods legend'				=>	'Set moderator access',
-'Moderator in info'				=>	'Choose which forums this user should be allowed to moderate. Note: This only applies to moderators. Administrators always have full permissions in all forums.',
-'Update forums'					=>	'Update forums',
-'Delete ban legend'				=>	'Delete (administrators only) or ban user',
-'Delete user'					=>	'Delete user',
-'Ban user'						=>	'Ban user',
-'Confirm delete legend'			=>	'Important: read before deleting user',
-'Confirm delete user'			=>	'Confirm delete user',
-'Confirmation info'				=>	'Please confirm that you want to delete the user', // the username will be appended to this string
-'Delete warning'				=>	'Warning! Deleted users and/or posts cannot be restored. If you choose not to delete the posts made by this user, the posts can only be deleted manually at a later time.',
-'Delete posts'					=>	'Delete any posts and topics this user has made.',
-'Delete'						=>	'Delete', // submit button (confirm user delete)
-'User delete redirect'			=>	'User deleted. Redirecting âŠ',
-'Group membership redirect'		=>	'Group membership saved. Redirecting âŠ',
-'Update forums redirect'		=>	'Forum moderator rights updated. Redirecting âŠ',
-'Ban redirect'					=>	'Redirecting âŠ',
-'No delete admin message'		=>	'Administrators cannot be deleted. In order to delete this user, you must first move him/her to a different user group.',
+'Group membership legend'	=>	'Choose user group',
+'Save'						=>	'Save',
+'Set mods legend'			=>	'Set moderator access',
+'Moderator in'				=>	'Moderator in',
+'Moderator in info'			=>	'Choose what forums this user should be allowed to moderate. Note: This only applies to moderators. Administrators always have full permissions in all forums.',
+'Update forums'				=>	'Update forums',
+'Delete ban legend'			=>	'Delete (administrators only) or ban user',
+'Delete user'				=>	'Delete user',
+'Ban user'					=>	'Ban user',
+'Confirm delete legend'		=>	'Important: read before deleting user',
+'Confirm delete user'		=>	'Confirm delete user',
+'Confirmation info'			=>	'Please confirm that you want to delete the user',	// the username will be appended to this string
+'Delete warning'			=>	'Warning! Deleted users and/or posts cannot be restored. If you choose not to delete the posts made by this user, the posts can only be deleted manually at a later time.',
+'Delete posts'				=>	'Delete any posts and topics this user has made.',
+'Delete'					=>	'Delete',		// submit button (confirm user delete)
+'User delete redirect'		=>	'User deleted. Redirection ...',
+'Group membership redirect'	=>	'Group membership saved. Redirection ...',
+'Update forums redirect'	=>	'Forum moderator rights updated. Redirection ...',
+'Ban redirect'				=>	'Redirection ...'
 
 );
Index: trunk/web/punbb/lang/English/register.php
===================================================================
--- trunk/web/punbb/lang/English/register.php	(revision 10)
+++ trunk/web/punbb/lang/English/register.php	(revision 1)
@@ -6,8 +6,7 @@
 // Miscellaneous
 'No new regs'				=>	'This forum is not accepting new registrations.',
-'Reg cancel redirect'		=>	'Registration cancelled. Redirecting âŠ',
+'Reg cancel redirect'		=>	'Registration cancelled. Redirection ...',
 'Forum rules'				=>	'Forum rules',
 'Rules legend'				=>	'You must agree to the following in order to register',
-'Registration flood'		=>	'A new user was registered with the same IP address as you within the last hour. To prevent registration flooding, at least an hour has to pass between registrations from the same IP. Sorry for the inconvenience.',
 'Agree'						=>	'Agree',
 'Cancel'					=>	'Cancel',
@@ -15,14 +14,12 @@
 
 // Form validation stuff (some of these are also used in post.php)
-'Registration errors'		=>	'Registration errors',
-'Registration errors info'	=>	'The following errors need to be corrected before you can register:',
 'Username censor'			=>	'The username you entered contains one or more censored words. Please choose a different username.',
 'Username dupe 1'			=>	'Someone is already registered with the username',
 'Username dupe 2'			=>	'The username you entered is too similar. The username must differ from that by at least one alphanumerical character (a-z or 0-9). Please choose a different username.',
-'Email not match'			=>	'Email addresses do not match.',
+'E-mail not match'			=>	'E-mail addresses do not match. Please go back and correct.',
 
-// Registration email stuff
-'Reg email'					=>	'Thank you for registering. Your password has been sent to the specified address. If it doesn\'t arrive you can contact the forum administrator at',
-'Reg complete'				=>	'Registration complete. Logging in and redirecting âŠ',
+// Registration e-mail stuff
+'Reg e-mail'				=>	'Thank you for registering. Your password has been sent to the specified address. If it doesn\'t arrive you can contact the forum administrator at',
+'Reg complete'				=>	'Registration complete. Logging in and Redirection ...',
 
 // Register info
@@ -30,8 +27,9 @@
 'Desc 2'					=>	'Below is a form you must fill out in order to register. Once you are registered you should visit your profile and review the different settings you can change. The fields below only make up a small part of all the settings you can alter in your profile.',
 'Username legend'			=>	'Please enter a username between 2 and 25 characters long',
-'Pass legend'				=>	'Please enter and confirm your chosen password',
-'Pass info'					=>	'Passwords must be at least 4 characters long. Passwords are case sensitive.',
-'Email info'				=>	'You must enter a valid email address as your randomly generated password will be sent to that address.',
-'Confirm email'				=>	'Confirm email address',
+'Pass legend 1'				=>	'Please enter and confirm your chosen password',
+'Pass legend 2'				=>	'Please read the instructions below',
+'Pass info'					=>	'Passwords can be between 4 and 16 characters long. Passwords are case sensitive.',
+'E-mail info'				=>	'You must enter a valid e-mail address as your randomly generated password will be sent to that address.',
+'Confirm e-mail'			=>	'Confirm e-mail address',
 
 );
Index: trunk/web/punbb/lang/English/search.php
===================================================================
--- trunk/web/punbb/lang/English/search.php	(revision 10)
+++ trunk/web/punbb/lang/English/search.php	(revision 1)
@@ -5,61 +5,43 @@
 
 // The search form
-'User search'						=>	'User search',
-'No search permission'				=>	'You do not have permission to use the search feature.',
-'Search flood'						=>	'At least %s seconds have to pass between searches. Please wait a while and try searching again.',
-'Search'							=>	'Search',
-'Search criteria legend'			=>	'Enter your search criteria',
-'Search info'						=>	'To search by keyword, enter a term or terms to search for. Separate terms with spaces. Use AND, OR and NOT to refine your search. To search by author enter the username of the author whose posts you wish to search for. Use wildcard character * for partial matches.',
-'Keyword search'					=>	'Keyword search',
-'Author search'						=>	'Author search',
-'Search in legend'					=>	'Select where to search',
-'Search in info'					=>	'Choose in which forum you would like to search and if you want to search in topic subjects, message text or both.',
-'Search multiple forums info'		=>	'If no forums are selected, all forums will be searched.',
-'Forum search'						=>	'Forum',
-'All forums'						=>	'All forums',
-'Search in'							=>	'Search in',
-'Message and subject'				=>	'Message text and topic subject',
-'Message only'						=>	'Message text only',
-'Topic only'						=>	'Topic subject only',
-'Sort by'							=>	'Sort by',
-'Sort order'						=>	'Sort order',
-'Search results legend'				=>	'Select how to view search results',
-'Search results info'				=>	'You can choose how you wish to sort and show your results.',
-'Sort by post time'					=>	'Post time',
-'Sort by author'					=>	'Author',
-'Sort by subject'					=>	'Subject',
-'Sort by forum'						=>	'Forum',
-'Ascending'							=>	'Ascending',
-'Descending'						=>	'Descending',
-'Show as'							=>	'Show results as',
-'Show as topics'					=>	'Topics',
-'Show as posts'						=>	'Posts',
+'User search'				=>	'User search',
+'No search permission'		=>	'You do not have permission to use the search feature.',
+'Search'					=>	'Search',
+'Search criteria legend'	=>	'Enter your search criteria',
+'Search info'				=>	'To search by keyword, enter a term or terms to search for. Separate terms with spaces. Use AND, OR and NOT to refine your search. To search by author enter the username of the author whose posts you wish to search for. Use wildcard character * for partial matches.',
+'Keyword search'			=>	'Keyword search',
+'Author search'				=>	'Author search',
+'Search in legend'			=>	'Select where to search',
+'Search in info'			=>	'Choose in which forum you would like to search and if you want to search in topic subjects, message text or both.',
+'Forum search'				=>	'Forum',
+'All forums'				=>	'All forums',
+'Search in'					=>	'Search in',
+'Message and subject'		=>	'Message text and topic subject',
+'Message only'				=>	'Message text only',
+'Topic only'				=>	'Topic subject only',
+'Sort by'					=>	'Sort by',
+'Sort order'				=>	'Sort order',
+'Search results legend'		=>	'Select how to view search results',
+'Search results info'		=>	'You can choose how you wish to sort and show your results.',
+'Sort by post time'			=>	'Post time',
+'Sort by author'			=>	'Author',
+'Sort by subject'			=>	'Subject',
+'Sort by forum'				=>	'Forum',
+'Ascending'					=>	'Ascending',
+'Descending'				=>	'Descending',
+'Show as'					=>	'Show results as',
+'Show as topics'			=>	'Topics',
+'Show as posts'				=>	'Posts',
 
 // Results
-'Search'							=>	'Search',
-'Search results'					=>	'Search results',
-'Quick search show_new'				=>	'New',
-'Quick search show_recent'			=>	'Active',
-'Quick search show_unanswered'		=>	'Unanswered',
-'Quick search show_replies'			=>	'Posted',
-'Quick search show_user_topics'		=>	'Topics by %s',
-'Quick search show_user_posts'		=>	'Posts by %s',
-'Quick search show_subscriptions'	=>	'Subscribed by %s',
-'By keywords show as topics'		=>	'Topics with posts containing \'%s\'',
-'By keywords show as posts'			=>	'Posts containing \'%s\'',
-'By user show as topics'			=>	'Topics with posts by %s',
-'By user show as posts'				=>	'Posts by %s',
-'By both show as topics'			=>	'Topics with posts containing \'%s\', by %s',
-'By both show as posts'				=>	'Posts containing \'%s\', by %s',
-'No terms'							=>	'You have to enter at least one keyword and/or an author to search for.',
-'No hits'							=>	'Your search returned no hits.',
-'No user posts'						=>	'There are no posts by this user in this forum.',
-'No user topics'					=>	'There are no topics by this user in this forum.',
-'No subscriptions'					=>	'This user is currently not subscribed to any topics.',
-'No new posts'						=>	'There are no topics with new posts since your last visit.',
-'No recent posts'					=>	'No new posts have been made within the last 24 hours.',
-'No unanswered'						=>	'There are no unanswered posts in this forum.',
-'Go to post'						=>	'Go to post',
-'Go to topic'						=>	'Go to topic'
+'Search results'			=>	'Search results',
+'No terms'					=>	'You have to enter at least one keyword and/or an author to search for.',
+'No hits'					=>	'Your search returned no hits.',
+'No user posts'				=>	'There are no posts by this user in this forum.',
+'No subscriptions'			=>	'You are currently not subscribed to any topics.',
+'No new posts'				=>	'There are no topics with new posts since your last visit.',
+'No recent posts'			=>	'No new posts have been made within the last 24 hours.',
+'No unanswered'				=>	'There are no unanswered posts in this forum.',
+'Go to post'				=>	'Go to post'
 
 );
Index: trunk/web/punbb/lang/English/stopwords.txt
===================================================================
--- trunk/web/punbb/lang/English/stopwords.txt	(revision 10)
+++ trunk/web/punbb/lang/English/stopwords.txt	(revision 1)
@@ -11,5 +11,4 @@
 are
 arent
-aren't
 around
 ask
@@ -22,17 +21,12 @@
 can
 cant
-can't
 come
 could
 couldnt
-couldn't
 did
 didnt
-didn't
 does
 doesnt
-doesn't
 dont
-don't
 each
 either
@@ -53,5 +47,4 @@
 have
 havent
-haven't
 having
 her
@@ -62,15 +55,8 @@
 how
 ill
-i'll
-i'm
 into
 isnt
-isn't
-itll
-it'll
 its
-it's
 ive
-i've
 just
 know
@@ -97,5 +83,4 @@
 our
 ours
-our's
 out
 over
@@ -118,5 +103,4 @@
 that
 thats
-that's
 the
 their
@@ -164,12 +148,3 @@
 you
 your
-youre
-you're
 yours
-http
-https
-ftp
-www
-com
-net
-org
Index: trunk/web/punbb/lang/English/topic.php
===================================================================
--- trunk/web/punbb/lang/English/topic.php	(revision 10)
+++ trunk/web/punbb/lang/English/topic.php	(revision 1)
@@ -6,10 +6,6 @@
 'Post reply'		=>	'Post reply',
 'Topic closed'		=>	'Topic closed',
-'From'				=>	'From:', // User location
-'IP address logged'	=>	'IP address logged',
-'Note'				=>	'Note:', // Admin note
-'Posts'				=>	'Posts:',
-'Registered'		=>	'Registered:',
-'Replies'			=>	'Replies:',
+'From'				=>	'From',				// User location
+'Note'				=>	'Note',				// Admin note
 'Website'			=>	'Website',
 'Guest'				=>	'Guest',
@@ -25,8 +21,7 @@
 'Subscribe'			=>	'Subscribe to this topic',
 'Quick post'		=>	'Quick post',
-'Mod controls'		=>	'Moderator controls',
-'New icon'			=>	'New post',
-'Re'				=>	'Re:',
-'Preview'			=>	'Preview'
+
+'Link separator'	=>	' | ',	// The text that separates links in posts (website, e-mail, report, edit etc.)
+'Mod controls'		=>	'Moderator controls'
 
 );
Index: trunk/web/punbb/lang/English/update.php
===================================================================
--- trunk/web/punbb/lang/English/update.php	(revision 10)
+++ 	(revision )
@@ -1,76 +1,0 @@
-<?php
-
-// Language definitions used in db_update.php
-
-$lang_update = array(
-
-'Update'						=>	'Update FluxBB',
-'Update message'				=>	'Your FluxBB database is out-of-date and must be upgraded in order to continue. If you are the board administrator, please follow the instructions below to complete the upgrade.',
-'Note'							=>	'Note:',
-'Members message'				=>	'This process is for board administators only. If you are a member there is nothing to worry about - the forums will be back shortly!',
-'Administrator only'			=>	'This step is for the board administrator only!',
-'Database password info'		=>	'To perform the database update please enter the database password with which FluxBB was installed. If you cannot remember, this is stored in your \'config.php\' file.',
-'Database password note'		=>	'If you are running SQLite (and hence have no database password) please use the database file name instead. This must exactly match the database file name given in your configuration file.',
-'Database password'				=>	'Database password',
-'Maintenance'					=>	'Maintenance',
-'Maintenance message info'		=>	'The message that will be displayed to users during the updating process. This text will not be parsed like regular posts and thus may contain HTML.',
-'Maintenance message'		    =>	'Maintenance message',
-'Next'							=>	'Next',
-
-'You are running error'			=>	'You are running %1$s version %2$s. FluxBB %3$s requires at least %1$s %4$s to run properly. You must upgrade your %1$s installation before you can continue.',
-'Version mismatch error'		=>	'Version mismatch. The database \'%s\' doesn\'t seem to be running a FluxBB database schema supported by this update script.',
-'Invalid file error'			=>	'Invalid database file name. When using SQLite the database file name must be entered exactly as it appears in your \'%s\'',
-'Invalid password error'		=>	'Invalid database password. To upgrade FluxBB you must enter your database password exactly as it appears in your \'%s\'',
-'No password error'				=>	'No database password provided',
-'Script runs error'				=>	'It appears the update script is already being ran by someone else. If this is not the case, please manually delete the file \'%s\' and try again',
-'No update error'				=>	'Your forum is already as up-to-date as this script can make it',
-
-'Intro 1'						=>	'This script will update your forum database. The update procedure might take anything from a second to hours depending on the speed of the server and the size of the forum database. Don\'t forget to make a backup of the database before continuing.',
-'Intro 2'						=>	'Did you read the update instructions in the documentation? If not, start there.',
-'No charset conversion'			=>	'<strong>IMPORTANT!</strong> FluxBB has detected that this PHP environment does not have support for the encoding mechanisms required to do UTF-8 conversion from character sets other than ISO-8859-1. What this means is that if the current character set is not ISO-8859-1, FluxBB won\'t be able to convert your forum database to UTF-8 and you will have to do it manually. Instructions for doing manual charset conversion can be found in the update instructions.',
-'Enable conversion'				=>	'<strong>Enable conversion:</strong> When enabled this update script will, after it has made the required structural changes to the database, convert all text in the database from the current character set to UTF-8. This conversion is required if you\'re upgrading from version 1.2.',
-'Current character set'			=>	'<strong>Current character set:</strong> If the primary language in your forum is English, you can leave this at the default value. However, if your forum is non-English, you should enter the character set of the primary language pack used in the forum. <em>Getting this wrong can corrupt your database so don\'t just guess!</em> Note: This is required even if the old database is UTF-8.',
-'Charset conversion'			=>	'Charset conversion',
-'Enable conversion label'		=>	'<strong>Enable conversion</strong> (perform database charset conversion).',
-'Current character set label'	=>	'Current character set',
-'Current character set info'	=>	'Accept default for English forums otherwise the character set of the primary language pack.',
-'Start update'					=>	'Start update',
-'Error converting users'		=>	'Error converting users',
-'Error info 1'					=>	'There was an error converting some users. This can occur when converting from FluxBB v1.2 if multiple users have registered with very similar usernames, for example "bob" and "bÃ¶b".',
-'Error info 2'					=>	'Below is a list of users who failed to convert. Please choose a new username for each user. Users who are renamed will automatically be sent an email alerting them of the change.',
-'New username'					=>	'New username',
-'Required'						=>	'(Required)',
-'Correct errors'				=>	'The following errors need to be corrected:',
-'Rename users'					=>	'Rename users',
-'Successfully updated'			=>	'Your forum database was successfully updated. You may now %s.',
-'go to index'					=>	'go to the forum index',
-
-'Unable to lock error'			=>	'Unable to write update lock. Please make sure PHP has write access to the directory \'%s\' and no-one else is currently running the update script.',
-
-'Converting'					=>	'Converting %s âŠ',
-'Converting item'				=>	'Converting %1$s %2$s âŠ',
-'Preparsing item'				=>	'Preparsing %1$s %2$s âŠ',
-'Rebuilding index item'			=>	'Rebuilding index for %1$s %2$s',
-
-'ban'							=>	'ban',
-'categories'					=>	'categories',
-'censor words'					=>	'censor words',
-'configuration'					=>	'configuration',
-'forums'						=>	'forums',
-'groups'						=>	'groups',
-'post'							=>	'post',
-'ranks'							=>	'ranks',
-'report'						=>	'report',
-'topic'							=>	'topic',
-'user'							=>	'user',
-'signature'						=>	'signature',
-
-'Username too short error'		=>	'Usernames must be at least 2 characters long. Please choose another (longer) username.',
-'Username too long error'		=>	'Usernames must not be more than 25 characters long. Please choose another (shorter) username.',
-'Username Guest reserved error'	=>	'The username guest is reserved. Please choose another username.',
-'Username IP format error'		=>	'Usernames may not be in the form of an IP address. Please choose another username.',
-'Username bad characters error'	=>	'Usernames may not contain all the characters \', " and [ or ] at once. Please choose another username.',
-'Username BBCode error'			=>	'Usernames may not contain any of the text formatting tags (BBCode) that the forum uses. Please choose another username.',
-'Username duplicate error'		=>	'Someone is already registered with the username %s. The username you entered is too similar. The username must differ from that by at least one alphanumerical character (a-z or 0-9). Please choose a different username.',
-
-);
Index: trunk/web/punbb/lang/English/userlist.php
===================================================================
--- trunk/web/punbb/lang/English/userlist.php	(revision 10)
+++ trunk/web/punbb/lang/English/userlist.php	(revision 1)
@@ -4,10 +4,9 @@
 $lang_ul = array(
 
-'User find legend'	=>	'Find and sort users',
-'User search info'	=>	'Enter a username to search for and/or a user group to filter by. The username field can be left blank. Use the wildcard character * for partial matches.',
-'User sort info'	=>	'Sort users by name, date registered or number of posts and in ascending/descending order.',
-'User group'		=>	'User group',
-'No of posts'		=>	'Number of posts',
-'All users'			=>	'All'
+'User find legend'		=>	'Find and sort users',
+'User search info'		=>	'Enter a username to search for and/or a user group to filter by. The username field can be left blank. Use the wildcard character * for partial matches. Sort users by name, date registered or number of posts and in ascending/descending order.',
+'User group'			=>	'User group',
+'No of posts'			=>	'No. of posts',
+'All users'				=>	'All'
 
 );
Index: trunk/web/punbb/lang/French/admin_bans.php
===================================================================
--- trunk/web/punbb/lang/French/admin_bans.php	(revision 10)
+++ 	(revision )
@@ -1,67 +1,0 @@
-<?php
-
-// Language definitions used in admin_bans.php
-$lang_admin_bans = array(
-
-'No user message'			=>	'Aucun utilisateur enregistrÃ© sous ce nom d\'utilisateur. Si vous souhaitez ajouter un bannissement n\'Ã©tant pas associÃ© Ã  un nom d\'utilisateur veuillez laisser le champ du nom d\'utilisateur vide.',
-'No user ID message'			=>	'Aucun utilisateur inscrit avec cet ID.',
-'User is admin message'			=>	'L\'utilisateur %s est un administrateur et ne peut Ãªtre banni. Si vous souhaitez bannir un administrateur, vous devez d\'abord le destituer de ce rang.',
-'User is mod message'                   =>      'L\'utilisateur %s est un modÃ©rateur et ne peut Ãªtre banni. Si vous souhaitez bannir un modÃ©rateur, vous devez d\'abord le destituer de ce rang.',
-'Must enter message'			=>	'Vous devez indiquer, au minimum, soit un nom d\'utilisateur, soit une adresse IP, soit une adresse Ã©lectronique.',
-'Cannot ban guest message'		=>	'Un visiteur ne peut Ãªtre banni.',
-'Invalid IP message'			=>	'Vous avez indiquÃ© une IP/plage d\'IP invalide.',
-'Invalid e-mail message'		=>	'L\'adresse Ã©lectronique (ex. : utilisateur@domaine.com) ou le nom de domaine d\'adresse Ã©lectronique (ex. : domaine.com) que vous avez indiquÃ© est invalide.',
-'Invalid date message'			=>	'Vous avez indiquÃ© une date d\'expiration invalide.',
-'Invalid date reasons'			=>	'Le format devrait Ãªtre du type YYYY-MM-DD et la date doit Ãªtre ultÃ©rieure Ã  la date d\'aujourd\'hui.',
-'Ban added redirect'			=>	'Bannissement ajoutÃ©. Redirection&#160;âŠ' ,
-'Ban edited redirect'			=>	'Bannissement modifiÃ©. Redirection&#160;âŠ',
-'Ban removed redirect'			=>	'Bannissement supprimÃ©. Redirection&#160;âŠ',
-
-'New ban head'				=>	'Nouveau bannissement',
-'Add ban subhead'			=>	'Ajouter le bannissement',
-'Username label'			=>	'Nom d\'utilisateur',
-'Username help'				=>	'Le nom d\'utilisateur Ã  bannir (insensible Ã  la casse).',
-'Username advanced help'		=>	'Le nom d\'utilisateur Ã  bannir (insensible Ã  la casse). La page suivante vous permettra d\'indiquer une IP et un e-mail personnalisÃ©s. Si vous ne souhaitez bannir qu\'une IP/plage d\'IP ou un e-mail, veuillez laisser ce champ vide.',
-
-'Ban search head'			=>	'Recherche de bannissements',
-'Ban search subhead'			=>	'Indiquer les critÃšres de recherche',
-'Ban search info'			=>	'Recherche de bannissements dans la base de donnÃ©es. Vous pouvez indiquer un ou plusieurs termes Ã  retrouver. Les jokers sous formes d\'astÃ©risques (*) sont acceptÃ©s. Pour afficher tous les bannissements, laisser tous les champs vides.',
-'Date help'				=>	'(yyyy-mm-dd)',
-'Message label'				=>	'Message',
-'Expire after label'			=>	'Expire aprÃšs',
-'Expire before label'			=>	'Expire avant',
-'Order by label'			=>	'Trier par',
-'Order by username'			=>	'Nom d\'utilisateur',
-'Order by ip'			        =>	'IP',
-'Order by e-mail'			=>	'E-mail',
-'Order by expire'			=>	'Date d\'expiration',
-'Ascending'				=>	'Ascendant',
-'Descending'				=>	'Descendant',
-'Submit search'				=>	'Lancer la recherche',
-
-'E-mail label'				=>	'E-mail',
-'E-mail help'				=>	'L\'e-mail ou le domaine d\'e-mail que vous souhaitez bannir (ex. : utilisateur@domaine.com ou domaine.com). Rendez-vous Ã  Â«&#160;Autoriser les adresses Ã©lectroniques bannies&#160;Â» dans la rubrique Permissions pour davantage d\'informations.',
-'IP label'				=>	'Adresse IP/plages d\'adresses IP',
-'IP help'				=>	'L\'adresse IP ou la plage d\'adresses IP que vous souhaitez bannir (ex. : 150.11.110.1 ou 150.11.110). SÃ©parez les adresses par des espaces. Si une IP est dÃ©jÃ  indiquÃ©e, il s\'agit de la derniÃšre adresse IP connue de cet utilisateur enregistrÃ©e dans la base de donnÃ©es.',
-'IP help link'				=>	'Cliquez sur %s pour afficher les statistiques IP de cet utilisateur.',
-'Ban advanced head'			=>	'ParamÃštres de bannissement avancÃ©s',
-'Ban advanced subhead'			=>	'Ajouter IP et e-mail pour complÃ©ter le bannissement',
-'Ban message label'			=>	'Message de bannissement',
-'Ban message help'			=>	'Un message qui s\'affichera lors de la prochaine visite de l\'utilisateur banni.',
-'Message expiry subhead'		=>	'Message de bannissement et expiration',
-'Ban IP range info'			=>	'Vous devrez Ãªtre trÃšs prudent lors du bannissement d\'une plage d\'IP puisqu\'il est possible que plusieurs utilisateurs utilisent la mÃªme partie d\'adresse IP.',
-'Expire date label'			=>	'Date d\'expiration',
-'Expire date help'			=>	'La date Ã  laquelle ce bannissement devrait prendre automatiquement fin (format : YYYY-MM-DD). Laissez vide pour une suppression manuelle.',
-
-'Results head'				=>	'RÃ©sultats de la recherche',
-'Results username head'			=>	'Nom d\'utilisateur',
-'Results e-mail head'			=>	'E-mail',
-'Results IP address head'		=>	'IP/plage d\'IP',
-'Results expire head'	      		=>	'Expire',
-'Results message head'	        	=>	'Message',
-'Results banned by head'       		=>	'Banni par',
-'Results actions head'			=>	'Actions',
-'No match'				=>	'Pas de correspondance',
-'Unknown'				=>	'Inconnu',
-
-);
Index: trunk/web/punbb/lang/French/admin_categories.php
===================================================================
--- trunk/web/punbb/lang/French/admin_categories.php	(revision 10)
+++ 	(revision )
@@ -1,29 +1,0 @@
-<?php
-
-// Language definitions used in admin_categories.php
-$lang_admin_categories = array(
-
-'Must enter name message'		=>	'Vous devez indiquer un nom pour la catÃ©gorie',
-'Category added redirect'		=>	'CatÃ©gorie ajoutÃ©e. Redirection&#160;âŠ',
-'Category deleted redirect'		=>	'CatÃ©gorie supprimÃ©e. Redirection&#160;âŠ',
-'Delete category head'			=>	'Supprimer la catÃ©gorie (ainsi que les forums et les sujets qu\'elle contient)',
-'Confirm delete subhead'		=>	'Confirmer la suppression de la catÃ©gorie',
-'Confirm delete info'			=>	'Souhaitez-vous vraiment supprimer la catÃ©gorie Â«&#160;%s&#160;Â» ?',
-'Delete category warn'			=>	'<strong>ATTENTION&#160;!</strong> Supprimer une catÃ©gorie entraÃ®ne la suppression des forums et sujets Ã©ventuels qu\'elle contient !',
-'Must enter integer message'		=>	'La position doit Ãªtre indiquÃ©e sous la forme d\'un nombre entier positif',
-'Categories updated redirect'		=>	'CatÃ©gories mises Ã  jour. Redirection&#160;âŠ',
-'Add categories head'			=>	'Ajouter des catÃ©gories',
-'Add categories subhead'		=>	'Ajouter les catÃ©gories',
-'Add category label'			=>	'Ajouter une nouvelle catÃ©gorie',
-'Add new submit'			=>	'Ajouter',
-'Add category help'			=>	'Le nom de la nouvelle catÃ©gorie que vous souhaitez ajouter. Vous pouvez modifier ce nom plus tard (voir ci-dessous). Allez Ã  la rubrique %s pour ajouter des forums dans votre nouvelle catÃ©gorie.',
-'Delete categories head'		=>	'Supprimer des catÃ©gories',
-'Delete categories subhead'		=>	'Supprimer les catÃ©gories',
-'Delete category label'			=>	'Supprimer une catÃ©gorie',
-'Delete category help'			=>	'SÃ©lectionnez le nom de la catÃ©gorie que vous souhaitez supprimer. Une confirmation vous sera demandÃ©e avant que cette catÃ©gorie ne soit supprimÃ©e.',
-'Edit categories head'			=>	'Modifier des catÃ©gories',
-'Edit categories subhead'		=>	'Modifier les catÃ©gories',
-'Category position label'		=>	'Position',
-'Category name label'			=>	'Nom',
-
-);
Index: trunk/web/punbb/lang/French/admin_censoring.php
===================================================================
--- trunk/web/punbb/lang/French/admin_censoring.php	(revision 10)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php
-
-// Language definitions used in admin_censoring.php
-$lang_admin_censoring = array(
-
-'Must enter word message'		=>	'Vous devez indiquer un mot Ã  censurer.',
-'Word updated redirect'			=>	'Mot censurÃ© mis Ã  jour. Redirection&#160;âŠ',
-'Word added redirect'			=>	'Mot censurÃ© ajoutÃ©. Redirection&#160;âŠ',
-'Word removed redirect'			=>	'Mot censurÃ© supprimÃ©. Redirection&#160;âŠ',
-'Censoring head'			=>	'Censure',
-'Add word subhead'			=>	'Ajouter le mot',
-'Add word info'				=>	'Indiquer un mot que vous souhaitez censurer et le texte de remplacement pour ce mot. Les jokers sont acceptÃ©s (ex. : *certain* correspond Ã  Â«&#160;incertain&#160;Â» et Ã  Â«&#160;certainement&#160;Â»). Les noms d\'utilisateurs sont Ã©galement concernÃ©s par la censure. Les nouveaux utilisateurs ne pourront pas s\'inscrire en utilisant des noms d\'utilisateurs contenant un mot censurÃ©. La recherche est insensible Ã  la casse.',
-'Censoring enabled'			=>	'<strong>La censure est activÃ©e dans %s.</strong>',
-'Censoring disabled'			=>	'<strong>La censure est dÃ©sactivÃ©e dans %s.</strong>',
-'Censored word label'			=>	'Mot censurÃ©',
-'Replacement label'			=>	'Mot(s) de remplacement',
-'Action label'				=>	'Action',
-'Edit remove subhead'			=>	'Modifier ou supprimer des mots',
-'No words in list'			=>	'Aucun mot censurÃ© pour le moment.',
-
-);
Index: trunk/web/punbb/lang/French/admin_common.php
===================================================================
--- trunk/web/punbb/lang/French/admin_common.php	(revision 10)
+++ 	(revision )
@@ -1,44 +1,0 @@
-<?php
-
-// Language definitions used in admin_common
-$lang_admin_common = array(
-
-// The menu
-'Admin menu'					=>	'Menu d\'administration',
-'Plugins menu'					=>	'Menu des plugins',
-'Moderator menu'				=>	'Menu de modÃ©ration',
-'Index'						=>	'Accueil',
-'Categories'					=>	'CatÃ©gories',
-'Forums'					=>	'Forums',
-'Users'						=>	'Utilisateurs',
-'User groups'					=>	'Groupes d\'utilisateurs',
-'Options'					=>	'Options',
-'Permissions'					=>	'Permissions',
-'Censoring'					=>	'Censure',
-'Ranks'						=>	'Rangs',
-'Bans'						=>	'Bannissements',
-'Prune'						=>	'Ãlagage',
-'Maintenance'					=>	'Maintenance',
-'Reports'					=>	'Signalements',
-
-'Admin'						=>	'Admin',
-'Go back'					=>	'Retour',
-'Delete'					=>	'Supprimer',
-'Update'					=>	'Mettre Ã  jour',
-'Add'						=>	'Ajouter',
-'Edit'						=>	'Modifier',
-'Remove'					=>	'Supprimer',
-'Yes'						=>	'Oui',
-'No'						=>	'Non',
-'Save changes'					=>	'Enregistrer les modifications',
-'Save'						=>	'Enregistrer',
-'here'						=>	'ici',
-'Action'					=>	'Action',
-'None'						=>	'Aucune',
-'Maintenance mode'				=>	'Mode maintenance', // Used for link text in more than one file
-
-// Admin loader
-'No plugin message'				=>	'Il n\'y a aucun plugin nommÃ© %s dans le rÃ©pertoire plugin.',
-'Plugin failed message'				=>	'Ãchec du chargement du plugin <strong>%s</strong>',
-
-);
Index: trunk/web/punbb/lang/French/admin_forums.php
===================================================================
--- trunk/web/punbb/lang/French/admin_forums.php	(revision 10)
+++ 	(revision )
@@ -1,53 +1,0 @@
-<?php
-
-// Language definitions used in admin_forums.php
-$lang_admin_forums = array(
-
-'Forum added redirect'		=>	'Forum ajoutÃ©. Redirection&#160;âŠ',
-'Forum deleted redirect'	=>	'Forum supprimÃ©. Redirection&#160;âŠ',
-'Forums updated redirect'	=>	'Forums mis Ã  jour. Redirection&#160;âŠ',
-'Forum updated redirect'	=>	'Forum mis Ã  jour. Redirection&#160;âŠ',
-'Perms reverted redirect'	=>	'RÃ©tablissement des permissions par dÃ©faut. Redirection&#160;âŠ',
-'Must enter name message'	=>	'Vous devez indiquer un nom de forum.',
-'Must be integer message'	=>	'La position doit Ãªtre indiquÃ©e sous forme de nombre entier positif.',
-'New forum'			=>	'Nouveau forum',
-
-// Entry page
-'Add forum head'		=>	'Ajouter un forum',
-'Create new subhead'		=>	'CrÃ©er un nouveau forum',
-'Add forum label'		=>	'Ajouter le forum Ã  une catÃ©gorie',
-'Add forum help'		=>	'Choisissez la catÃ©gorie Ã  laquelle vous souhaitez ajouter un nouveau forum.',
-'Add forum'			=>	'Ajouter le forum',
-'No categories exist'		=>	'Il n\'existe aucune catÃ©gorie pour le moment',
-'Edit forums head'		=>	'Modifier des forums',
-'Category subhead'		=>	'CatÃ©gorie&#160;:',
-'Forum label'			=>	'Forum',
-'Edit link'			=>	'Modifier',
-'Delete link'			=>	'Supprimer',
-'Position label'		=>	'Position',
-'Update positions'		=>	'Mettre Ã  jour les positions',
-'Confirm delete head'		=>	'Confirmation de suppression de forum',
-'Confirm delete subhead'	=>	'Important ! Lisez ceci avant de supprimer.',
-'Confirm delete info'		=>	'Souhaitez-vous vraiment supprimer le forum <strong>%s</strong>&#160;?',
-'Confirm delete warn'		=>	'ATTENTION ! La suppression d\'un forum entraÃ®nera la suppression des Ã©ventuels messages contenus dans ce forum&#160;!',
-
-// Detailed edit page
-'Edit forum head'		=>	'Modifier un forum',
-'Edit details subhead'		=>	'Modifier les informations sur le forum',
-'Forum name label'		=>	'Nom du forum',
-'Forum description label'	=>	'Description (HTML)',
-'Category label'		=>	'CatÃ©gorie',
-'Sort by label'			=>	'Trier les discussions par',
-'Last post'			=>	'Dernier message',
-'Topic start'			=>	'DÃ©but du sujet',
-'Subject'					=>	'Sujet',
-'Redirect label'		=>	'URL de redirection',
-'Redirect help'			=>	'Uniquement disponible pour les forums vides',
-'Group permissions subhead'	=>	'Modifier les permissions des groupes pour ce forum',
-'Group permissions info'	=>	'Dans ce forum, vous pouvez dÃ©finir les permissions spÃ©cifiques Ã  diffÃ©rents groupes d\'utilisateurs. Si vous n\'avez fait aucune modification aux permissions de groupe de ce forum, ce que vous voyez ci-dessous sont les paramÃštres par dÃ©faut basÃ©s sur ceux proposÃ©s dans %s. Les administrateurs ont toujours toutes les permissions et sont donc exclus de ce paramÃ©trage. Les paramÃštres de permission qui diffÃšrent des permissions par dÃ©faut pour le groupe d\'utilisateurs sont mis en Ã©vidence en rouge. La case Ã  cocher indiquant la permission de Â«&#160;lire le forum&#160;Â» sera dÃ©sactivÃ©e si le groupe en question ne possÃšde pas cette permission. Pour les forums redirigÃ©s, seule la permission de lecture de forum est modifiable.',
-'Read forum label'		=>	'Lire le forum',
-'Post replies label'		=>	'RÃ©pondre aux messages',
-'Post topics label'		=>	'CrÃ©er des discussions',
-'Revert to default'		=>	'RÃ©tablir les paramÃštres par dÃ©faut',
-
-);
Index: trunk/web/punbb/lang/French/admin_groups.php
===================================================================
--- trunk/web/punbb/lang/French/admin_groups.php	(revision 10)
+++ 	(revision )
@@ -1,84 +1,0 @@
-<?php
-
-// Language definitions used in admin_groups.php
-$lang_admin_groups = array(
-
-'Must enter title message'		=>	'Vous devez indiquer un nom au groupe.',
-'Title already exists message'		=>	'Il existe dÃ©jÃ  un groupe nommÃ© <strong>%s</strong>.',
-'Default group redirect'		=>	'Groupe par dÃ©faut dÃ©fini. Redirection&#160;âŠ',
-'Cannot remove default message'		=>	'Le groupe par dÃ©faut ne peut Ãªtre supprimÃ©. Pour pouvoir supprimer ce groupe, vous devez d\'abord configurer un autre groupe.',
-'Group removed redirect'		=>	'Groupe supprimÃ©. Redirection&#160;âŠ',
-'Group added redirect'			=>	'Groupe ajoutÃ©. Redirection&#160;âŠ',
-'Group edited redirect'			=>	'Groupe modifiÃ©. Redirection&#160;âŠ',
-
-'Add groups head'			=>	'Ajouter/configurer des groupes',
-'Add group subhead'			=>	'Ajouter un nouveau groupe',
-'New group label'			=>	'Baser le nouveau groupe sur',
-'New group help'			=>	'SÃ©lectionner un groupe d\'utilisateurs duquel le nouveau groupe va hÃ©riter les permissions. La page suivante vous permettra de rÃ©gler plus prÃ©cisÃ©ment les paramÃštres.',
-'Default group subhead'			=>	'DÃ©finir le groupe par dÃ©faut',
-'Default group label'			=>	'Groupe par dÃ©faut',
-'Default group help'			=>	'Ceci est le groupe par dÃ©faut, c\'est-Ã -dire le groupe dans lequel sont placÃ©s les utilisateurs lorsqu\'ils s\'inscrivent. Pour des raisons de sÃ©curitÃ©, les utilisateurs ne peuvent Ãªtre placÃ©s ni dans le groupe des modÃ©rateurs, ni dans le groupe des administrateurs par dÃ©faut.',
-'Existing groups head'			=>	'Groupes existants',
-'Edit groups subhead'			=>	'Modifier/supprimer des groupes',
-'Edit groups info'			=>	'Les groupes prÃ©dÃ©finis des invitÃ©s, administrateurs, modÃ©rateurs et membres ne peuvent Ãªtre supprimÃ©s. Cependant, ils peuvent Ãªtre modifiÃ©s. Veuillez prendre note que, dans certains groupes, certaines options ne sont pas disponibles (ex. : la permission de <em>modifier les messages</em> pour les invitÃ©s). Les administrateurs ont toujours toutes les permissions.',
-'Edit link'				=>	'Modifier',
-'Delete link'				=>	'Supprimer',
-'Group delete head'			=>	'Suppression de groupe',
-'Confirm delete subhead'		=>	'Confirmez la suppression du groupe',
-'Confirm delete info'			=>	'Souhaitez-vous vraiment supprimer le groupe <strong>%s</strong> ?',
-'Confirm delete warn'			=>	'ATTENTION&#160;! AprÃšs avoir supprimÃ© un groupe il n\'est plus possible de le rÃ©tablir.',
-'Delete group head'			=>	'Supprimer le groupe',
-'Move users subhead'			=>	'DÃ©placer les utilisateurs actuellement dans le groupe',
-'Move users info'			=>	'Le groupe <strong>%s</strong> comporte actuellement <strong>%s</strong> membres. Veuillez choisir un groupe auquel ses membres seront assignÃ©s aprÃšs la suppression.',
-'Move users label'			=>	'DÃ©placer les utilisateurs vers',
-'Delete group'				=>	'Supprimer le groupe',
-
-'Group settings head'			=>	'ParamÃštres du groupe',
-'Group settings subhead'		=>	'Configurer les options et les permissions du groupe',
-'Group settings info'			=>	'Les options et permissions ci-dessous sont les permissions par dÃ©faut de ce groupe d\'utilisateurs. Ces options sont appliquÃ©es si aucune permission spÃ©cifique au forum n\'est effective.',
-'Group title label'			=>	'Nom du groupe',
-'User title label'			=>	'Titre d\'utilisateur',
-'User title help'			=>	'Ce titre remplacera tout rang que les utilisateurs auront obtenus dans ce groupe. Laissez vide pour utiliser titre ou rang par dÃ©faut.',
-'Mod privileges label'			=>	'Appliquer des privilÃšges de modÃ©rateur aux utilisateurs',
-'Mod privileges help'			=>	'Pour qu\'un utilisateur de ce groupe puisse obtenir des privilÃšges de modÃ©rateur, il doit Ãªtre assignÃ© Ã  modÃ©rer un ou plusieurs forums. Ceci se fait via la page d\'administration d\'utilisateur du profil de l\'utilisateur.',
-'Edit profile label'			=>	'Autoriser les modÃ©rateurs Ã  Ã©diter les profils des utilisateurs',
-'Edit profile help'			=>	'Si les privilÃšges de modÃ©rateurs sont activÃ©s, autoriser les utilisateurs de ce groupe Ã  Ã©diter les profils des utilisateurs.',
-'Rename users label'			=>	'Autoriser les modÃ©rateurs Ã  renommer les utilisateurs',
-'Rename users help'			=>	'Si les privilÃšges de modÃ©rateurs sont activÃ©s, autoriser les utilisateurs de ce groupe Ã  renommer les utilisateurs.',
-'Change passwords label'		=>	'Autoriser les modÃ©rateurs Ã  modifier les mots de passe',
-'Change passwords help'			=>	'Si les privilÃšges de modÃ©rateurs sont activÃ©s, autoriser les utilisateurs de ce groupe Ã  modifier le mot de passe des utilisateurs.',
-'Ban users label'			=>	'Autoriser les modÃ©rateurs Ã  bannir les utilisateurs',
-'Ban users help'			=>	'Si les privilÃšges de modÃ©rateurs sont activÃ©s, autoriser les utilisateurs de ce groupe Ã  bannir les utilisateurs.',
-'Read board label'			=>	'Lire le forum',
-'Read board help'			=>	'Autoriser les utilisateurs de ce groupe Ã  afficher le forum. Ce paramÃštre s\'applique Ã  tous les aspects du forum et ne peut donc pas Ãªtre remplacÃ© par les paramÃštres spÃ©cifiques au forum. Si votre choix porte sur le Â«&#160;Non&#160;Â», les utilisateurs dans ce groupe ne pourront que se connecter/dÃ©connecter et s\'inscrire.',
-'View user info label'			=>	'Afficher les informations sur l\'utilisateur',
-'View user info help'			=>	'Autoriser les utilisateurs Ã  afficher la liste des utilisateurs et les profils.',
-'Post replies label'			=>	'RÃ©pondre aux messages',
-'Post replies help'			=>	'Autoriser les utilisateurs de ce groupe Ã  rÃ©pondre dans les discussions.',
-'Post topics label'			=>	'CrÃ©er des discussions',
-'Post topics help'			=>	'Autoriser les utilisateurs de ce groupe Ã  crÃ©er des discussions.',
-'Edit posts label'			=>	'Modifier les messages',
-'Edit posts help'			=>	'Autoriser les utilisateurs de ce groupe Ã  modifier leurs propres messages.',
-'Delete posts label'			=>	'Supprimer les messages',
-'Delete posts help'			=>	'Autoriser les utilisateurs de ce groupe Ã  supprimer leurs propres messages.',
-'Delete topics label'			=>	'Supprimer les discussions',
-'Delete topics help'			=>	'Autoriser les utilisateurs de ce groupe Ã  supprimer leurs propres discussions (ainsi que les Ã©ventuelles rÃ©ponses).',
-'Set own title label'			=>	'DÃ©finir leur propre titre d\'utilisateur',
-'Set own title help'			=>	'Autoriser les utilisateurs de ce groupe Ã  dÃ©finir leur propre titre d\'utilisateur.',
-'User search label'			=>	'Utiliser la recherche',
-'User search help'			=>	'Autoriser les utilisateurs de ce groupe Ã  utiliser la fonction de recherche.',
-'User list search label'		=>	'Rechercher dans la liste des utilisateurs',
-'User list search help'			=>	'Autoriser les utilisateurs de ce groupe Ã  rechercher Ã  partir d\'un texte libre des utilisateurs dans la liste d\'utilisateurs.',
-'Send e-mails label'			=>	'Envoyer des e-mails',
-'Send e-mails help'			=>	'Autoriser les utilisateurs de ce groupe Ã  envoyer des e-mails Ã  d\'autres utilisateurs.',
-'Post flood label'			=>	'Intervalle entre messages consÃ©cutifs',
-'Post flood help'			=>	'DÃ©lai en secondes Ã  respecter par les utilisateurs de ce groupe entre deux messages envoyÃ©s. DÃ©finir Ã  0 pour dÃ©sactiver.',
-'Search flood label'			=>	'Intervalle entre recherches consÃ©cutives',
-'Search flood help'			=>	'DÃ©lai en secondes Ã  respecter par les utilisateurs de ce groupe entre deux recherches. DÃ©finir Ã  0 pour dÃ©sactiver.',
-'E-mail flood label'			=>	'Intervalle entre e-mails consÃ©cutifs',
-'E-mail flood help'			=>	'DÃ©lai en secondes Ã  respecter par les utilisateurs de ce groupe entre deux e-mails envoyÃ©s. DÃ©finir Ã  0 pour dÃ©sactiver.',
-'Report flood label'      =>  'Intervalle entre signalements consÃ©cutifs',
-'Report flood help'        =>  'DÃ©lai en secondes Ã  respecter par les utilisateurs de ce groupe entre deux signalements envoyÃ©s. DÃ©finir Ã  0 pour dÃ©sactiver.',
-'Moderator info'			=>	'Veuillez prendre note que pour qu\'un utilisateur de ce groupe puisse obtenir des privilÃšges de modÃ©rateur, il doit Ãªtre assignÃ© Ã  modÃ©rer un ou plusieurs forums. Ceci se fait via la page d\'administration d\'utilisateur du profil de l\'utilisateur.',
-
-);
Index: trunk/web/punbb/lang/French/admin_index.php
===================================================================
--- trunk/web/punbb/lang/French/admin_index.php	(revision 10)
+++ 	(revision )
@@ -1,51 +1,0 @@
-<?php
-
-// Language definitions used in admin_index.php
-$lang_admin_index = array(
-
-'fopen disabled message'		=>	'Impossible de vÃ©rifier la prÃ©sence de nouvelles mises Ã  jour puisque l\'option Â«&#160;allow_url_fopen&#160;Â» est dÃ©sactivÃ©e sur ce systÃšme.',
-'Upgrade check failed message'		=>	'La vÃ©rification de nouvelles mises Ã  jour a Ã©chouÃ© pour des raisons inconnues.',
-'Running latest version message'	=>	'Vous utilisez la version la plus rÃ©cente de FluxBB.',
-'New version available message'		=>	'Une nouvelle version de FluxBB est disponible. Vous pouvez tÃ©lÃ©charger cette version ici&#160;: %s.',
-'PHPinfo disabled message'		=>	'La fonction PHP phpinfo() a Ã©tÃ© dÃ©sactivÃ©e sur ce serveur.',
-'Not available'				=>	'Non disponible',
-'Forum admin head'			=>	'Administration du forum',
-'NA'					=>	'N/A',
-'Welcome to admin'			=>	'Bienvenue dans le panneau d\'administration de FluxBB. Ã partir d\'ici vous pouvez gÃ©rer les aspects vitaux du forum. Selon que vous Ãªtes administrateur ou modÃ©rateur, vous pouvez',
-'Welcome 1'				=>	'Organiser les catÃ©gories et forums.',
-'Welcome 2'				=>	'DÃ©finir les options et prÃ©fÃ©rences pour chaque forum.',
-'Welcome 3'				=>	'GÃ©rer les permissions pour les utilisateurs et les invitÃ©s.',
-'Welcome 4'				=>	'Afficher les statistiques IP des utilisateurs.',
-'Welcome 5'				=>	'Bannir des utilisateurs.',
-'Welcome 6'				=>	'Censurer des mots.',
-'Welcome 7'				=>	'ParamÃ©trer les rangs d\'utilisateurs.',
-'Welcome 8'				=>	'Supprimer d\'anciens messages.',
-'Welcome 9'				=>	'Traiter les signalements de messages.',
-'Statistics head'			=>	'Statistiques',
-'FluxBB version label'			=>	'Version de FluxBB',
-'Check for upgrade'			=>	'VÃ©rification pour mise Ã  niveau',
-'FluxBB version data'			=>	'v%s - %s',
-'Server load label'			=>	'Charge du serveur',
-'Server load data'			=>	'%s - %s utilisateur(s) en ligne',
-'Environment label'			=>	'Environnement',
-'Environment data OS'			=>	'SystÃšme d\'exploitation&#160;: %s',
-'Show info'				=>	'Afficher les infos',
-'Environment data version'		=>	'PHP : %s - %s',
-'Environment data acc'			=>	'AccÃ©lÃ©rateur&#160;: %s',
-'Turck MMCache'				=>	'Turck MMCache',
-'Turck MMCache link'			=>	'turck-mmcache.sourceforge.net/',
-'ionCube PHP Accelerator'		=>	'AccÃ©lÃ©rateur PHP ionCube PHP',
-'ionCube PHP Accelerator link'		=>	'www.php-accelerator.co.uk/',
-'Alternative PHP Cache (APC)'		=>	'Cache alternatif PHP (APC)',
-'Alternative PHP Cache (APC) link'	=>	'www.php.net/apc/',
-'Zend Optimizer'			=>	'Optimiseur Zend',
-'Zend Optimizer link'			=>	'www.zend.com/products/guard/zend-optimizer/',
-'eAccelerator'				=>	'eAccelerator',
-'eAccelerator link'			=>	'www.eaccelerator.net/',
-'XCache'				=>	'XCache',
-'XCache link'				=>	'xcache.lighttpd.net/',
-'Database label'			=>	'Base de donnÃ©es',
-'Database data rows'			=>	'Lignes&#160;: %s',
-'Database data size'			=>	'Taille&#160;: %s',
-
-);
Index: trunk/web/punbb/lang/French/admin_maintenance.php
===================================================================
--- trunk/web/punbb/lang/French/admin_maintenance.php	(revision 10)
+++ 	(revision )
@@ -1,39 +1,0 @@
-<?php
-
-// Language definitions used in admin_maintenance.php
-$lang_admin_maintenance = array(
-
-'Maintenance head'			=>	'Maintenance du forum',
-'Rebuild index subhead'			=>	'Reconstruire l\'index de recherche',
-'Rebuild index info'			=>	'Si vous avez ajoutÃ©, modifiÃ© ou supprimÃ© des messages manuellement dans la base de donnÃ©es ou si vous rencontrez des problÃšmes lors des recherches, vous devriez reconstruire l\'index de recherche. Pour une performance optimale vous devriez placer le forum en %s lors de la reconstruction. <strong>La reconstruction de l\'index de recherche peut prendre du temps et provoquer une montÃ©e en charge du serveur durant le processus&#160;!</strong>',
-'Posts per cycle label'			=>	'Messages par cycle',
-'Posts per cycle help'			=>	'Le nombre de messages Ã  afficher pour chaque page. Ex. : si vous indiquez 300, trois cents messages seront traitÃ©s, ensuite la page sera rÃ©actualisÃ©e. Ceci Ã©vite que le script ne s\'interrompe durant le processus de reconstruction.',
-'Starting post label'			=>	'ID du message de dÃ©part',
-'Starting post help'			=>	'L\'ID du message de dÃ©part pour la reconstruction. La valeur pas dÃ©faut est le premier ID disponible dans la base de donnÃ©es. En principe, vous ne devriez pas avoir Ã  changer cela.',
-'Empty index label'			=>	'Effacer l\'index',
-'Empty index help'			=>	'Choisissez cela si vous souhaitez que l\'index soit vidÃ© avant de dÃ©buter la reconstruction (voir ci-dessous).',
-'Rebuild completed info'		=>	'Une fois que le processus s\'est achevÃ© vous serez redirigÃ© vers cette page. L\'activation de Javascript dans votre navigateur est fortement recommandÃ©e durant la reconstruction (pour redirection automatique au terme d\'un cycle). Si vous Ãªtes contraint(e) d\'interrompre le processus de reconstruction, notez l\'ID du message traitÃ© en dernier et indiquez la valeur ID+1 dans Â«&#160;ID du message de dÃ©part&#160;Â» lorsque/si vous souhaitez continuer (Â«&#160;Effacer l\'index&#160;Â» ne doit pas Ãªtre sÃ©lectionnÃ©).',
-'Rebuild index'				=>	'Reconstruire l\'index',
-'Rebuilding search index'		=>	'Reconstruction de l\'index de recherche',
-'Rebuilding index info'			=>	'Reconstruction de l\'index. Il serait bon de se servir un cafÃ© en attendant :-)',
-'Processing post'			=>	'Traitement du message <strong>%s</strong>&#160;âŠ',
-'Click here'				=>	'Cliquez ici',
-'Javascript redirect failed'		=>	'Ãchec de la redirection JavaScript. %s pour continuer&#160;âŠ',
-'Posts must be integer message'		=>	'Le nombre de messages par cycle doit Ãªtre une valeur entiÃšre positive.',
-'Days must be integer message'          =>      'Le nombre de jours Ã  prendre en compte pour Ã©laguer doit Ãªtre indiquÃ© sous forme de nombre entier positif.',
-'No old topics message'		        =>	'Aucune discussion ne date de plus de %s jours. Veuillez rÃ©duire la valeur de Â«&#160;AnciennetÃ© en jours&#160;Â» et essayer Ã  nouveau.',
-'Posts pruned redirect'		        =>	'Messages Ã©laguÃ©s. Redirection&#160;âŠ',
-'Prune head'			        =>	'Ãlaguer',
-'Prune subhead'			        =>	'Supprimer d\'anciens messages',
-'Days old label'		        =>	'AnciennetÃ© en jours',
-'Days old help'			        =>	'L\'anciennetÃ© d\'une discussion pour qu\'elle puisse Ãªtre supprimÃ©e. Ex.&#160;: si vous indiquez le nombre 30, toute discussion qui ne contient pas de message datant de moins de 30 jours sera supprimÃ©e.',
-'Prune sticky label'		        =>	'Supprimer les discussions Ã©pinglÃ©es',
-'Prune sticky help'		        =>	'Si activÃ©, les discussions Ã©pinglÃ©es seront Ã©galement prises en compte lors de l\'Ã©lagage.',
-'Prune from label'		        =>	'Ãlaguer dans le forum',
-'All forums'			        =>	'Tous les forums',
-'Prune from help'		        =>	'Le forum dans lequel vous souhaitez Ã©laguer les messages.',
-'Prune info'			        =>	'Utilisez cette fonctionnalitÃ© avec prudence. <strong>Les messages supprimÃ©s ne peuvent plus Ãªtre rÃ©cupÃ©rÃ©s.</strong> Pour une performance optimale, vous devriez passer le forum en %s.',
-'Confirm prune subhead'		        =>	'Confirmer l\'Ã©lagage des messages',
-'Confirm prune info'		        =>	'Souhaitez-vous vraiment supprimer toutes les discussions datant de plus de %s jours de %s (%s discussions).',
-'Confirm prune warn'		        =>	'ATTENTION&#160;! La suppression des messages est irrÃ©versible lors de l\'Ã©lagage.',
-);
Index: trunk/web/punbb/lang/French/admin_options.php
===================================================================
--- trunk/web/punbb/lang/French/admin_options.php	(revision 10)
+++ 	(revision )
@@ -1,228 +1,0 @@
-<?php
-
-// Language definitions used in admin-options.php
-$lang_admin_options = array(
-
-'Bad HTTP Referer message'			=>	'Mauvais HTTP_REFERER. Si vous avez dÃ©placÃ© ces forums d\'un endroit Ã  un autre ou si vous avez changÃ© de domaine, vous devez mettre Ã  jour l\'URL de base manuellement dans la base de donnÃ©es (recherchez o_base_url dans la table config) et nettoyer le cache en supprimant tous les fichiers *.php dans le rÃ©pertoire /cache.',
-'Must enter title message'			=>	'Vous devez spÃ©cifier un nom pour le forum.',
-'Invalid e-mail message'			=>	'L\'adresse Ã©lectronique d\'administrateur que vous avez indiquÃ©e est invalide.',
-'Invalid webmaster e-mail message'		=>	'L\'adresse Ã©lectronique de Webmestre que vous avez indiquÃ©e est invalide.',
-'SMTP passwords did not match'		        =>	'Vous devez indiquer le mot de passe SMTP deux fois exactement de la mÃªme maniÃšre pour le modifier.',
-'Enter announcement here'			=>	'Veuillez saisir votre annonce ici.',
-'Enter rules here'				=>	'Veuillez saisir vos rÃšgles ici.',
-'Default maintenance message'			=>	'Les forums sont temporairement fermÃ©s pour maintenance. Veuillez essayer Ã  nouveau dans quelques minutes.',
-'Timeout error message'				=>	'La valeur pour Â«&#160;DÃ©lai avant dÃ©connexion&#160;Â» doit Ãªtre infÃ©rieure Ã  celle du champ Â«&#160;DÃ©lai de fin de visite&#160;Â».',
-'Options updated redirect'			=>	'Options mises Ã  jour. Redirection&#160;âŠ',
-'Options head'					=>	'Options',
-
-// Essentials section
-'Essentials subhead'				=>	'Principal',
-'Board title label'				=>	'Titre du forum',
-'Board title help'				=>	'Le titre de ce forum (affichÃ© en haut de chaque page). Ce champ <strong>ne</strong> doit <strong>pas</strong> contenir de code HTML.',
-'Board desc label'				=>	'Description du forum',
-'Board desc help'				=>	'Une courte description de ce forum (affichÃ©e en haut de chaque page). Ce champ peut contenir du code HTML.',
-'Base URL label'				=>	'URL de base',
-'Base URL help'					=>	'L\'URL complÃšte du forum sans barre oblique finale (ex. : http://www.mondomaine.com/forums). Ceci <strong>doit</strong> Ãªtre correct pour que les fonctionnalitÃ©s dÃ©diÃ©es aux administrateurs et aux modÃ©rateurs puissent Ãªtre conservÃ©es. Si vous obtenez des erreurs Â«&#160;Bad referer&#160;Â», elle est sÃ»rement incorrecte.',
-'Timezone label'				=>	'Fuseau horaire par dÃ©faut',
-'Timezone help'					=>	'Le fuseau horaire par dÃ©faut pour les invitÃ©s et les utilisateurs qui s\'inscrivent sur le forum.',
-'DST label'					=>	'Ajustement pour l\'heure d\'Ã©tÃ©',
-'DST help'					=>	'Pour activer l\'heure d\'Ã©tÃ© (avance d\'une heure).',
-'Language label'				=>	'Langue par dÃ©faut',
-'Language help'					=>	'Ceci est la langue par dÃ©faut utilisÃ©e si le visiteur est un invitÃ© ou si un utilisateur n\'a pas modifiÃ© ce paramÃštre dans son pofil. Si vous supprimez un paquetage de langue, ceci devra Ãªtre mis Ã  jour.',
-'Default style label'				=>	'Style par dÃ©faut',
-'Default style help'				=>	'Ceci est le style par dÃ©faut utilisÃ© si le visiteur est un invitÃ© ou si un utilisateur n\'a pas modifiÃ© ce paramÃštre dans son profil.',
-
-// Essentials section timezone options
-'UTC-12:00'					=>	'(UTC-12:00) Ligne de changement de date OUEST',
-'UTC-11:00'					=>	'(UTC-11:00) Niue, Samoa',
-'UTC-10:00'					=>	'(UTC-10:00) Hawaii et des Ã®les AlÃ©outiennes, Ãles Cook',
-'UTC-09:30'					=>	'(UTC-09:30) Ãles Marquises',
-'UTC-09:00'					=>	'(UTC-09:00) Alaska, Ãles Gambier',
-'UTC-08:30'					=>	'(UTC-08:30) Ãles Pitcairn',
-'UTC-08:00'					=>	'(UTC-08:00) Pacifique',
-'UTC-07:00'					=>	'(UTC-07:00) Montagnes, les Rocheuses',
-'UTC-06:00'					=>	'(UTC-06:00) Centre',
-'UTC-05:00'					=>	'(UTC-05:00) Est',
-'UTC-04:00'					=>	'(UTC-04:00) Atlantique',
-'UTC-03:30'					=>	'(UTC-03:30) Terre-Neuve',
-'UTC-03:00'					=>	'(UTC-03:00) Amazone, Centre du Groenland',
-'UTC-02:00'					=>	'(UTC-02:00) Milieu de l\'Atlantique',
-'UTC-01:00'					=>	'(UTC-01:00) AÃ§ores, Cap Vert, Groenland de l\'Est',
-'UTC'						=>	'(UTC) Europe Occidentale, Greenwich',
-'UTC+01:00'					=>	'(UTC+01:00) Europe Centrale, Afrique Occidentale',
-'UTC+02:00'					=>	'(UTC+02:00) Europe de l\'Est, Afrique Centrale',
-'UTC+03:00'					=>	'(UTC+03:00) Moscou, Afrique Orientale',
-'UTC+03:30'					=>	'(UTC+03:30) Iran',
-'UTC+04:00'					=>	'(UTC+04:00) Golf, Samara',
-'UTC+04:30'					=>	'(UTC+04:30) Afghanistan',
-'UTC+05:00'					=>	'(UTC+05:00) Pakistan, Iekaterinbourg',
-'UTC+05:30'					=>	'(UTC+05:30) Inde, Sri Lanka',
-'UTC+05:45'					=>	'(UTC+05:45) NÃ©pal',
-'UTC+06:00'					=>	'(UTC+06:00) Bangladesh, Bhutan, Novosibirsk',
-'UTC+06:30'					=>	'(UTC+06:30) Ãles Cocos, Myanmar',
-'UTC+07:00'					=>	'(UTC+07:00) Indochine, Krasnoyarsk',
-'UTC+08:00'					=>	'(UTC+08:00) Grande Chin, Australie occidentale, Irkutsk',
-'UTC+08:45'					=>	'(UTC+08:45) Australie occidentale',
-'UTC+09:00'					=>	'(UTC+09:00) Japon, CorÃ©e, Chine',
-'UTC+09:30'					=>	'(UTC+09:30) Australie MÃ©ridionale',
-'UTC+10:00'					=>	'(UTC+10:00) Australie Orientale, Vladivostok',
-'UTC+10:30'					=>	'(UTC+10:30) Ãle Lord Howe',
-'UTC+11:00'					=>	'(UTC+11:00) Ãle Salomon, Magadan',
-'UTC+11:30'					=>	'(UTC+11:30) Ãle Norfolk',
-'UTC+12:00'					=>	'(UTC+12:00) Nouvelle ZÃ©lande, Fiji, Kamchatka',
-'UTC+12:45'					=>	'(UTC+12:45) Ãles Chatham',
-'UTC+13:00'					=>	'(UTC+13:00) Tonga, Ãles Phoenix',
-'UTC+14:00'					=>	'(UTC+14:00) Ãles de la Ligne',
-
-// Timeout Section
-'Timeouts subhead'				=>	'Horaire et dÃ©lais avant interruption',
-'Time format label'				=>	'Format de l\'horaire',
-'PHP manual'					=>	'manuel PHP',
-'Time format help'				=>	'[Format actuel&#160;: %s]. Rendez-vous au %s pour des options de formatage.',
-'Date format label'				=>	'Format de la date',
-'Date format help'				=>	'[Format actuel&#160;: %s]. Rendez-vous au %s pour des options de formatage.',
-'Visit timeout label'				=>	'DÃ©lai d\'interruption de visite',
-'Visit timeout help'				=>	'DÃ©lai en secondes d\'inactivitÃ© d\'un utilisateur avant de mettre Ã  jour ses donnÃ©es de derniÃšre visite (touche principalement les indicateurs de nouveau message).',
-'Online timeout label'				=>	'DÃ©lai de dÃ©connexion',
-'Online timeout help'				=>	'DÃ©lai en secondes d\'inactivitÃ© d\'un utilisateur avant d\'Ãªtre retirÃ© de la liste des utilisateurs en ligne.',
-'Redirect time label'				=>	'DÃ©lai de redirection',
-'Redirect time help'				=>	'DÃ©lai en secondes avant redirection. Si dÃ©fini Ã  0, la page de redirection ne sera pas affichÃ©e (non recommandÃ©).',
-
-// Display Section
-'Display subhead'				=>	'Affichage',
-'Version number label'				=>	'NumÃ©ro de version',
-'Version number help'				=>	'Afficher la version de FluxBB dans le pied de page.',
-'Info in posts label'				=>	'Infos sur l\'utilisateur dans les messages',
-'Info in posts help'				=>	'Afficher les informations Ã  propos de l\'utilisateur ayant crÃ©Ã© le  message sous son nom d\'utilisateur dans la discussion. Les informations donnÃ©es sont&#160;: le lieu, la date d\'inscription, le nombre de messages publiÃ©s et les liens de contact (e-mail et URL).',
-'Post count label'				=>	'Nombre de messages',
-'Post count help'				=>	'Affiche le nombre de messages publiÃ©s par un utilisateur (indiquÃ© dans les discussions, le profil et la liste d\'utilisateurs).',
-'Smilies label'					=>	'ÃmoticÃŽnes dans les messages',
-'Smilies help'					=>	'Convertit les Ã©moticÃŽnes en petites icÃŽnes graphiques.',
-'Smilies sigs label'				=>	'ÃmoticÃŽnes dans les signatures',
-'Smilies sigs help'				=>	'Convertit les Ã©moticÃŽnes en petites icÃŽnes graphiques dans les signatures d\'utilisateurs.',
-'Clickable links label'				=>	'Rendre les liens cliquables',
-'Clickable links help'				=>	'Si activÃ©e, FluxBB dÃ©tectera automatiquement les URL dans les messages et les convertira en hyperliens cliquables.',
-'Topic review label'				=>	'RÃ©sumÃ© de discussion',
-'Topic review help'				=>	'Nombre maximal de sujets Ã  afficher lors de la composition de message (le plus rÃ©cent en premier). 0 pour dÃ©sactiver.',
-'Topics per page label'				=>	'Discussions par page',
-'Topics per page help'				=>	'Le nombre de discussions Ã  afficher par dÃ©faut par page dans un forum. Les utilisateurs peuvent personnaliser ce paramÃštre.',
-'Posts per page label'				=>	'Messages par page',
-'Posts per page help'				=>	'Le nombre de messages Ã  afficher par dÃ©faut par page dans une discussion. Les utilisateurs peuvent personnaliser ce paramÃštre.',
-'Indent label'					=>	'Tabulation',
-'Indent help'					=>	'Si dÃ©finie Ã  8, une indentation normale sera utilisÃ©e lors de l\'affichage du texte contenu dans une balise [code][/code]. Sinon, le nombre d\'espaces indiquÃ© sera utilisÃ© pour l\'indentation du texte.',
-'Quote depth label'				=>	'Niveau maximum de citations imbriquÃ©es',
-'Quote depth help'				=>	'Le nombre de fois qu\'une balise [quote] peut apparaÃ®re Ã  l\'intÃ©rieure d\'une autre balise [quote], toute balise de niveau supÃ©rieur sera ignorÃ©e.',
-
-// Features section
-'Features subhead'				=>	'FonctionnalitÃ©s',
-'Quick post label'				=>	'RÃ©ponse rapide',
-'Quick post help'				=>	'Si activÃ©e, FluxBB ajoutera un formulaire de rÃ©ponse rapide au bas des sujets. Ainsi, les utilisateurs pourront rÃ©pondre directement Ã  partir du sujet.',
-'Users online label'				=>	'Utilisateurs en ligne',
-'Users online help'				=>	'Affiche des informations sur la page d\'accueil indiquant le nombre d\'invitÃ©s et d\'inscrits visitant actuellement les forums.',
-'Censor words label'				=>	'Mots censurÃ©s',
-'Censor words help'				=>	'Activez ceci pour censurer des mots spÃ©cifiques dans le forum. Rendez-vous Ã  la rubrique %s pour davantage d\'informations.',
-'Signatures label'				=>	'Signatures',
-'Signatures help'				=>	'Autoriser les utilisateurs Ã  ajouter une signature en bas de message.',
-'User ranks label'				=>	'Rangs des utilisateurs',
-'User ranks help'				=>	'Activer cela pour utiliser les rangs d\'utilisateurs. Rendez-vous Ã  la rubrique %s pour davantage d\'informations.',
-'User has posted label'				=>	'Indication de message antÃ©rieur',
-'User has posted help'				=>	'Cette fonctionnalitÃ© affiche un point devant les sujets dans viewforum.php si l\'utilisateur actuellement connectÃ© a dÃ©jÃ  Ã©crit un message dans le sujet. DÃ©sactivez cette fonction si vous constatez des problÃšmes de surcharge du serveur.',
-'Topic views label'				=>	'Affichages de sujet',
-'Topic views help'				=>	'Conserver le nombre de fois qu\'un sujet a Ã©tÃ© visionnÃ©. DÃ©sactivez cette option si vous constatez une surcharge du serveur dans un forum trÃšs frÃ©quentÃ©.',
-'Quick jump label'				=>	'Basculement rapide',
-'Quick jump help'				=>	'Activer la liste dÃ©roulante de basculement rapide (basculer vers un forum).',
-'GZip label'					=>	'Compression GZip',
-'GZip help'					=>	'Si activÃ©e, FluxBB compressera au format gzip ce qui sera envoyÃ© au navigateur. Cela rÃ©duira l\'utilisation de la bande passante mais utilisera davantage les ressources du processeur. Cette fonctionnalitÃ© demande une configuration de PHP avec zlib (--with-zlib). Remarque : si vous avez d\'ores et dÃ©jÃ  configurÃ© un des modules Apache mod_gzip ou mod_deflate pour compresser les scripts PHP, vous devriez dÃ©sactiver cette fonctionnalitÃ©.',
-'Search all label'				=>	'Rechercher dans tous les forums',
-'Search all help'				=>	'Si dÃ©sactivÃ©e, les recherches ne pourront Ãªtre effectuÃ©es que dans un forum Ã  la fois. DÃ©sactivez ceci si la charge du serveur est trop Ã©levÃ©e Ã  cause d\'un nombre de recherches trop important.',
-'Menu items label'				=>	'ÃlÃ©ments de menu supplÃ©mentaires',
-'Menu items help'				=>	'En ajoutant des hyperliens HTML dans cette boÃ®te, un nombre illimitÃ© d\'Ã©lÃ©ments peuvent Ãªtre ajoutÃ©s au menu de navigation situÃ© en haut de chaque page. Le format pour ajouter de nouveaux liens est le suivant&#160;: X = &lt;a href="URL"&gt;INTITULE DU LIEN&lt;/a&gt; oÃ¹ X est la position Ã  laquelle le lien devra Ãªtre insÃ©rÃ© (ex. : 0 pour insÃ©rer au dÃ©but et 2 pour insÃ©rer aprÃšs l\'Ã©lÃ©ment Â«&#160;Liste d\'utilisateurs&#160;Â»). Chaque Ã©lÃ©ment devra se trouver dans une nouvelle ligne.',
-
-// Feeds section
-'Feed subhead'                                  =>      'Syndication',
-'Default feed label'				=>	'Type de flux par dÃ©faut',
-'Default feed help'				=>	'Type d\'abonnement de flux devant Ãªtre affichÃ©. Remarque&#160;: le choix Â«&#160;Aucun&#160;Â» ne dÃ©sactive pas le flux mais le masque simplement par dÃ©faut.',
-'None'						=>	'Aucun',
-'RSS'						=>	'RSS',
-'Atom'						=>	'Atom',
-'Feed TTL label'                                =>      'Temps de mise en cache des flux',
-'Feed TTL help'                                 =>      'Les flux peuvent Ãªtre placÃ©s dans le cache afin de rÃ©duire l\'utilisation des ressources.',
-'No cache'                                      =>      'Ne pas placer dans le cache',
-'Minutes'                                       =>      '%d minutes',
-
-// Reports section
-'Reports subhead'				=>	'Signalements',
-'Reporting method label'			=>	'MÃ©thode de signalement',
-'Internal'					=>	'Interne',
-'By e-mail'					=>	'E-mail',
-'Both'						=>	'Les deux',
-'Reporting method help'				=>	'Choisissez la mÃ©thode pour traiter les signalements de discussion/message. Vous pouvez opter pour le systÃšme de signalement interne, l\'envoi d\'un e-mail Ã  la liste de diffusion (voir ci-dessous) ou effectuer les deux opÃ©rations.',
-'Mailing list label'				=>	'Liste de diffusion',
-'Mailing list help'				=>	'Une liste d\'abonnÃ©s sÃ©parÃ©s par une virgule. Les personnes dans cette liste sont les destinataires des signalements.',
-
-// Avatars section
-'Avatars subhead'				=>	'Avatars',
-'Use avatars label'				=>	'Utiliser des avatars',
-'Use avatars help'				=>	'Si activÃ©e, les utilisateurs pourront envoyer vers le serveur un avatar qui sera affichÃ© sous leur titre/rang.',
-'Upload directory label'			=>	'RÃ©pertoire d\'envoi',
-'Upload directory help'				=>	'Le rÃ©pertoire vers lequel les avatars seront envoyÃ©s (relatif au rÃ©pertoire racine de FluxBB). PHP doit avoir les permissions d\'Ã©criture dans ce rÃ©pertoire.',
-'Max width label'				=>	'Largeur max',
-'Max width help'				=>	'La largeur maximale autorisÃ©e pour les avatars en pixels (60 recommandÃ©s).',
-'Max height label'				=>	'Hauteur max',
-'Max height help'				=>	'La hauteur maximale autorisÃ©e pour les avatars en pixels (60 recommandÃ©s).',
-'Max size label'				=>	'Taille max',
-'Max size help'					=>	'La taille maximale autorisÃ©e pour les avatars en octets (10240 recommandÃ©s).',
-
-// E-mail section
-'E-mail subhead'				=>	'E-mail',
-'Admin e-mail label'				=>	'E-mail de l\'administrateur',
-'Admin e-mail help'				=>	'L\'adresse Ã©lectronique de l\'administrateur du forum.',
-'Webmaster e-mail label'			=>	'E-mail du webmaster',
-'Webmaster e-mail help'				=>	'Ceci est l\'adresse indiquÃ©e comme adresse de provenance dans les e-mails envoyÃ©s par le forum.',
-'Forum subscriptions label'			=>	'Suivi de forum',
-'Forum subscriptions help'			=>	'Autorise les utilisateurs Ã  suivre des forums (reÃ§oivent un e-mail lorsque quelqu\'un crÃ©Ã© une nouvelle discussion).',
-'Topic subscriptions label'			=>	'Suivi de discussion',
-'Topic subscriptions help'			=>	'Autorise les utilisateurs Ã  suivre des discussions (reÃ§oivent un e-mail lorsque quelqu\'un rÃ©pond).',
-'SMTP address label'				=>	'Adresse du serveur SMTP',
-'SMTP address help'				=>	'L\'adresse d\'un serveur SMTP externe Ã  utiliser pour envoyer les e-mails. Vous pouvez spÃ©cifier un numÃ©ro de port personnalisÃ© si le serveur SMTP n\'utilise pas le port par dÃ©faut 25 (exemple : mail.monhÃŽte.com:3580). Laisser vide pour utiliser le programme d\'envoi d\'e-mail local.',
-'SMTP username label'				=>	'Nom d\'utilisateur SMTP',
-'SMTP username help'				=>	'Nom d\'utilisateur pour serveur SMTP. Indiquez un nom d\'utilisateur uniquement si cela est demandÃ© par le serveur SMTP (la plupart des serveurs <strong>ne</strong> nÃ©cessitent <strong>pas</strong> d\'authentification).',
-'SMTP password label'				=>	'Mot de passe SMTP',
-'SMTP change password help'			=>	'Cocher ceci si vous souhaitez modifier ou supprimer le mot de passe stockÃ© actuellement.',
-'SMTP password help'				=>	'Mot de passe pour serveur SMTP. Indiquez un mot de passe uniquement si cela est demandÃ© par le serveur SMTP (la plupart des serveurs <strong>ne</strong> nÃ©cessitent <strong>pas</strong> d\'authentification). Veuillez indiquer deux fois votre mot de passe pour confirmation.',
-'SMTP SSL label'				=>	'Chiffrage du SMTP par SSL',
-'SMTP SSL help'					=>	'Chiffre la connexion vers le serveur SMTP en utilisant SSL. Ne devrait Ãªtre utilisÃ© que si votre serveur SMTP le demande et que votre version de PHP prend en charge SSL.',
-
-// Registration Section
-'Registration subhead'				=>	'Inscription',
-'Allow new label'				=>	'Autoriser de nouvelles inscriptions',
-'Allow new help'				=>	'Indique si ce forum accepte de nouvelles inscriptions. Ne dÃ©sactiver que sous certaines conditions.',
-'Verify label'					=>	'VÃ©rifier les inscriptions',
-'Verify help'					=>	'Si activÃ©e, les utilisateurs obtiendront par e-mail un mot de passe alÃ©atoire lors de leur inscription. Ils pourront alors se connecter et modifier leur mot de passe dans leur profil s\'ils le souhaitent. Cette fonctionnalitÃ© demande Ã©galement une vÃ©rification de leur adresse Ã©lectronique s\'ils choisissent d\'en changer. Ceci est un moyen efficace d\'Ã©viter l\'inscription abusive et de vÃ©rifier que les utilisateurs ont une adresse Ã©lectronique correcte associÃ©e Ã  leur profil.',
-'Report new label'				=>	'Signaler les nouvelles inscriptions',
-'Report new help'				=>	'Si activÃ©e, FluxBB notifiera les utilisateurs dans la liste de diffusion (voir ci-dessus) lorsqu\'un nouvel utilisateur s\'inscrit sur les forums.',
-'Use rules label'				=>	'RÃšgles du forum pour les utilisateurs',
-'Use rules help'				=>	'Si activÃ©e, les utilisateurs devront accepter les rÃšgles lorsqu\'ils s\'inscriront (indiquez le texte ci-dessous). Ces rÃšgles seront toujours disponibles sous forme de lien dans le menu de navigation en haut de chaque page.',
-'Rules label'					=>	'Indiquez vos rÃšgles d\'utilisation ici',
-'Rules help'					=>	'Ici vous pouvez indiquer toute rÃšgle ou autre information que l\'utilisateur doit considÃ©rer et accepter avant de s\'inscrire. Si vous avez activÃ© les rÃšgles ci-dessus vous devez saisir quelque chose ici, sinon, elles seront dÃ©sactivÃ©es. Ce texte ne sera pas traitÃ© comme les messages ordinaires et peut contenir du code HTML.',
-'E-mail default label'				=>	'ParamÃštre e-mail par dÃ©faut',
-'E-mail default help'				=>	'Choisissez le paramÃštre de vie privÃ©e pour les nouvelles inscriptions d\'utilisateurs.',
-'Display e-mail label'				=>	'Divulguer l\'adresse Ã©lectronique aux autres utilisateurs.',
-'Hide allow form label'				=>	'Masquer l\'adresse Ã©lectronique mais autoriser l\'utilisation du formulaire d\'envoi d\'e-mail.',
-'Hide both label'				=>	'Masquer l\'adresse Ã©lectronique et ne pas autoriser l\'utilisation du formulaire d\'envoi d\'e-mail.',
-
-// Announcement Section
-'Announcement subhead'				=>	'Annonces',
-'Display announcement label'			=>	'Afficher l\'annonce',
-'Display announcement help'			=>	'Activez ceci pour afficher le message ci-dessous sur chaque page des forums.',
-'Announcement message label'			=>	'Message d\'annonce',
-'Announcement message help'			=>	'Ce texte ne sera pas traitÃ© comme les messages ordinaires et peut contenir du code HTML.',
-
-// Maintenance Section
-'Maintenance subhead'				=>	'Maintenance',
-'Maintenance mode label'			=>	'Mode maintenance',
-'Maintenance mode help'				=>	'Si activÃ©, le forum ne sera disponible qu\'aux administrateurs. Ceci devra Ãªtre utilisÃ© si le forum doit Ãªtre indisponible temporairement pour maintenance. ATTENTION&#160;! Ne vous dÃ©connectez pas lorsque le forum est en mode maintenance. Vous ne seriez plus en mesure de vous connecter.',
-'Maintenance message label'			=>	'Message de maintenance',
-'Maintenance message help'			=>	'Le message qui s\'affichera pour les utilisateurs lorsque le forum sera en mode maintenance. Si laissÃ© vide, un message par dÃ©faut sera utilisÃ©. Ce texte ne sera pas traitÃ© comme les messages ordinaires et peut contenir du code HTML.',
-
-);
Index: trunk/web/punbb/lang/French/admin_permissions.php
===================================================================
--- trunk/web/punbb/lang/French/admin_permissions.php	(revision 10)
+++ 	(revision )
@@ -1,36 +1,0 @@
-<?php
-
-// Language definitions used in admin-permissions.php
-$lang_admin_permissions = array(
-
-'Perms updated redirect'	=>	'Permissions mises Ã  jour. Redirection&#160;âŠ',
-'Permissions head'		=>	'Permissions',
-'Posting subhead'		=>	'Messages',
-'BBCode label'			=>	'BBCode',
-'BBCode help'			=>	'Autoriser les balises BBCode dans les messages (recommandÃ©).',
-'Image tag label'		=>	'Balise image',
-'Image tag help'		=>	'Autoriser la balise BBCode [img][/img] dans les messages.',
-'All caps message label'	=>	'Message uniquement en capitales',
-'All caps message help'		=>	'Accepter qu\'un message soit complÃštement Ã©crit en lettres capitales.',
-'All caps subject label'	=>	'Sujet uniquement en capitales',
-'All caps subject help'		=>	'Accepter qu\'un sujet soit complÃštement Ã©crit en lettres capitales.',
-'Require e-mail label'		=>	'E-mail de l\'invitÃ© obligatoire',
-'Require e-mail help'		=>	'Demander Ã  l\'invitÃ© d\'indiquer son adresse Ã©lectronique pour publier un message.',
-'Signatures subhead'		=>	'Signatures',
-'BBCode sigs label'		=>	'BBCodes dans les signatures',
-'BBCode sigs help'		=>	'Autoriser les balises BBCode dans les signatures des utilisateurs.',
-'Image tag sigs label'		=>	'Balise image dans les signatures',
-'Image tag sigs help'		=>	'Autoriser la balise BBCode [img][/img] dans les signatures d\'utilisateurs (non recommandÃ©).',
-'All caps sigs label'		=>	'Signature uniquement en capitales',
-'All caps sigs help'		=>	'Accepter qu\'une signature soit complÃštement Ã©crite en lettres capitales.',
-'Max sig length label'		=>	'Longueur maximale de la signature',
-'Max sig length help'		=>	'Nombre maximal de caractÃšres contenus dans une signature d\'utilisateur.',
-'Max sig lines label'		=>	'Lignes maximales de la signature',
-'Max sig lines help'		=>	'Nombre maximal de lignes acceptÃ© dans une signature d\'utilisateur.',
-'Registration subhead'		=>	'Inscription',
-'Banned e-mail label'		=>	'Autoriser les adresses Ã©lectroniques bannies',
-'Banned e-mail help'		=>	'Autoriser l\'utilisation d\'adresse Ã©lectroniques ou de domaines d\'adresse Ã©lectronique bannis lors de l\'inscription ou la modification d\'e-mail d\'utilisateurs. Si laissÃ© au paramÃštre par dÃ©faut (oui), cette action sera autorisÃ©e, mais un avertissement par e-mail sera envoyÃ© Ã  la liste de diffusion (moyen efficace pour dÃ©tecter les inscriptions multiples).',
-'Duplicate e-mail label'	=>	'Autoriser des adresses Ã©lectroniques en double',
-'Duplicate e-mail help'		=>	'Indique si les utilisateurs sont autorisÃ©s Ã  s\'inscrire avec une adresse Ã©lectronique dÃ©jÃ  utilisÃ©e par un autre utilisateur enregistrÃ©. Si autorisÃ©, un e-mail d\'avertissement sera envoyÃ© Ã  la liste de diffusion si un doublon est dÃ©tectÃ©.',
-
-);
Index: trunk/web/punbb/lang/French/admin_ranks.php
===================================================================
--- trunk/web/punbb/lang/French/admin_ranks.php	(revision 10)
+++ 	(revision )
@@ -1,23 +1,0 @@
-<?php
-
-// Language definitions used in admin_ranks.php
-$lang_admin_ranks = array(
-
-'Must be integer message'	=>	'Le nombre minimum de messages doit Ãªtre indiquÃ© sous forme de nombre entier positif.',
-'Dupe min posts message'	=>	'Il existe dÃ©jÃ  un rang avec un nombre minimum de messages fixÃ© Ã  %s.',
-'Must enter title message'	=>	'Vous devez indiquer un intitulÃ© pour le rang.',
-'Rank added redirect'		=>	'Rang ajoutÃ©. Redirection&#160;âŠ',
-'Rank updated redirect'		=>	'Rang mis Ã  jour. Redirection&#160;âŠ',
-'Rank removed redirect'		=>	'Rang supprimÃ©. Redirection&#160;âŠ',
-'Ranks head'			=>	'Rangs',
-'Add rank subhead'		=>	'Ajouter le rang',
-'Add rank info'			=>	'Indiquez un rang et le nombre minimum de messages publiÃ©s pour qu\'un utilisateur puisse obtenir ce rang. DiffÃ©rents rangs ne peuvent dÃ©pendre du mÃªme nombre minimum de messages. Si une identitÃ© est dÃ©finie pour un utilisateur, cette identitÃ© sera affichÃ©e Ã  la place du rang.',
-'Ranks enabled'			=>	'<strong>Les rangs d\'utilisateur sont activÃ©s dans %s.</strong>',
-'Ranks disabled'		=>	'<strong>Les rangs d\'utilisateur sont dÃ©sactivÃ©s dans %s.</strong>',
-'Rank title label'		=>	'IntitulÃ© de rang',
-'Minimum posts label'		=>	'Nombre de messages minimum',
-'Actions label'			=>	'Actions',
-'Edit remove subhead'		=>	'Modifier/supprimer des rangs',
-'No ranks in list'		=>	'Pas de rangs dÃ©finis pour le moment.',
-
-);
Index: trunk/web/punbb/lang/French/admin_reports.php
===================================================================
--- trunk/web/punbb/lang/French/admin_reports.php	(revision 10)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php
-
-// Language definitions used in admin_reports.php
-$lang_admin_reports = array(
-
-'Report zapped redirect'		=>	'Signalement traitÃ©. Redirection&#160;âŠ',
-'New reports head'			=>	'Nouveaux signalements',
-'Deleted user'				=>	'Utilisateur supprimÃ©',
-'Deleted'				=>	'SupprimÃ©',
-'Post ID'                               =>      'Message nÂ°%s',
-'Report subhead'			=>	'SignalÃ©&#160;: %s',
-'Reported by'				=>	'SignalÃ© par %s',
-'Reason'				=>	'Motif',
-'Zap'					=>	'Marquer comme traitÃ©',
-'No new reports'			=>	'Aucun nouveau signalement pour l\'instant.',
-'Last 10 head'				=>	'10 derniers signalements traitÃ©s',
-'NA'					=>	'N/A',
-'Zapped subhead'			=>	'TraitÃ© le %s par %s',
-'No zapped reports'			=>	'Aucun signalement traitÃ© pour le moment.',
-
-);
Index: trunk/web/punbb/lang/French/admin_users.php
===================================================================
--- trunk/web/punbb/lang/French/admin_users.php	(revision 10)
+++ 	(revision )
@@ -1,110 +1,0 @@
-<?php
-
-// Language definitions used in admin-users.php
-$lang_admin_users = array(
-
-'Non numeric message'			=>	'Vous avez indiquÃ© une valeur non numÃ©rique dans une colonne n\'acceptant que des valeurs numÃ©riques.',
-'Invalid date time message'		=>	'Vous avez indiquÃ© une date, un horaire invalide.',
-'Not verified'				=>	'Non vÃ©rifiÃ©',
-
-// Actions: mass delete/ban etc.
-'No users selected'                     =>      'Aucun utilisateur sÃ©lectionnÃ©.',
-'No move admins message'                =>      'Pour des raisons de sÃ©curitÃ©, vous n\'Ãªtes pas autorisÃ©(e) Ã  dÃ©placer plusieurs administrateurs vers un autre groupe. Si vous souhaitez dÃ©placer ces administrateurs, vous pouvez le faire dans leurs profils respectifs.',
-'No delete admins message'              =>      'Les administrateurs ne peuvent Ãªtre supprimÃ©s. Pour supprimer des administrateurs, vous devez d\'abord les dÃ©placer vers un autre groupe d\'utilisateurs.',
-'No ban admins message'                 =>      'Les administrateurs ne peuvent Ãªtre bannis. Pour bannir des administrateurs, vous devez d\'abord les dÃ©placer vers un autre groupe d\'utilisateurs.',
-'No ban mods message'                   =>      'Les modÃ©rateurs ne peuvent Ãªtre bannis. Pour bannir des modÃ©rateurs, vous devez d\'abord les dÃ©placer vers un autre groupe d\'utilisateurs.',
-'Move users'                            =>      'Changer le groupe d\'utilisateurs',
-'Move users subhead'                    =>      'Choisir un nouveau groupe d\'utilisateurs',
-'New group label'                       =>      'Nouveau groupe',
-'New group help'                        =>      'Choisissez le groupe vers lequel l\'(les) utilisateur(s) sÃ©lectionnÃ©(s) sera(seront) dÃ©placÃ©(s). Pour des raisons de sÃ©curitÃ©, il n\'est pas possible de dÃ©placer plusieurs utilisateurs vers le groupe des administrateurs.',
-'Invalid group message'                 =>      'ID de groupe invalide.',
-'Users move redirect'                   =>      'Groupe d\'utilisateur modifiÃ©. Redirection&#160;âŠ',
-'Delete users'                          =>      'Supprimer des utilisateurs',
-'Confirm delete legend'                 =>      'Important : lisez avant de supprimer des utilisateurs',
-'Confirm delete info'                   =>      'Veuillez confirmer que vous souhaitez supprimer ces utilisateurs.',
-'Delete posts'                          =>      'Supprimer tous les messages et discussions que ces utilisateurs ont publiÃ©s.',
-'Delete warning'                        =>      'Avertissement ! Des utilisateurs et/ou messages supprimÃ©s ne peuvent Ãªtre rÃ©cupÃ©rÃ©s. Si vous choisissez de ne pas supprimer les messages crÃ©Ã©s par ces utilisateurs, ils ne pourront Ãªtre supprimÃ©s plus tard que manuellement.',      
-'Users delete redirect'                 =>      'Utilisateurs supprimÃ©s. Redirection&#160;âŠ',
-'Ban users'                             =>      'Bannir des utilisateurs',
-'Message expiry subhead'                =>      'Message de bannissement et expiration',
-'Ban message label'                     =>      'Message de bannissement',
-'Ban message help'                      =>      'Un message qui s\'affichera pour les utilisateurs bannis lorsqu\'ils consulteront les forums.',
-'Expire date label'                     =>      'Date d\'expiration',
-'Expire date help'                      =>      'La date Ã  laquelle ces bannissements devront Ãªtre automatiquement supprimÃ©s (format : yyyy-mm-dd). Laisser vide pour une suppression manuelle.',
-'Ban IP label'                          =>      'Bannissement d\'adresse IP',
-'Ban IP help'                           =>      'Bannir Ã©galement les adresses IP des utilisateurs bannis pour leur rendre une nouvelle crÃ©ation de compte plus difficile.',
-'Invalid date message'                  =>      'Vous avez indiquÃ© une date d\'expiration invalide.',
-'Invalid date reasons'                  =>      'Le format devrait correspondre Ã  YYYY-MM-DD et la date doit Ãªtre dÃ©finie Ã  au moins un jour plus tard.',
-'Users banned redirect'                 =>      'Utilisateurs bannis. Redirection&#160;âŠ',
-
-'User search head'			=>	'Recherche d\'utilisateur',
-'User search subhead'			=>	'Indiquer les critÃšres de recherche',
-'User search info'			=>	'Rechercher des utilisateurs dans la base de donnÃ©es. Vous pouvez indiquer un ou plusieurs termes Ã  rechercher. Les jokers sous forme d\'astÃ©risques (*) sont acceptÃ©s.',
-'Username label'			=>	'Nom d\'utilisateur',
-'E-mail address label'			=>	'Adresse Ã©lectronique',
-'Title label'				=>	'Titre',
-'Real name label'			=>	'Nom rÃ©el',
-'Website label'				=>	'Site Web',
-'Jabber label'				=>	'Jabber',
-'ICQ label'				=>	'ICQ',
-'MSN label'				=>	'MSN Messenger',
-'AOL label'				=>	'AOL IM',
-'Yahoo label'				=>	'Yahoo Messenger',
-'Location label'			=>	'Lieu',
-'Signature label'			=>	'Signature',
-'Admin note label'			=>	'Note d\'administrateur',
-'Posts more than label'			=>	'Nombre de messages supÃ©rieur Ã ',
-'Posts less than label'			=>	'Nombre de messages infÃ©rieur Ã ',
-'Last post after label'			=>	'Dernier message publiÃ© aprÃšs',
-'Date help'				=>	'(dd-mm-yyyy hh:mm:ss)',
-'Last post before label'		=>	'Dernier message publiÃ© avant',
-'Last visit after label'  =>  'DerniÃšre visite aprÃšs',
-'Last visit before label'  =>  'DerniÃšre visite avant',
-'Registered after label'		=>	'Inscrit aprÃšs',
-'Registered before label'		=>	'Inscrit avant',
-'Order by label'			=>	'CritÃšre de tri&160;:',
-'Order by username'			=>	'nom d\'utilisateur',
-'Order by e-mail'			=>	'e-mail',
-'Order by posts'			=>	'nombre de messages',
-'Order by last post'			=>	'dernier message',
-'Order by last visit'    =>  'derniÃšre visite',
-'Order by registered'			=>	'inscrit',
-'Ascending'				=>	'ascendant',
-'Descending'				=>	'descendant',
-'User group label'			=>	'Groupe d\'utilisateurs',
-'All groups'				=>	'Tous les groupes',
-'Unverified users'			=>	'Utilisateurs non vÃ©rifiÃ©s',
-'Submit search'				=>	'Lancer la recherche',
-'IP search head'			=>	'Recherche d\'IP',
-'IP search subhead'			=>	'Indiquer l\'IP Ã  rechercher',
-'IP address label'			=>	'Adresse IP',
-'IP address help'			=>	'L\'adresse IP Ã  rechercher dans la base de donnÃ©es des messages.',
-'Find IP address'			=>	'Rechercher l\'adresse IP',
-
-'Results head'				=>	'Utilisateurs',
-'Results username head'			=>	'Nom d\'utilisateur',
-'Results e-mail head'			=>	'E-mail',
-'Results title head'			=>	'IdentitÃ©/Ã©tat',
-'Results posts head'			=>	'Messages',
-'Results admin note head'		=>	'Note d\'administrateur',
-'Results actions head'			=>	'Actions',
-'Results IP address head'		=>	'Adresse IP',
-'Results last used head'		=>	'RÃ©cemment utilisÃ©e',
-'Results times found head'		=>	'Nombre de fois trouvÃ©',
-'Results action head'			=>	'Action',
-'Results find more link'		=>	'Trouver davantage d\'utilisateurs pour cette IP',
-'Results no posts found'		=>	'Aucun message n\'a Ã©tÃ© publiÃ© par cet utilisateur dans ce forum pour le moment.',
-'Select'                                =>      'SÃ©lectionner',
-'Select all'                            =>      'Tout sÃ©lectionner',
-'Unselect all'                          =>      'Tout dÃ©sÃ©lectionner',
-'Ban'                                   =>      'Bannir',
-'Delete'                                =>      'Supprimer',
-'Change group'                          =>      'Changer de groupe',
-'Bad IP message'			=>	'L\'adresse IP indiquÃ©e n\'est pas correctement formatÃ©e.',
-'Results view IP link'			=>	'Afficher les stats IP',
-'Results show posts link'		=>	'Afficher les messages',
-'Results guest'				=>	'InvitÃ©',
-'Results no IP found'			=>	'L\'adresse IP indiquÃ©e est introuvable dans la base de donnÃ©es.',
-'No match'				=>	'Aucune correspondance'
-
-);
Index: trunk/web/punbb/lang/French/common.php
===================================================================
--- trunk/web/punbb/lang/French/common.php	(revision 10)
+++ trunk/web/punbb/lang/French/common.php	(revision 1)
@@ -1,163 +1,154 @@
 <?php
 
+/*
+// Determine what locale to use
+switch (PHP_OS)
+{
+	case 'WINNT':
+	case 'WIN32':
+		$locale = 'french';
+		break;
+
+	case 'FreeBSD':
+	case 'NetBSD':
+	case 'OpenBSD':
+		$locale = 'fr_FR.ISO8859-1';
+		break;
+
+	default:
+		$locale = 'fr_FR';
+		break;
+}
+
+// Attempt to set the locale
+setlocale(LC_CTYPE, $locale);
+*/
+
+
 // Language definitions for frequently used strings
+ 
 $lang_common = array(
-
 // Text orientation and encoding
 'lang_direction'		=>	'ltr',	// ltr (Left-To-Right) or rtl (Right-To-Left)
-'lang_identifier'		=>	'fr', //iso code 639-1 value (see http://www.loc.gov/standards/iso639-2/php/code_list.php)
-
-// Number formatting
-'lang_decimal_point'            =>        ',',
-'lang_thousands_sep'            =>        ' ',
-
+'lang_encoding'			=>	'utf-8',
+'lang_multibyte'		=>	false,
+ 
 // Notices
 'Bad request'			=>	'Erreur. Le lien que vous avez suivi est incorrect ou pÃ©rimÃ©.',
-'No view'			=>	'Vous n\'Ãªtes pas autorisÃ©(e) Ã  visiter ces forums.',
-'No permission'			=>	'Vous n\'Ãªtes pas autorisÃ©(e) Ã  afficher cette page.',
-'Bad referrer'			=>	'Mauvais HTTP_REFERER. Vous avez Ã©tÃ© renvoyÃ©(e) vers cette page par une source inconnue ou interdite. Si le problÃšme persiste, assurez-vous que le champ Â«&#160;URL de base&#160;Â» de la page Administration&#160;Â» Options est correctement renseignÃ© et que vous vous rendez sur ces forums en utilisant cette URL. Vous pourrez trouver davantage d\'informations dans la documentation de FluxBB.',
-'No cookie'			=>	'Vous semblez avoir Ã©tÃ© identifiÃ©(e), cependant aucun cookie n\'a Ã©tÃ© envoyÃ©. Veuillez vÃ©rifier vos paramÃštres et, si possible, activer les cookies pour ce site.',
-'Pun include error'		=>	'Impossible de procÃ©der Ã  l\'inclusion utilisateur %s Ã  partir du gabarit %s. Ce fichier ne se trouve ni dans le dossier des gabarits, ni dans le dossier d\'inclusion d\'utilisateur.',
-
+'No view'				=>	'Vous n\'Ãªtes pas autorisÃ© Ã  visiter ces forums.',
+'No permission'			=>	'Vous n\'Ãªtes pas autorisÃ© Ã  afficher cette page.',
+'Bad referrer'			=>	'Mauvais HTTP_REFERER. Vous avez Ã©tÃ© renvoyÃ© sur cette page par une source inconnue ou interdite. Si le problÃšme persiste, assurez-vous que le champ \'URL de base\' de la page Admin/Options est correctement renseignÃ© et que vous visitez ces forums en utilisant cette URL. Plus d\'informations pourront-Ãªtres trouvÃ©es dans la documentation de PunBB.',
+ 
+// Topic/forum indicators
+'New icon'				=>	'Il y a des nouveaux messages',
+'Normal icon'			=>	'<!-- -->',
+'Closed icon'			=>	'Cette discussion est fermÃ©e',
+'Redirect icon'			=>	'Forum de redirection',
+ 
 // Miscellaneous
 'Announcement'			=>	'Annonce',
-'Options'			=>	'Options',
-'Submit'			=>	'Valider',	// "name" of submit buttons
-'Ban message'			=>	'Vous Ãªtes banni(e) de ce forum.',
-'Ban message 2'			=>	'Votre bannissement expire le',
-'Ban message 3'			=>	'L\'administrateur ou le modÃ©rateur qui vous a banni envoie le message suivant :',
+'Options'				=>	'Options',
+'Actions'				=>	'Actions',
+'Submit'				=>	'Envoyer',	// "name" of submit buttons
+'Ban message'			=>	'Vous Ãªtes exclu de ce forum.',
+'Ban message 2'			=>	'Votre exclusion expire le',
+'Ban message 3'			=>	'L\'administrateur ou le modÃ©rateur qui vous a exclu envoit le message suivant&#160;:',
 'Ban message 4'			=>	'Pour toute question, contactez l\'administrateur',
-'Never'				=>	'Jamais',
-'Today'				=>	'Aujourd\'hui',
-'Yesterday'			=>	'Hier',
-'Info'				=>	'Info',		// a common table header
-'Go back'			=>	'Retour',
+'Never'					=>	'Jamais',
+'Today'					=>	'Aujourd\'hui',
+'Yesterday'				=>	'Hier',
+'Info'					=>	'Info',		// a common table header
+'Go back'				=>	'Retour',
 'Maintenance'			=>	'Maintenance',
 'Redirecting'			=>	'Redirection',
-'Click redirect'		=>	'Cliquez ici si vous ne voulez pas attendre (ou si votre navigateur ne vous redirige pas automatiquement).',
-'on'				=>	'activÃ©',		// as in "BBCode is on"
-'off'				=>	'dÃ©sactivÃ©',
-'Invalid email'			=>	'L\'adresse Ã©lectronique que vous avez saisie est invalide.',
-'Required'			=>	'(obligatoire)',
-'required field'		=>	'est un champ obligatoire pour ce formulaire.',	// for javascript form validation
-'Last post'			=>	'Dernier message',
-'by'				=>	'par',	// as in last post by someuser
-'New posts'			=>	'Nouveaux messages',
-'New posts info'		=>	'Atteindre le premier nouveau message de cette discussion.',	// the popup text for new posts links
-'Username'			=>	'Nom d\'utilisateur',
-'Password'			=>	'Mot de passe',
-'Email'				=>	'E-mail',
-'Send email'			=>	'Envoyer un e-mail',
+'Click redirect'		=>	'Cliquez ici si vous ne voulez pas attendre (ou si votre navigateur ne vous redirige pas).',
+'on'					=>	'actif',		// as in "BBCode is on"
+'off'					=>	'inactif',
+'Invalid e-mail'		=>	'L\'adresse e-mail que vous avez saisie est invalide.',
+'required field'		=>	'est un champ requis pour ce formulaire.',	// for javascript form validation
+'Last post'				=>	'Dernier message',
+'by'					=>	'par',	// as in last post by someuser
+'New posts'				=>	'Nouveaux&#160;messages',	// the link that leads to the first new post (use &#160; for spaces)
+'New posts info'		=>	'Allez au premier nouveau message de cette discussion.',	// the popup text for new posts links
+'Username'				=>	'Nom d\'utilisateur',
+'Password'				=>	'Mot de passe',
+'E-mail'				=>	'e-mail',
+'Send e-mail'			=>	'Envoyer un e-mail',
 'Moderated by'			=>	'ModÃ©rÃ© par',
 'Registered'			=>	'Date d\'inscription',
-'Subject'			=>	'Sujet',
-'Message'			=>	'Message',
-'Topic'				=>	'Discussion',
-'Forum'				=>	'Forum',
-'Posts'				=>	'Messages',
-'Replies'			=>	'RÃ©ponses',
-'Pages'				=>	'Pages&#160;:',
-'Page'				=>	'Page %s',
-'BBCode'			=>	'BBCode&#160;:',	// You probably shouldn't change this
-'img tag'			=>	'Balise [img]&#160;:',
-'Smilies'			=>	'ÃmoticÃŽnes&#160;:',
-'and'				=>	'et',
+'Subject'				=>	'Sujet',
+'Message'				=>	'Message',
+'Topic'					=>	'Discussion',
+'Forum'					=>	'Forum',
+'Posts'					=>	'Messages',
+'Replies'				=>	'RÃ©ponses',
+'Author'				=>	'Auteur',
+'Pages'					=>	'Pages',
+'BBCode'				=>	'BBCode',	// You probably shouldn't change this
+'img tag'				=>	'Balise [img]',
+'Smilies'				=>	'ÃmoticÃŽnes',
+'and'					=>	'et',
 'Image link'			=>	'image',	// This is displayed (i.e. <image>) instead of images when "Show images" is disabled in the profile
-'wrote'				=>	'a Ã©crit&#160;:',	// For [quote]'s
-'Mailer'			=>	'E-mail automatique',	// As in "MyForums Mailer" in the signature of outgoing e-mails
-'Important information'		=>	'Information importante',
-'Write message legend'		=>	'Veuillez composer votre message et l\'envoyer',
-'Previous'                      =>      'PrÃ©cÃ©dent',
-'Next'                          =>      'Suivant',
-'Spacer'                        =>      'âŠ', // Ellipsis for paginate
-
+'wrote'					=>	'a Ã©crit',	// For [quote]'s
+'Code'					=>	'Code',		// For [code]'s
+'Mailer'				=>	'E-mail automatique',	// As in "MyForums Mailer" in the signature of outgoing e-mails
+'Important information'	=>	'Information importante',
+'Write message legend'	=>	'Veuillez Ã©crire votre message et l\'envoyer',
+ 
 // Title
-'Title'				=>	'Titre de l\'utilisateur',
-'Member'			=>	'Membre',	// Default title
-'Moderator'			=>	'ModÃ©rateur',
+'Title'					=>	'Titre',
+'Member'				=>	'Membre',	// Default title
+'Moderator'				=>	'ModÃ©rateur',
 'Administrator'			=>	'Administrateur',
-'Banned'			=>	'Banni(e)',
-'Guest'				=>	'InvitÃ©',
+'Banned'				=>	'Banni',
+'Guest'					=>	'InvitÃ©',
  
 // Stuff for include/parser.php
-'BBCode error no opening tag'		=>	'La balise [/%1$s] a Ã©tÃ© trouvÃ©e sans balise [%1$s] correspondante',
-'BBCode error invalid nesting'		=>	'La balise [%1$s] a Ã©tÃ© ouverte dans la balise [%2$s], ceci n\'est pas autorisÃ©',
-'BBCode error invalid self-nesting'	=>	'La balise [%s] a Ã©tÃ© ouverte dans cette mÃªme balise, ceci n\'est pas autorisÃ©',
-'BBCode error no closing tag'		=>	'La balise [%1$s] a Ã©tÃ© trouvÃ©e sans balise [/%1$s] correspondante',
-'BBCode error empty attribute'		=>	'La balise [%s] comporte un attribut non dÃ©fini',
-'BBCode code problem'			=>	'Il y a un problÃšme avec vos balises [code]',
-'BBCode list size error'		=>	'Votre liste Ã©tant trop longue pour Ãªtre analysÃ©e, veuillez la rÃ©duire s\'il vous plaÃ®t&#160;!',
-
+'BBCode error'			=>	'La syntaxe BBCode est incorrecte.',
+'BBCode error 1'		=>	'Il manque la balise d\'ouverture pour [/quote].',
+'BBCode error 2'		=>	'Il manque la balise de fermeture pour [code].',
+'BBCode error 3'		=>	'Il manque la balise d\'ouverture pour [/code].',
+'BBCode error 4'		=>	'Il manque une ou plusieurs balises de fermeture pour [quote].',
+'BBCode error 5'		=>	'Il manque une ou plusieurs balises d\'ouverture manquantes pour [/quote].',
+ 
 // Stuff for the navigator (top of every page)
-'Index'				=>	'Accueil',
-'User list'			=>	'Liste des membres',
-'Rules'				=>  	'RÃšgles',
-'Search'			=>  	'Recherche',
-'Register'			=>  	'Inscription',
-'Login'				=>  	'Identification',
-'Not logged in'			=>  	'Vous n\'Ãªtes pas identifiÃ©(e).',
-'Profile'			=>	'Profil',
-'Logout'			=>	'DÃ©connexion',
-'Logged in as'			=>	'ConnectÃ©(e) sous l\'identitÃ©&#160;',
-'Admin'				=>	'Administration',
-'Last visit'			=>	'DerniÃšre visite&#160;: %s',
-'Topic searches'		=>	'Contributions&#160;:',
-'New posts header'		=>	'Nouvelles',
-'Active topics'			=>	'RÃ©centes',
-'Unanswered topics'		=>      'Sans rÃ©ponse',
-'Posted topics'			=>	'Personnelles',
-'Show new posts'		=>	'Trouver les discussions avec de nouveaux messages depuis votre derniÃšre visite.',
-'Show active topics'		=>	'Trouver les discussions comportant des messages rÃ©cents.',
-'Show unanswered topics'	=>	'Trouver les discussions sans rÃ©ponse.',
-'Show posted topics'		=>	'Trouver les discussions auxquelles vous avez participÃ©.',
+'Index'					=>	'Index',
+'User list'				=>	'Liste des membres',
+'Rules'					=>  'RÃšgles',
+'Search'				=>  'Recherche',
+'Register'				=>  'Inscription',
+'Login'					=>  'S\'identifier',
+'Not logged in'			=>  'Vous n\'Ãªtes pas identifiÃ©.',
+'Profile'				=>	'Profil',
+'Logout'				=>	'DÃ©connexion',
+'Logged in as'			=>	'ConnectÃ© en tant que',
+'Admin'					=>	'Administration',
+'Last visit'			=>	'DerniÃšre visite',
+'Show new posts'		=>	'Afficher les nouveaux messages depuis la derniÃšre visite',
 'Mark all as read'		=>	'Marquer toutes les discussions comme lues',
-'Mark forum read'               =>      'Marquer ce forum comme lu',
-'Title separator'		=>	' / ',
-
+'Link separator'		=>	'',	// The text that separates links in the navigator
+ 
 // Stuff for the page footer
 'Board footer'			=>	'Pied de page des forums',
-'Jump to'			=>	'Atteindre',
-'Go'				=>	'Aller',		// submit button in forum jump
-'Moderate topic'                =>      'ModÃ©rer la discussion',
-'Move topic'			=>  	'DÃ©placer la discussion',
-'Open topic'			=>  	'Ouvrir la discussion',
-'Close topic'			=>  	'Fermer la discussion',
-'Unstick topic'			=>  	'DÃ©tacher la discussion',
-'Stick topic'			=>  	'Ãpingler la discussion',
+'Search links'			=>	'Liens de recherche',
+'Show recent posts'		=>	'Afficher les messages rÃ©cents',
+'Show unanswered posts'	=>	'Afficher les messages sans rÃ©ponse',
+'Show your posts'		=>	'Afficher vos messages',
+'Show subscriptions'	=>	'Afficher les discussions auxquelles vous Ãªtes abonnÃ©s',
+'Jump to'				=>	'Aller Ã ',
+'Go'					=>	' Aller ',		// submit button in forum jump
+'Move topic'			=>  'DÃ©placer la discussion',
+'Open topic'			=>  'Ouvrir la discussion',
+'Close topic'			=>  'Fermer la discussion',
+'Unstick topic'			=>  'DÃ©tacher la discussion',
+'Stick topic'			=>  'Ãpingler la discussion',
 'Moderate forum'		=>	'ModÃ©rer le forum',
-'Powered by'                    =>      'PropulsÃ© par %s',
+'Delete posts'			=>	'Supprimer plusieurs messages',
+'Debug table'			=>	'Informations de dÃ©bogue',
  
-// Debug information
-'Debug table'                   =>        'Informations de dÃ©bogage',
-'Querytime'                     =>        'GÃ©nÃ©rÃ©es en %1$s secondes, %2$s requÃªtes exÃ©cutÃ©es',
-'Memory usage'			=>	  'Utilisation de la mÃ©moire : %1$s',
-'Peak usage'			=>	  '(pic d\'utilisation : %1$s)',
-'Query times'                   =>        'Temps (s)',
-'Query'                         =>        'RequÃªte',
-'Total query time'              =>        'Temps total d\'exÃ©cution de la requÃªte&#160;: %s',
-
 // For extern.php RSS feed
-'RSS description'                                 =>        'Les sujets les plus rÃ©cents sur %s.',
-'RSS description topic'                           =>        'Les sujets les plus rÃ©cents dans %s.',
-'RSS reply'                                       =>        'RÃ©ponse Ã &#160;:  ', // The topic subject will be appended to this string (to signify a reply)
-'RSS active topics feed'			  =>	    'Flux RSS des discussions actives',
-'Atom active topics feed'			  =>	    'Flux Atom des discussions actives',
-'RSS forum feed'				  =>	    'Flux RSS du forum',
-'Atom forum feed'				  =>	    'Flux Atom du forum',
-'RSS topic feed'				  =>	    'Flux RSS de la discussion',
-'Atom topic feed'				  =>	    'Flux Atom de la discussion',
-
-// Admin related stuff in the header
-'New reports'					  =>	    'De nouveaux signalements ont Ã©tÃ© envoyÃ©s&#160;!',
-'Maintenance mode enabled'			  =>	    'Le mode maintenance est activÃ©&#160;!',
-
-// Units for file sizes
-'Size unit B'            =>  '%s O',
-'Size unit KiB'            =>  '%s Kio',
-'Size unit MiB'            =>  '%s Mio',
-'Size unit GiB'            =>  '%s Gio',
-'Size unit TiB'            =>  '%s Tio',
-'Size unit PiB'            =>  '%s Pio',
-'Size unit EiB'            =>  '%s Eio',
-
-); 
+'RSS Desc Active'		=>	'Les discussions rÃ©cemment actives de',	// board_title will be appended to this string
+'RSS Desc New'			=>	'Les derniÃšres discussions de',					// board_title will be appended to this string
+'Posted'				=>	'Ãcrit le'	// The date/time a topic was started
+);
+ 
Index: trunk/web/punbb/lang/French/delete.php
===================================================================
--- trunk/web/punbb/lang/French/delete.php	(revision 10)
+++ trunk/web/punbb/lang/French/delete.php	(revision 1)
@@ -5,12 +5,8 @@
  
 'Delete post'			=>	'Supprimer le message',
-'Warning'			=>	'Vous Ãªtes sur le point de supprimer dÃ©finitivement ce message&#160;!',
-'Topic warning'			=>	'Attention&#160;! Ceci est le premier message de cette discussion, toute la discussion sera dÃ©finitivement supprimÃ©e.',
-'Delete info'			=>	'Le message que vous souhaitez supprimer vous est prÃ©sentÃ© ci-dessous afin que vous puissiez le revoir avant de continuer.',
-'Reply by'			=>	'RÃ©ponse de %s - %s',
-'Topic by'			=>	'Discussion dÃ©marrÃ©e par %s - %s',
-'Delete'			=>	'Supprimer',	// The submit button
-'Post del redirect'		=>	'Message supprimÃ©. Redirection&#160;âŠ',
-'Topic del redirect'		=>	'Discussion supprimÃ©e. Redirection&#160;âŠ'
+'Warning'				=>	'Attention&#160;: S\'il s\'agit du premier message de la discussion, celle-ci sera entiÃšrement supprimÃ©e&#160;!',
+'Delete'				=>	'Supprimer',	// The submit button
+'Post del redirect'		=>	'Message supprimÃ©. Redirection ...',
+'Topic del redirect'	=>	'Discussion supprimÃ©e. Redirection ...'
  
 );
Index: trunk/web/punbb/lang/French/forum.php
===================================================================
--- trunk/web/punbb/lang/French/forum.php	(revision 10)
+++ trunk/web/punbb/lang/French/forum.php	(revision 1)
@@ -3,14 +3,10 @@
 // Language definitions used in viewforum.php
 $lang_forum = array(
-
+ 
 'Post topic'	=>	'Nouvelle discussion',
-'Views'		=>	'Vues',
-'Moved'		=>	'DÃ©placÃ©e&#160;:',
-'Sticky'	=>	'ÃpinglÃ©e&#160;:',
-'Closed'	=>	'FermÃ©e&#160;:',
-'Empty forum'	=>	'Le forum ne contient aucune discussion.',
-'Mod controls'	=>	'Interventions pour modÃ©rateurs',
-'Is subscribed'	=>	'Vous suivez ce forum',
-'Unsubscribe'	=>	'Ne plus suivre',
-'Subscribe'	=>	'Suivre ce forum'
+'Views'			=>	'Vues',
+'Moved'			=>	'DÃ©placÃ©',
+'Sticky'		=>	'ÃpinglÃ©',
+'Empty forum'	=>	'Le forum est vide.'
+ 
 );
Index: trunk/web/punbb/lang/French/help.php
===================================================================
--- trunk/web/punbb/lang/French/help.php	(revision 10)
+++ trunk/web/punbb/lang/French/help.php	(revision 1)
@@ -4,63 +4,39 @@
 $lang_help = array(
  
-'Help'				=>	'Aide',
-'produces'			=>	'gÃ©nÃšre',
-
-'BBCode'			=>	'BBCode',
-'BBCode info 1'			=>	'Le BBCode est une collection de balises de formatage utilisÃ©es pour modifier l\'apparence du texte ou ajouter des Ã©lÃ©ments graphiques sur ces forums. BBCode est basÃ© sur le mÃªme principe que le HTML, et y ressemble donc beaucoup. Il suffit d\'encadrer les parties que l\'on souhaite modifier/ajouter par des balises ([nom_de_balise]partie Ã  modifier[/nom_de_balise]). Ci-dessous la liste de toutes les balises BBCodes disponibles et les instructions d\'utilisation.',
-'BBCode info 2'			=>	'Les administrateurs ont la possibilitÃ© d\'activer ou de dÃ©sactiver le systÃšme BBCode. Vous pouvez vÃ©rifier si le BBCode est activÃ© lors de la composition d\'un message ou la modification de votre signature.',
+'Help'					=>	'Aide',
+'produces'				=>	'produit',
+ 
+'BBCode info 1'			=>	'Le BBCode est une collection de balises de formatage utilisÃ©es pour modifier l\'apparence du texte sur ces forums. BBCode est basÃ© sur le mÃªme principe -&#160;et y ressemble beaucoup&#160;- que le HTML. Ci-dessous la liste de tous les BBCodes disponibles et les instructions d\'utilisation.',
+'BBCode info 2'			=>	'Les administrateurs ont la possibilitÃ© d\'activer ou de dÃ©sactiver le systÃšme de BBCode. Vous pouvez vÃ©rifier si le BBCode est activÃ© ou non lorsque vous Ã©crivez un message ou lorsque vous modifiez votre signature.',
  
 'Text style'			=>	'Style du texte',
 'Text style info'		=>	'Les balises suivantes changent l\'apparence du texte&#160;:',
-'Bold text'			=>	'Texte en gras',
+'Bold text'				=>	'Texte en gras',
 'Underlined text'		=>	'Texte soulignÃ©',
 'Italic text'			=>	'Texte en italique',
-'Strike-through text'		=>	'Texte barrÃ©',
-'Red text'			=>	'Texte rouge',
-'Blue text'			=>	'Texte bleu',
-'Heading text'			=>	'Titre',
-'Deleted text'			=>	'Texte supprimÃ©',
-'Inserted text'			=>	'Texte insÃ©rÃ©',
-'Emphasised text'		=>	'Texte en emphase',
-
+'Red text'				=>	'Texte rouge',
+'Blue text'				=>	'Texte bleu',
+ 
 'Links and images'		=>	'Liens et images',
-'This help page'    =>  'Cette page d\'aide',
-'Links info'			=>	'Vous pouvez crÃ©er des liens vers d\'autres documents ou vers des adresses Ã©lectroniques en utilisant les balises suivantes&#160;:',
-'My email address'		=>	'Mon adresse Ã©lectronique',
-'Images info'			=>	'Si vous souhaitez afficher une image, vous pouvez utiliser la balise Â«&#160;<strong>img</strong>&#160;Â». Le texte aprÃšs le signe Â«&#160;=&#160;Â» dans la balise ouvrante est utilisÃ© pour l\'attribut alt (texte alternatif en cas de non affichage de l\'image) et devrait Ãªtre ajoutÃ© Ã  chaque fois que cela est possible',
-'FluxBB bbcode test'	        =>	'Test du bbcode FluxBB',
-
-'Test topic'      =>  'Discussion de test',
-'Test post'        =>  'Message de test',
-'Test forum'      =>  'Forum de test',
-'Test user'        =>  'Utilisateur de test',
-
-'Quotes'			=>	'Citations',
-'Quotes info'			=>	'Si vous souhaitez inclure une citation de quelqu\'un, vous devriez utiliser la balise Â«&#160;<strong>quote</strong>&#160;Â».',
-'Quotes info 2'			=>	'Si vous ne souhaitez pas citer quelqu\'un en particulier, vous pouvez utiliser la balise Â«&#160;<strong>quote</strong>&#160;Â» sans spÃ©cifier de nom.',
+'Links info'			=>	'Vous pouvez crÃ©er des liens vers d\'autres documents ou vers des adresses e-mail en utilisant les balises suivantes&#160;:',
+'My e-mail address'		=>	'Mon adresse e-mail',
+'Images info'			=>	'Si vous souhaitez afficher une image, vous pouvez utiliser la balise <em>img</em> comme ceci&#160;:',
+ 
+'Quotes'				=>	'Citations',
+'Quotes info'			=>	'Si vous souhaitez rÃ©aliser une citation de quelqu\'un, vous devriez utiliser la balise <em>quote</em>.',
+'Quotes info 2'			=>	'Si vous ne souhaitez pas citer quelqu\'un en particulier, vous pouvez utiliser la balise <em>quote</em> sans spÃ©cifier de nom.',
 'Quote text'			=>	'Voici le texte que je veux citer.',
-'produces quote box'		=>	'gÃ©nÃšre une boÃ®te de citation comme ceci&#160;:',
-'quote note'			=>	'Remarque&#160;: si un nom d\'utilisateur contient les caractÃšres [ ou ] vous pouvez les dÃ©limiter par des guillemets.',
+'produces quote box'	=>	'produit une boite de citation comme ceci&#160;:',
  
-'Code'				=>	'Code',
-'Code info'			=>	'Lorsque vous affichez du code source vous devriez vous assurer que vous utilisez la balise Â«&#160;<strong>code</strong>&#160;Â». Le texte affichÃ© entre les balises <em>code</em> utilise une police de caractÃšres Ã  chasse fixe et n\'est pas affectÃ© par les autres balises.',
-'Code text'			=>	'Voici un peu de code.',
-'produces code box'		=>	'gÃ©nÃšre une boÃ®te de code comme ceci&#160;:',
+'Code'					=>	'Code',
+'Code info'				=>	'Lorsque vous affichez du code source vous devriez vous assurer que vous utilisez la balise <em>code</em>. Le texte affichÃ© entre les balises <em>code</em> utilise une police de caractÃšre Ã  chasse fixe et n\'est pas affectÃ© par les autres balises.',
+'Code text'				=>	'Voici un peu de code.',
+'produces code box'		=>	'produit une boite de code comme ceci&#160;:',
  
 'Nested tags'			=>	'Balises imbriquÃ©es',
 'Nested tags info'		=>	'Les balises BBCode peuvent s\'imbriquer afin de rÃ©aliser un formatage avancÃ©. Par exemple&#160;:',
-'Bold, underlined text'		=>	'Texte gras et soulignÃ©',
+'Bold, underlined text'	=>	'Texte gras et soulignÃ©',
  
-'Lists'                    	=>    	'Listes',
-'List info'               	=>    	'Pour crÃ©er une liste vous pouvez utiliser la balise Â«&#160;<strong>list</strong>&#160;Â». Trois types de listes sont Ã  votre disposition.',
-'List text 1'             	=>    	'Exemple de premier Ã©lÃ©ment de liste.',
-'List text 2'             	=>    	'Exemple de deuxiÃšme Ã©lÃ©ment de liste.',
-'List text 3'             	=>    	'Exemple de troisiÃšme Ã©lÃ©ment de liste.',
-'produces list'           	=>    	'gÃ©nÃšre une liste Ã  puces.',
-'produces decimal list'   	=>    	'gÃ©nÃšre une liste numÃ©rotÃ©e.',
-'produces alpha list'     	=>    	'gÃ©nÃšre une liste alphabÃ©tique.',
-
-'Smilies'			=>	'ÃmoticÃŽnes',
-'Smilies info'			=>	'Si vous le souhaitez (et si cette fonctionnalitÃ© est activÃ©e), les forums peuvent convertir une sÃ©rie d\'Ã©moticÃŽnes en images correspondantes. Ces forums reconnaissent les Ã©moticÃŽnes suivantes et les remplacent par des images&#160;:'
+'Smilies info'			=>	'Si vous le souhaitez (et si c\'est activÃ©), les forums peuvent convertir une sÃ©rie d\'Ã©moticÃŽnes en reprÃ©sentation graphique de ceux-ci. Les forums reconnaissent et remplacent les Ã©moticÃŽnes par des images comme ci-dessous&#160;:'
  
 );
Index: trunk/web/punbb/lang/French/index.html
===================================================================
--- trunk/web/punbb/lang/French/index.html	(revision 10)
+++ trunk/web/punbb/lang/French/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/lang/French/index.php
===================================================================
--- trunk/web/punbb/lang/French/index.php	(revision 10)
+++ trunk/web/punbb/lang/French/index.php	(revision 1)
@@ -4,17 +4,18 @@
 $lang_index = array(
  
-'Topics'			=>  	'Discussions',
-'Link to'			=>	'Lien vers&#160;:',	// As in "Link to: http://www.punbb.org/"
-'Empty board'			=>	'Les forums ne contiennent rien pour le moment.',
-'Newest user'			=>	'Dernier utilisateur inscrit&#160;: %s',
-'Users online'			=>	'Membres en ligne&#160;: %s',
-'Guests online'			=>	'InvitÃ©s en ligne&#160;: %s',
-'No of users'			=>	'Nombre total de membres&#160;: %s',
-'No of topics'			=>	'Nombre total de discussions&#160;: %s',
-'No of posts'			=>	'Nombre total de messages&#160;: %s',
-'Online'			=>	'Actuellement en ligne&#160;: ',	// As in "Online: User A, User B etc."
-'Board info'			=>	'Informations sur les forums',
-'Board stats'			=>	'Statistiques des forums',
-'User info'			=>	'Informations sur l\'utilisateur'
+'Topics'				=>  'Discussions',
+'Moderators'			=>  'ModÃ©rateurs',
+'Link to'				=>	'Lien vers',	// As in "Link to http://www.punbb.org/"
+'Empty board'			=>	'Les forums sont vides.',
+'Newest user'			=>	'Dernier utilisateur inscrit',
+'Users online'			=>	'Membres en ligne',
+'Guests online'			=>	'InvitÃ©s en ligne',
+'No of users'			=>	'Nombre total de membres',
+'No of topics'			=>	'Nombre total de discussions',
+'No of posts'			=>	'Nombre total de messages',
+'Online'				=>	'Actuellement en ligne',	// As in "Online: User A, User B etc."
+'Board info'			=>	'Informations Forums',
+'Board stats'			=>	'Statistiques Forums',
+'User info'				=>	'Informations utilisateurs'
  
 );
Index: trunk/web/punbb/lang/French/install.php
===================================================================
--- trunk/web/punbb/lang/French/install.php	(revision 10)
+++ 	(revision )
@@ -1,120 +1,0 @@
-<?php
-
-// Language definitions used in install.php, localized by adaur
-
-$lang_install = array(
-
-'Install message'			=>	'Le fichier \'config.php\' n\'existe pas ou est corrompu. Cela veut dire que FluxBB n\'a pas encore Ã©tÃ© installÃ©. Pour l\'installer, veuillez suivre les instructions ci-dessous.',
-'Choose install language'		=>	'Choisir la langue du script d\'installation',
-'Choose install language info'	        =>	'La langue utilisÃ©e pour ce script d\'installation. La langue par dÃ©faut utilisÃ©e pour les forums peut Ãªtre dÃ©finie ci-dessous.',
-'Install language'			=>	'Installer la langue',
-'Change language'                       =>      'Changer de langue',
-'Next'					=>	'Suivante',
-'Already installed'			=>	'Il semble que FluxBB soit dÃ©jÃ  installÃ©. Veuillez vous rendre <a href="index.php">ici</a> plutÃŽt.',
-'You are running error'			=>	'Vous utilisez la version %2$s de %1$s. FluxBB %3$s nÃ©cessite au moins %1$s %4$s pour fonctionner correctement. Vous devez mettre Ã  niveau votre installation %1$s avant de poursuivre.',
-'My FluxBB Forum'			=>	'Mon Forum FluxBB',
-'Description'				=>	'Malheureusement, on ne peut pas vous expliquer ce qu\'est FluxBB - vous devrez vous en rendre compte par vous-mÃªme.',
-'Username 1'				=>	'Les noms d\'utilisateurs doivent comporter au moins 2 caractÃšres.',
-'Username 2'				=>	'Les noms d\'utilisateurs ne doivent pas comporter plus de 25 caractÃšres.',
-'Username 3'				=>	'Le nom d\'utilisateur Â« guest Â» est rÃ©servÃ©.',
-'Username 4'				=>	'Les noms d\'utilisateurs ne doivent pas ressembler Ã  une adresse IP.',
-'Username 5'				=>	'Les noms d\'utilisateurs ne doivent pas comporter tous les caractÃšres \', " et [ ou ] en mÃªme temps.',
-'Username 6'				=>	'Les noms d\'utilisateurs ne doivent pas comporter de balises de formatage de texte (BBCode) utilisÃ©s par les forums.',
-'Short password'			=>	'Les mots de passe doivent comporter au moins 4 caractÃšres.',
-'Passwords not match'			=>	'Les mots de passe ne coÃ¯ncident pas.',
-'Wrong email'				=>	'L\'e-mail d\'administrateur que vous avez indiquÃ© est invalide.',
-'No board title'			=>	'Vous devez indiquer un titre pour les forums.',
-'Error default language'		=>	'La langue par dÃ©faut choisie semble ne pas exister.',
-'Error default style'			=>	'Le style par dÃ©faut choisi semble ne pas exister.',
-'No DB extensions'			=>	'Cet environnement PHP n\'est compatible avec aucune des bases de donnÃ©es prises en charge par FluxBB. PHP doit prendre en charge MySQL, PostgreSQL ou SQLite pour pouvoir installer FluxBB.',
-'Administrator username'		=>	'Nom d\'utilisateur de l\'administrateur',
-'Administrator password 1'		=>	'Mot de passe de l\'administarteur',
-'Administrator password 2'		=>	'Confirmation du mot de passe de l\'administrateur',
-'Administrator email'			=>	'E-mail de l\'administrateur',
-'Board title'				=>	'Titre des forums',
-'Base URL'				=>	'URL de base',
-'Required field'			=>	'est un champ obligatoire dans ce formulaire.',
-'FluxBB Installation'			=>	'Installation de FluxBB',
-'Welcome'				=>	'Vous allez installer FluxBB. Pour ce faire, vous devez remplir le formulaire ci-dessous. Si vous rencontrez des difficultÃ©s concernant cette installation, veuillez vous rÃ©fÃ©rer Ã  la documentation.',
-'Install'				=>	'Installer FluxBB 1.4',
-'Errors'				=>	'Les erreurs suivantes doivent Ãªtre corrigÃ©es :',
-'Database setup'			=>	'ParamÃ©trage de la base de donnÃ©es',
-'Info 1'				=>	'Veuillez renseigner les informations demandÃ©es pour paramÃ©trer votre base de donnÃ©es FluxBB. Vous devez connaÃ®tre toutes les informations demandÃ©es avant de procÃ©der Ã  l\'installation.',
-'Select database'			=>	'Choisir votre type de base de donnÃ©es',
-'Info 2'				=>	'FluxBB prend actuellement en charge MySQL, PostgreSQL et SQLite. Si la base de donnÃ©es que vous avez choisie ne figure pas dans le menu dÃ©roulant ci-dessous, cela signifie que votre environnement PHP n\'est pas compatible avec cette base de donnÃ©es-ci. Vous pourrez trouver davantage d\'informations concernant la prise en charge de base de donnÃ©es particuliÃšres dans la FAQ.',
-'Dual MySQL'				=>	'FluxBB a dÃ©tectÃ© que votre environnement PHP prend en charge 2 moyens diffÃ©rents de communication avec MySQL. Les deux options sont nommÃ©es Â« standard Â» et Â« improved Â». Si vous ne savez pas trop lequel utiliser, commencez par essayer avec Â« improved Â» et si cela ne fonctionne pas, essayez Â« standard Â».',
-'InnoDB'				=>	'FluxBB a dÃ©tectÃ© que votre serveur devrait prendre en charge <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb.html">InnoDB</a>. Cela serait un bon choix si vous avez l\'intention de mettre Ã  disposition une grande plate-forme de discussion. Si vous n\'Ãªtes pas sÃ»r de vous, il est recommandÃ© de ne pas utiliser InnoDB.',
-'Database type'				=>	'Type de base de donnÃ©es',
-'Required'				=>	'(Obligatoire)',
-'Database hostname'			=>	'Indiquer le nom d\'hÃŽte de votre serveur de base de donnÃ©es',
-'Info 3'				=>	'L\'adresse du serveur de base de donnÃ©es (exemple : localhost, db.monhote.com ou 192.168.0.15). Vous pouvez spÃ©cifier un numÃ©ro de port si votre base de donnÃ©es n\'utilise pas le port par dÃ©faut (exemple : localhost:3580). Pour la prise en charge de SQLite, indiquer n\'importe quoi ou laisser \'localhost\'.',
-'Database server hostname'		=>      'Nom d\'hÃŽte du serveur de base de donnÃ©es',
-'Database enter name'			=>	'Indiquer le nom de votre base de donnÃ©es',
-'Info 4'				=>	'Le nom de la base de donnÃ©es dans laquelle FluxBB sera installÃ©. La base de donnÃ©e doit exister. Pour SQLite, indiquer le chemin relatif vers le fichier de base de donnÃ©es. Pour des raisons de sÃ©curitÃ©, il est fortement recommandÃ© de placer la base de donnÃ©es SQLite dans un dossier privÃ© (non accessible par le Web) tant que possible. Si le fichier de base de donnÃ©es SQLite n\'existe pas, FluxBB tentera de le crÃ©er.',
-'Database name'				=>	'Nom de la base de donnÃ©es',
-'Database enter informations'	        =>	'Indiquer le nom d\'utilisateur et le mot de passe de votre base de donnÃ©es',
-'Database username'			=>	'Nom d\'utilisateur de base de donnÃ©es',
-'Info 5'				=>	'Indiquer le nom d\'utilisateur et le mot de passe avec lesquels vous vous connectez Ã  la base de donnÃ©es. Ã ignorer pour SQLite.',
-'Database password'			=>	'Mot de passe de base de donnÃ©es',
-'Database enter prefix'			=>	'Indiquer le prÃ©fixe de table de la base de donnÃ©es',
-'Info 6'				=>	'Si vous le souhaitez, vous pouvez spÃ©cifier un prÃ©fixe de table. Ainsi vous pourrez faire fonctionner plusieurs copies de FluxBB dans la mÃªme base de donnÃ©es (exemple : foo_).',
-'Table prefix'				=>	'PrÃ©fixe de table',
-'Administration setup'			=>	'ParamÃ©trage de l\'administration',
-'Info 7'				=>	'Veuillez renseigner les informations demandÃ©es afin de paramÃ©trer un administrateur pour votre installation FluxBB.',
-'Admin enter username'			=>	'Indiquer le nom d\'utilisateur de l\'administrateur',
-'Info 8'				=>	'Le nom d\'utilisateur de l\'administrateur des forums. Vous pourrez crÃ©er davantage d\'administrateurs et de modÃ©rateurs plus tard. Les noms d\'utilisateur peuvent comporter de 2 Ã  25 caractÃšres.',
-'Admin enter password'			=>	'Indiquer et confirmer le mot de passe administrateur',
-'Info 9'				=>	'Les mots de passe doivent comporter au moins 4 caractÃšres. Ils sont sensibles Ã  la casse.',
-'Password'				=>	'Mot de passe',
-'Confirm password'			=>	'Confirmation du mot de passe',
-'Admin enter email'			=>	'Indiquer l\'e-mail de l\'administrateur',
-'Info 10'				=>	'L\'e-mail de l\'administrateur des forums.',
-'Board setup'				=>	'ParamÃ©trage des forums',
-'Info 11'				=>	'Veuillez renseigner les informations demandÃ©es afin de paramÃ©trer vos forums FluxBB.',
-'Enter board title'			=>	'Indiquer le titre des forums',
-'Info 12'				=>	'Le titre de cette plate-forme de discussion (AffichÃ© en haut de chaque page).',
-'Enter board description'		=>	'Indiquer la description des forums',
-'Info 13'				=>	'Une brÃšve description de cette plate-forme de discussion (AffichÃ© en haut de chaque page). Ce champ peut contenir des balises HTML.',
-'Board description'			=>	'Description des forums',
-'Enter base URL'			=>	'Indiquer l\'URL de base de votre installation FluxBB',
-'Info 14'				=>	'L\'URL (sans barre oblique Ã  la fin) de vos forums FluxBB (exemple : http://forum.mondomaine.com ou http://mondomaine.com/~monutilisateur). Ceci <strong>doit</strong> Ãªtre juste, sinon, les administrateurs et les modÃ©rateurs ne pourront pas soumettre de formulaires. Veuillez prendre note que la valeur prÃ©dÃ©finie ci-dessous n\'est qu\'une suggestion de FluxBB.',
-'Choose the default language'	        =>	'Choisir la langue par dÃ©faut',
-'Info 15'				=>	'La langue par dÃ©faut utilisÃ©e pour les invitÃ©s et les utilisateurs qui n\'ont pas optÃ© pour une autre langue dans leur profil.',
-'Default language'			=>	'Langue par dÃ©faut',
-'Choose the default style'		=>	'Choisir le style par dÃ©faut',
-'Info 16'				=>	'Le style par dÃ©faut utilisÃ© pour les invitÃ©s et les utilisateurs qui n\'ont pas optÃ© pour un autre style dans leur profil.',
-'Default style'				=>	'Style par dÃ©faut',
-'Start install'				=>	'DÃ©marrage de l\'installation',
-'DB type not valid'			=>	'Â«&#160;%s&#160;Â» n\'est pas un type de base de donnÃ©es valide',
-'Table prefix error'			=>	'Le prÃ©fixe de table Â«&#160;%s&#160;Â» comporte des cacactÃšres interdits ou est trop long. Le prÃ©fixe peut contenir les lettres de a Ã  z, tout nombre et le caractÃšre de soulignement (underscore). Mais il ne doit pas commencer par un nombre. La taille maximale est de 40 caractÃšres. Veuillez choisir un autre prÃ©fixe.',
-'Prefix reserved'			=>	'Le prÃ©fixe de table Â«&#160;sqlite_&#160;Â» est rÃ©servÃ© pour Ãªtre utilisÃ© par le moteur SQLite. Veuillez choisir un autre prÃ©fixe.',
-'Existing table error'			=>	'Une table nommÃ©e Â«&#160;%susers&#160;Â» est dÃ©jÃ  prÃ©sente dans la base de donnÃ©es Â«&#160;%s&#160;Â». Cela pourrait signifier que FluxBB est dÃ©jÃ  installÃ© ou qu\'une autre application utilise le nom d\'une ou plusieures tables nÃ©cessaires Ã  FluxBB. Si vous souhaitez installer plusieurs copies de FluxBB dans la mÃªme base de donnÃ©es, vous devez choisir un prÃ©fixe de table diffÃ©rent.',
-'InnoDB off'				=>	'InnoDB semble ne pas Ãªtre activÃ©. Veuillez choisir une base de donnÃ©es qui ne prend pas en charge InnoDB ou activez InnoDB sur votre serveur MySQL.',
-'Administrators'			=>	'Administrateurs',
-'Administrator'				=>	'Administrateur',
-'Moderators'				=>	'ModÃ©rateurs',
-'Moderator'				=>	'ModÃ©rateur',
-'Guests'                                =>      'InvitÃ©s',
-'Guest'					=>	'InvitÃ©',
-'New member'				=>	'Nouveau membre',
-'Members'                               =>      'Membres',
-'Member'				=>	'Membre',
-'Announcement'				=>	'Indiquer votre annonce ici.',
-'Rules'					=>	'Indiquer vos rÃšgles ici',
-'Maintenance message'			=>	'Les forums sont temporairement inaccessibles pour maintenance. Veuillez essayer Ã  nouveau dans quelques minutes.',
-'Test post'				=>	'Message de test',
-'Message'				=>	'Si vous lisez ceci (ce que vous faites probablement), l\'installation de FluxBB semble avoir fonctionnÃ© ! A prÃ©sent, identifiez-vous et rendez-vous au panneau d\'administration pour paramÃ©trer vos forums.',
-'Test category'				=>	'CatÃ©gorie de test',
-'Test forum'				=>	'Forum de test',
-'This is just a test forum'		=>	'Ceci n\'est qu\'un forum de test.',
-'Alert cache'				=>	'<strong>Le rÃ©pertoire cache n\'est pas modifiable actuellement !</strong> Pour que FluxBB fonctionne correctement, le rÃ©pertoire nommÃ© <em>%s</em> doit Ãªtre modifiable par PHP. Utilisez chmod pour spÃ©cifier les permissions appropriÃ©es au rÃ©pertoire. Si vous avez un doute, passez le chmod Ã  0777.',
-'Alert avatar'				=>	'<strong>Le rÃ©pertoire avatar n\'est pas modifiable actuellement !</strong> Si vous souhaitez que les utilisateurs puissent envoyer vers le serveur leur propre image avatar, vous devez vÃ©rifier que le rÃ©pertoire nommÃ© <em>%s</em> soit modifiable par PHP. Vous pourrez plus tard choisir d\'enregistrer les images avatar dans un autre rÃ©pertoire (rendez-vous Ã  Admin/Options). Utilisez chmod pour spÃ©cifier les permissions appropriÃ©es au rÃ©pertoire. Si vous avez un doute, passez le chmod Ã  0777.',
-'Alert upload'				=>	'<strong>L\'envoi de fichier semble Ãªtre interdit sur ce serveur !</strong> Si vous souhaitez que les utilisateurs puissent envoyer leur propre image avatar vous devez activer le paramÃštre de configuration file_uploads dans PHP. Une fois que l\'envoi (upload) de fichiers a Ã©tÃ© activÃ©, l\'envoi d\'avatars peut Ãªtre activÃ© dans Administration/Options/FonctionnalitÃ©s.',
-'FluxBB has been installed'		=>	'FluxBB a Ã©tÃ© installÃ©. Pour finaliser l\'installation veuillez suivre les instructions ci-dessous.',
-'Final instructions'			=>	'Instructions finales',
-'Info 17'				=>	'Pour finaliser l\'installation, vous devez cliquer sur le bouton ci-dessous afin de tÃ©lÃ©charger un fichier nommÃ© config.php. Vous devrez ensuite envoyer ce fichier vers le rÃ©pertoire racine de votre installation FluxBB.',
-'Info 18'				=>	'Une fois que vous aurez envoyÃ© config.php vers le serveur, FluxBB sera complÃštement installÃ© ! A ce moment-lÃ  vous pourrez <a href="index.php">vous rendre Ã  la page d\'accueil des forums</a>.',
-'Download config.php file'		=>	'TÃ©lÃ©charger le fichier config.php',
-'FluxBB fully installed'		=>	'FluxBB a Ã©tÃ© complÃštement installÃ© ! Vous pouvez Ã  prÃ©sent <a href="index.php">vous rendre Ã  la page d\'accueil des forums</a>.',
-
-);
Index: trunk/web/punbb/lang/French/login.php
===================================================================
--- trunk/web/punbb/lang/French/login.php	(revision 10)
+++ trunk/web/punbb/lang/French/login.php	(revision 1)
@@ -5,22 +5,18 @@
  
 // Miscellaneous
-'Wrong user/pass'		=>	'Nom d\'utilisateur et/ou mot de passe incorrect.',
+'Wrong user/pass'		=>	'Identifiant et/ou mot de passe incorrect.',
 'Forgotten pass'		=>	'Mot de passe oubliÃ©&#160;?',
-'Login redirect'		=>	'Vous Ãªtes Ã  prÃ©sent identifiÃ©(e). Redirection&#160;âŠ',
-'Logout redirect'		=>	'Vous Ãªtes Ã  prÃ©sent dÃ©connectÃ©(e). Redirection&#160;âŠ',
-'No email match'		=>	'Aucun utilisateur inscrit n\'utilise cette adresse Ã©lectronique',
+'Login redirect'		=>	'Vous Ãªtes maintenant identifiÃ©. Redirection ...',
+'Logout redirect'		=>	'Vous Ãªtes maintenant dÃ©connectÃ©. Redirection ...',
+'No e-mail match'		=>	'Il n`y a pas d\'utilisateur inscrit avec l\'adresse e-mail',
 'Request pass'			=>	'Demande de mot de passe',
-'Request pass legend'		=>	'Indiquez l\'adresse Ã©lectronique utilisÃ©e lors de l\'inscription',
-'Request pass info'		=>	'Un nouveau mot de passe ainsi que le lien pour activer ce nouveau mot de passe vont Ãªtre envoyÃ©s Ã  cette adresse.',
-'Not registered'		=>	'Pas encore inscrit&#160;?',
-'Login legend'			=>	'Indiquez ci-dessous votre nom d\'utilisateur et votre mot de passe',
-'Remember me'			=>	'Me connecter automatiquement lors de mes prochaines visites.',
-'Login info'			=>	'Si vous n\'Ãªtes pas encore inscrit(e) ou si vous avez oubliÃ© votre mot de passe, veuillez cliquer sur le lien appropriÃ© ci-dessous.',
-'New password errors'		=>	'Erreur pour demande de mot de passe',
-'New passworderrors info'	=>	'Les erreurs suivantes doivent Ãªtre corrigÃ©es avant qu\'un nouveau mot de passe puisse Ãªtre envoyÃ©&#160;:',
-
+'Request pass legend'	=>	'Saisissez l\'adresse e-mail avec laquelle vous vous Ãªtes inscrits',
+'Request pass info'		=>	'Un nouveau mot de passe ainsi que le lien pour activer ce nouveau mot de passe vont Ãªtre envoyÃ©s Ã  cette adresse e-mail.',
+'Not registered'		=>	'Toujours pas inscrit&#160;?',
+'Login legend'			=>	'Saisissez ci-dessous votre nom d\'utilisateur et votre mot de passe',
+'Login info'			=>	'Si vous ne vous Ãªtes jamais inscrits  ou si vous avez oubliÃ© votre mot de passe, veuillez cliquer ci-dessous sur le lien appropriÃ©.',
+ 
 // Forget password mail stuff
-'Forget mail'			=>	'Un e-mail contenant des instructions pour modifier votre mot de passe vient d\'Ãªtre envoyÃ© Ã  l\'adresse indiquÃ©e. Si vous ne le recevez pas, vous pouvez contacter l\'administrateur des forums&#160;: ',
-'Email flood'			=>	'Une rÃ©initialisation du mot de passe de ce compte a Ã©tÃ© effectuÃ©e il y a moins d\'une heure. Veuillez patienter un moment avant de rÃ©clamer un nouveau mot de passe.'
-
+'Forget mail'			=>	'Un e-mail avec les instructions pour changer de mot de passe vient d\'Ãªtre envoyÃ© Ã  l\'adresse indiquÃ©e. Si vous ne le recevez pas, vous pouvez contacter l\'administrateur des forums Ã '
+ 
 );
Index: trunk/web/punbb/lang/French/mail_templates/activate_email.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/activate_email.tpl	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/activate_email.tpl	(revision 1)
@@ -1,12 +1,12 @@
-Subject: Demande de changement d'adresse Ã©lectronique
+Subject: Demande de changement d'adresse e-mail
 
 Bonjour <username>,
 
-Vous avez demandÃ© un changement d'adresse Ã©lectronique associÃ©e Ã  votre compte sur les forums de <base_url>. Si vous n'en avez pas fait la demande ou ne souhaitez finalement pas la modifier, veuillez ignorer ce message. Elle ne sera changÃ© que si vous vous rendez Ã  la page d'activation ci-dessous. Pour que cette activation soit effective, vous devez Ãªtre identifiÃ© sur les forums.
+Vous avez fait la demande d'avoir une nouvelle adresse e-mail assignÃ©e Ã  votre compte sur le forum de <base_url>. Si vous n'en avez pas fait la demande ou ne voulez pas en changer, veuillez ignorer ce message. Votre e-mail ne sera changÃ© que si vous visitez la page d'activation ci-dessous. Pour que la page d'activation fonctionne, vous devez Ãªtre identifiÃ© sur le forum.
 
-Afin de changer votre adresse Ã©lectronique, merci de vous rendre Ã  la page suivante :
+Pour changer votre adresse e-mail, merci de visiter la page suivante:
 <activation_url>
 
 -- 
 <board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
+(Ne pas rÃ©pondre a ce message)
Index: trunk/web/punbb/lang/French/mail_templates/activate_password.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/activate_password.tpl	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/activate_password.tpl	(revision 1)
@@ -3,13 +3,12 @@
 Bonjour <username>,
 
-Vous avez demandÃ© un nouveau mot de passe associÃ© Ã  votre compte sur les forums de <base_url>. Si vous n'en avez pas fait la demande ou ne souhaitez finalement pas le modifier, veuillez ignorer ce message. Il ne sera changÃ© que si vous vous rendez Ã  la page d'activation ci-dessous. 
-=======================================================================
+Vous avez fait la demande d'avoir un nouveau mot de passe assignÃ© Ã  votre compte sur le forum de <base_url>. Si vous n'en avez pas fait la demande ou ne voulez pas en changer, veuillez ignorer ce message. Votre mot de passe ne sera changÃ© qui si vous visitez la page d'activation ci-dessous. 
+
 Votre nouveau mot de passe est : <new_password>
-=======================================================================
 
-Afin de modifier votre mot de passe, merci de vous rendre Ã  la page suivante :
+Pour changer votre mot de passe, merci de visiter la page suivante:
 <activation_url>
 
 -- 
 <board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
+(Ne pas rÃ©pondre a ce message)
Index: trunk/web/punbb/lang/French/mail_templates/banned_email_change.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/banned_email_change.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Avertissement - e-mail bannie dÃ©tectÃ©e
-
-L'utilisateur Â« <username> Â» a modifiÃ© son e-mail pour l'adresse e-mail bannie suivante : <email>
-
-Profil utilisateur : <profile_url>
-
--- 
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/banned_email_post.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/banned_email_post.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Avertissement - e-mail bannie dÃ©tectÃ©e
-
-L'utilisateur Â« <username> Â» a publiÃ© un messsage en utilisant l'adresse e-mail bannie suivante : <email>
-
-URL du message : <post_url>
-
--- 
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/banned_email_register.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/banned_email_register.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Avertissement - e-mail bannie dÃ©tectÃ©e
-
-L'utilisateur Â« <username> Â» s'est inscrit avec l'adresse e-mail bannie suivante : <email>
-
-Profil utilisateur : <profile_url>
-
--- 
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/dupe_email_change.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/dupe_email_change.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Avertissement - e-mail en doublon dÃ©tectÃ©e
-
-L'utilisateur Â« <username> Â» a modifiÃ© son e-mail pour l'adresse e-mail appartenant Ã©galement Ã  : <dupe_list>
-
-Profil utilisateur : <profile_url>
-
--- 
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/dupe_email_register.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/dupe_email_register.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Avertissement - e-mail en doublon dÃ©tectÃ©e
-
-L'utilisateur Â« <username> Â» s'est inscrit avec l'adresse e-mail appartenant Ã©galement Ã  : <dupe_list>
-
-Profil utilisateur : <profile_url>
-
--- 
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/form_email.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/form_email.tpl	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/form_email.tpl	(revision 1)
@@ -1,12 +1,12 @@
 Subject: <mail_subject>
 
-<sender> vous a envoyÃ© un message Ã  partir de <board_title>. Vous pouvez rÃ©pondre Ã  <sender> en rÃ©pondant Ã  cet e-mail.
+<sender> de <board_title> vous a envoyÃ© un message. Vous pouvez rÃ©pondre Ã  <sender> en rÃ©pondant Ã  cet e-mail.
 
-Contenu du message :
-=======================================================================
+Contenu du message:
+-----------------------------------------------------------------------
 
 <mail_message>
 
-=======================================================================
+-----------------------------------------------------------------------
 
 -- 
Index: trunk/web/punbb/lang/French/mail_templates/index.html
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/index.html	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/lang/French/mail_templates/new_reply.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/new_reply.tpl	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/new_reply.tpl	(revision 1)
@@ -1,11 +1,11 @@
-Subject: RÃ©ponse Ã  la discussion Â« <topic_subject> Â»
+Subject: RÃ©ponse Ã  la discussion : <topic_subject>
 
-<replier> a rÃ©pondu Ã  la discussion Â« <topic_subject> Â» que vous suivez. Il se peut qu'il y ait davantage de nouvelles rÃ©ponses, mais ce sera la seule notification tant que vous ne vous serez pas rendu(e) Ã  nouveau aux forums.
+<replier> a rÃ©pondu Ã  la discussion <topic_subject> Ã  laquelle vous avez souscrit. Il se peut qu'il y ait plus de nouvelles rÃ©ponses, mais ce sera la seule notification d'ici Ã  ce que vous vous reconnectiez sur le forum.
 
-Le message est situÃ© ici : <post_url>
+Le message est situÃ© <post_url>
 
-Vous pouvez interrompre le suivi de cette discussion en cliquant ici : <unsubscribe_url>
+Vous pouvez vous dÃ©sabonner ici <unsubscribe_url>
 
 -- 
 <board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
+(Ne pas rÃ©pondre a ce message)
Index: trunk/web/punbb/lang/French/mail_templates/new_reply_full.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/new_reply_full.tpl	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/new_reply_full.tpl	(revision 1)
@@ -1,18 +1,18 @@
-Subject: RÃ©ponse Ã  la discussion Â« <topic_subject> Â»
+Subject: RÃ©ponse Ã  la discussion: <topic_subject>
 
-<replier> a rÃ©pondu Ã  la discussion Â« <topic_subject> Â» que vous suivez. Il se peut qu'il y ait davantage de nouvelles rÃ©ponses, mais ce sera la seule notification tant que vous ne vous serez pas rendu(e) Ã  nouveau aux forums.
+<replier> a rÃ©pondu Ã  la discussion <topic_subject> Ã  laquelle vous avez souscrit. Il se peut qu'il y ait plus de nouvelles rÃ©ponses, mais ce sera la seule notification d'ici Ã  ce que vous vous reconnectiez sur le forum.
 
-Contenu du message :
-=======================================================================
+Contenu du message:
+-----------------------------------------------------------------------
 
 <message>
 
-=======================================================================
+-----------------------------------------------------------------------
 
-Le message est situÃ© ici : <post_url>
+Le message est situÃ© <post_url>
 
-Vous pouvez interrompre le suivi de cette discussion en cliquant ici : <unsubscribe_url>
+Vous pouvez vous dÃ©sabonner ici <unsubscribe_url>
 
 -- 
 <board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
+(Ne pas rÃ©pondre a ce message)
Index: trunk/web/punbb/lang/French/mail_templates/new_report.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/new_report.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Signalement(<forum_id>) - Â« <topic_subject> Â»
-
-L'utilisateur Â« <username> Â» a signalÃ© le message suivant : <post_url>
-
-Motif : <reason>
-
---
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/new_topic.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/new_topic.tpl	(revision 10)
+++ 	(revision )
@@ -1,11 +1,0 @@
-Subject: Nouvelle discussion dans le forum Â« <forum_name> Â»
-
-<poster> a lancÃ© une nouvelle discussion intitulÃ©e Â« <topic_subject> Â» dans le forum Â« <forum_name> Â» que vous suivez.
-
-La discussion se trouve ici : <topic_url>
-
-Vous pouvez interrompre le suivi en cliquant ici : <unsubscribe_url>
-
---
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/new_topic_full.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/new_topic_full.tpl	(revision 10)
+++ 	(revision )
@@ -1,18 +1,0 @@
-Subject: Nouvelle discussion dans le forum Â« <forum_name> Â»
-
-<poster> a lancÃ© une nouvelle discussion intitulÃ©e Â« <topic_subject> Â» dans le forum Â« <forum_name> Â» que vous suivez.
-
-Contenu du message :
-=======================================================================
-
-<message>
-
-=======================================================================
-
-La discussion se trouve ici : <topic_url>
-
-Vous pouvez interrompre le suivi en cliquant ici : <unsubscribe_url>
-
---
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/new_user.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/new_user.tpl	(revision 10)
+++ 	(revision )
@@ -1,9 +1,0 @@
-Subject: Avertissement - nouvelle inscription
-
-L'utilisateur Â« <username> Â» s'est inscrit dans les forums de <base_url>
-
-Profil utilisateur : <profile_url>
-
---
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/rename.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/rename.tpl	(revision 10)
+++ 	(revision )
@@ -1,12 +1,0 @@
-Subject: Compte utilisateur renommÃ©
-
-Lors d'une mise Ã  jour des forums sur <base_url> il a Ã©tÃ© dÃ©terminÃ© que votre nom d'utilisateur est trop proche d'un autre existant dÃ©jÃ . Il a donc Ã©tÃ© modifiÃ© de la maniÃšre suivante.
-
-Ancien nom d'utilisateur : <old_username>
-Nouveau nom d'utilisateur : <new_username>
-
-Nous vous prions de nous excuser pour les dÃ©sagrÃ©ments causÃ©s.
-
---
-<board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
Index: trunk/web/punbb/lang/French/mail_templates/welcome.tpl
===================================================================
--- trunk/web/punbb/lang/French/mail_templates/welcome.tpl	(revision 10)
+++ trunk/web/punbb/lang/French/mail_templates/welcome.tpl	(revision 1)
@@ -1,13 +1,12 @@
 Subject: Bienvenue sur <board_title> !
 
-Merci de vous Ãªtre inscrit(e) sur <base_url>. Voici les informations concernant votre compte :
-=======================================================================
+Merci de vous Ãªtre inscrit sur les forums <base_url>. Les dÃ©tails de votre compte sont :
+
 Nom d'utilisateur : <username>
 Mot de passe      : <password>
-=======================================================================
 
-Veuillez vous rendre Ã  <login_url> pour activer votre compte.
+Allez Ã  <login_url> pour activer votre compte.
 
 -- 
 <board_mailer>
-(Veuillez ne pas rÃ©pondre Ã  ce message. Merci !)
+(Ne pas rÃ©pondre a ce message)
Index: trunk/web/punbb/lang/French/misc.php
===================================================================
--- trunk/web/punbb/lang/French/misc.php	(revision 10)
+++ trunk/web/punbb/lang/French/misc.php	(revision 1)
@@ -4,90 +4,64 @@
 $lang_misc = array(
  
-'Mark read redirect'    	=>	'Toutes les discussions et forums ont Ã©tÃ© marquÃ©s comme lus. Redirection&#160;âŠ',
-'Mark forum read redirect'	=>	'Toutes les discussions du forum spÃ©cifiÃ© ont Ã©tÃ© marquÃ©es comme lues. Redirection&#160;âŠ',
-
+'Mark read redirect'    	=>	'Tous les messages et forums ont Ã©tÃ© marquÃ©s comme lus. Redirection ...',
+ 
 // Send e-mail
-'Form email disabled'		=>	'L\'utilisateur Ã  qui vous essayez d\'envoyer un e-mail a dÃ©sactivÃ© le formulaire e-mail.',
-'No email subject'		=>	'Vous devez indiquer un sujet.',
-'No email message'		=>	'Vous devez saisir un message.',
-'Too long email message'	=>	'Les messages ne peuvent contenir plus de 65535 caractÃšres (64 Kio).',
-'Email flood'			=>	'L\'intervalle d\'envoi consÃ©cutif d\'e-mails est de %s secondes. Veuillez patienter un moment avant de tenter d\'envoyer Ã  nouveau.',
-'Email sent redirect'		=>	'E-mail envoyÃ©. Redirection&#160;âŠ',
-'Send email to'			=>	'Envoyer un e-mail Ã ',
-'Email subject'			=>	'Sujet',
-'Email message'			=>	'Message',
-'Email disclosure note'		=>	'Veuillez prendre note qu\'en utilisant ce formulaire, vous divulguerez votre adresse Ã©lectronique au destinataire.',
-'Write email'			=>	'Composez et envoyez votre e-mail',
+'Form e-mail disabled'		=>	'L\'utilisateur Ã  qui vous essayez d\'envoyer un e-mail a dÃ©sactivÃ© le formulaire e-mail.',
+'No e-mail subject'			=>	'Vous devez saisir un sujet.',
+'No e-mail message'			=>	'Vous devez saisir un message.',
+'Too long e-mail message'	=>	'Les messages ne peuvent excÃ©der 65535 caractÃšres de long (64 ko).',
+'E-mail sent redirect'		=>	'E-mail envoyÃ©. Redirection ...',
+'Send e-mail to'			=>	'Envoyer un e-mail Ã ',
+'E-mail subject'			=>	'Sujet',
+'E-mail message'			=>	'Message',
+'E-mail disclosure note'	=>	'Veuillez noter qu\'en utilisant ce formulaire, votre adresse e-mail sera rÃ©vÃ©lÃ©e au destinataire.',
+'Write e-mail'				=>	'Ãcrivez et envoyez votre e-mail',
  
 // Report
-'No reason'			=>	'Vous devez indiquer un motif.',
-'Reason too long'		=>	'Votre message ne doit pas dÃ©passer 65535 octets (~64 Kio).',
-'Report flood'			=>	'L\'intervalle d\'envoi consÃ©cutif de signalements est de %s secondes. Veuillez patienter un moment avant de tenter d\'envoyer Ã  nouveau.',
-'Report redirect'		=>	'Message signalÃ©. RedirectionâŠ',
-'Report post'			=>	'Signaler un message',
-'Reason'			=>	'Motif',
-'Reason desc'			=>	'Indiquez la raison pour laquelle vous signalez ce message.',
+'No reason'					=>	'Vous devez saisir un motif.',
+'Report redirect'			=>	'Signalement envoyÃ©. Redirection ...',
+'Report post'				=>	'Signaler un message',
+'Reason'					=>	'Motif',
+'Reason desc'				=>	'Saisissez le motif du signalement de ce message.',
  
 // Subscriptions
-'Already subscribed topic'      =>      'Vous suivez dÃ©jÃ  cette discussion.',
-'Already subscribed forum'      =>      'Vous suivez dÃ©jÃ  ce forum.',
-'Subscribe redirect'		=>	'Votre demande de suivi a Ã©tÃ© prise en compte. Redirection&#160;âŠ',
-'Not subscribed topic'		=>	'Vous ne suivez pas cette discussion.',
-'Not subscribed forum'		=>	'Vous ne suivez pas ce forum.',
-'Unsubscribe redirect'		=>	'Vous ne suivez plus cette discussion. Redirection&#160;âŠ',
+'Already subscribed'		=>	'Vous Ãªtes dÃ©jÃ  abonnÃ© Ã  cette discussion.',
+'Subscribe redirect'		=>	'Votre abonnement a Ã©tÃ© pris en compte. Redirection ...',
+'Not subscribed'			=>	'Vous n\'Ãªtes pas abonnÃ© Ã  cette discussion.',
+'Unsubscribe redirect'		=>	'Votre abonnement a Ã©tÃ© annulÃ©. Redirection ...',
  
 // General forum and topic moderation
-'Moderate'			=>	'ModÃ©rer',
-'Select'			=>	'SÃ©lectionner',  // the header of a column of checkboxes
-'Move'				=>	'DÃ©placer',
-'Split'				=>	'Scinder',
-'Delete'			=>	'Supprimer',
-'Merge'				=>	'Fusionner',
-
+'Moderate'					=>	'ModÃ©rer',
+'Select'					=>	'SÃ©lectionner',  // the header of a column of checkboxes
+'Move'						=>	'DÃ©placer',
+'Delete'					=>	'Supprimer',
+ 
 // Moderate forum
-'Open'				=>	'Ouvrir',
-'Close'				=>	'Fermer',
-'Move topic'			=>	'DÃ©placer la discussion',
-'Move topics'			=>	'DÃ©placer les discussions',
-'Move legend'			=>	'Choisissez une destination',
-'Move to'			=>	'DÃ©placer vers',
-'Nowhere to move'		=>	'Aucun forum n\'est disponible pour y dÃ©placer des discussions.',
-'Leave redirect'		=>	'Laisser un lien de redirection',
-'Move topic redirect'		=>	'Discussion dÃ©placÃ©e. Redirection&#160;âŠ',
-'Move topics redirect'		=>	'Discussions dÃ©placÃ©es. Redirection&#160;âŠ',
+'Open'						=>	'Ouvrir',
+'Close'						=>	'Fermer',
+'Move topic'				=>	'DÃ©placer la discussion',
+'Move topics'				=>	'DÃ©placer les discussions',
+'Move legend'				=>	'Choisissez une destination',
+'Move to'					=>	'DÃ©placer vers',
+'Leave redirect'			=>	'Laisser un lien de redirection',
+'Move topic redirect'		=>	'Discussion dÃ©placÃ©e. Redirection ...',
+'Move topics redirect'		=>	'Discussions dÃ©placÃ©es. Redirection ...',
 'Confirm delete legend'		=>	'Veuillez confirmer la suppression',
-'Delete topics'			=>	'Supprimer des discussions',
-'Delete topics comply'		=>	'Souhaitez-vous vraiment supprimer les discussions sÃ©lectionnÃ©es&#160;?',
-'Delete topics redirect'	=>	'Discussions supprimÃ©es. Redirection&#160;âŠ',
-'Open topic redirect'       	=>  	'Discussion ouverte. Redirection&#160;âŠ',
-'Open topics redirect'     	=>  	'Discussions ouvertes. Redirection&#160;âŠ',
-'Close topic redirect'		=>	'Discussion fermÃ©e. Redirection&#160;âŠ',
-'Close topics redirect'		=>	'Discussions fermÃ©es. Redirection&#160;âŠ',
-'No topics selected'		=>	'Vous devez choisir au moins une discussion Ã  dÃ©placer/supprimer/ouvrir/fermer.',
-'Not enough topics selected'	=>	'Vous devez sÃ©lectionner au moins 2 discussions pour une fusion.',
-'Stick topic redirect'		=>	'Discussion Ã©pinglÃ©e. Redirection&#160;âŠ',
-'Unstick topic redirect'	=>	'Discussion dÃ©tachÃ©e. Redirection&#160;âŠ',
-'Merge topics'			=>	'Fusionner les discussions',
-'Merge topics redirect'		=>	'Discussions fusionnÃ©es. Redirection&#160;âŠ',
-'Confirm merge legend'		=>	'Veuillez confirmer la fusion',
-'New subject'			=>	'Nouveau sujet',
-
-// Split multiple posts in topic
-'Confirm split legend'		=>	'Veuillez confirmer la scission des messages sÃ©lectionnÃ©s et choisir leur destination pour dÃ©placement.',
-'Split posts'			=>	'Scinder les messages',
-'Split posts comply'		=>	'Souhaitez-vous vraiment scinder les messages sÃ©lectionnÃ©s&#160;?',
-'Split posts redirect'		=>	'Les messages ont Ã©tÃ© scindÃ©s. Redirection&#160;âŠ',
-
+'Delete topics'				=>	'Supprimer des discussions',
+'Delete topics comply'		=>	'Ãtes-vous sÃ»r de vouloir supprimer les discussions sÃ©lectionnÃ©es&#160;?',
+'Delete topics redirect'	=>	'Discussions supprimÃ©es. Redirection ...',
+'Open topic redirect'       =>  'Discussion ouverte. Redirection ...',
+'Open topics redirect'      =>  'Discussions ouvertes. Redirection ...',
+'Close topic redirect'		=>	'Discussion fermÃ©e. Redirection ...',
+'Close topics redirect'		=>	'Discussions fermÃ©es. Redirection ...',
+'No topics selected'		=>	'Vous devez choisir au moins une discussion Ã  DÃ©placer/Supprimer/Ouvrir/Fermer.',
+'Stick topic redirect'		=>	'Discussion Ã©pinglÃ©e. Redirection ...',
+'Unstick topic redirect'	=>	'Discussion dÃ©tachÃ©e. Redirection ...',
+ 
 // Delete multiple posts in topic
-'Delete posts'			=>	'Supprimer les messages',
-'Cannot select first'		=>	'Le premier message ne peut pas Ãªtre sÃ©lectionnÃ© pour Ãªtre scindÃ©/supprimÃ©.',
-'Delete posts comply'		=>	'Souhaitez-vous vraiment supprimer les messages sÃ©lectionnÃ©s&#160;?',
-'Delete posts redirect'		=>	'Messages supprimÃ©s. Redirection&#160;âŠ',
-'No posts selected'		=>	'Vous devez choisir au moins un message Ã  scinder/supprimer.',
-
-// Get host
-'Host info 1'			=>	'L\'adresse IP est&#160;: %s',
-'Host info 2'			=>	'Le nom d\'hÃŽte est&#160;: %s',
-'Show more users'		=>	'Afficher davantage d\'utilisateurs pour cette IP',
+'Delete posts'				=>	'Supprimer les messages',
+'Delete posts comply'		=>	'Ãtes vous sÃ»r de vouloir supprimer les messages sÃ©lectionnÃ©s&#160;?',
+'Delete posts redirect'		=>	'Messages supprimÃ©s. Redirection ...',
+'No posts selected'			=>	'Vous devez choisir au moins un message Ã  supprimer.'
  
 );
Index: trunk/web/punbb/lang/French/post.php
===================================================================
--- trunk/web/punbb/lang/French/post.php	(revision 10)
+++ trunk/web/punbb/lang/French/post.php	(revision 1)
@@ -5,35 +5,29 @@
  
 // Post validation stuff (many are similiar to those in edit.php)
-'No subject'			=>	'Vous devez indiquer un sujet.',
-'No subject after censoring'    =>      'Les discussions doivent comporter un sujet. AprÃšs application des filtres de censure, le sujet n\'est pas indiquÃ©.',
+'No subject'			=>	'Vous devez saisir un sujet.',
 'Too long subject'		=>	'Le sujet ne peut contenir plus de 70 caractÃšres.',
 'No message'			=>	'Vous devez saisir un message.',
-'No message after censoring'    =>      'Vous devez saisir un message. AprÃšs application des filtres de censure, votre message est vide.',
-'Too long message'		=>	'Les messages ne peuvent contenir plus de %s octets.',
-'All caps subject'  		=>  	'Il n\'est pas autorisÃ© d\'Ã©crire un sujet entiÃšrement en lettres capitales.',
-'All caps message'  		=>  	'Il n\'est pas autorisÃ© d\'Ã©crire un message entiÃšrement en lettres capitales.',
-'Empty after strip'	        =>	'Il semblerait que votre message ne comporte que des balises BBCode vides. Il est possible que cela se soit passÃ© par exemple parce que la citation imbriquÃ©e la plus ancienne a Ã©tÃ© supprimÃ© pour cause de niveau d\'imbrication de citations supÃ©rieur Ã  celui autorisÃ©.',
-
+'Too long message'		=>	'Les messages ne peuvent excÃ©der 65535 caractÃšres de long (64 ko).',
+ 
 // Posting
-'Post errors'			=>	'Erreurs dans le message',
+'Post errors'			=>	'Erreurs',
 'Post errors info'		=>	'Les erreurs suivantes doivent Ãªtre corrigÃ©es pour que le message puisse Ãªtre envoyÃ©&#160;:',
 'Post preview'			=>	'PrÃ©visualisation du message',
 'Guest name'			=>	'Nom',	// For guests (instead of Username)
-'Post redirect'			=>	'Message envoyÃ©. Redirection&#160;âŠ',
-'Post a reply'			=>	'RÃ©pondre',
-'Post new topic'		=>	'Nouvelle discussion',
-'Hide smilies'			=>	'Ne pas convertir les Ã©moticÃŽnes dans ce message',
-'Subscribe'			=>	'Suivre cette discussion',
-'Stay subscribed'   		=>  	'Continuer Ã  suivre cette discussion',
+'Post redirect'			=>	'Message envoyÃ©. Redirection ...',
+'Post a reply'			=>	'Ãcrire une rÃ©ponse',
+'Post new topic'		=>	'Lancer une nouvelle discussion',
+'Hide smilies'			=>	'Ne pas convertir les Ã©moticÃŽnes sur ce message',
+'Subscribe'				=>	'S\'abonner Ã  cette discussion',
 'Topic review'			=>	'RÃ©sumÃ© de la discussion (messages les plus rÃ©cents en premier)',
 'Flood start'			=>	'Au moins',
-'flood end'			=>	'secondes doivent s\'Ã©couler entre deux messages. Veuillez patienter quelques instants avant d\'essayer Ã  nouveau.',
-'Preview'			=>	'PrÃ©visualisation',	// submit button to preview message
+'flood end'				=>	'secondes doivent s\'Ã©couler entre deux messages. Merci de patienter quelques instants et essayer Ã  nouveau.',
+'Preview'				=>	'PrÃ©visualisation',	// submit button to preview message
  
 // Edit post
-'Edit post legend'		=>	'Modifier le message et valider les modifications',
-'Silent edit'			=>	'Modification anonyme (la mention Â«&#160;DerniÃšre modification parâŠ&#160;Â» ne s\'affichera pas)',
-'Edit post'			=>	'Modifier le message',
-'Edit redirect'			=>	'Message mis Ã  jour. Redirection&#160;âŠ'
+'Edit post legend'		=>	'Modifier le message et valider les changements',
+'Silent edit'			=>	'Modification invisible (la mention "DerniÃšre modification par ..." ne s\'affichera pas)',
+'Edit post'				=>	'Modifier le message',
+'Edit redirect'			=>	'Message mis Ã  jour. Redirection ...'
  
 );
Index: trunk/web/punbb/lang/French/prof_reg.php
===================================================================
--- trunk/web/punbb/lang/French/prof_reg.php	(revision 10)
+++ trunk/web/punbb/lang/French/prof_reg.php	(revision 1)
@@ -4,76 +4,36 @@
 $lang_prof_reg = array(
  
-'Email legend'			=>	'Indiquez une adresse Ã©lectronique valide',
-'Email legend 2'		=>	'Saisissez et confirmez une adresse Ã©lectronique valide',
-'Localisation legend'		=>	'DÃ©finissez vos options gÃ©ographiques',
-'Time zone'			=>	'Fuseau horaire&#160;',
-'Time zone info'		=>	'Afin que le forum affiche correctement l\'heure, vous devez sÃ©lectionner votre fuseau horaire.',
-'DST'				=>	'Ajustement pour l\'heure d\'Ã©tÃ©&#160;: cochez cette case si nÃ©cessaire pour que les forums affichent correctement l\'heure.',
-'Time format'			=>	'Format de l\'heure',
-'Date format'			=>	'Format de la date',
-'Default'			=>	'Par dÃ©faut',
-'Language'			=>	'Langue&#160;',
-'Email setting info'		=>	'Indiquez si vous souhaitez que votre adresse Ã©lectronique soit visible par les autres utilisateurs ou non et si vous voulez que les autres utilisateurs puissent vous envoyer des e-mails via ces forums (formulaire d\'envoi d\'e-mail) ou non.',
-'Email setting 1'		=>	'Divulguer votre adresse Ã©lectronique.',
-'Email setting 2'		=>	'Masquer votre adresse Ã©lectronique mais autoriser l\'envoi via le formulaire d\'envoi d\'e-mail.',
-'Email setting 3'		=>	'Masquer votre adresse Ã©lectronique et interdire l\'utilisation du formulaire d\'envoi d\'e-mail.',
-'Privacy options legend'	=>	'DÃ©finissez vos options de vie privÃ©e',
-'Confirm pass'			=>	'Confirmez votre mot de passe',
+'E-mail legend'				=>	'Saisissez une adresse e-mail valide',
+'E-mail legend 2'			=>	'Saisissez et confirmez une adresse e-mail valide',
+'Localisation legend'		=>	'RÃ©glez vos options gÃ©ographiques',
+'Timezone'					=>	'Fuseau horaire&#160;',
+'Timezone info'				=>	'Afin que le forum affiche correctement l\'heure, vous devez sÃ©lectionner votre fuseau horaire.',
+'Language'					=>	'Langue&#160;',
+'Language info'				=>	'Vous pouvez choisir la langue dans laquelle vous souhaitez lire les forums.',
+'E-mail setting info'		=>	'Choisissez si vous voulez que votre adresse e-mail soit visible par les autres utilisateurs ou non et si vous voulez que les autres utilisateurs puissent vous envoyer des e-mails via ces forums (formulaire e-mail) ou non.',
+'E-mail setting 1'			=>	'Afficher votre adresse e-mail.',
+'E-mail setting 2'			=>	'Cacher votre adresse e-mail mais autoriser le formulaire e-mail.',
+'E-mail setting 3'			=>	'Cacher votre adresse e-mail et interdisez le formulaire e-mail.',
+'Privacy options legend'	=>	'RÃ©glez vos options de vie privÃ©e',
+'Save user/pass'			=>	'MÃ©moriser le nom d\'utilisateur et le mot de passe entre les visites.',
+'Save user/pass info'		=>	'Cette option dÃ©finit si le forum doit vous "mÃ©moriser" entre deux visites. Si vous l\'activez, vous n\'aurez pas Ã  vous identifier Ã  chaque fois que vous visitez les forums. Vous serez automatiquement connectÃ©s. RecommandÃ©.',
+'Confirm pass'				=>	'Confirmez votre mot de passe',
  
-'Username too short'		=>	'Les noms d\'utilisateur doivent comporter au moins 2 caractÃšres. Veuillez choisir un autre nom d\'utilisateur.',
-'Username too long'		=>	'Les noms d\'utilisateur ne doivent pas comporter plus de 25 caractÃšres. Veuillez choisir un autre nom d\'utilisateur.',
-'Username guest'		=>	'Le nom d\'utilisateur Â«&#160;invitÃ©&#160;Â» est rÃ©servÃ©. Veuillez choisir un autre nom d\'utilisateur.',
-'Username IP'			=>	'Les noms d\'utilisateur ne peuvent pas Ãªtre au format d\'une adresse IP. Veuillez choisir un autre nom d\'utilisateur.',
+'Username too short'		=>	'Les noms d\'utilisateur doivent Ãªtres constituÃ©s d\'au moins 2 caractÃšres. Veuillez choisir un autre nom d\'utilisateur.',
+'Username guest'			=>	'Le nom d\'utilisateur \'invitÃ©\' est rÃ©servÃ©. Veuillez choisir un autre nom d\'utilisateur.',
+'Username IP'				=>	'Les noms d\'utilisateur ne peuvent pas Ãªtres au format d\'une adresse IP. Veuillez choisir un autre nom d\'utilisateur.',
 'Username reserved chars'	=>	'Les noms d\'utilisateurs ne peuvent pas contenir les caractÃšres \', " et [ ou ]. Veuillez choisir un autre nom d\'utilisateur.',
-'Username BBCode'		=>	'Les noms d\'utilisateur ne peuvent pas contenir de balises (BBCode). Veuillez choisir un autre nom d\'utilisateur.',
-'Banned username'		=>	'Le nom d\'utilisateur que vous avez indiquÃ© est banni. Veuillez choisir un autre nom d\'utilisateur.',
-'Pass too short'		=>	'Les mots de passe doivent comporter au moins 4 caractÃšres. Veuillez choisir un autre mot de passe.',
-'Pass not match'		=>	'Les mots de passe ne coÃ¯ncident pas. Veuillez recommencer.',
-'Banned email'			=>	'L\'adresse Ã©lectronique saisie est bannie de ces forums. Veuillez en choisir une autre.',
-'Dupe email'			=>	'Cette adresse Ã©lectronique est dÃ©jÃ  utilisÃ©e. Veuillez en choisir une autre.',
-'Sig too long'			=>	'Les signatures ne peuvent pas contenir plus de %1$s caractÃšres. Veuillez raccourcir votre signature de %2$s caractÃšres.',
-'Sig too many lines'		=>	'Les signatures ne peuvent pas comporter plus de %s lignes.',
-'Bad ICQ'			=>	'Vous avez saisi un UIN ICQ invalide. Merci de corriger.',
-
-'UTC-12:00'			=>	'(UTC-12:00) Ligne de changement de date OUEST',
-'UTC-11:00'			=>	'(UTC-11:00) Niue, Samoa',
-'UTC-10:00'			=>	'(UTC-10:00) Hawaii et des Ã®les AlÃ©outiennes, Ãles Cook',
-'UTC-09:30'			=>	'(UTC-09:30) Ãles Marquises',
-'UTC-09:00'			=>	'(UTC-09:00) Alaska, Ãles Gambier',
-'UTC-08:30'			=>	'(UTC-08:30) Ãles Pitcairn',
-'UTC-08:00'			=>	'(UTC-08:00) Pacifique',
-'UTC-07:00'			=>	'(UTC-07:00) Montagnes, les Rocheuses',
-'UTC-06:00'			=>	'(UTC-06:00) Centre',
-'UTC-05:00'			=>	'(UTC-05:00) Est',
-'UTC-04:00'			=>	'(UTC-04:00) Atlantique',
-'UTC-03:30'			=>	'(UTC-03:30) Terre-Neuve',
-'UTC-03:00'			=>	'(UTC-03:00) Amazone, Centre du Groenland',
-'UTC-02:00'			=>	'(UTC-02:00) Milieu de l\'Atlantique',
-'UTC-01:00'			=>	'(UTC-01:00) AÃ§ores, Cap Vert, Groenland de l\'Est',
-'UTC'				=>	'(UTC) Europe Occidentale, Greenwich',
-'UTC+01:00'			=>	'(UTC+01:00) Europe Centrale, Afrique Occidentale',
-'UTC+02:00'			=>	'(UTC+02:00) Europe de l\'Est, Afrique Centrale',
-'UTC+03:00'			=>	'(UTC+03:00) Moscou, Afrique Orientale',
-'UTC+03:30'			=>	'(UTC+03:30) Iran',
-'UTC+04:00'			=>	'(UTC+04:00) Golf, Samara',
-'UTC+04:30'			=>	'(UTC+04:30) Afghanistan',
-'UTC+05:00'			=>	'(UTC+05:00) Pakistan, Iekaterinbourg',
-'UTC+05:30'			=>	'(UTC+05:30) Inde, Sri Lanka',
-'UTC+05:45'			=>	'(UTC+05:45) NÃ©pal',
-'UTC+06:00'			=>	'(UTC+06:00) Bangladesh, Bhutan, Novosibirsk',
-'UTC+06:30'			=>	'(UTC+06:30) Ãles Cocos, Myanmar',
-'UTC+07:00'			=>	'(UTC+07:00) Indochine, Krasnoyarsk',
-'UTC+08:00'			=>	'(UTC+08:00) Grande Chin, Australie occidentale, Irkutsk',
-'UTC+08:45'			=>	'(UTC+08:45) Australie occidentale',
-'UTC+09:00'			=>	'(UTC+09:00) Japon, CorÃ©e, Chine',
-'UTC+09:30'			=>	'(UTC+09:30) Australie MÃ©ridionale',
-'UTC+10:00'			=>	'(UTC+10:00) Australie Orientale, Vladivostok',
-'UTC+10:30'			=>	'(UTC+10:30) Ãle Lord Howe',
-'UTC+11:00'			=>	'(UTC+11:00) Ãle Salomon, Magadan',
-'UTC+11:30'			=>	'(UTC+11:30) Ãle Norfolk',
-'UTC+12:00'			=>	'(UTC+12:00) Nouvelle ZÃ©lande, Fiji, Kamchatka',
-'UTC+12:45'			=>	'(UTC+12:45) Ãles Chatham',
-'UTC+13:00'			=>	'(UTC+13:00) Tonga, Ãles Phoenix',
-'UTC+14:00'			=>	'(UTC+14:00) Ãles de la Ligne',
-
+'Username BBCode'			=>	'Les noms d\'utilisateur ne peuvent pas contenir de balises (BBCode). Veuillez choisir un autre nom d\'utilisateur.',
+'Dupe username'				=>	'Ce nom d\'utilisateur est dÃ©jÃ  utilisÃ©. Veuillez choisir un autre nom d\'utilisateur.',
+'Pass too short'			=>	'Les mots de passe doivent Ãªtres constituÃ©s d\'au moins 4 caractÃšres. Veuillez choisir un autre mot de passe.',
+'Pass not match'			=>	'Les mots de passe ne correspondent pas. Veuillez recommencer.',
+'Banned e-mail'				=>	'L\'adresse e-mail saisie est bannie de ces forums. Veuillez en choisir une autre.',
+'Dupe e-mail'				=>	'Cette adresse e-mail est dÃ©jÃ  utilisÃ©e. Veuillez en choisir une autre.',
+'Sig too long'				=>	'Les signatures ne peuvent pas contenir plus de',
+'characters'				=>	'caractÃšres',
+'Sig too many lines'		=>	'Les signatures ne peuvent pas faire plus de',
+'lines'						=>	'lignes',
+'Signature quote/code'		=>	'Les balises BBCode \'QUOTE\' et \'CODE\' ne sont pas autorisÃ©es dans les signatures. Veuillez corriger.',
+'Bad ICQ'					=>	'Vous avez saisi un UIN ICQ invalide. Merci de corriger.'
+ 
 );
Index: trunk/web/punbb/lang/French/profile.php
===================================================================
--- trunk/web/punbb/lang/French/profile.php	(revision 10)
+++ trunk/web/punbb/lang/French/profile.php	(revision 1)
@@ -5,137 +5,140 @@
  
 // Navigation and sections
-'Profile menu'			=>	'Menu profil',
-'Section essentials'		=>	'Principal',
-'Section personal'		=>	'Personnel',
-'Section messaging'		=>	'Messagerie',
-'Section personality'		=>	'PersonnalitÃ©',
-'Section display'		=>	'Affichage',
-'Section privacy'		=>	'Vie privÃ©e',
-'Section admin'			=>	'Administration',
+'Profile menu'				=>	'Menu profil',
+'Section essentials'		=>	'GÃ©nÃ©ral',
+'Section personal'			=>	'Personnel',
+'Section messaging'			=>	'Messagerie',
+'Section personality'		=>	'Personnalisation',
+'Section display'			=>	'Affichage',
+'Section privacy'			=>	'Vie privÃ©e',
+'Section admin'				=>	'Administration',
  
 // Miscellaneous
 'Username and pass legend'	=>	'Nom d\'utilisateur et mot de passe',
 'Personal details legend'	=>	'Informations personnelles',
-'Contact details legend'	=>	'Informations sur les messageries instantanÃ©es',
-'User activity'			=>	'ActivitÃ© de l\'utilisateur',
-'Paginate info'			=>	'Nombres de discussions et de messages Ã  afficher par page.',
+'Contact details legend'	=>	'Informations de messageries instantanÃ©es',
+'Options display'			=>	'Options d\'affichage',
+'Options post'				=>	'Options de visualisation des messages',
+'User activity'				=>	'ActivitÃ© de l\'utilisateur',
+'Paginate info'				=>	'Nombres de discussions et de messages a afficher par page.',
  
 // Password stuff
-'Pass key bad'			=>	'La clef d\'activation du mot de passe est incorrecte ou a expirÃ©. Veuillez demander un nouveau mot de passe. Si cela ne marche pas, contactez l\'administrateur.',
-'Pass updated'			=>	'Votre mot de passe a Ã©tÃ© mis Ã  jour. Vous pouvez Ã  prÃ©sent vous identifier avec votre nouveau mot de passe.',
-'Pass updated redirect'		=>	'Mot de passe mis Ã  jour. Redirection&#160;âŠ',
-'Wrong pass'			=>	'Ancien mot de passe incorrect.',
-'Change pass'			=>	'Changer de mot de passe',
+'Pass key bad'				=>	'La clef d\'activation du mot de passe est incorrecte ou a expirÃ©. Veuillez demander Ã  nouveau un mot de passe. Si cela Ã©choue, contactez l\'administrateur',
+'Pass updated'				=>	'Votre mot de passe a Ã©tÃ© mis Ã  jour. Vous pouvez vous identifier avec votre nouveau mot de passe.',
+'Pass updated redirect'		=>	'Mot de passe mis Ã  jour. Redirection ...',
+'Wrong pass'				=>	'Ancien mot de passe incorrect.',
+'Change pass'				=>	'Changer de mot de passe',
 'Change pass legend'		=>	'Saisissez et confirmez votre mot de passe',
-'Old pass'			=>	'Ancien mot de passe',
-'New pass'			=>	'Nouveau mot de passe',
-'Confirm new pass'		=>	'Confirmez le nouveau mot de passe',
-'Pass info'			=>	'Les mots de passe doivent comporter au moins 4 caractÃšres. Ils sont sensibles Ã  la casse.',
+'Old pass'					=>	'Ancien mot de passe',
+'New pass'					=>	'Nouveau mot de passe',
+'Confirm new pass'			=>	'Confirmez le nouveau mot de passe',
  
 // E-mail stuff
-'Email key bad'			=>	'La clef d\'activation d\'adresse Ã©lectronique est incorrecte ou a expirÃ©. Veuillez demander Ã  nouveau un changement d\'adresse Ã©lectronique. Si cela Ã©choue, contactez l\'administrateur',
-'Email updated'			=>	'Votre adresse Ã©lectronique a Ã©tÃ© mise Ã  jour.',
-'Activate email sent'		=>	'Un e-mail comportant les instructions pour activer la nouvelle adresse Ã©lectronique a Ã©tÃ© envoyÃ©. S\'il n\'arrive pas, contactez l\'administrateur&#160;: ',
-'Email legend'			=>	'Saisissez la nouvelle adresse Ã©lectronique',
-'Email instructions'		=>	'Indiquez la nouvelle adresse Ã©lectronique. Un e-mail comportant un lien d\'activation y sera envoyÃ©. Vous devrez cliquer sur ce lien pour activer l\'adresse.',
-'Change email'			=>	'Changer l\'adresse Ã©lectronique',
-'New email'			=>	'Nouvelle adresse Ã©lectronique',
+'E-mail key bad'			=>	'La clef d\'activation d\'adresse e-mail est incorrecte ou a expir&eacute. Veuillez demander Ã  nouveau un changement d\'adresse e-mail. Si cela Ã©choue, contactez l\'administrateur',
+'E-mail updated'			=>	'Votre adresse e-mail a Ã©tÃ© mise Ã  jour.',
+'Activate e-mail sent'		=>	'Un e-mail a Ã©tÃ© envoyÃ© avec les instructions pour activer la nouvelle adresse e-mail. S\'il n\'arrive pas, contactez l\'administrateur Ã ',
+'E-mail legend'				=>	'Saisissez la nouvelle adresse e-mail',
+'E-mail instructions'		=>	'Entrez la nouvelle adresse e-mail. Un e-mail y sera envoyÃ© avec un lien d\'activation. Vous devrez cliquer sur ce lien pour activer l\'adresse.',
+'Change e-mail'				=>	'Changer l\'adresse e-mail',
+'New e-mail'				=>	'Nouvelle adresse e-mail',
  
 // Avatar upload stuff
-'Avatars disabled'		=>	'La prise en charge des avatars est dÃ©sactivÃ©e.',
-'Too large ini'			=>	'Fichier trop volumineux. Le serveur refuse son envoi.',
-'Partial upload'		=>	'Fichier partiellement envoyÃ©. Merci de rÃ©essayer.',
-'No tmp directory'		=>	'Le serveur n\'a pas pu enregistrer temporairement le fichier envoyÃ©.',
-'No file'			=>	'Vous n\'avez pas sÃ©lectionnÃ© de fichier Ã  envoyer.',
-'Bad type'			=>	'Ce type de fichier n\'est pas autorisÃ©. Voici les formats pris en charge&#160;:  *.gif, *.jpeg et *.png.',
-'Too wide or high'		=>	'L\'image est plus large et/ou plus haute que le maximum autorisÃ©',
-'Too large'			=>	'La taille du fichier dÃ©passe le maximum autorisÃ©',
-'pixels'			=>	'pixels',
-'bytes'				=>	'octets',
-'Move failed'			=>	'Le serveur n\'a pas pu enregistrer le fichier envoyÃ©. Contactez l\'administrateur',
-'Unknown failure'		=>	'Erreur inconnue. Merci de rÃ©essayer.',
-'Avatar upload redirect'	=>	'Avatar envoyÃ©. Redirection&#160;âŠ',
-'Avatar deleted redirect'	=>	'Avatar effacÃ©. Redirection&#160;âŠ',
-'Avatar desc'			=>	'Un avatar est une petite image qui sera affichÃ©e sous votre nom d\'utilisateur dans vos messages. Il ne doit pas faire plus de',
-'Upload avatar'			=>	'Envoyer un avatar',
-'Upload avatar legend'		=>	'SÃ©lectionnez un fichier avatar Ã  envoyer',
-'Delete avatar'			=>	'Effacer l\'avatar',	// only for admins
-'File'				=>	'Fichier',
-'Upload'			=>	'Envoyer',	// submit button
+'Avatars disabled'			=>	'Le support des avatars est dÃ©sactivÃ©.',
+'Too large ini'				=>	'Fichier trop gros. Le serveur refuse son tÃ©lÃ©chargement.',
+'Partial upload'			=>	'Fichier partiellement tÃ©lÃ©charg&eacute. Merci de reacute;essayer.',
+'No tmp directory'			=>	'Le serveur n\'a pas pu enregistrer le fichier envoyÃ© dans un rÃ©pertoire temporaire.',
+'No file'					=>	'Vous n\'avez pas sÃ©lectionnÃ© de fichier Ã  tÃ©lÃ©charger.',
+'Bad type'					=>	'Le type du fichier n\'est pas autorisÃ©. Les types autorisÃ©s sont le GIF, le JPG et le PNG.',
+'Too wide or high'			=>	'L\'image est plus large et/ou plus haute que le maximum autorisÃ©',
+'Too large'					=>	'La taille du fichier dÃ©passe le maximum autorisÃ©',
+'pixels'					=>	'pixels',
+'bytes'						=>	'octets',
+'Move failed'				=>	'Le serveur n\'a pas pu enregistrer le fichier tÃ©lÃ©charg&acute;. Contactez l\'administrateur',
+'Unknown failure'			=>	'Erreur inconnue. Merci de rÃ©essayer.',
+'Avatar upload redirect'	=>	'Avatar tÃ©lÃ©chargÃ©. Redirection ...',
+'Avatar deleted redirect'	=>	'Avatar effacÃ©. Redirection ...',
+'Avatar desc'				=>	'Un avatar est une petite image qui sera affichÃ©e sous votre nom d\'utilisateur dans vos messages. Il ne doit pas faire plus de',
+'Upload avatar'				=>	'TÃ©lÃ©charger un avatar',
+'Upload avatar legend'		=>	'SÃ©lectionnez un fichier avatar Ã  tÃ©lÃ©charger',
+'Delete avatar'				=>	'Effacer l\'avatar',	// only for admins
+'File'						=>	'Fichier',
+'Upload'					=>	'TÃ©lÃ©charger',	// submit button
  
 // Form validation stuff
-'Forbidden title'		=>	'Votre titre contient un mot interdit. Choisissez un autre titre.',
-'Profile redirect'		=>	'Profil mis Ã  jour. Redirection&#160;âŠ',
+'Dupe username'				=>	'Ce nom d\'utilisateur est dÃ©jÃ  utilisÃ©. Essayez un autre nom d\'utilisateur.',
+'Forbidden title'			=>	'Votre titre contient un mot interdit. Choisissez un autre titre.',
+'Profile redirect'			=>	'Profil mis Ã  jour. Redirection ...',
  
 // Profile display stuff
-'Users profile'			=>	'Profil de %s',
-'Username info'			=>	'Nom d\'utilisateur&#160;: %s',
-'Email info'			=>	'E-mail&#160;: %s',
-'Posts info'			=>	'Messages&#160;: %s',
-'Registered info'		=>	'Inscription&#160;: %s',
-'Last post info'		=>	'Dernier message&#160;: %s',
-'Last visit info'               =>      'DerniÃšre visite&#160;: %s',
-'Show posts'			=>	'Voir les messages de cet utilisateur',
-'Show topics'			=>	'Afficher toutes les discussions',
-'Show subscriptions'		=>	'Afficher toutes les discussions suivies',
-'Realname'			=>	'Nom',
-'Location'			=>	'Lieu',
-'Website'			=>	'Site Web',
-'Invalid website URL'          =>  'L\'URL de site Web saisie est invalide.',
-'Jabber'			=>	'Jabber',
-'ICQ'				=>	'ICQ',
-'MSN'				=>	'MSN Messenger',
-'AOL IM'			=>	'AOL IM',
-'Yahoo'				=>	'Yahoo! Messenger',
-'Avatar'			=>	'Avatar',
-'Signature'			=>	'Signature',
-'Sig max size'			=>	'%s caractÃšres et %s lignes autorisÃ©s',
-'Avatar legend'			=>	'DÃ©finissez vos options d\'affichage d\'avatar',
-'Avatar info'			=>	'Un avatar est une petite image qui sera affichÃ©e avec chacun de vos messages. Vous pouvez envoyer un avatar en cliquant sur le lien ci-dessous.',
-'Change avatar'			=>	'Changer d\'avatar',
-'Signature legend'		=>	'RÃ©digez votre signature',
-'Signature info'		=>	'Une signature est un petit texte ajoutÃ© Ã  la suite de vos messages. Vous pouvez y inclure ce que vous voulez et y utiliser des balises BBCode, selon la configuration du forum. Les fonctionnalitÃ©s actives apparaissent dans la marge lors de l\'Ã©dition de votre signature.',
-'Sig preview'			=>	'AperÃ§u de la signature actuelle&#160;:',
-'No sig'			=>	'Pas de signature dans le profil.',
-'Signature quote/code/list/h'	=>	'L\'utilisation des balises BBCode [quote], [code], [list] et [h] n\'est pas autorisÃ©e dans les signatures.',
-'Topics per page'		=>	'Discussions par page',
-'Posts per page'		=>	'Messages par page',
-'Leave blank'			=>	'Laisser vide pour utiliser la valeur par dÃ©faut du forum.',
-'Subscription legend'	        =>	'DÃ©finit vos options de suivi de discussion',
-'Notify full'			=>	'Inclure le message dans les e-mails de notification de rÃ©ponse.',
-'Auto notify full'		=>	'Suivre automatiquement les sujets auxquels on a rÃ©pondu.',
-'Show smilies'			=>	'Afficher les Ã©moticÃŽnes sous forme d\'icÃŽnes',
-'Show images'			=>	'Afficher les images.',
-'Show images sigs'		=>	'Afficher les images dans les signatures des utilisateurs.',
-'Show avatars'			=>	'Afficher les avatars des utilisateurs.',
-'Show sigs'			=>	'Afficher les signatures.',
-'Style legend'			=>	'Choisissez votre style favori',
-'Styles'			=>	'Styles',
-'Admin note'			=>	'Note de l\'administrateur',
-'Pagination legend'		=>	'DÃ©finissez vos options de pagination',
+'Not activated'				=>	'Cet utilisateur n\'a pas activÃ© son compte. Le compte est activÃ© lors de la premiÃšre identification de l\'utilisateur.',
+'Unknown'					=>	'(Information inconnue)',	// This is displayed when a user hasn't filled out profile field (e.g. Location)
+'Private'					=>	'(Information privÃ©e)',	// This is displayed when a user does not want to receive e-mails
+'No avatar'					=>	'(Aucun avatar)',
+'Show posts'				=>	'Voir les messages de cet utilisateur',
+'Realname'					=>	'Nom',
+'Location'					=>	'Lieu',
+'Website'					=>	'Site web',
+'Jabber'					=>	'Jabber',
+'ICQ'						=>	'ICQ',
+'MSN'						=>	'MSN Messenger',
+'AOL IM'					=>	'AOL IM',
+'Yahoo'						=>	'Yahoo! Messenger',
+'Avatar'					=>	'Avatar',
+'Signature'					=>	'Signature',
+'Sig max length'			=>	'Longueur maximale',
+'Sig max lines'				=>	'Maximum de lignes',
+'Avatar legend'				=>	'DÃ©finissez vos options d\'affichage d\'avatar',
+'Avatar info'				=>	'Un avatar est une petite image qui sera affichÃ©e avec chacun de vos messages. Vous pouvez tÃ©lÃ©charger un avatar en cliquant sur le lien ci-dessous. La case \'Utiliser l\'avatar\' doit Ãªtre cochÃ©e pour que l\'avatar soit visible dans vos messages.',
+'Change avatar'				=>	'Modifier avatar',
+'Use avatar'				=>	'Utiliser l\'avatar.',
+'Signature legend'			=>	'RÃ©digez votre signature',
+'Signature info'			=>	'Une signature est un petit texte ajoutÃ© Ã  la suite de vos messages. Vous pouvez y mettre ce que vous voulez. Vous pouvez y utiliser des balises BBCode, selon la configuration du forum. Les fonctionnalitÃ©s actives apparaissent dans la marge lors de l\'Ã©dition de votre signature.',
+'Sig preview'				=>	'Apercu de la signature actuelle:',
+'No sig'					=>	'Pas de signature dans le profil.',
+'Topics per page'			=>	'Discussions par page',
+'Topics per page info'		=>	'ContrÃŽle le nombre de discussions affichÃ©es par page dans chaque forum. Vous pouvez laisser blanc et la valeur par dÃ©faut sera employÃ©e.',
+'Posts per page'			=>	'Messages par page',
+'Posts per page info'		=>	'ContrÃŽle le nombre de messages affichÃ©s par page dans chaque forum. Vous pouvez laisser blanc et la valeur par dÃ©faut sera employÃ©e.',
+'Leave blank'				=>	'Laisser blanc pour utiliser la valeur par dÃ©faut du forum.',
+'Notify full'				=>	'Inclure le message dans les e-mails d\'abonnement.',
+'Notify full info'			=>	'En activant cette option, une version en texte brut du nouveau message sera incluse dans l\'avis d\'abonnement par e-mail.',
+'Show smilies'				=>	'Afficher les smileys sous forme d\'icÃŽnes',
+'Show smilies info'			=>	'En activant cette option, de petites images seront affichÃ©es Ã  la place du texte.',
+'Show images'				=>	'Afficher les images.',
+'Show images info'			=>	'En dÃ©sactivant cette option, vous ne verez pas les images dans les message (c\'est-Ã -dire les images affichÃ©es avec la balise [img]).',
+'Show images sigs'			=>	'Afficher les images dans les signatures des utilisateurs.',
+'Show images sigs info'		=>	'DÃ©sactivez ceci si vous ne voulez pas voir les images dans les signatures (c\'est-Ã -dire les images affichÃ©es avec la balise [img]).',
+'Show avatars'				=>	'Afficher les avatars des utilisateurs.',
+'Show avatars info'			=>	'Cette option vous permet de dÃ©cider si les images des avatars des utilisateurs doivent Ãªtre affichÃ©es dans les messages ou non.',
+'Show sigs'					=>	'Afficher les signatures.',
+'Show sigs info'			=>	'Activez ceci si vous voulez voir les signatures ou non.',
+'Style legend'				=>	'SÃ©lectionnez votre style favori',
+'Style info'				=>	'Vous pouvez utiliser un style diffÃ©rent pour ce forum.',
+'Admin note'				=>	'Note de l\'administrateur',
+'Pagination legend'			=>	'DÃ©finissez vos options de pagination',
 'Post display legend'		=>	'DÃ©finissez vos options de visualisation des messages',
-'Post display info'		=>	'En dÃ©sactivant toutes les options d\'affichage des images et des signatures dans les messages, vous augmenterez la vitesse de chargement des pages.',
-'Instructions'			=>	'AprÃšs avoir mis Ã  jour le profil vous serez redirigÃ©(e) vers cette page.',
+'Post display info'			=>	'En dÃ©sactivant toutes les options d\'affichage des images dans les messages et les signatures vous augmenterez le temps de chargement des pages.',
+'Instructions'				=>	'AprÃšs avoir mis Ã  jour le profil vous serez redirigÃ©s sur cette page.',
  
 // Administration stuff
 'Group membership legend'	=>	'Choisissez un groupe d\'utilisateurs',
-'Save'				=>	'Enregistrer',
-'Set mods legend'		=>	'DÃ©finir l\'accÃšs modÃ©rateur',
-'Moderator in info'		=>	'Veuillez choisir les forums que cet utilisateur peut modÃ©rer. Remarque&#160;:  Ceci s\'applique seulement aux modÃ©rateurs. Les administrateurs ont toujours toutes les permissions pour tous les forums.',
-'Update forums'			=>	'Mettre Ã  jour',
-'Delete ban legend'		=>	'Supprimer (administrateurs seulement) ou bannir un utilisateur',
-'Delete user'			=>	'Supprimer l\'utilisateur',
-'Ban user'			=>	'Bannir l\'utilisateur',
+'Save'						=>	'Enregistrer',
+'Set mods legend'			=>	'DÃ©finir l\'accÃšs modÃ©rateur',
+'Moderator in'				=>	'ModÃšre',
+'Moderator in info'			=>	'Veuillez choisir quels forums cet utilisateur peut modÃ©rer. Note: Ceci s\'applique seulement aux modÃ©rateurs. Les administrateurs ont toujours toutes les permissions pour tous les forums.',
+'Update forums'				=>	'Mettre Ã  jour',
+'Delete ban legend'			=>	'Supprimer (administrateurs seulement) ou exclure un utilisateur',
+'Delete user'				=>	'Supprimer l\'utilisateur',
+'Ban user'					=>	'Exclure l\'utilisateur',
 'Confirm delete legend'		=>	'Important&#160;: lisez avant de supprimer un utilisateur',
 'Confirm delete user'		=>	'Confirmer la suppression de l\'utilisateur',
-'Confirmation info'		=>	'Veuillez confirmer la suppression de l\'utilisateur',	// the username will be appended to this string
-'Delete warning'		=>	'Attention&#160;! Les utilisateurs et/ou messages supprimÃ©s ne peuvent Ãªtre rÃ©cupÃ©rÃ©s. Si vous choisissez de ne pas supprimer les messages d\'un utilisateur, les messages pourront uniquement Ãªtre supprimÃ©s manuellement plus tard.',
-'Delete posts'			=>	'Supprimer tous les messages ou discussions de cet utilisateur.',
-'Delete'			=>	'Supprimer',		// submit button (confirm user delete)
-'User delete redirect'		=>	'Utilisateur supprimÃ©. Redirection&#160;âŠ',
-'Group membership redirect'	=>	'Appartenance Ã  un groupe enregistrÃ©e. Redirection&#160;âŠ',
-'Update forums redirect'	=>	'Droits du modÃ©rateur mis Ã  jour. Redirection&#160;âŠ',
-'Ban redirect'			=>	'Redirection&#160;âŠ',
-'No delete admin message'	=>	'Les administrateurs ne peuvent Ãªtre supprimÃ©s. Pour supprimer cet utilisateur, vous devez d\'abord le/la dÃ©placer vers un groupe d\'utilisateurs diffÃ©rent.',
+'Confirmation info'			=>	'Veuillez confirmer la suppression de l\'utilisateur',	// the username will be appended to this string
+'Delete warning'			=>	'Attention&#160;! Les utilisateurs et/ou messages supprimÃ©s ne peuvent Ãªtre restaurÃ©s. Si vous choisissez de ne pas supprimer les messages d\'un utilisateur, les messages ne pourront Ãªtre uniquement supprimÃ©s manuellement plus tard.',
+'Delete posts'				=>	'Supprimer tous les messages ou discussions de cet utilisateur.',
+'Delete'					=>	'Supprimer',		// submit button (confirm user delete)
+'User delete redirect'		=>	'Utilisateur supprimÃ©. Redirection ...',
+'Group membership redirect'	=>	'Appartenance Ã  un groupe enregistrÃ©e. Redirection ...',
+'Update forums redirect'	=>	'Droits du modÃ©rateur mis Ã  jour. Redirection ...',
+'Ban redirect'				=>	'Redirection ...'
  
 );
Index: trunk/web/punbb/lang/French/register.php
===================================================================
--- trunk/web/punbb/lang/French/register.php	(revision 10)
+++ trunk/web/punbb/lang/French/register.php	(revision 1)
@@ -5,33 +5,31 @@
  
 // Miscellaneous
-'No new regs'			=>	'Ces forums n\'acceptent pas de nouveaux utilisateurs.',
-'Reg cancel redirect'		=>	'Inscription annulÃ©e. Redirection&#160;âŠ',
-'Forum rules'			=>	'Conditions d\'utilisation des forums',
-'Rules legend'			=>	'Vous devez accepter les conditions d\'utilisation suivantes pour vous inscrire sur ces forums.',
-'Registration flood'		=>	'Un nouvel utilisateur ayant la mÃªme adresse IP que vous a Ã©tÃ© inscrit dans la derniÃšre heure. Pour Ã©viter les inscriptions multiples, il n\'est pas possible de s\'inscrire Ã  partir de la mÃªme IP dans un intervalle infÃ©rieur Ã  1 heure. DÃ©solÃ© pour la gÃªne occasionnÃ©e.',
-'Agree'				=>	'J\'accepte',
-'Cancel'			=>	'Je refuse',
-'Register'			=>	'S\'inscrire',
+'No new regs'				=>	'Ce forum n\'accepte pas de nouveaux utilisateurs.',
+'Reg cancel redirect'		=>	'Inscription annulÃ©e. Redirection ...',
+'Forum rules'				=>	'Conditions d\'utilisation du forum',
+'Rules legend'				=>	'Vous devez accepter les conditions d\'utilisation suivantes pour vous inscrire sur ce forum.',
+'Agree'						=>	'J\'accepte',
+'Cancel'					=>	'Je refuse',
+'Register'					=>	'S\'inscrire',
  
 // Form validation stuff (some of these are also used in post.php)
-'Registration errors'		=>	'Erreurs d\'inscription',
-'Registration errors info'	=>	'Les erreurs suivantes doivent Ãªtre corrigÃ©es avant que vous puissiez vous inscrire&#160;:',
-'Username censor'		=>	'Le nom d\'utilisateur que vous avez saisi contient des mots interdits. Veuillez choisir un autre nom d\'utilisateur.',
-'Username dupe 1'		=>	'Il existe dÃ©jÃ  une personne inscrite avec ce nom d\'utilisateur.',
-'Username dupe 2'		=>	'Ce nom d\'utilisateur est trop ressemblant. Il doit diffÃ©rer par au moins un caractÃšre alpha-numÃ©rique (a-z ou 0-9). Veuillez essayer un autre nom d\'utilisateur.',
-'Email not match'		=>	'Les adresses Ã©lectroniques ne coÃ¯ncident pas. Veuillez revenir en arriÃšre et corriger cela.',
+'Username censor'			=>	'Le nom d\'utilisateur que vous avez saisi contient des mots interdits. Veuillez choisir un autre nom d\'utilisateur.',
+'Username dupe 1'			=>	'Quelqu\'un est dÃ©jÃ  inscrit avec ce nom d\'utilisateur',
+'Username dupe 2'			=>	'Ce nom d\'utilisateur est trop ressemblant. Il doit diffÃ©rer par au moins un caractÃšre alpha-numÃ©rique (a-z ou 0-9). Veuillez essayer un autre nom d\'utilisateur.',
+'E-mail not match'			=>	'Les adresses e-mail ne correspondent pas. Veuiller retourner en arriÃšre et corriger cela.',
  
 // Registration e-mail stuff
-'Reg email'			=>	'Merci de vous Ãªtre inscrit(e). Votre mot de passe a Ã©tÃ© envoyÃ© Ã  l\'adresse indiquÃ©e. Si vous ne l\'obtenez pas, merci de contacter l\'administrateur&#160;:',
-'Reg complete'			=>	'Inscription acceptÃ©e. Identification et redirection&#160;âŠ',
+'Reg e-mail'				=>	'Merci de vous Ãªtre inscrits. Votre mot de passe a Ã©tÃ© envoyÃ© Ã  l\'adresse indiquÃ©e. S\'il n\'arrive pas, merci de contacter l\'administrateur Ã ',
+'Reg complete'				=>	'Inscription acceptÃ©e. Identification et redirection ...',
  
 // Register info
-'Desc 1'			=>	'L\'inscription vous permettra d\'accÃ©der Ã  un certain nombre de fonctionnalitÃ©s autrement indisponibles. Cela inclut la possibilitÃ© de modifier et d\'effacer des messages, de crÃ©er vos propres signatures et bien davantage. Pour toute question, contactez l\'administrateur.',
-'Desc 2'			=>	'Ci-dessous le formulaire Ã  remplir afin de vous inscrire. AprÃšs vous Ãªtre inscrit(e), vous pourrez consulter votre profil et modifier vos prÃ©fÃ©rences. Les champs ci-dessous ne sont qu\'une toute petite partie de tout ce que vous pouvez changer dans votre profil.',
-'Username legend'		=>	'Veuillez saisir un nom d\'utilisateur comportant entre 2 et 25 caractÃšres.',
-'Pass legend'			=>	'Veuillez saisir et confirmer le mot de passe que vous avez choisi.',
-'Pass info'			=>	'Le mot de passe doit comporter au minimum 4 caractÃšres (sensible Ã  la casse).',
-'Email info'			=>	'Vous devez saisir une adresse Ã©lectronique valide. Vous pouvez choisir de ne pas divulguer votre adresse aux autres utilisateurs (voir ci-dessous).',
-'Confirm email'			=>	'Confirmez votre adresse Ã©lectronique',
+'Desc 1'					=>	'L\'inscription vous accordera l\'accÃšs Ã  un certain nombre de fonctionnalitÃ©s et de possibilitÃ©s autrement indisponibles. Cela inclue la possibilitÃ© de modifier et d\'effacer des messages, de crÃ©er vos propres signatures, et autres encore. Pour toute question, contactez l\'administrateur.',
+'Desc 2'					=>	'Ci-dessous le formulaire Ã  remplir afin de vous inscrire. AprÃšs vous Ãªtres inscrits, vous pourrez regarder votre profil et vos prÃ©fÃ©rences. Les champs ci-dessous ne sont qu\'une toute petite partie de tous ce que vous pouvez changer dans votre profil.',
+'Username legend'			=>	'Veuillez saisir un nom d\'utilisateur entre 2 et 25 caractÃšres de long.',
+'Pass legend 1'				=>	'Veuillez saisir et confirmer le mot de passe que vous avez choisi',
+'Pass legend 2'				=>	'Veuillez lire les instructions ci-dessous',
+'Pass info'					=>	'Le mots de passe doit faire entre 4 et 16 caractÃšres de long (sensible Ã  la casse).',
+'E-mail info'				=>	'Vous devez saisir une adresse e-mail valide,. Vous pouvez choisir de ne pas rÃ©veler votre adresse aux autres utilisateurs (voir ci-dessous).',
+'Confirm e-mail'			=>	'Confirmez votre adresse e-mail',
  
 );
Index: trunk/web/punbb/lang/French/search.php
===================================================================
--- trunk/web/punbb/lang/French/search.php	(revision 10)
+++ trunk/web/punbb/lang/French/search.php	(revision 1)
@@ -5,61 +5,43 @@
  
 // The search form
-'User search'			=>	'Rechercher un utilisateur',
-'No search permission'		=>	'Vous ne pouvez pas effectuer de recherche, vous n\'avez pas les permissions requises',
-'Search flood'			=>	'Vous devez patienter au minimum %s secondes avant d\'effectuer une nouvelle recherche. Veuillez patienter un moment et essayer Ã  nouveau.',
-'Search'			=>	'Rechercher',
-'Search criteria legend'	=>	'Choisissez vos critÃšres de recherche',
-'Search info'			=>	'Pour effectuer une recherche par mots-clÃ©s, indiquez le ou les termes Ã  rechercher en les sÃ©parant par des espaces. Utilisez AND, OR, NOT pour affiner votre recherche. Pour rechercher par auteur, saisissez le nom d\'utilisateur auquel les messages appartiennent. Utilisez le joker * pour des recherches sur des fragments de mot.',
-'Keyword search'		=>	'Mots-clÃ©s',
-'Author search'			=>	'Rechercher un auteur',
-'Search in legend'		=>	'Indiquez oÃ¹ la recherche doit s\'effectuer',
-'Search in info'		=>	'Choisissez le forum dans lequel vous souhaitez lancer votre recherche et indiquez si vous souhaitez rechercher dans les sujets des discussions uniquement ou dans les textes des messages ou bien dans les deux Ã  la fois.',
-'Search multiple forums info'    =>  'Si aucun forum n\'est sÃ©lectionnÃ©, la recherche s\'effectuera dans tous les forums.',
-'Forum search'			=>	'Forum',
-'All forums'			=>	'Tous les forums',
-'Search in'			=>	'Rechercher dans&#160;âŠ',
-'Message and subject'		=>	'Le texte du message et du sujet',
-'Message only'			=>	'Le texte du message seulement',
-'Topic only'			=>	'Le texte du sujet seulement',
-'Sort by'			=>	'Trier par&#160;âŠ',
-'Sort order'			=>	'Ordre&#160;âŠ',
-'Search results legend'		=>	'SÃ©lectionnez le mode d\'affichage des rÃ©sultats',
-'Search results info'		=>	'Vous pouvez choisir le mode de classement et d\'affichage des rÃ©sultats.',
-'Sort by post time'		=>	'Date du message',
-'Sort by author'		=>	'Auteur',
-'Sort by subject'		=>	'Sujet',
-'Sort by forum'			=>	'Forum',
-'Ascending'			=>	'Croissant',
-'Descending'			=>	'DÃ©croissant',
-'Show as'			=>	'Afficher les&#160;âŠ',
-'Show as topics'		=>	'Discussions',
-'Show as posts'			=>	'Messages',
+'User search'				=>	'Rechercher un utilisateur',
+'No search permission'		=>	'Vous n\'avez pas accÃšs Ã  la fonctionnalitÃ© de recherche',
+'Search'					=>	'Rechercher',
+'Search criteria legend'	=>	'SÃ©lectionnez vos critÃšres de recherche',
+'Search info'				=>	'Pour effectuer une recherche par mots-clef, saisissez le ou les termes Ã  rechercher. SÃ©parez chaque terme avec des espaces. Utilisez AND, OR, NOT pour affiner votre recherche. Pour rechercher par auteur, saisissez le nom d\'utilisateur auquel les messages appartiennent. Utilisez le joker * pour des recherches sur des mots incomplets.',
+'Keyword search'			=>	'Mots-clef',
+'Author search'				=>	'Rechercher un auteur',
+'Search in legend'			=>	'SÃ©lectionnez oÃ¹ vous souhaitez chercher',
+'Search in info'			=>	'Choisissez dans quel forum vous souhaitez lancer votre recherche et si vous souhaitez rechercher dans les sujets des discussions ou les textes des messages ou bien les deux Ã  la fois.',
+'Forum search'				=>	'Forum',
+'All forums'				=>	'Tous les forums',
+'Search in'					=>	'Rechercher dans',
+'Message and subject'		=>	'Texte du message et du sujet',
+'Message only'				=>	'Texte du message seulement',
+'Topic only'				=>	'Texte du sujet seulement',
+'Sort by'					=>	'Trier par',
+'Sort order'				=>	'Ordre',
+'Search results legend'		=>	'Selectionnez le mode d\'affichage des rÃ©sultats',
+'Search results info'		=>	'Vous pouvez choisir comment vous voulez classer et afficher les rÃ©sultats.',
+'Sort by post time'			=>	'Date du message',
+'Sort by author'			=>	'Auteur',
+'Sort by subject'			=>	'Sujet',
+'Sort by forum'				=>	'Forum',
+'Ascending'					=>	'Croissant',
+'Descending'				=>	'DÃ©croissant',
+'Show as'					=>	'Voir les rÃ©sultats',
+'Show as topics'			=>	'Discussions',
+'Show as posts'				=>	'Messages',
  
 // Results
-'Search'              =>  'Recherche',
-'Search results'		=>	'RÃ©sultats de la recherche',
-'Quick search show_new'		=>	'Nouveaux',
-'Quick search show_recent'	=>	'RÃ©centes',
-'Quick search show_unanswered'	=>	'Sans rÃ©ponse',
-'Quick search show_replies'	=>	'PubliÃ©s',
-'Quick search show_user_topics'	=>	'Discussions de %s',
-'Quick search show_user_posts'	=>	'Messages de %s',
-'Quick search show_subscriptions'       =>	'Suivies par %s',
-'By keywords show as topics'    =>      'Discussions avec messages contenant Â«&#160;%s&#160;Â»',
-'By keywords show as posts'     =>      'Messages contenant Â«&#160;%s&#160;Â»',
-'By user show as topics'        =>      'Discussions contenant des messages de %s',
-'By user show as posts'         =>      'Messages de %s',
-'By both show as topics'        =>      'Discussions avec messages de %s contenant Â«&#160;%s&#160;Â»',
-'By both show as posts'         =>      'Messages de %s contenant Â«&#160;%s&#160;Â»',
-'No terms'			=>	'Vous devez saisir au moins un mot-clÃ© et/ou un auteur Ã  rechercher.',
-'No hits'			=>	'DÃ©solÃ©, aucun rÃ©sultat n\'a Ã©tÃ© trouvÃ© pour votre recherche.',
-'No user posts'			=>	'Il n\'y a pas de message de cet utilisateur dans ce forum.',
-'No user topics'		=>	'Il n\'y a pas de discussion de cet utilisateur dans ce forum.',
-'No subscriptions'		=>	'Cet utilisateur ne suit actuellement aucune discussion.',
-'No new posts'			=>	'Il n\'y a pas de discussion avec de nouveaux messages depuis votre derniÃšre visite.',
-'No recent posts'		=>	'Il n\'y a pas de discussion avec de nouveaux messages depuis les 24 derniÃšres heures.',
-'No unanswered'			=>	'Il n\'y a pas de message sans rÃ©ponse dans ce forum.',
-'Go to post'			=>	'Aller au message',
-'Go to topic'			=>	'Aller Ã  la discussion'
-
+'Search results'			=>	'RÃ©sultats de la recherche',
+'No terms'					=>	'Vous devez entrer au moins un mot-clef et/ou un auteur Ã  rechercher.',
+'No hits'					=>	'Votre recherche n\'a renvoyÃ© aucun rÃ©sultat.',
+'No user posts'				=>	'Il n\'y a pas de message de cet utilisateur dans ce forum.',
+'No subscriptions'			=>	'Vous n\'Ãªtes abonnÃ© Ã  aucune discussion.',
+'No new posts'				=>	'Il n\'y a pas de discussion avec de nouveaux messages depuis votre derniÃšre visite.',
+'No recent posts'			=>	'Il n\'y a pas de discussion avec de nouveaux messages depuis les derniÃšres 24 heures.',
+'No unanswered'				=>	'Il n\'y a pas de message sans rÃ©ponse dans ce forum.',
+'Go to post'				=>	'Aller au message'
+ 
 );
Index: trunk/web/punbb/lang/French/topic.php
===================================================================
--- trunk/web/punbb/lang/French/topic.php	(revision 10)
+++ trunk/web/punbb/lang/French/topic.php	(revision 1)
@@ -3,30 +3,24 @@
 // Language definitions used in viewtopic.php
 $lang_topic = array(
-
-'Post reply'		=>	'RÃ©pondre',
+ 
+'Post reply'		=>	'Ãcrire une rÃ©ponse',
 'Topic closed'		=>	'Discussion fermÃ©e',
-'From'			=>	'Lieu&#160;:',	// User location
-'IP address logged'	=>	'IP de connexion',
-'Note'			=>	'Note&#160;:',	// Admin note
-'Posts'			=>	'Messages&#160;:',
-'Replies'		=>	'RÃ©ponses&#160;:',
-'Registered'		=>	'Inscription&#160;:',
-'Website'		=>	'Site Web',
-'Guest'			=>	'InvitÃ©',
-'Online'		=>	'En ligne',
-'Offline'		=>	'Hors ligne',
-'Last edit'		=>	'DerniÃšre modification par',
-'Report'		=>	'Signaler',
-'Delete'		=>	'Supprimer',
-'Edit'			=>	'Modifier',
-'Quote'			=>	'Citer',
-'Is subscribed'		=>	'Vous suivez cette discussion',
-'Unsubscribe'		=>	'Ne plus suivre',
-'Subscribe'		=>	'Suivre cette discussion',
+'From'				=>	'Lieu',				// User location
+'Note'				=>	'Note',				// Admin note
+'Website'			=>	'Site web',
+'Guest'				=>	'InvitÃ©',
+'Online'			=>	'En ligne',
+'Offline'			=>	'Hors ligne',
+'Last edit'			=>	'DerniÃšre modification par',
+'Report'			=>	'Signaler',
+'Delete'			=>	'Supprimer',
+'Edit'				=>	'Modifier',
+'Quote'				=>	'Citer',
+'Is subscribed'		=>	'Vous Ãªtes abonnÃ© Ã  cette discussion',
+'Unsubscribe'		=>	'DÃ©sabonner',
+'Subscribe'			=>	'S\'abonner Ã  cette discussion',
 'Quick post'		=>	'RÃ©ponse rapide',
-'Mod controls'		=>	'ModÃ©ration',
-'New icon'		=>	'Nouveau message',
-'Re'			=>	'Re&#160;:',
-'Preview'		=>	'PrÃ©visualisation'
-
+'Link separator'	=>	' | ',	// The text that separates links in posts (website, e-mail, report, edit etc.)
+'Mod controls'		=>	'ModÃ©ration'
+ 
 );
Index: trunk/web/punbb/lang/French/update.php
===================================================================
--- trunk/web/punbb/lang/French/update.php	(revision 10)
+++ 	(revision )
@@ -1,76 +1,0 @@
-<?php
-
-// Language definitions used in db_update.php
-
-$lang_update = array(
-
-'Update'			     =>	'Mise Ã  jour de FluxBB',
-'Update message'		     =>	'Votre base de donnÃ©es FluxBB est dÃ©passÃ©e et doit Ãªtre mise Ã  niveau afin de poursuivre. Si vous Ãªtes l\'administrateur de ces forums, veuillez suivre les instructions ci-desssous afin d\'achever la mise Ã  niveau.',
-'Note'				     =>	'Remarque :',
-'Members message'		     =>	'Cette procÃ©dure n\'est destinÃ©e qu\'aux administrateurs des forums. Si vous Ãªtes un membre ce n\'est pas la peine de vous prÃ©occuper de cela - les forums seront trÃšs rapidement fonctionnels !',
-'Administrator only'		     =>	'Cette Ã©tape ne concerne que l\'administrateur des forums !',
-'Database password info'	     =>	'Pour lancer la mise Ã  jour de la base de donnÃ©es veuillez indiquer le mot de passe de base de donnÃ©es avec lequel FluxBB a Ã©tÃ© installÃ©. Si vous ne vous en souvenez plus, il est stockÃ© dans le fichier \'config.php\'.',
-'Database password note'	     =>	'Si vous utilisez SQLite (et donc n\'avez dÃ©fini aucun mot de passe), veuillez utiliser le nom du fichier de base de donnÃ©es Ã  la place. Cela doit correspondre exactement au nom de base de donnÃ©es indiquÃ© dans votre fichier de configuration.',
-'Database password'		     =>	'Mot de passe de base de donnÃ©es',
-'Maintenance'          =>  'Maintenance',
-'Maintenance message info'    =>  'Le message qui s\'affichera pour les utilisateurs lors de l\'opÃ©ration de mise Ã  jour. Ce texte ne sera pas analysÃ© comme les messages habituels et peut donc contenir du code HTML.',
-'Maintenance message'        =>  'Message de maintenance',
-'Next'				     =>	'Suivante',
-
-'You are running error'		     =>	'Vous utilez la version %2$s de %1$s. FluxBB %3$s nÃ©cessite au moins %1$s %4$s pour fonctionner correctement. Vous devez mettre Ã  niveau votre installation avant de poursuivre.',
-'Version mismatch error'	     =>	'Version non correspondante. La base de donnÃ©es \'%s\' ne semble pas utiliser un schÃ©ma de base de donnÃ©es FluxBB pris en charge par ce script de mise Ã  jour.',
-'Invalid file error'		     =>	'Nom de base de donnÃ©es invalide. Lorsque vous utilisez SQLite le nom de la base de donnÃ©es indiquÃ© doit Ãªtre exactement identique Ã  celui de votre \'%s\'',
-'Invalid password error'	     =>	'Mot de passe de base de donnÃ©es invalide. Pour mettre Ã  niveau FluxBB vous devez indiquer votre mot de passe de base de donnÃ©es, il doit Ãªtre exactement identique Ã  celui de votre \'%s\'',
-'No password error'		     =>	'Aucun mot de passe de base de donnÃ©es fourni',
-'Script runs error'		     =>	'Il semblerait que le script de mise Ã  jour ait dÃ©jÃ  Ã©tÃ© lancÃ© par une autre personne. Si cela ne s\'averrait pas Ãªtre vrai, veuillez supprimer manuellement le fichier \'%s\' et essayer Ã  nouveau',
-'No update error'		     =>	'Votre forum a dÃ©jÃ  atteint le niveau de mis Ã  jour le plus Ã©levÃ© pour ce script',
-
-'Intro 1'			     =>	'Ce script va se charger de mettre votre base de donnÃ©es Ã  jour. La procÃ©dure de mise Ã  jour pourra prendre quelques secondes Ã  plusieures heures, cette durÃ©e dÃ©pendant de la vitesse du serveur et de la taille de la base de donnÃ©es. N\'oubliez pas de faire une sauvegarde de la base de donnÃ©es avant de poursuivre.',
-'Intro 2'			     =>	'Avez-vous lu les instructions de mise Ã  jour dans la documentation ? Si non, allez voir.',
-'No charset conversion'		     =>	'<strong>IMPORTANT !</strong> FluxBB a dÃ©tectÃ© que cet environnement PHP ne prend pas en charge les mÃ©canismes d\'encodage nÃ©cessaires pour effectuer une conversion UTF-8 Ã  partir de jeux de caractÃšres autres que ISO-8859-1. Cela signifie que si le jeu de caractÃšres actuel n\'est pas ISO-8859-1, FluxBB ne pourra pas convertir votre base de donnÃ©es du forum en UTF-8 et vous devrez le faire manuellement. Des informations concernant la conversion manuelle peuvent Ãªtre trouvÃ©es dans les instructions de mise Ã  jour.',
-'Enable conversion'		     =>	'<strong>Activer la conversion :</strong> si activÃ©, ce script de mise Ã  jour procÃšdera, aprÃšs avoir fait les modifications structurelles nÃ©cessaires Ã  la base de donnÃ©es, Ã  la conversion de tout le texte dans la base de donnÃ©es de l\'actuel jeu de caractÃšres vers UTF-8. Cette conversion est nÃ©cessaire si vous mettez Ã  niveau une version 1.2.',
-'Current character set'		     =>	'<strong>Jeu de caractÃšre actuel :</strong> Si la langue principale de votre forum est l\'anglais, vous pouvez laisser cela Ã  la valeur par dÃ©faut. En revanche, si votre forum utilise une autre langue, vous devrez indiquer le jeu de caractÃšres du paquetage de la langue principale utilisÃ© par le forum. <em>Si cette donnÃ©e est fausse, cela pourra corrompre votre base de donnÃ©es, donc n\'essayez pas de deviner !</em> Remarque : ceci est nÃ©cessaire mÃªme si votre ancienne base de donnÃ©es est en UTF-8.',
-'Charset conversion'		     =>	'Conversion de jeu de caractÃšres',
-'Enable conversion label'	     =>	'<strong>Activer la conversion</strong> (effectuer la conversion du jeu de caractÃšres de la base de donnÃ©es).',
-'Current character set label'	     =>	'Jeu de caractÃšres actuel',
-'Current character set info'	     =>	'Accepter la valeur par dÃ©faut pour des forums en anglais sinon, le jeu de caractÃšres du paquetage de la langue principale.',
-'Start update'			     =>	'DÃ©marrer la mise Ã  jour',
-'Error converting users'	     =>	'Erreur lors de la conversion de noms d\'utilisateurs',
-'Error info 1'			     =>	'Une erreur est survenue lors de la conversion de certains noms d\'utilisateurs. Cela peut arriver lors d\'une conversion Ã  partir de FluxBB v1.2 si plusieurs utilisateurs se sont inscrits en indiquant des noms trÃšs similaires, par exemple Â« bob Â» et Â« bÃ¶b Â».',
-'Error info 2'			     =>	'Ci-dessous une liste d\'utilisateurs dont la conversion du nom a Ã©chouÃ©. Veuillez choisir un nouveau nom pour chaque utilisateur. Les utilisateurs dont le nom aura Ã©tÃ© modifiÃ© seront automatiquement avertis par l\'envoi d\'un e-mail.',
-'New username'			     =>	'Nouvel utilisateur',
-'Required'			     =>	'(Obligatoire)',
-'Correct errors'		     =>	'Les erreurs suivantes doivent Ãªtre corrigÃ©es :',
-'Rename users'			     =>	'Renommer les utilisateurs',
-'Successfully updated'		     =>	'Votre base de donnÃ©es a Ã©tÃ© mise Ã  jour avec succÃšs. Vous devrez Ã  prÃ©sent %s.',
-'go to index'			     =>	'vous rendre Ã  la page d\'accueil des forums',
-
-'Unable to lock error'		     =>	'Impossible de dÃ©verrouiller pour mise Ã  jour. Veuillez vÃ©rifier que PHP puisse modifier le rÃ©pertoire \'%s\' et qu\'actuellement personne d\'autre n\'a lancÃ© le script de mise Ã  jour.',
-
-'Converting'			     =>	'Conversion de %s âŠ',
-'Converting item'		     =>	'Conversion de %1$s %2$s âŠ',
-'Preparsing item'		     =>	'Analyse prÃ©liminaire de %1$s %2$s âŠ',
-'Rebuilding index item'		     =>	'Reconstruction de l\'index pour %1$s %2$s',
-
-'ban'				     =>	'bannissement',
-'categories'			     =>	'catÃ©gories',
-'censor words'			     =>	'mots censurÃ©s',
-'configuration'			     =>	'configuration',
-'forums'			     =>	'forums',
-'groups'			     =>	'groupes',
-'post'				     =>	'message',
-'ranks'				     =>	'rangs',
-'report'			     =>	'signalement',
-'topic'				     =>	'discussion',
-'user'				     =>	'utilisateur',
-'signature'			     =>	'signature',
-
-'Username too short error'	     =>	'Les noms d\'utilisateurs doivent comporter au moins 2 caractÃšres. Veuillez choisir un autre nom d\'utilisateur (plus long).',
-'Username too long error'	     =>	'Les noms d\'utilisateurs ne doivent pas comporter plus de 25 caractÃšres. Veuillez choisir un autre nom d\'utilisateur (plus court).',
-'Username Guest reserved error'	     =>	'Le nom d\'utilisateur Â« guest Â» est rÃ©servÃ©. Veuillez choisir un autre nom.',
-'Username IP format error'	     =>	'Les noms d\'utilisateurs ne doivent pas ressembler Ã  une adresse IP. Veuillez choisir un autre nom d\'utilisateur.',
-'Username bad characters error'	     =>	'Les noms d\'utilisateurs ne doivent pas comporter tous les caractÃšres \', " et [ ou ] en mÃªme temps. Veuillez choisir un autre nom d\'utilisateur.',
-'Username BBCode error'		     =>	'Les noms d\'utilisateurs ne doivent pas comporter de balises de formatage de texte (BBCode) utilisÃ©s par le forum. Veuillez choisir un autre nom d\'utilisateur.',
-'Username duplicate error'	     =>	'Quelqu\'un a dÃ©jÃ  utilisÃ© le nom d\'utilisateur Â« %s Â». Le nom d\'utilisateur que vous avez indiquÃ© est trop semblable. Le nom doit comporter au moins un caractÃšre alphanumÃ©rique (a-z ou 0-9) diffÃ©rent. Veuillez choisir un autre nom d\'utilisateur.',
-
-);
Index: trunk/web/punbb/lang/French/userlist.php
===================================================================
--- trunk/web/punbb/lang/French/userlist.php	(revision 10)
+++ trunk/web/punbb/lang/French/userlist.php	(revision 1)
@@ -5,9 +5,8 @@
  
 'User find legend'		=>	'Chercher et trier les utilisateurs',
-'User search info'		=>	'Saisissez un nom d\'utilisateur pour le rechercher et/ou un groupe d\'utilisateurs pour filtrer les rÃ©sultats. Le champ Â«&#160;Nom d\'utilisateur&#160;Â» peut rester vide. Utilisez le joker * pour des recherches sur une partie du nom.',
-'User sort info'		=>	'Triez les utilisateurs par nom, date d\'inscription ou nombre de messages et dans l\'ordre croissant ou dÃ©croissant.',
+'User search info'		=>	'Saisissez un nom d\'utilisateur pour rechercher un utilisateur et le trier par groupe d\'utilisateurs. Le champ nom d\'utilisateur peut rester vide. Utilisez le joker * pour des recherches partielles. Triez les utilisateurs par nom, date d\'inscription ou nombre de messages et en ordre croissant ou dÃ©croissant.',
 'User group'			=>	'Groupe d\'utilisateurs',
 'No of posts'			=>	'Nombre de messages',
-'All users'			=>	'Tous les utilisateurs'
+'All users'				=>	'Tous les utilisateurs'
  
 );
Index: trunk/web/punbb/lang/index.html
===================================================================
--- trunk/web/punbb/lang/index.html	(revision 10)
+++ trunk/web/punbb/lang/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/login.php
===================================================================
--- trunk/web/punbb/login.php	(revision 10)
+++ trunk/web/punbb/login.php	(revision 1)
@@ -1,14 +1,31 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 if (isset($_GET['action']))
 	define('PUN_QUIET_VISIT', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -21,42 +38,30 @@
 if (isset($_POST['form_sent']) && $action == 'in')
 {
-	$form_username = pun_trim($_POST['req_username']);
-	$form_password = pun_trim($_POST['req_password']);
-	$save_pass = isset($_POST['save_pass']);
-
-	$username_sql = ($db_type == 'mysql' || $db_type == 'mysqli' || $db_type == 'mysql_innodb' || $db_type == 'mysqli_innodb') ? 'username=\''.$db->escape($form_username).'\'' : 'LOWER(username)=LOWER(\''.$db->escape($form_username).'\')';
-
-	$result = $db->query('SELECT * FROM '.$db->prefix.'users WHERE '.$username_sql) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-	$cur_user = $db->fetch_assoc($result);
+	$form_username = trim($_POST['req_username']);
+	$form_password = trim($_POST['req_password']);
+
+	$username_sql = ($db_type == 'mysql' || $db_type == 'mysqli') ? 'username=\''.$db->escape($form_username).'\'' : 'LOWER(username)=LOWER(\''.$db->escape($form_username).'\')';
+
+	$result = $db->query('SELECT id, group_id, password, save_pass FROM '.$db->prefix.'users WHERE '.$username_sql) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
+	list($user_id, $group_id, $db_password_hash, $save_pass) = $db->fetch_row($result);
 
 	$authorized = false;
 
-	if (!empty($cur_user['password']))
+	if (!empty($db_password_hash))
 	{
-		$form_password_hash = pun_hash($form_password); // Will result in a SHA-1 hash
-
-		// If there is a salt in the database we have upgraded from 1.3-legacy though havent yet logged in
-		if (!empty($cur_user['salt']))
+		$sha1_in_db = (strlen($db_password_hash) == 40) ? true : false;
+		$sha1_available = (function_exists('sha1') || function_exists('mhash')) ? true : false;
+
+		$form_password_hash = pun_hash($form_password);	// This could result in either an SHA-1 or an MD5 hash (depends on $sha1_available)
+
+		if ($sha1_in_db && $sha1_available && $db_password_hash == $form_password_hash)
+			$authorized = true;
+		else if (!$sha1_in_db && $db_password_hash == md5($form_password))
 		{
-			if (sha1($cur_user['salt'].sha1($form_password)) == $cur_user['password']) // 1.3 used sha1(salt.sha1(pass))
-			{
-				$authorized = true;
-
-				$db->query('UPDATE '.$db->prefix.'users SET password=\''.$form_password_hash.'\', salt=NULL WHERE id='.$cur_user['id']) or error('Unable to update user password', __FILE__, __LINE__, $db->error());
-			}
+			$authorized = true;
+
+			if ($sha1_available)	// There's an MD5 hash in the database, but SHA1 hashing is available, so we update the DB
+				$db->query('UPDATE '.$db->prefix.'users SET password=\''.$form_password_hash.'\' WHERE id='.$user_id) or error('Impossible de modifier le mot de passe', __FILE__, __LINE__, $db->error());
 		}
-		// If the length isn't 40 then the password isn't using sha1, so it must be md5 from 1.2
-		else if (strlen($cur_user['password']) != 40)
-		{
-			if (md5($form_password) == $cur_user['password'])
-			{
-				$authorized = true;
-
-				$db->query('UPDATE '.$db->prefix.'users SET password=\''.$form_password_hash.'\' WHERE id='.$cur_user['id']) or error('Unable to update user password', __FILE__, __LINE__, $db->error());
-			}
-		}
-		// Otherwise we should have a normal sha1 password
-		else
-			$authorized = ($cur_user['password'] == $form_password_hash);
 	}
 
@@ -65,25 +70,14 @@
 
 	// Update the status if this is the first time the user logged in
-	if ($cur_user['group_id'] == PUN_UNVERIFIED)
-	{
-		$db->query('UPDATE '.$db->prefix.'users SET group_id='.$pun_config['o_default_user_group'].' WHERE id='.$cur_user['id']) or error('Unable to update user status', __FILE__, __LINE__, $db->error());
-
-		// Regenerate the users info cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_users_info_cache();
-	}
+	if ($group_id == PUN_UNVERIFIED)
+		$db->query('UPDATE '.$db->prefix.'users SET group_id='.$pun_config['o_default_user_group'].' WHERE id='.$user_id) or error('Uimpossible de modifier le statut utilisateur', __FILE__, __LINE__, $db->error());
 
 	// Remove this users guest entry from the online list
-	$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape(get_remote_address()).'\'') or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
-
-	$expire = ($save_pass == '1') ? time() + 1209600 : time() + $pun_config['o_timeout_visit'];
-	pun_setcookie($cur_user['id'], $form_password_hash, $expire);
-
-	// Reset tracked topics
-	set_tracked_topics(null);
-
-	redirect(htmlspecialchars($_POST['redirect_url']), $lang_login['Login redirect']);
+	$db->query('DELETE FROM '.$db->prefix.'online WHERE ident=\''.$db->escape(get_remote_address()).'\'') or error('Impossible de supprimer de la liste des utilisateur en ligne', __FILE__, __LINE__, $db->error());
+
+	$expire = ($save_pass == '1') ? time() + 31536000 : 0;
+	pun_setcookie($user_id, $form_password_hash, $expire);
+
+	redirect($_POST['redirect_url'], $lang_login['Login redirect']);
 }
 
@@ -91,5 +85,5 @@
 else if ($action == 'out')
 {
-	if ($pun_user['is_guest'] || !isset($_GET['id']) || $_GET['id'] != $pun_user['id'] || !isset($_GET['csrf_token']) || $_GET['csrf_token'] != pun_hash($pun_user['id'].pun_hash(get_remote_address())))
+	if ($pun_user['is_guest'] || !isset($_GET['id']) || $_GET['id'] != $pun_user['id'])
 	{
 		header('Location: index.php');
@@ -97,12 +91,12 @@
 	}
 
-	// Remove user from "users online" list
-	$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$pun_user['id']) or error('Unable to delete from online list', __FILE__, __LINE__, $db->error());
+	// Remove user from "users online" list.
+	$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$pun_user['id']) or error('Impossible de supprimer de la liste des utilisateur en ligne', __FILE__, __LINE__, $db->error());
 
 	// Update last_visit (make sure there's something to update it with)
 	if (isset($pun_user['logged']))
-		$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Unable to update user visit data', __FILE__, __LINE__, $db->error());
-
-	pun_setcookie(1, pun_hash(uniqid(rand(), true)), time() + 31536000);
+		$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Impossible de modifier les donnÃ©es de visite de l\'utilisateur', __FILE__, __LINE__, $db->error());
+
+	pun_setcookie(1, random_pass(8), time() + 31536000);
 
 	redirect('index.php', $lang_login['Logout redirect']);
@@ -117,90 +111,56 @@
 	if (isset($_POST['form_sent']))
 	{
-		// Start with a clean slate
-		$errors = array();
-
 		require PUN_ROOT.'include/email.php';
 
-		// Validate the email address
+		// Validate the email-address
 		$email = strtolower(trim($_POST['req_email']));
 		if (!is_valid_email($email))
-			$errors[] = $lang_common['Invalid email'];
-
-		// Did everything go according to plan?
-		if (empty($errors))
+			message($lang_common['Invalid e-mail']);
+
+		$result = $db->query('SELECT id, username FROM '.$db->prefix.'users WHERE email=\''.$db->escape($email).'\'') or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
+
+		if ($db->num_rows($result))
 		{
-			$result = $db->query('SELECT id, username, last_email_sent FROM '.$db->prefix.'users WHERE email=\''.$db->escape($email).'\'') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-
-			if ($db->num_rows($result))
+			// Load the "activate password" template
+			$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/activate_password.tpl'));
+
+			// The first row contains the subject
+			$first_crlf = strpos($mail_tpl, "\n");
+			$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
+			$mail_message = trim(substr($mail_tpl, $first_crlf));
+
+			// Do the generic replacements first (they apply to all e-mails sent out here)
+			$mail_message = str_replace('<base_url>', $pun_config['o_base_url'].'/', $mail_message);
+			$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
+
+			// Loop through users we found
+			while ($cur_hit = $db->fetch_assoc($result))
 			{
-				// Load the "activate password" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/activate_password.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				// Do the generic replacements first (they apply to all emails sent out here)
-				$mail_message = str_replace('<base_url>', get_base_url().'/', $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-				// Loop through users we found
-				while ($cur_hit = $db->fetch_assoc($result))
-				{
-					if ($cur_hit['last_email_sent'] != '' && (time() - $cur_hit['last_email_sent']) < 3600 && (time() - $cur_hit['last_email_sent']) >= 0)
-						message($lang_login['Email flood'], true);
-
-					// Generate a new password and a new password activation code
-					$new_password = random_pass(8);
-					$new_password_key = random_pass(8);
-
-					$db->query('UPDATE '.$db->prefix.'users SET activate_string=\''.pun_hash($new_password).'\', activate_key=\''.$new_password_key.'\', last_email_sent = '.time().' WHERE id='.$cur_hit['id']) or error('Unable to update activation data', __FILE__, __LINE__, $db->error());
-
-					// Do the user specific replacements to the template
-					$cur_mail_message = str_replace('<username>', $cur_hit['username'], $mail_message);
-					$cur_mail_message = str_replace('<activation_url>', get_base_url().'/profile.php?id='.$cur_hit['id'].'&action=change_pass&key='.$new_password_key, $cur_mail_message);
-					$cur_mail_message = str_replace('<new_password>', $new_password, $cur_mail_message);
-
-					pun_mail($email, $mail_subject, $cur_mail_message);
-				}
-
-				message($lang_login['Forget mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
+				// Generate a new password and a new password activation code
+				$new_password = random_pass(8);
+				$new_password_key = random_pass(8);
+
+				$db->query('UPDATE '.$db->prefix.'users SET activate_string=\''.pun_hash($new_password).'\', activate_key=\''.$new_password_key.'\' WHERE id='.$cur_hit['id']) or error('Impossible de modifier les donnÃ©es d\'activation', __FILE__, __LINE__, $db->error());
+
+				// Do the user specific replacements to the template
+				$cur_mail_message = str_replace('<username>', $cur_hit['username'], $mail_message);
+				$cur_mail_message = str_replace('<activation_url>', $pun_config['o_base_url'].'/profile.php?id='.$cur_hit['id'].'&action=change_pass&key='.$new_password_key, $cur_mail_message);
+				$cur_mail_message = str_replace('<new_password>', $new_password, $cur_mail_message);
+
+				pun_mail($email, $mail_subject, $cur_mail_message);
 			}
-			else
-				$errors[] = $lang_login['No email match'].' '.htmlspecialchars($email).'.';
-			}
+
+			message($lang_login['Forget mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
 		}
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_login['Request pass']);
-	$required_fields = array('req_email' => $lang_common['Email']);
+		else
+			message($lang_login['No e-mail match'].' '.htmlspecialchars($email).'.');
+	}
+
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_login['Request pass'];
+	$required_fields = array('req_email' => $lang_common['E-mail']);
 	$focus_element = array('request_pass', 'req_email');
-	define ('PUN_ACTIVE_PAGE', 'login');
 	require PUN_ROOT.'header.php';
 
-// If there are errors, we display them
-if (!empty($errors))
-{
-
-?>
-<div id="posterror" class="block">
-	<h2><span><?php echo $lang_login['New password errors'] ?></span></h2>
-	<div class="box">
-		<div class="inbox error-info">
-			<p><?php echo $lang_login['New passworderrors info'] ?></p>
-			<ul class="error-list">
-<?php
-
-	foreach ($errors as $cur_error)
-		echo "\t\t\t\t".'<li><strong>'.$cur_error.'</strong></li>'."\n";
-?>
-			</ul>
-		</div>
-	</div>
-</div>
-
-<?php
-
-}
 ?>
 <div class="blockform">
@@ -213,10 +173,10 @@
 					<div class="infldset">
 						<input type="hidden" name="form_sent" value="1" />
-						<label class="required"><strong><?php echo $lang_common['Email'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input id="req_email" type="text" name="req_email" size="50" maxlength="80" /><br /></label>
+						<input id="req_email" type="text" name="req_email" size="50" maxlength="50" />
 						<p><?php echo $lang_login['Request pass info'] ?></p>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="request_pass" value="<?php echo $lang_common['Submit'] ?>" /><?php if (empty($errors)): ?> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a><?php endif; ?></p>
+			<p><input type="submit" name="request_pass" value="<?php echo $lang_common['Submit'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -232,35 +192,9 @@
 
 // Try to determine if the data in HTTP_REFERER is valid (if not, we redirect to index.php after login)
-if (!empty($_SERVER['HTTP_REFERER']))
-{
-	$referrer = parse_url($_SERVER['HTTP_REFERER']);
-	// Remove www subdomain if it exists
-	if (strpos($referrer['host'], 'www.') === 0)
-		$referrer['host'] = substr($referrer['host'], 4);
-
-	// Make sure the path component exists
-	if (!isset($referrer['path']))
-		$referrer['path'] = '';
-
-	$valid = parse_url(get_base_url());
-	// Remove www subdomain if it exists
-	if (strpos($valid['host'], 'www.') === 0)
-		$valid['host'] = substr($valid['host'], 4);
-
-	// Make sure the path component exists
-	if (!isset($valid['path']))
-		$valid['path'] = '';
-
-	if ($referrer['host'] == $valid['host'] && preg_match('%^'.preg_quote($valid['path'], '%').'/(.*?)\.php%i', $referrer['path']))
-		$redirect_url = $_SERVER['HTTP_REFERER'];
-}
-
-if (!isset($redirect_url))
-	$redirect_url = 'index.php';
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Login']);
+$redirect_url = (isset($_SERVER['HTTP_REFERER']) && preg_match('#^'.preg_quote($pun_config['o_base_url']).'/(.*?)\.php#i', $_SERVER['HTTP_REFERER'])) ? htmlspecialchars($_SERVER['HTTP_REFERER']) : 'index.php';
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Login'];
 $required_fields = array('req_username' => $lang_common['Username'], 'req_password' => $lang_common['Password']);
 $focus_element = array('login', 'req_username');
-define('PUN_ACTIVE_PAGE', 'login');
 require PUN_ROOT.'header.php';
 
@@ -273,20 +207,16 @@
 				<fieldset>
 					<legend><?php echo $lang_login['Login legend'] ?></legend>
-					<div class="infldset">
-						<input type="hidden" name="form_sent" value="1" />
-						<input type="hidden" name="redirect_url" value="<?php echo pun_htmlspecialchars($redirect_url) ?>" />
-						<label class="conl required"><strong><?php echo $lang_common['Username'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="req_username" size="25" maxlength="25" tabindex="1" /><br /></label>
-						<label class="conl required"><strong><?php echo $lang_common['Password'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="password" name="req_password" size="25" tabindex="2" /><br /></label>
-
-						<div class="rbox clearb">
-							<label><input type="checkbox" name="save_pass" value="1" tabindex="3" /><?php echo $lang_login['Remember me'] ?><br /></label>
+						<div class="infldset">
+							<input type="hidden" name="form_sent" value="1" />
+							<input type="hidden" name="redirect_url" value="<?php echo $redirect_url ?>" />
+							<label class="conl"><strong><?php echo $lang_common['Username'] ?></strong><br /><input type="text" name="req_username" size="25" maxlength="25" tabindex="1" /><br /></label>
+							<label class="conl"><strong><?php echo $lang_common['Password'] ?></strong><br /><input type="password" name="req_password" size="16" maxlength="16" tabindex="2" /><br /></label>
+							<p class="clearb"><?php echo $lang_login['Login info'] ?></p>
+							<p><a href="register.php" tabindex="4"><?php echo $lang_login['Not registered'] ?></a>&#160;&#160;
+							<a href="login.php?action=forget" tabindex="5"><?php echo $lang_login['Forgotten pass'] ?></a></p>
 						</div>
-
-						<p class="clearb"><?php echo $lang_login['Login info'] ?></p>
-						<p class="actions"><span><a href="register.php" tabindex="5"><?php echo $lang_login['Not registered'] ?></a></span> <span><a href="login.php?action=forget" tabindex="6"><?php echo $lang_login['Forgotten pass'] ?></a></span></p>
-					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="login" value="<?php echo $lang_common['Login'] ?>" tabindex="4" /></p>
+			<p><input type="submit" name="login" value="<?php echo $lang_common['Login'] ?>" tabindex="3" /></p>
 		</form>
 	</div>
Index: trunk/web/punbb/misc.php
===================================================================
--- trunk/web/punbb/misc.php	(revision 10)
+++ trunk/web/punbb/misc.php	(revision 1)
@@ -1,14 +1,31 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 if (isset($_GET['action']))
 	define('PUN_QUIET_VISIT', 1);
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -22,20 +39,16 @@
 if ($action == 'rules')
 {
-	if ($pun_config['o_rules'] == '0' || ($pun_user['is_guest'] && $pun_user['g_read_board'] == '0' && $pun_config['o_regs_allow'] == '0'))
-		message($lang_common['Bad request']);
-
 	// Load the register.php language file
 	require PUN_ROOT.'lang/'.$pun_user['language'].'/register.php';
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_register['Forum rules']);
-	define('PUN_ACTIVE_PAGE', 'rules');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Forum rules'];
 	require PUN_ROOT.'header.php';
 
 ?>
-<div id="rules" class="block">
-	<div class="hd"><h2><span><?php echo $lang_register['Forum rules'] ?></span></h2></div>
+<div class="block">
+	<h2><span><?php echo $lang_register['Forum rules'] ?></span></h2>
 	<div class="box">
-		<div id="rules-block" class="inbox">
-			<div class="usercontent"><?php echo $pun_config['o_rules_message'] ?></div>
+		<div class="inbox">
+			<p><?php echo $pun_config['o_rules_message'] ?></p>
 		</div>
 	</div>
@@ -52,8 +65,5 @@
 		message($lang_common['No permission']);
 
-	$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Unable to update user last visit data', __FILE__, __LINE__, $db->error());
-
-	// Reset tracked topics
-	set_tracked_topics(null);
+	$db->query('UPDATE '.$db->prefix.'users SET last_visit='.$pun_user['logged'].' WHERE id='.$pun_user['id']) or error('Impossible de modifier les donnÃ©es de derniÃšre visite de l\'utilisateur', __FILE__, __LINE__, $db->error());
 
 	redirect('index.php', $lang_misc['Mark read redirect']);
@@ -61,25 +71,7 @@
 
 
-// Mark the topics/posts in a forum as read?
-else if ($action == 'markforumread')
+else if (isset($_GET['email']))
 {
 	if ($pun_user['is_guest'])
-		message($lang_common['No permission']);
-
-	$fid = isset($_GET['fid']) ? intval($_GET['fid']) : 0;
-	if ($fid < 1)
-		message($lang_common['Bad request']);
-
-	$tracked_topics = get_tracked_topics();
-	$tracked_topics['forums'][$fid] = time();
-	set_tracked_topics($tracked_topics);
-
-	redirect('viewforum.php?id='.$fid, $lang_misc['Mark forum read redirect']);
-}
-
-
-else if (isset($_GET['email']))
-{
-	if ($pun_user['is_guest'] || $pun_user['g_send_email'] == '0')
 		message($lang_common['No permission']);
 
@@ -88,5 +80,5 @@
 		message($lang_common['Bad request']);
 
-	$result = $db->query('SELECT username, email, email_setting FROM '.$db->prefix.'users WHERE id='.$recipient_id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT username, email, email_setting FROM '.$db->prefix.'users WHERE id='.$recipient_id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
 		message($lang_common['Bad request']);
@@ -94,6 +86,6 @@
 	list($recipient, $recipient_email, $email_setting) = $db->fetch_row($result);
 
-	if ($email_setting == 2 && !$pun_user['is_admmod'])
-		message($lang_misc['Form email disabled']);
+	if ($email_setting == 2 && $pun_user['g_id'] > PUN_MOD)
+		message($lang_misc['Form e-mail disabled']);
 
 
@@ -105,20 +97,17 @@
 
 		if ($subject == '')
-			message($lang_misc['No email subject']);
+			message($lang_misc['No e-mail subject']);
 		else if ($message == '')
-			message($lang_misc['No email message']);
-		else if (pun_strlen($message) > PUN_MAX_POSTSIZE)
-			message($lang_misc['Too long email message']);
-
-		if ($pun_user['last_email_sent'] != '' && (time() - $pun_user['last_email_sent']) < $pun_user['g_email_flood'] && (time() - $pun_user['last_email_sent']) >= 0)
-			message(sprintf($lang_misc['Email flood'], $pun_user['g_email_flood']));
-
-		// Load the "form email" template
+			message($lang_misc['No e-mail message']);
+		else if (strlen($message) > 65535)
+			message($lang_misc['Too long e-mail message']);
+
+		// Load the "form e-mail" template
 		$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/form_email.tpl'));
 
 		// The first row contains the subject
 		$first_crlf = strpos($mail_tpl, "\n");
-		$mail_subject = pun_trim(substr($mail_tpl, 8, $first_crlf-8));
-		$mail_message = pun_trim(substr($mail_tpl, $first_crlf));
+		$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
+		$mail_message = trim(substr($mail_tpl, $first_crlf));
 
 		$mail_subject = str_replace('<mail_subject>', $subject, $mail_subject);
@@ -126,62 +115,42 @@
 		$mail_message = str_replace('<board_title>', $pun_config['o_board_title'], $mail_message);
 		$mail_message = str_replace('<mail_message>', $message, $mail_message);
-		$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
+		$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
 
 		require_once PUN_ROOT.'include/email.php';
 
-		pun_mail($recipient_email, $mail_subject, $mail_message, $pun_user['email'], $pun_user['username']);
-
-		$db->query('UPDATE '.$db->prefix.'users SET last_email_sent='.time().' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
-
-		redirect(htmlspecialchars($_POST['redirect_url']), $lang_misc['Email sent redirect']);
+		pun_mail($recipient_email, $mail_subject, $mail_message, '"'.str_replace('"', '', $pun_user['username']).'" <'.$pun_user['email'].'>');
+
+		redirect($_POST['redirect_url'], $lang_misc['E-mail sent redirect']);
 	}
 
 
-	// Try to determine if the data in HTTP_REFERER is valid (if not, we redirect to the users profile after the email is sent)
-	if (!empty($_SERVER['HTTP_REFERER']))
-	{
-		$referrer = parse_url($_SERVER['HTTP_REFERER']);
-		// Remove www subdomain if it exists
-		if (strpos($referrer['host'], 'www.') === 0)
-			$referrer['host'] = substr($referrer['host'], 4);
-
-		$valid = parse_url(get_base_url());
-		// Remove www subdomain if it exists
-		if (strpos($valid['host'], 'www.') === 0)
-			$valid['host'] = substr($valid['host'], 4);
-
-		if ($referrer['host'] == $valid['host'] && preg_match('%^'.preg_quote($valid['path'], '%').'/(.*?)\.php%i', $referrer['path']))
-			$redirect_url = $_SERVER['HTTP_REFERER'];
-	}
-
-	if (!isset($redirect_url))
-		$redirect_url = 'profile.php?id='.$recipient_id;
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Send email to'].' '.pun_htmlspecialchars($recipient));
-	$required_fields = array('req_subject' => $lang_misc['Email subject'], 'req_message' => $lang_misc['Email message']);
+	// Try to determine if the data in HTTP_REFERER is valid (if not, we redirect to the users profile after the e-mail is sent)
+	$redirect_url = (isset($_SERVER['HTTP_REFERER']) && preg_match('#^'.preg_quote($pun_config['o_base_url']).'/(.*?)\.php#i', $_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : 'index.php';
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Send e-mail to'].' '.pun_htmlspecialchars($recipient);
+	$required_fields = array('req_subject' => $lang_misc['E-mail subject'], 'req_message' => $lang_misc['E-mail message']);
 	$focus_element = array('email', 'req_subject');
-	define('PUN_ACTIVE_PAGE', 'index');
 	require PUN_ROOT.'header.php';
 
 ?>
-<div id="emailform" class="blockform">
-	<h2><span><?php echo $lang_misc['Send email to'] ?> <?php echo pun_htmlspecialchars($recipient) ?></span></h2>
+<div class="blockform">
+	<h2><span><?php echo $lang_misc['Send e-mail to'] ?> <?php echo pun_htmlspecialchars($recipient) ?></span></h2>
 	<div class="box">
 		<form id="email" method="post" action="misc.php?email=<?php echo $recipient_id ?>" onsubmit="this.submit.disabled=true;if(process_form(this)){return true;}else{this.submit.disabled=false;return false;}">
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_misc['Write email'] ?></legend>
+					<legend><?php echo $lang_misc['Write e-mail'] ?></legend>
 					<div class="infldset txtarea">
 						<input type="hidden" name="form_sent" value="1" />
-						<input type="hidden" name="redirect_url" value="<?php echo pun_htmlspecialchars($redirect_url) ?>" />
-						<label class="required"><strong><?php echo $lang_misc['Email subject'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
+						<input type="hidden" name="redirect_url" value="<?php echo $redirect_url ?>" />
+						<label><strong><?php echo $lang_misc['E-mail subject'] ?></strong><br />
 						<input class="longinput" type="text" name="req_subject" size="75" maxlength="70" tabindex="1" /><br /></label>
-						<label class="required"><strong><?php echo $lang_misc['Email message'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
+						<label><strong><?php echo $lang_misc['E-mail message'] ?></strong><br />
 						<textarea name="req_message" rows="10" cols="75" tabindex="2"></textarea><br /></label>
-						<p><?php echo $lang_misc['Email disclosure note'] ?></p>
+						<p><?php echo $lang_misc['E-mail disclosure note'] ?></p>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" tabindex="3" accesskey="s" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" tabindex="3" accesskey="s" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -208,9 +177,4 @@
 		if ($reason == '')
 			message($lang_misc['No reason']);
-		else if (strlen($reason) > 65535) // TEXT field can only hold 65535 bytes
-			message($lang_misc['Reason too long']);
-
-		if ($pun_user['last_report_sent'] != '' && (time() - $pun_user['last_report_sent']) < $pun_user['g_report_flood'] && (time() - $pun_user['last_report_sent']) >= 0)
-			message(sprintf($lang_misc['Report flood'], $pun_user['g_report_flood']));
 
 		// Get the topic ID
@@ -222,5 +186,5 @@
 
 		// Get the subject and forum ID
-		$result = $db->query('SELECT subject, forum_id FROM '.$db->prefix.'topics WHERE id='.$topic_id) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT subject, forum_id FROM '.$db->prefix.'topics WHERE id='.$topic_id) or error('Impossible de retrouver les informations des discussions', __FILE__, __LINE__, $db->error());
 		if (!$db->num_rows($result))
 			message($lang_common['Bad request']);
@@ -229,27 +193,15 @@
 
 		// Should we use the internal report handling?
-		if ($pun_config['o_report_method'] == '0' || $pun_config['o_report_method'] == '2')
+		if ($pun_config['o_report_method'] == 0 || $pun_config['o_report_method'] == 2)
 			$db->query('INSERT INTO '.$db->prefix.'reports (post_id, topic_id, forum_id, reported_by, created, message) VALUES('.$post_id.', '.$topic_id.', '.$forum_id.', '.$pun_user['id'].', '.time().', \''.$db->escape($reason).'\')' ) or error('Unable to create report', __FILE__, __LINE__, $db->error());
 
-		// Should we email the report?
-		if ($pun_config['o_report_method'] == '1' || $pun_config['o_report_method'] == '2')
+		// Should we e-mail the report?
+		if ($pun_config['o_report_method'] == 1 || $pun_config['o_report_method'] == 2)
 		{
 			// We send it to the complete mailing-list in one swoop
 			if ($pun_config['o_mailing_list'] != '')
 			{
-				// Load the "new report" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/new_report.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				$mail_subject = str_replace('<forum_id>', $forum_id, $mail_subject);
-				$mail_subject = str_replace('<topic_subject>', $subject, $mail_subject);
-				$mail_message = str_replace('<username>', $pun_user['username'], $mail_message);
-				$mail_message = str_replace('<post_url>', get_base_url().'/viewtopic.php?pid='.$post_id.'#p'.$post_id, $mail_message);
-				$mail_message = str_replace('<reason>', $reason, $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
+				$mail_subject = 'Report('.$forum_id.') - \''.$subject.'\'';
+				$mail_message = 'User \''.$pun_user['username'].'\' has reported the following message:'."\n".$pun_config['o_base_url'].'/viewtopic.php?pid='.$post_id.'#p'.$post_id."\n\n".'Reason:'."\n".$reason;
 
 				require PUN_ROOT.'include/email.php';
@@ -259,38 +211,15 @@
 		}
 
-		$db->query('UPDATE '.$db->prefix.'users SET last_report_sent='.time().' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
-
 		redirect('viewtopic.php?pid='.$post_id.'#p'.$post_id, $lang_misc['Report redirect']);
 	}
 
-	// Fetch some info about the post, the topic and the forum
-	$result = $db->query('SELECT f.id AS fid, f.forum_name, t.id AS tid, t.subject FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id='.$post_id) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-	if (!$db->num_rows($result))
-		message($lang_common['Bad request']);
-
-	$cur_post = $db->fetch_assoc($result);
-
-	if ($pun_config['o_censoring'] == '1')
-		$cur_post['subject'] = censor_words($cur_post['subject']);
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Report post']);
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Report post'];
 	$required_fields = array('req_reason' => $lang_misc['Reason']);
 	$focus_element = array('report', 'req_reason');
-	define('PUN_ACTIVE_PAGE', 'index');
 	require PUN_ROOT.'header.php';
 
 ?>
-<div class="linkst">
-	<div class="inbox">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $cur_post['fid'] ?>"><?php echo pun_htmlspecialchars($cur_post['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?pid=<?php echo $post_id ?>#p<?php echo $post_id ?>"><?php echo pun_htmlspecialchars($cur_post['subject']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_misc['Report post'] ?></strong></li>
-		</ul>
-	</div>
-</div>
-
-<div id="reportform" class="blockform">
+<div class="blockform">
 	<h2><span><?php echo $lang_misc['Report post'] ?></span></h2>
 	<div class="box">
@@ -301,9 +230,9 @@
 					<div class="infldset txtarea">
 						<input type="hidden" name="form_sent" value="1" />
-						<label class="required"><strong><?php echo $lang_misc['Reason'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><textarea name="req_reason" rows="5" cols="60"></textarea><br /></label>
+						<label><strong><?php echo $lang_misc['Reason'] ?></strong><br /><textarea name="req_reason" rows="5" cols="60"></textarea><br /></label>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -315,91 +244,39 @@
 
 
-else if ($action == 'subscribe')
-{
-	if ($pun_user['is_guest'])
-		message($lang_common['No permission']);
-
-	$topic_id = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
-	$forum_id = isset($_GET['fid']) ? intval($_GET['fid']) : 0;
-	if ($topic_id < 1 && $forum_id < 1)
-		message($lang_common['Bad request']);
-
-	if ($topic_id)
-	{
-		if ($pun_config['o_topic_subscriptions'] != '1')
-			message($lang_common['No permission']);
-
-		// Make sure the user can view the topic
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$topic_id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
-		if (!$db->num_rows($result))
-			message($lang_common['Bad request']);
-
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'topic_subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$topic_id) or error('Unable to fetch subscription info', __FILE__, __LINE__, $db->error());
-		if ($db->num_rows($result))
-			message($lang_misc['Already subscribed topic']);
-
-		$db->query('INSERT INTO '.$db->prefix.'topic_subscriptions (user_id, topic_id) VALUES('.$pun_user['id'].' ,'.$topic_id.')') or error('Unable to add subscription', __FILE__, __LINE__, $db->error());
-
-		redirect('viewtopic.php?id='.$topic_id, $lang_misc['Subscribe redirect']);
-	}
-
-	if ($forum_id)
-	{
-		if ($pun_config['o_forum_subscriptions'] != '1')
-			message($lang_common['No permission']);
-
-		// Make sure the user can view the forum
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$forum_id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
-		if (!$db->num_rows($result))
-			message($lang_common['Bad request']);
-
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'forum_subscriptions WHERE user_id='.$pun_user['id'].' AND forum_id='.$forum_id) or error('Unable to fetch subscription info', __FILE__, __LINE__, $db->error());
-		if ($db->num_rows($result))
-			message($lang_misc['Already subscribed forum']);
-
-		$db->query('INSERT INTO '.$db->prefix.'forum_subscriptions (user_id, forum_id) VALUES('.$pun_user['id'].' ,'.$forum_id.')') or error('Unable to add subscription', __FILE__, __LINE__, $db->error());
-
-		redirect('viewforum.php?id='.$forum_id, $lang_misc['Subscribe redirect']);
-	}
-}
-
-
-else if ($action == 'unsubscribe')
-{
-	if ($pun_user['is_guest'])
-		message($lang_common['No permission']);
-
-	$topic_id = isset($_GET['tid']) ? intval($_GET['tid']) : 0;
-	$forum_id = isset($_GET['fid']) ? intval($_GET['fid']) : 0;
-	if ($topic_id < 1 && $forum_id < 1)
-		message($lang_common['Bad request']);
-
-	if ($topic_id)
-	{
-		if ($pun_config['o_topic_subscriptions'] != '1')
-			message($lang_common['No permission']);
-
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'topic_subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$topic_id) or error('Unable to fetch subscription info', __FILE__, __LINE__, $db->error());
-		if (!$db->num_rows($result))
-			message($lang_misc['Not subscribed topic']);
-
-		$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$topic_id) or error('Unable to remove subscription', __FILE__, __LINE__, $db->error());
-
-		redirect('viewtopic.php?id='.$topic_id, $lang_misc['Unsubscribe redirect']);
-	}
-
-	if ($forum_id)
-	{
-		if ($pun_config['o_forum_subscriptions'] != '1')
-			message($lang_common['No permission']);
-
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'forum_subscriptions WHERE user_id='.$pun_user['id'].' AND forum_id='.$forum_id) or error('Unable to fetch subscription info', __FILE__, __LINE__, $db->error());
-		if (!$db->num_rows($result))
-			message($lang_misc['Not subscribed forum']);
-
-		$db->query('DELETE FROM '.$db->prefix.'forum_subscriptions WHERE user_id='.$pun_user['id'].' AND forum_id='.$forum_id) or error('Unable to remove subscription', __FILE__, __LINE__, $db->error());
-
-		redirect('viewforum.php?id='.$forum_id, $lang_misc['Unsubscribe redirect']);
-	}
+else if (isset($_GET['subscribe']))
+{
+	if ($pun_user['is_guest'] || $pun_config['o_subscriptions'] != '1')
+		message($lang_common['No permission']);
+
+	$topic_id = intval($_GET['subscribe']);
+	if ($topic_id < 1)
+		message($lang_common['Bad request']);
+
+	$result = $db->query('SELECT 1 FROM '.$db->prefix.'subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$topic_id) or error('Impossible de retrouver les informations d\'abonnement', __FILE__, __LINE__, $db->error());
+	if ($db->num_rows($result))
+		message($lang_misc['Already subscribed']);
+
+	$db->query('INSERT INTO '.$db->prefix.'subscriptions (user_id, topic_id) VALUES('.$pun_user['id'].' ,'.$topic_id.')') or error('UImpossible d\'ajouter l\'abonnement', __FILE__, __LINE__, $db->error());
+
+	redirect('viewtopic.php?id='.$topic_id, $lang_misc['Subscribe redirect']);
+}
+
+
+else if (isset($_GET['unsubscribe']))
+{
+	if ($pun_user['is_guest'] || $pun_config['o_subscriptions'] != '1')
+		message($lang_common['No permission']);
+
+	$topic_id = intval($_GET['unsubscribe']);
+	if ($topic_id < 1)
+		message($lang_common['Bad request']);
+
+	$result = $db->query('SELECT 1 FROM '.$db->prefix.'subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$topic_id) or error('Impossible de retrouver les informations d\'abonnement', __FILE__, __LINE__, $db->error());
+	if (!$db->num_rows($result))
+		message($lang_misc['Not subscribed']);
+
+	$db->query('DELETE FROM '.$db->prefix.'subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$topic_id) or error('Impossible de supprimer l\'abonnement', __FILE__, __LINE__, $db->error());
+
+	redirect('viewtopic.php?id='.$topic_id, $lang_misc['Unsubscribe redirect']);
 }
 
Index: trunk/web/punbb/moderate.php
===================================================================
--- trunk/web/punbb/moderate.php	(revision 10)
+++ trunk/web/punbb/moderate.php	(revision 1)
@@ -1,23 +1,40 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
 
 // This particular function doesn't require forum-based moderator access. It can be used
-// by all moderators and admins
+// by all moderators and admins.
 if (isset($_GET['get_host']))
 {
-	if (!$pun_user['is_admmod'])
+	if ($pun_user['g_id'] > PUN_MOD)
 		message($lang_common['No permission']);
 
 	// Is get_host an IP address or a post ID?
-	if (@preg_match('%^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$%', $_GET['get_host']) || @preg_match('%^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$%', $_GET['get_host']))
+	if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $_GET['get_host']))
 		$ip = $_GET['get_host'];
 	else
@@ -27,5 +44,5 @@
 			message($lang_common['Bad request']);
 
-		$result = $db->query('SELECT poster_ip FROM '.$db->prefix.'posts WHERE id='.$get_host) or error('Unable to fetch post IP address', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT poster_ip FROM '.$db->prefix.'posts WHERE id='.$get_host) or error('Impossible de retrouver l\'adresse IP', __FILE__, __LINE__, $db->error());
 		if (!$db->num_rows($result))
 			message($lang_common['Bad request']);
@@ -34,8 +51,5 @@
 	}
 
-	// Load the misc.php language file
-	require PUN_ROOT.'lang/'.$pun_user['language'].'/misc.php';
-
-	message(sprintf($lang_misc['Host info 1'], $ip).'<br />'.sprintf($lang_misc['Host info 2'], @gethostbyaddr($ip)).'<br /><br /><a href="admin_users.php?show_users='.$ip.'">'.$lang_misc['Show more users'].'</a>');
+	message('L\'adresse IP est : '.$ip.'<br />Le nom de l\'hÃŽte est : '.@gethostbyaddr($ip).'<br /><br /><a href="admin_users.php?show_users='.$ip.'">Voir plus d\'utilisateurs pour cette IP</a>');
 }
 
@@ -46,15 +60,12 @@
 	message($lang_common['Bad request']);
 
-$result = $db->query('SELECT moderators FROM '.$db->prefix.'forums WHERE id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT moderators FROM '.$db->prefix.'forums WHERE id='.$fid) or error('UImpossible de retrouver les informations des forums', __FILE__, __LINE__, $db->error());
 
 $moderators = $db->result($result);
 $mods_array = ($moderators != '') ? unserialize($moderators) : array();
 
-if ($pun_user['g_id'] != PUN_ADMIN && ($pun_user['g_moderator'] == '0' || !array_key_exists($pun_user['username'], $mods_array)))
+if ($pun_user['g_id'] != PUN_ADMIN && ($pun_user['g_id'] != PUN_MOD || !array_key_exists($pun_user['username'], $mods_array)))
 	message($lang_common['No permission']);
 
-// Get topic/forum tracking data
-if (!$pun_user['is_guest'])
-	$tracked_topics = get_tracked_topics();
 
 // Load the misc.php language file
@@ -62,5 +73,5 @@
 
 
-// All other topic moderation features require a topic ID in GET
+// All other topic moderation features require a topic id in GET
 if (isset($_GET['tid']))
 {
@@ -70,5 +81,5 @@
 
 	// Fetch some info about the topic
-	$result = $db->query('SELECT t.subject, t.num_replies, t.first_post_id, f.id AS forum_id, forum_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid.' AND t.id='.$tid.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT t.subject, t.num_replies, f.id AS forum_id, forum_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid.' AND t.id='.$tid.' AND t.moved_to IS NULL') or error('UImpossible de retrouver les informations des discussions', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
 		message($lang_common['Bad request']);
@@ -76,8 +87,9 @@
 	$cur_topic = $db->fetch_assoc($result);
 
+
 	// Delete one or more posts
 	if (isset($_POST['delete_posts']) || isset($_POST['delete_posts_comply']))
 	{
-		$posts = isset($_POST['posts']) ? $_POST['posts'] : array();
+		$posts = $_POST['posts'];
 		if (empty($posts))
 			message($lang_misc['No posts selected']);
@@ -87,15 +99,9 @@
 			confirm_referrer('moderate.php');
 
-			if (@preg_match('%[^0-9,]%', $posts))
+			if (preg_match('/[^0-9,]/', $posts))
 				message($lang_common['Bad request']);
 
-			// Verify that the post IDs are valid
-			$result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id IN('.$posts.') AND topic_id='.$tid) or error('Unable to check posts', __FILE__, __LINE__, $db->error());
-
-			if ($db->num_rows($result) != substr_count($posts, ',') + 1)
-				message($lang_common['Bad request']);
-
 			// Delete the posts
-			$db->query('DELETE FROM '.$db->prefix.'posts WHERE id IN('.$posts.')') or error('Unable to delete posts', __FILE__, __LINE__, $db->error());
+			$db->query('DELETE FROM '.$db->prefix.'posts WHERE id IN('.$posts.')') or error('Impossible de supprimer les messages', __FILE__, __LINE__, $db->error());
 
 			require PUN_ROOT.'include/search_idx.php';
@@ -103,5 +109,5 @@
 
 			// Get last_post, last_post_id, and last_poster for the topic after deletion
-			$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+			$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT 1') or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
 			$last_post = $db->fetch_assoc($result);
 
@@ -110,5 +116,5 @@
 
 			// Update the topic
-			$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$last_post['posted'].', last_post_id='.$last_post['id'].', last_poster=\''.$db->escape($last_post['poster']).'\', num_replies=num_replies-'.$num_posts_deleted.' WHERE id='.$tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$last_post['posted'].', last_post_id='.$last_post['id'].', last_poster=\''.$db->escape($last_post['poster']).'\', num_replies=num_replies-'.$num_posts_deleted.' WHERE id='.$tid) or error('Impossible de modifier la discussion', __FILE__, __LINE__, $db->error());
 
 			update_forum($fid);
@@ -118,6 +124,5 @@
 
 
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
-		define('PUN_ACTIVE_PAGE', 'index');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
 		require PUN_ROOT.'header.php';
 
@@ -131,10 +136,10 @@
 					<legend><?php echo $lang_misc['Confirm delete legend'] ?></legend>
 					<div class="infldset">
-						<input type="hidden" name="posts" value="<?php echo implode(',', array_map('intval', array_keys($posts))) ?>" />
+						<input type="hidden" name="posts" value="<?php echo implode(',', array_keys($posts)) ?>" />
 						<p><?php echo $lang_misc['Delete posts comply'] ?></p>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="delete_posts_comply" value="<?php echo $lang_misc['Delete'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="delete_posts_comply" value="<?php echo $lang_misc['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -144,128 +149,7 @@
 		require PUN_ROOT.'footer.php';
 	}
-	else if (isset($_POST['split_posts']) || isset($_POST['split_posts_comply']))
-	{
-		$posts = isset($_POST['posts']) ? $_POST['posts'] : array();
-		if (empty($posts))
-			message($lang_misc['No posts selected']);
-
-		if (isset($_POST['split_posts_comply']))
-		{
-			confirm_referrer('moderate.php');
-
-			if (@preg_match('%[^0-9,]%', $posts))
-				message($lang_common['Bad request']);
-
-			$move_to_forum = isset($_POST['move_to_forum']) ? intval($_POST['move_to_forum']) : 0;
-			if ($move_to_forum < 1)
-				message($lang_common['Bad request']);
-
-			// How many posts did we just split off?
-			$num_posts_splitted = substr_count($posts, ',') + 1;
-
-			// Verify that the post IDs are valid
-			$result = $db->query('SELECT 1 FROM '.$db->prefix.'posts WHERE id IN('.$posts.') AND topic_id='.$tid) or error('Unable to check posts', __FILE__, __LINE__, $db->error());
-			if ($db->num_rows($result) != $num_posts_splitted)
-				message($lang_common['Bad request']);
-
-			// Verify that the move to forum ID is valid
-			$result = $db->query('SELECT 1 FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.group_id='.$pun_user['g_id'].' AND fp.forum_id='.$move_to_forum.') WHERE f.redirect_url IS NULL AND (fp.post_topics IS NULL OR fp.post_topics=1)') or error('Unable to fetch forum permissions', __FILE__, __LINE__, $db->error());
-			if (!$db->num_rows($result))
-				message($lang_common['Bad request']);
-
-			// Load the post.php language file
-			require PUN_ROOT.'lang/'.$pun_user['language'].'/post.php';
-
-			// Check subject
-			$new_subject = isset($_POST['new_subject']) ? pun_trim($_POST['new_subject']) : '';
-
-			if ($new_subject == '')
-				message($lang_post['No subject']);
-			else if (pun_strlen($new_subject) > 70)
-				message($lang_post['Too long subject']);
-
-			// Get data from the new first post
-			$result = $db->query('SELECT p.id, p.poster, p.posted FROM '.$db->prefix.'posts AS p WHERE id IN('.$posts.') ORDER BY p.id ASC LIMIT 1') or error('Unable to get first post', __FILE__, __LINE__, $db->error());
-			$first_post_data = $db->fetch_assoc($result);
-
-			// Create the new topic
-			$db->query('INSERT INTO '.$db->prefix.'topics (poster, subject, posted, first_post_id, forum_id) VALUES (\''.$db->escape($first_post_data['poster']).'\', \''.$db->escape($new_subject).'\', '.$first_post_data['posted'].', '.$first_post_data['id'].', '.$move_to_forum.')') or error('Unable to create new topic', __FILE__, __LINE__, $db->error());
-			$new_tid = $db->insert_id();
-
-			// Move the posts to the new topic
-			$db->query('UPDATE '.$db->prefix.'posts SET topic_id='.$new_tid.' WHERE id IN('.$posts.')') or error('Unable to move posts into new topic', __FILE__, __LINE__, $db->error());
-
-			// Get last_post, last_post_id, and last_poster from the topic and update it
-			$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-			$last_post_data = $db->fetch_assoc($result);
-			$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$last_post_data['posted'].', last_post_id='.$last_post_data['id'].', last_poster=\''.$db->escape($last_post_data['poster']).'\', num_replies=num_replies-'.$num_posts_splitted.' WHERE id='.$tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
-
-			// Get last_post, last_post_id, and last_poster from the new topic and update it
-			$result = $db->query('SELECT id, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$new_tid.' ORDER BY id DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
-			$last_post_data = $db->fetch_assoc($result);
-			$db->query('UPDATE '.$db->prefix.'topics SET last_post='.$last_post_data['posted'].', last_post_id='.$last_post_data['id'].', last_poster=\''.$db->escape($last_post_data['poster']).'\', num_replies='.($num_posts_splitted-1).' WHERE id='.$new_tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
-
-			update_forum($fid);
-			update_forum($move_to_forum);
-
-			redirect('viewtopic.php?id='.$new_tid, $lang_misc['Split posts redirect']);
-		}
-
-		$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.post_topics IS NULL OR fp.post_topics=1) AND f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
-
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
-		$focus_element = array('subject','new_subject');
-		define('PUN_ACTIVE_PAGE', 'index');
-		require PUN_ROOT.'header.php';
-
-?>
-<div class="blockform">
-	<h2><span><?php echo $lang_misc['Split posts'] ?></span></h2>
-	<div class="box">
-		<form id="subject" method="post" action="moderate.php?fid=<?php echo $fid ?>&amp;tid=<?php echo $tid ?>">
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_misc['Confirm split legend'] ?></legend>
-					<div class="infldset">
-						<input type="hidden" name="posts" value="<?php echo implode(',', array_map('intval', array_keys($posts))) ?>" />
-						<label class="required"><strong><?php echo $lang_misc['New subject'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="new_subject" size="80" maxlength="70" /><br /></label>
-						<label><?php echo $lang_misc['Move to'] ?>
-						<br /><select name="move_to_forum">
-<?php
-
-	$cur_category = 0;
-	while ($cur_forum = $db->fetch_assoc($result))
-	{
-		if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
-		{
-			if ($cur_category)
-				echo "\t\t\t\t\t\t\t".'</optgroup>'."\n";
-
-			echo "\t\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($cur_forum['cat_name']).'">'."\n";
-			$cur_category = $cur_forum['cid'];
-		}
-
-		echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_forum['fid'].'"'.($fid == $cur_forum['fid'] ? ' selected="selected"' : '').'>'.pun_htmlspecialchars($cur_forum['forum_name']).'</option>'."\n";
-	}
-
-?>
-							</optgroup>
-						</select>
-						<br /></label>
-						<p><?php echo $lang_misc['Split posts comply'] ?></p>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="split_posts_comply" value="<?php echo $lang_misc['Split'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
-		</form>
-	</div>
-</div>
-<?php
-
-		require PUN_ROOT.'footer.php';
-	}
-
-
-	// Show the moderate posts view
+
+
+	// Show the delete multiple posts view
 
 	// Load the viewtopic.php language file
@@ -273,5 +157,5 @@
 
 	// Used to disable the Move and Delete buttons if there are no replies to this topic
-	$button_status = ($cur_topic['num_replies'] == 0) ? ' disabled="disabled"' : '';
+	$button_status = ($cur_topic['num_replies'] == 0) ? ' disabled' : '';
 
 
@@ -279,9 +163,9 @@
 	$num_pages = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']);
 
-	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
+	$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 	$start_from = $pun_user['disp_posts'] * ($p - 1);
 
 	// Generate paging links
-	$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'moderate.php?fid='.$fid.'&amp;tid='.$tid);
+	$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'moderate.php?fid='.$fid.'&amp;tid='.$tid);
 
 
@@ -290,20 +174,12 @@
 
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), pun_htmlspecialchars($cur_topic['forum_name']), pun_htmlspecialchars($cur_topic['subject']));
-	define('PUN_ACTIVE_PAGE', 'index');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$cur_topic['subject'];
 	require PUN_ROOT.'header.php';
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $fid ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?id=<?php echo $tid ?>"><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_misc['Moderate'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
-		</div>
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li><li>&#160;&raquo;&#160;<a href="viewforum.php?id=<?php echo $fid ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li><li>&#160;&raquo;&#160;<?php echo pun_htmlspecialchars($cur_topic['subject']) ?></li></ul>
 		<div class="clearer"></div>
 	</div>
@@ -315,15 +191,9 @@
 	require PUN_ROOT.'include/parser.php';
 
-	$post_count = 0; // Keep track of post numbers
-
-	// Retrieve a list of post IDs, LIMIT is (really) expensive so we only fetch the IDs here then later fetch the remaining data
-	$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id LIMIT '.$start_from.','.$pun_user['disp_posts']) or error('Unable to fetch post IDs', __FILE__, __LINE__, $db->error());
-
-	$post_ids = array();
-	for ($i = 0;$cur_post_id = $db->result($result, $i);$i++)
-		$post_ids[] = $cur_post_id;
+	$bg_switch = true;	// Used for switching background color in posts
+	$post_count = 0;	// Keep track of post numbers
 
 	// Retrieve the posts (and their respective poster)
-	$result = $db->query('SELECT u.title, u.num_posts, g.g_id, g.g_user_title, p.id, p.poster, p.poster_id, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE p.id IN ('.implode(',', $post_ids).') ORDER BY p.id', true) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT u.title, u.num_posts, g.g_id, g.g_user_title, p.id, p.poster, p.poster_id, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE p.topic_id='.$tid.' ORDER BY p.id LIMIT '.$start_from.','.$pun_user['disp_posts'], true) or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
 
 	while ($cur_post = $db->fetch_assoc($result))
@@ -331,11 +201,8 @@
 		$post_count++;
 
-		// If the poster is a registered user
+		// If the poster is a registered user.
 		if ($cur_post['poster_id'] > 1)
 		{
-			if ($pun_user['g_view_users'] == '1')
-				$poster = '<a href="profile.php?id='.$cur_post['poster_id'].'">'.pun_htmlspecialchars($cur_post['poster']).'</a>';
-			else
-				$poster = pun_htmlspecialchars($cur_post['poster']);
+			$poster = '<a href="profile.php?id='.$cur_post['poster_id'].'">'.pun_htmlspecialchars($cur_post['poster']).'</a>';
 
 			// get_title() requires that an element 'username' be present in the array
@@ -353,4 +220,8 @@
 		}
 
+		// Switch the background color for every message.
+		$bg_switch = ($bg_switch) ? $bg_switch = false : $bg_switch = true;
+		$vtbg = ($bg_switch) ? ' roweven' : ' rowodd';
+
 		// Perform the main parsing of the message (BBCode, smilies, censor words etc)
 		$cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies']);
@@ -358,50 +229,40 @@
 ?>
 
-<div id="p<?php echo $cur_post['id'] ?>" class="blockpost<?php if($cur_post['id'] == $cur_topic['first_post_id']) echo ' firstpost' ?><?php echo ($post_count % 2 == 0) ? ' roweven' : ' rowodd' ?><?php if ($post_count == 1) echo ' blockpost1' ?>">
-	<h2><span><span class="conr">#<?php echo ($start_from + $post_count) ?></span> <a href="viewtopic.php?pid=<?php echo $cur_post['id'].'#p'.$cur_post['id'] ?>"><?php echo format_time($cur_post['posted']) ?></a></span></h2>
+<div class="blockpost<?php echo $vtbg ?>">
+	<a name="<?php echo $cur_post['id'] ?>"></a>
+	<h2><span><span class="conr">#<?php echo ($start_from + $post_count) ?>&#160;</span><a href="viewtopic.php?pid=<?php echo $cur_post['id'].'#p'.$cur_post['id'] ?>"><?php echo format_time($cur_post['posted']) ?></a></span></h2>
 	<div class="box">
 		<div class="inbox">
-			<div class="postbody">
-				<div class="postleft">
-					<dl>
-						<dt><strong><?php echo $poster ?></strong></dt>
-						<dd class="usertitle"><strong><?php echo $user_title ?></strong></dd>
-					</dl>
+			<div class="postleft">
+				<dl>
+					<dt><strong><?php echo $poster ?></strong></dt>
+					<dd><strong><?php echo $user_title ?></strong></dd>
+				</dl>
+			</div>
+			<div class="postright">
+				<h3 class="nosize"><?php echo $lang_common['Message'] ?></h3>
+				<div class="postmsg">
+					<?php echo $cur_post['message']."\n" ?>
+<?php if ($cur_post['edited'] != '') echo "\t\t\t\t\t".'<p class="postedit"><em>'.$lang_topic['Last edit'].' '.pun_htmlspecialchars($cur_post['edited_by']).' ('.format_time($cur_post['edited']).')</em></p>'."\n"; ?>
 				</div>
-				<div class="postright">
-					<h3 class="nosize"><?php echo $lang_common['Message'] ?></h3>
-					<div class="postmsg">
-						<?php echo $cur_post['message']."\n" ?>
-<?php if ($cur_post['edited'] != '') echo "\t\t\t\t\t\t".'<p class="postedit"><em>'.$lang_topic['Last edit'].' '.pun_htmlspecialchars($cur_post['edited_by']).' ('.format_time($cur_post['edited']).')</em></p>'."\n"; ?>
-					</div>
-				</div>
+				<?php if ($start_from + $post_count > 1) echo '<p class="multidelete"><label><strong>'.$lang_misc['Select'].'</strong>&#160;&#160;<input type="checkbox" name="posts['.$cur_post['id'].']" value="1" /></label></p>'."\n" ?>
 			</div>
-		</div>
-		<div class="inbox">
-			<div class="postfoot clearb">
-				<div class="postfootright"><?php echo ($cur_post['id'] != $cur_topic['first_post_id']) ? '<p class="multidelete"><label><strong>'.$lang_misc['Select'].'</strong>&#160;<input type="checkbox" name="posts['.$cur_post['id'].']" value="1" /></label></p>' : '<p>'.$lang_misc['Cannot select first'].'</p>' ?></div>
-			</div>
-		</div>
-	</div>
-</div>
-
-<?php
-
-	}
-
-?>
-<div class="postlinksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
-			<p class="conr modbuttons"><input type="submit" name="split_posts" value="<?php echo $lang_misc['Split'] ?>"<?php echo $button_status ?> /> <input type="submit" name="delete_posts" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /></p>
 			<div class="clearer"></div>
 		</div>
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $fid ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?id=<?php echo $tid ?>"><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_misc['Moderate'] ?></strong></li>
-		</ul>
+	</div>
+</div>
+
+
+
+
+<?php
+
+	}
+
+?>
+<div class="postlinksb">
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
+		<p class="conr"><input type="submit" name="delete_posts" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /></p>
 		<div class="clearer"></div>
 	</div>
@@ -421,5 +282,5 @@
 		confirm_referrer('moderate.php');
 
-		if (@preg_match('%[^0-9,]%', $_POST['topics']))
+		if (preg_match('/[^0-9,]/', $_POST['topics']))
 			message($lang_common['Bad request']);
 
@@ -429,37 +290,26 @@
 			message($lang_common['Bad request']);
 
-		// Verify that the topic IDs are valid
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'topics WHERE id IN('.implode(',',$topics).') AND forum_id='.$fid) or error('Unable to check topics', __FILE__, __LINE__, $db->error());
-
-		if ($db->num_rows($result) != count($topics))
-			message($lang_common['Bad request']);
-
-		// Verify that the move to forum ID is valid
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.group_id='.$pun_user['g_id'].' AND fp.forum_id='.$move_to_forum.') WHERE f.redirect_url IS NULL AND (fp.post_topics IS NULL OR fp.post_topics=1)') or error('Unable to fetch forum permissions', __FILE__, __LINE__, $db->error());
-		if (!$db->num_rows($result))
-			message($lang_common['Bad request']);
-
-		// Delete any redirect topics if there are any (only if we moved/copied the topic back to where it was once moved from)
-		$db->query('DELETE FROM '.$db->prefix.'topics WHERE forum_id='.$move_to_forum.' AND moved_to IN('.implode(',',$topics).')') or error('Unable to delete redirect topics', __FILE__, __LINE__, $db->error());
+		// Delete any redirect topics if there are any (only if we moved/copied the topic back to where it where it was once moved from)
+		$db->query('DELETE FROM '.$db->prefix.'topics WHERE forum_id='.$move_to_forum.' AND moved_to IN('.implode(',',$topics).')') or error('Impossible de supprimer les redirections', __FILE__, __LINE__, $db->error());
 
 		// Move the topic(s)
-		$db->query('UPDATE '.$db->prefix.'topics SET forum_id='.$move_to_forum.' WHERE id IN('.implode(',',$topics).')') or error('Unable to move topics', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'topics SET forum_id='.$move_to_forum.' WHERE id IN('.implode(',',$topics).')') or error('Impossible de dÃ©placer la discussion', __FILE__, __LINE__, $db->error());
 
 		// Should we create redirect topics?
 		if (isset($_POST['with_redirect']))
 		{
-			foreach ($topics as $cur_topic)
+			while (list(, $cur_topic) = @each($topics))
 			{
 				// Fetch info for the redirect topic
-				$result = $db->query('SELECT poster, subject, posted, last_post FROM '.$db->prefix.'topics WHERE id='.$cur_topic) or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT poster, subject, posted, last_post FROM '.$db->prefix.'topics WHERE id='.$cur_topic) or error('Impossible de retrouver les informations de la discussions', __FILE__, __LINE__, $db->error());
 				$moved_to = $db->fetch_assoc($result);
 
 				// Create the redirect topic
-				$db->query('INSERT INTO '.$db->prefix.'topics (poster, subject, posted, last_post, moved_to, forum_id) VALUES(\''.$db->escape($moved_to['poster']).'\', \''.$db->escape($moved_to['subject']).'\', '.$moved_to['posted'].', '.$moved_to['last_post'].', '.$cur_topic.', '.$fid.')') or error('Unable to create redirect topic', __FILE__, __LINE__, $db->error());
+				$db->query('INSERT INTO '.$db->prefix.'topics (poster, subject, posted, last_post, moved_to, forum_id) VALUES(\''.$db->escape($moved_to['poster']).'\', \''.$db->escape($moved_to['subject']).'\', '.$moved_to['posted'].', '.$moved_to['last_post'].', '.$cur_topic.', '.$fid.')') or error('Impossible de crÃ©er une redirection', __FILE__, __LINE__, $db->error());
 			}
 		}
 
-		update_forum($fid); // Update the forum FROM which the topic was moved
-		update_forum($move_to_forum); // Update the forum TO which the topic was moved
+		update_forum($fid);				// Update the forum FROM which the topic was moved
+		update_forum($move_to_forum);	// Update the forum TO which the topic was moved
 
 		$redirect_msg = (count($topics) > 1) ? $lang_misc['Move topics redirect'] : $lang_misc['Move topic redirect'];
@@ -473,5 +323,5 @@
 			message($lang_misc['No topics selected']);
 
-		$topics = implode(',', array_map('intval', array_keys($topics)));
+		$topics = implode(',', array_keys($topics));
 		$action = 'multi';
 	}
@@ -485,10 +335,5 @@
 	}
 
-	$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.post_topics IS NULL OR fp.post_topics=1) AND f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
-	if ($db->num_rows($result) < 2)
-		message($lang_misc['Nowhere to move']);
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
-	define('PUN_ACTIVE_PAGE', 'index');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
 	require PUN_ROOT.'header.php';
 
@@ -507,8 +352,10 @@
 <?php
 
+	$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Impossible de retrouver la liste des catÃ©gories et des forums', __FILE__, __LINE__, $db->error());
+	
 	$cur_category = 0;
 	while ($cur_forum = $db->fetch_assoc($result))
 	{
-		if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
+		if ($cur_forum['cid'] != $cur_category)	// A new category since last iteration?
 		{
 			if ($cur_category)
@@ -533,5 +380,5 @@
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="move_topics_to" value="<?php echo $lang_misc['Move'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="move_topics_to" value="<?php echo $lang_misc['Move'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -542,96 +389,7 @@
 }
 
-// Merge two or more topics
-else if (isset($_POST['merge_topics']) || isset($_POST['merge_topics_comply']))
-{
-	if (isset($_POST['merge_topics_comply']))
-	{
-		confirm_referrer('moderate.php');
-
-		if (@preg_match('%[^0-9,]%', $_POST['topics']))
-			message($lang_common['Bad request']);
-
-		$topics = explode(',', $_POST['topics']);
-		if (count($topics) < 2)
-			message($lang_misc['Not enough topics selected']);
-
-		// Verify that the topic IDs are valid (redirect links will point to the merged topic after the merge)
-		$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $topics).') AND forum_id='.$fid.' ORDER BY id ASC') or error('Unable to check topics', __FILE__, __LINE__, $db->error());
-		if ($db->num_rows($result) != count($topics))
-			message($lang_common['Bad request']);
-
-		// The topic that we are merging into is the one with the smallest ID
-		$merge_to_tid = $db->result($result);
-
-		// Make any redirect topics point to our new, merged topic
-		$query = 'UPDATE '.$db->prefix.'topics SET moved_to='.$merge_to_tid.' WHERE moved_to IN('.implode(',', $topics).')';
-
-		// Should we create redirect topics?
-		if (isset($_POST['with_redirect']))
-			$query .= ' OR (id IN('.implode(',', $topics).') AND id != '.$merge_to_tid.')';
-
-		$db->query($query) or error('Unable to make redirection topics', __FILE__, __LINE__, $db->error());
-
-		// Merge the posts into the topic
-		$db->query('UPDATE '.$db->prefix.'posts SET topic_id='.$merge_to_tid.' WHERE topic_id IN('.implode(',', $topics).')') or error('Unable to merge the posts into the topic', __FILE__, __LINE__, $db->error());
-
-		// Delete any subscriptions
-		$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE topic_id IN('.implode(',', $topics).') AND topic_id != '.$merge_to_tid) or error('Unable to delete subscriptions', __FILE__, __LINE__, $db->error());
-
-		// Without redirection the old topics are removed
-		if (!isset($_POST['with_redirect']))
-			$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $topics).') AND id != '.$merge_to_tid) or error('Unable to delete old topics', __FILE__, __LINE__, $db->error());
-
-		// Count number of replies in the topic
-		$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'posts WHERE topic_id='.$merge_to_tid) or error('Unable to fetch post count for topic', __FILE__, __LINE__, $db->error());
-		$num_replies = $db->result($result, 0) - 1;
-
-		// Get last_post, last_post_id and last_poster
-		$result = $db->query('SELECT posted, id, poster FROM '.$db->prefix.'posts WHERE topic_id='.$merge_to_tid.' ORDER BY id DESC LIMIT 1') or error('Unable to get last post info', __FILE__, __LINE__, $db->error());
-		list($last_post, $last_post_id, $last_poster) = $db->fetch_row($result);
-
-		// Update topic
-		$db->query('UPDATE '.$db->prefix.'topics SET num_replies='.$num_replies.', last_post='.$last_post.', last_post_id='.$last_post_id.', last_poster=\''.$db->escape($last_poster).'\' WHERE id='.$merge_to_tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
-
-		// Update the forum FROM which the topic was moved and redirect
-		update_forum($fid);
-		redirect('viewforum.php?id='.$fid, $lang_misc['Merge topics redirect']);
-	}
-
-	$topics = isset($_POST['topics']) ? $_POST['topics'] : array();
-	if (count($topics) < 2)
-		message($lang_misc['Not enough topics selected']);
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
-	define('PUN_ACTIVE_PAGE', 'index');
-	require PUN_ROOT.'header.php';
-
-?>
-<div class="blockform">
-	<h2><span><?php echo $lang_misc['Merge topics'] ?></span></h2>
-	<div class="box">
-		<form method="post" action="moderate.php?fid=<?php echo $fid ?>">
-			<input type="hidden" name="topics" value="<?php echo implode(',', array_map('intval', array_keys($topics))) ?>" />
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_misc['Confirm merge legend'] ?></legend>
-					<div class="infldset">
-						<div class="rbox">
-							<label><input type="checkbox" name="with_redirect" value="1" /><?php echo $lang_misc['Leave redirect'] ?><br /></label>
-						</div>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="merge_topics_comply" value="<?php echo $lang_misc['Merge'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
-		</form>
-	</div>
-</div>
-<?php
-
-	require PUN_ROOT.'footer.php';
-}
 
 // Delete one or more topics
-else if (isset($_POST['delete_topics']) || isset($_POST['delete_topics_comply']))
+if (isset($_REQUEST['delete_topics']) || isset($_POST['delete_topics_comply']))
 {
 	$topics = isset($_POST['topics']) ? $_POST['topics'] : array();
@@ -643,23 +401,17 @@
 		confirm_referrer('moderate.php');
 
-		if (@preg_match('%[^0-9,]%', $topics))
+		if (preg_match('/[^0-9,]/', $topics))
 			message($lang_common['Bad request']);
 
 		require PUN_ROOT.'include/search_idx.php';
 
-		// Verify that the topic IDs are valid
-		$result = $db->query('SELECT 1 FROM '.$db->prefix.'topics WHERE id IN('.$topics.') AND forum_id='.$fid) or error('Unable to check topics', __FILE__, __LINE__, $db->error());
-
-		if ($db->num_rows($result) != substr_count($topics, ',') + 1)
-			message($lang_common['Bad request']);
-
 		// Delete the topics and any redirect topics
-		$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.$topics.') OR moved_to IN('.$topics.')') or error('Unable to delete topic', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'topics WHERE id IN('.$topics.') OR moved_to IN('.$topics.')') or error('Impossible de supprimer la discussion', __FILE__, __LINE__, $db->error());
 
 		// Delete any subscriptions
-		$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE topic_id IN('.$topics.')') or error('Unable to delete subscriptions', __FILE__, __LINE__, $db->error());
-
-		// Create a list of the post IDs in this topic and then strip the search index
-		$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id IN('.$topics.')') or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'subscriptions WHERE topic_id IN('.$topics.')') or error('Impossible de supprimer l\'abonnement', __FILE__, __LINE__, $db->error());
+
+		// Create a list of the post ID's in this topic and then strip the search index
+		$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id IN('.$topics.')') or error('Impossible de retrouver les messages', __FILE__, __LINE__, $db->error());
 
 		$post_ids = '';
@@ -667,10 +419,10 @@
 			$post_ids .= ($post_ids != '') ? ','.$row[0] : $row[0];
 
-		// We have to check that we actually have a list of post IDs since we could be deleting just a redirect topic
+		// We have to check that we actually have a list of post ID's since we could be deleting just a redirect topic
 		if ($post_ids != '')
 			strip_search_index($post_ids);
 
 		// Delete posts
-		$db->query('DELETE FROM '.$db->prefix.'posts WHERE topic_id IN('.$topics.')') or error('Unable to delete posts', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'posts WHERE topic_id IN('.$topics.')') or error('Impossible de supprimer les messages', __FILE__, __LINE__, $db->error());
 
 		update_forum($fid);
@@ -680,14 +432,13 @@
 
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_misc['Moderate']);
-	define('PUN_ACTIVE_PAGE', 'index');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_misc['Moderate'];
 	require PUN_ROOT.'header.php';
 
 ?>
 <div class="blockform">
-	<h2><span><?php echo $lang_misc['Delete topics'] ?></span></h2>
+	<h2><?php echo $lang_misc['Delete topics'] ?></h2>
 	<div class="box">
 		<form method="post" action="moderate.php?fid=<?php echo $fid ?>">
-			<input type="hidden" name="topics" value="<?php echo implode(',', array_map('intval', array_keys($topics))) ?>" />
+			<input type="hidden" name="topics" value="<?php echo implode(',', array_keys($topics)) ?>" />
 			<div class="inform">
 				<fieldset>
@@ -698,5 +449,5 @@
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="delete_topics_comply" value="<?php echo $lang_misc['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="delete_topics_comply" value="<?php echo $lang_misc['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -713,5 +464,5 @@
 	$action = (isset($_REQUEST['open'])) ? 0 : 1;
 
-	// There could be an array of topic IDs in $_POST
+	// There could be an array of topic ID's in $_POST
 	if (isset($_POST['open']) || isset($_POST['close']))
 	{
@@ -722,5 +473,5 @@
 			message($lang_misc['No topics selected']);
 
-		$db->query('UPDATE '.$db->prefix.'topics SET closed='.$action.' WHERE id IN('.implode(',', $topics).') AND forum_id='.$fid) or error('Unable to close topics', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'topics SET closed='.$action.' WHERE id IN('.implode(',', $topics).')') or error('Impossible de fermer les discussions', __FILE__, __LINE__, $db->error());
 
 		$redirect_msg = ($action) ? $lang_misc['Close topics redirect'] : $lang_misc['Open topics redirect'];
@@ -736,5 +487,5 @@
 			message($lang_common['Bad request']);
 
-		$db->query('UPDATE '.$db->prefix.'topics SET closed='.$action.' WHERE id='.$topic_id.' AND forum_id='.$fid) or error('Unable to close topic', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'topics SET closed='.$action.' WHERE id='.$topic_id) or error('Impossible de fermer la discussion', __FILE__, __LINE__, $db->error());
 
 		$redirect_msg = ($action) ? $lang_misc['Close topic redirect'] : $lang_misc['Open topic redirect'];
@@ -753,5 +504,5 @@
 		message($lang_common['Bad request']);
 
-	$db->query('UPDATE '.$db->prefix.'topics SET sticky=\'1\' WHERE id='.$stick.' AND forum_id='.$fid) or error('Unable to stick topic', __FILE__, __LINE__, $db->error());
+	$db->query('UPDATE '.$db->prefix.'topics SET sticky=\'1\' WHERE id='.$stick) or error('Impossible d\'Ã©pingler la discussion', __FILE__, __LINE__, $db->error());
 
 	redirect('viewtopic.php?id='.$stick, $lang_misc['Stick topic redirect']);
@@ -768,5 +519,5 @@
 		message($lang_common['Bad request']);
 
-	$db->query('UPDATE '.$db->prefix.'topics SET sticky=\'0\' WHERE id='.$unstick.' AND forum_id='.$fid) or error('Unable to unstick topic', __FILE__, __LINE__, $db->error());
+	$db->query('UPDATE '.$db->prefix.'topics SET sticky=\'0\' WHERE id='.$unstick) or error('Impossible de dÃ©tacher la discussion', __FILE__, __LINE__, $db->error());
 
 	redirect('viewtopic.php?id='.$unstick, $lang_misc['Unstick topic redirect']);
@@ -780,5 +531,5 @@
 
 // Fetch some info about the forum
-$result = $db->query('SELECT f.forum_name, f.redirect_url, f.num_topics, f.sort_by FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT f.forum_name, f.redirect_url, f.num_topics FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Impossible de retrouver les informations de forums', __FILE__, __LINE__, $db->error());
 if (!$db->num_rows($result))
 	message($lang_common['Bad request']);
@@ -790,44 +541,21 @@
 	message($lang_common['Bad request']);
 
-switch ($cur_forum['sort_by'])
-{
-	case 0:
-		$sort_by = 'last_post DESC';
-		break;
-	case 1:
-		$sort_by = 'posted DESC';
-		break;
-	case 2:
-		$sort_by = 'subject ASC';
-		break;
-	default:
-		$sort_by = 'last_post DESC';
-		break;
-}
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.pun_htmlspecialchars($cur_forum['forum_name']);
+require PUN_ROOT.'header.php';
 
 // Determine the topic offset (based on $_GET['p'])
 $num_pages = ceil($cur_forum['num_topics'] / $pun_user['disp_topics']);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
+$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 $start_from = $pun_user['disp_topics'] * ($p - 1);
 
 // Generate paging links
-$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'moderate.php?fid='.$fid);
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), pun_htmlspecialchars($cur_forum['forum_name']));
-define('PUN_ACTIVE_PAGE', 'index');
-require PUN_ROOT.'header.php';
+$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'moderate.php?fid='.$fid)
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $fid ?>"><?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_misc['Moderate'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
-		</div>
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a>&#160;</li><li>&raquo;&#160;<?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></li></ul>
 		<div class="clearer"></div>
 	</div>
@@ -844,6 +572,6 @@
 					<th class="tcl" scope="col"><?php echo $lang_common['Topic'] ?></th>
 					<th class="tc2" scope="col"><?php echo $lang_common['Replies'] ?></th>
-<?php if ($pun_config['o_topic_views'] == '1'): ?>					<th class="tc3" scope="col"><?php echo $lang_forum['Views'] ?></th>
-<?php endif; ?>					<th class="tcr"><?php echo $lang_common['Last post'] ?></th>
+					<th class="tc3" scope="col"><?php echo $lang_forum['Views'] ?></th>
+					<th class="tcr"><?php echo $lang_common['Last post'] ?></th>
 					<th class="tcmod" scope="col"><?php echo $lang_misc['Select'] ?></th>
 				</tr>
@@ -852,36 +580,27 @@
 <?php
 
-
-// Retrieve a list of topic IDs, LIMIT is (really) expensive so we only fetch the IDs here then later fetch the remaining data
-$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE forum_id='.$fid.' ORDER BY sticky DESC, '.$sort_by.', id DESC LIMIT '.$start_from.', '.$pun_user['disp_topics']) or error('Unable to fetch topic IDs', __FILE__, __LINE__, $db->error());
-
-// If there are topics in this forum
+// Select topics
+$result = $db->query('SELECT id, poster, subject, posted, last_post, last_post_id, last_poster, num_views, num_replies, closed, sticky, moved_to FROM '.$db->prefix.'topics WHERE forum_id='.$fid.' ORDER BY sticky DESC, last_post DESC LIMIT '.$start_from.', '.$pun_user['disp_topics']) or error('Impossible de retrouver la liste des discussions du forum', __FILE__, __LINE__, $db->error());
+
+// If there are topics in this forum.
 if ($db->num_rows($result))
 {
-	$topic_ids = array();
-	for ($i = 0;$cur_topic_id = $db->result($result, $i);$i++)
-		$topic_ids[] = $cur_topic_id;
-
-	// Select topics
-	$result = $db->query('SELECT id, poster, subject, posted, last_post, last_post_id, last_poster, num_views, num_replies, closed, sticky, moved_to FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $topic_ids).') ORDER BY sticky DESC, '.$sort_by.', id DESC') or error('Unable to fetch topic list for forum', __FILE__, __LINE__, $db->error());
-
 	$button_status = '';
-	$topic_count = 0;
+
 	while ($cur_topic = $db->fetch_assoc($result))
 	{
 
-		++$topic_count;
-		$status_text = array();
-		$item_status = ($topic_count % 2 == 0) ? 'roweven' : 'rowodd';
+		$icon_text = $lang_common['Normal icon'];
+		$item_status = '';
 		$icon_type = 'icon';
 
 		if ($cur_topic['moved_to'] == null)
 		{
-			$last_post = '<a href="viewtopic.php?pid='.$cur_topic['last_post_id'].'#p'.$cur_topic['last_post_id'].'">'.format_time($cur_topic['last_post']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['last_poster']).'</span>';
+			$last_post = '<a href="viewtopic.php?pid='.$cur_topic['last_post_id'].'#p'.$cur_topic['last_post_id'].'">'.format_time($cur_topic['last_post']).'</a> '.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['last_poster']);
 			$ghost_topic = false;
 		}
 		else
 		{
-			$last_post = '- - -';
+			$last_post = '&#160;';
 			$ghost_topic = true;
 		}
@@ -890,42 +609,41 @@
 			$cur_topic['subject'] = censor_words($cur_topic['subject']);
 
-		if ($cur_topic['sticky'] == '1')
-		{
-			$item_status .= ' isticky';
-			$status_text[] = '<span class="stickytext">'.$lang_forum['Sticky'].'</span>';
-		}
-
 		if ($cur_topic['moved_to'] != 0)
-		{
-			$subject = '<a href="viewtopic.php?id='.$cur_topic['moved_to'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
-			$status_text[] = '<span class="movedtext">'.$lang_forum['Moved'].'</span>';
-			$item_status .= ' imoved';
-		}
+			$subject = $lang_forum['Moved'].': <a href="viewtopic.php?id='.$cur_topic['moved_to'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
 		else if ($cur_topic['closed'] == '0')
+			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span>'.$lang_common['by'].'&#160;'.pun_htmlspecialchars($cur_topic['poster']).'</span>';
+		else
+		{
 			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
-		else
-		{
-			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
-			$status_text[] = '<span class="closedtext">'.$lang_forum['Closed'].'</span>';
-			$item_status .= ' iclosed';
-		}
-
-		if (!$ghost_topic && $cur_topic['last_post'] > $pun_user['last_visit'] && (!isset($tracked_topics['topics'][$cur_topic['id']]) || $tracked_topics['topics'][$cur_topic['id']] < $cur_topic['last_post']) && (!isset($tracked_topics['forums'][$fid]) || $tracked_topics['forums'][$fid] < $cur_topic['last_post']))
-		{
+			$icon_text = $lang_common['Closed icon'];
+			$item_status = 'iclosed';
+		}
+
+		if ($cur_topic['last_post'] > $pun_user['last_visit'] && !$ghost_topic)
+		{
+			$icon_text .= ' '.$lang_common['New icon'];
 			$item_status .= ' inew';
-			$icon_type = 'icon icon-new';
+			$icon_type = 'icon inew';
 			$subject = '<strong>'.$subject.'</strong>';
-			$subject_new_posts = '<span class="newtext">[ <a href="viewtopic.php?id='.$cur_topic['id'].'&amp;action=new" title="'.$lang_common['New posts info'].'">'.$lang_common['New posts'].'</a> ]</span>';
+			$subject_new_posts = '<span class="newtext">[&#160;<a href="viewtopic.php?id='.$cur_topic['id'].'&amp;action=new" title="'.$lang_common['New posts info'].'">'.$lang_common['New posts'].'</a>&#160;]</span>';
 		}
 		else
 			$subject_new_posts = null;
 
-		// Insert the status text before the subject
-		$subject = implode(' ', $status_text).' '.$subject;
+		// We won't display "the dot", but we add the spaces anyway
+		if ($pun_config['o_show_dot'] == '1')
+			$subject = '&#160;&#160;'.$subject;
+
+		if ($cur_topic['sticky'] == '1')
+		{
+			$subject = '<span class="stickytext">'.$lang_forum['Sticky'].': </span>'.$subject;
+			$item_status .= ' isticky';
+			$icon_text .= ' '.$lang_forum['Sticky'];
+		}
 
 		$num_pages_topic = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']);
 
 		if ($num_pages_topic > 1)
-			$subject_multipage = '<span class="pagestext">[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$cur_topic['id']).' ]</span>';
+			$subject_multipage = '[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$cur_topic['id']).' ]';
 		else
 			$subject_multipage = null;
@@ -934,21 +652,19 @@
 		if (!empty($subject_new_posts) || !empty($subject_multipage))
 		{
-			$subject .= !empty($subject_new_posts) ? ' '.$subject_new_posts : '';
+			$subject .= '&#160; '.(!empty($subject_new_posts) ? $subject_new_posts : '');
 			$subject .= !empty($subject_multipage) ? ' '.$subject_multipage : '';
 		}
 
 ?>
-				<tr class="<?php echo $item_status ?>">
+				<tr<?php if ($item_status != '') echo ' class="'.trim($item_status).'"'; ?>>
 					<td class="tcl">
-						<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo forum_number_format($topic_count + $start_from) ?></div></div>
+						<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo trim($icon_text) ?></div></div>
 						<div class="tclcon">
-							<div>
-								<?php echo $subject."\n" ?>
-							</div>
+							<?php echo $subject."\n" ?>
 						</div>
 					</td>
-					<td class="tc2"><?php echo (!$ghost_topic) ? forum_number_format($cur_topic['num_replies']) : '-' ?></td>
-<?php if ($pun_config['o_topic_views'] == '1'): ?>					<td class="tc3"><?php echo (!$ghost_topic) ? forum_number_format($cur_topic['num_views']) : '-' ?></td>
-<?php endif; ?>					<td class="tcr"><?php echo $last_post ?></td>
+					<td class="tc2"><?php echo (!$ghost_topic) ? $cur_topic['num_replies'] : '&#160;' ?></td>
+					<td class="tc3"><?php echo (!$ghost_topic) ? $cur_topic['num_views'] : '&#160;' ?></td>
+					<td class="tcr"><?php echo $last_post ?></td>
 					<td class="tcmod"><input type="checkbox" name="topics[<?php echo $cur_topic['id'] ?>]" value="1" /></td>
 				</tr>
@@ -959,7 +675,6 @@
 else
 {
-	$colspan = ($pun_config['o_topic_views'] == '1') ? 5 : 4;
-	$button_status = ' disabled="disabled"';
-	echo "\t\t\t\t\t".'<tr><td class="tcl" colspan="'.$colspan.'">'.$lang_forum['Empty forum'].'</td></tr>'."\n";
+	$button_status = ' disabled';
+	echo "\t\t\t\t\t".'<tr><td class="tcl" colspan="5">'.$lang_forum['Empty forum'].'</td></tr>'."\n";
 }
 
@@ -972,15 +687,7 @@
 
 <div class="linksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
-			<p class="conr modbuttons"><input type="submit" name="move_topics" value="<?php echo $lang_misc['Move'] ?>"<?php echo $button_status ?> /> <input type="submit" name="delete_topics" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> /> <input type="submit" name="merge_topics" value="<?php echo $lang_misc['Merge'] ?>"<?php echo $button_status ?> /> <input type="submit" name="open" value="<?php echo $lang_misc['Open'] ?>"<?php echo $button_status ?> /> <input type="submit" name="close" value="<?php echo $lang_misc['Close'] ?>"<?php echo $button_status ?> /></p>
-			<div class="clearer"></div>
-		</div>
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $fid ?>"><?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $lang_misc['Moderate'] ?></strong></li>
-		</ul>
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
+		<p class="conr"><input type="submit" name="move_topics" value="<?php echo $lang_misc['Move'] ?>"<?php echo $button_status ?> />&#160;&#160;<input type="submit" name="delete_topics" value="<?php echo $lang_misc['Delete'] ?>"<?php echo $button_status ?> />&#160;&#160;<input type="submit" name="open" value="<?php echo $lang_misc['Open'] ?>"<?php echo $button_status ?> />&#160;&#160;<input type="submit" name="close" value="<?php echo $lang_misc['Close'] ?>"<?php echo $button_status ?> /></p>
 		<div class="clearer"></div>
 	</div>
Index: trunk/web/punbb/plugins/index.html
===================================================================
--- trunk/web/punbb/plugins/index.html	(revision 10)
+++ trunk/web/punbb/plugins/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/post.php
===================================================================
--- trunk/web/punbb/post.php	(revision 10)
+++ trunk/web/punbb/post.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -22,7 +39,7 @@
 // Fetch some info about the topic and/or the forum
 if ($tid)
-	$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.subject, t.closed, s.user_id AS is_subscribed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') LEFT JOIN '.$db->prefix.'topic_subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics, t.subject, t.closed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$tid) or error('Impossible de retrouver les informations forum', __FILE__, __LINE__, $db->error());
 else
-	$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT f.id, f.forum_name, f.moderators, f.redirect_url, fp.post_replies, fp.post_topics FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$fid) or error('Impossible de retrouver les informations forum', __FILE__, __LINE__, $db->error());
 
 if (!$db->num_rows($result))
@@ -30,5 +47,4 @@
 
 $cur_posting = $db->fetch_assoc($result);
-$is_subscribed = $tid && $cur_posting['is_subscribed'];
 
 // Is someone trying to post into a redirect forum?
@@ -38,8 +54,5 @@
 // Sort out who the moderators are and if we are currently a moderator (or an admin)
 $mods_array = ($cur_posting['moderators'] != '') ? unserialize($cur_posting['moderators']) : array();
-$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
-
-if ($tid && $pun_config['o_censoring'] == '1')
-	$cur_posting['subject'] = censor_words($cur_posting['subject']);
+$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
 
 // Do we have permission to post?
@@ -60,6 +73,10 @@
 if (isset($_POST['form_sent']))
 {
+	// Make sure form_user is correct
+	if (($pun_user['is_guest'] && $_POST['form_user'] != 'InvitÃ©') || (!$pun_user['is_guest'] && $_POST['form_user'] != $pun_user['username']))
+		message($lang_common['Bad request']);
+
 	// Flood protection
-	if (!isset($_POST['preview']) && $pun_user['last_post'] != '' && (time() - $pun_user['last_post']) < $pun_user['g_post_flood'])
+	if (!$pun_user['is_guest'] && !isset($_POST['preview']) && $pun_user['last_post'] != '' && (time() - $pun_user['last_post']) < $pun_user['g_post_flood'])
 		$errors[] = $lang_post['Flood start'].' '.$pun_user['g_post_flood'].' '.$lang_post['flood end'];
 
@@ -69,18 +86,13 @@
 		$subject = pun_trim($_POST['req_subject']);
 
-		if ($pun_config['o_censoring'] == '1')
-			$censored_subject = pun_trim(censor_words($subject));
-
 		if ($subject == '')
 			$errors[] = $lang_post['No subject'];
-		else if ($pun_config['o_censoring'] == '1' && $censored_subject == '')
-			$errors[] = $lang_post['No subject after censoring'];
 		else if (pun_strlen($subject) > 70)
 			$errors[] = $lang_post['Too long subject'];
-		else if ($pun_config['p_subject_all_caps'] == '0' && is_all_uppercase($subject) && !$pun_user['is_admmod'])
-			$errors[] = $lang_post['All caps subject'];
+		else if ($pun_config['p_subject_all_caps'] == '0' && strtoupper($subject) == $subject && $pun_user['g_id'] > PUN_MOD)
+			$subject = ucwords(strtolower($subject));
 	}
 
-	// If the user is logged in we get the username and email from $pun_user
+	// If the user is logged in we get the username and e-mail from $pun_user
 	if (!$pun_user['is_guest'])
 	{
@@ -91,14 +103,36 @@
 	else
 	{
-		$username = pun_trim($_POST['req_username']);
+		$username = trim($_POST['req_username']);
 		$email = strtolower(trim(($pun_config['p_force_guest_email'] == '1') ? $_POST['req_email'] : $_POST['email']));
-		$banned_email = false;
-
-		// Load the register.php/prof_reg.php language files
+
+		// Load the register.php/profile.php language files
 		require PUN_ROOT.'lang/'.$pun_user['language'].'/prof_reg.php';
 		require PUN_ROOT.'lang/'.$pun_user['language'].'/register.php';
 
 		// It's a guest, so we have to validate the username
-		check_username($username);
+		if (strlen($username) < 2)
+			$errors[] = $lang_prof_reg['Username too short'];
+		else if (!strcasecmp($username, 'invitÃ©') || !strcasecmp($username, $lang_common['Guest']))
+			$errors[] = $lang_prof_reg['Username guest'];
+		else if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $username))
+			$errors[] = $lang_prof_reg['Username IP'];
+
+		if ((strpos($username, '[') !== false || strpos($username, ']') !== false) && strpos($username, '\'') !== false && strpos($username, '"') !== false)
+			$errors[] = $lang_prof_reg['Username reserved chars'];
+		if (preg_match('#\[b\]|\[/b\]|\[u\]|\[/u\]|\[i\]|\[/i\]|\[color|\[/color\]|\[quote\]|\[quote=|\[/quote\]|\[code\]|\[/code\]|\[img\]|\[/img\]|\[url|\[/url\]|\[email|\[/email\]#i', $username))
+			$errors[] = $lang_prof_reg['Username BBCode'];
+
+		// Check username for any censored words
+		$temp = censor_words($username);
+		if ($temp != $username)
+			$errors[] = $lang_register['Username censor'];
+
+		// Check that the username (or a too similar username) is not already registered
+		$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE username=\''.$db->escape($username).'\' OR username=\''.$db->escape(preg_replace('/[^\w]/', '', $username)).'\'') or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
+		if ($db->num_rows($result))
+		{
+			$busy = $db->result($result);
+			$errors[] = $lang_register['Username dupe 1'].' '.pun_htmlspecialchars($busy).'. '.$lang_register['Username dupe 2'];
+		}
 
 		if ($pun_config['p_force_guest_email'] == '1' || $email != '')
@@ -106,29 +140,20 @@
 			require PUN_ROOT.'include/email.php';
 			if (!is_valid_email($email))
-				$errors[] = $lang_common['Invalid email'];
-
-			// Check if it's a banned email address
-			// we should only check guests because members addresses are already verified
-			if ($pun_user['is_guest'] && is_banned_email($email))
-			{
-				if ($pun_config['p_allow_banned_email'] == '0')
-					$errors[] = $lang_prof_reg['Banned email'];
-
-				$banned_email = true; // Used later when we send an alert email
-			}
+				$errors[] = $lang_common['Invalid e-mail'];
 		}
 	}
 
 	// Clean up message from POST
-	$orig_message = $message = pun_linebreaks(pun_trim($_POST['req_message']));
-
-	// Here we use strlen() not pun_strlen() as we want to limit the post to PUN_MAX_POSTSIZE bytes, not characters
-	if (strlen($message) > PUN_MAX_POSTSIZE)
-		$errors[] = sprintf($lang_post['Too long message'], forum_number_format(PUN_MAX_POSTSIZE));
-	else if ($pun_config['p_message_all_caps'] == '0' && is_all_uppercase($message) && !$pun_user['is_admmod'])
-		$errors[] = $lang_post['All caps message'];
+	$message = pun_linebreaks(pun_trim($_POST['req_message']));
+
+	if ($message == '')
+		$errors[] = $lang_post['No message'];
+	else if (strlen($message) > 65535)
+		$errors[] = $lang_post['Too long message'];
+	else if ($pun_config['p_message_all_caps'] == '0' && strtoupper($message) == $message && $pun_user['g_id'] > PUN_MOD)
+		$message = ucwords(strtolower($message));
 
 	// Validate BBCode syntax
-	if ($pun_config['p_message_bbcode'] == '1')
+	if ($pun_config['p_message_bbcode'] == '1' && strpos($message, '[') !== false && strpos($message, ']') !== false)
 	{
 		require PUN_ROOT.'include/parser.php';
@@ -136,21 +161,9 @@
 	}
 
-	if (empty($errors))
-	{
-		if ($message == '')
-			$errors[] = $lang_post['No message'];
-		else if ($pun_config['o_censoring'] == '1')
-		{
-			// Censor message to see if that causes problems
-			$censored_message = pun_trim(censor_words($message));
-
-			if ($censored_message == '')
-				$errors[] = $lang_post['No message after censoring'];
-		}
-	}
-
-	$hide_smilies = isset($_POST['hide_smilies']) ? '1' : '0';
-	$subscribe = isset($_POST['subscribe']) ? '1' : '0';
-	$stick_topic = isset($_POST['stick_topic']) && $is_admmod ? '1' : '0';
+
+	require PUN_ROOT.'include/search_idx.php';
+
+	$hide_smilies = isset($_POST['hide_smilies']) ? 1 : 0;
+	$subscribe = isset($_POST['subscribe']) ? 1 : 0;
 
 	$now = time();
@@ -159,6 +172,4 @@
 	if (empty($errors) && !isset($_POST['preview']))
 	{
-		require PUN_ROOT.'include/search_idx.php';
-
 		// If it's a reply
 		if ($tid)
@@ -166,17 +177,14 @@
 			if (!$pun_user['is_guest'])
 			{
-				$new_tid = $tid;
-
 				// Insert the new post
-				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_id, poster_ip, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', '.$pun_user['id'].', \''.get_remote_address().'\', \''.$db->escape($message).'\', '.$hide_smilies.', '.$now.', '.$tid.')') or error('Unable to create post', __FILE__, __LINE__, $db->error());
+				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_id, poster_ip, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', '.$pun_user['id'].', \''.get_remote_address().'\', \''.$db->escape($message).'\', \''.$hide_smilies.'\', '.$now.', '.$tid.')') or error('Impossible de crÃ©er le message', __FILE__, __LINE__, $db->error());
 				$new_pid = $db->insert_id();
 
 				// To subscribe or not to subscribe, that ...
-				if ($pun_config['o_topic_subscriptions'] == '1')
+				if ($pun_config['o_subscriptions'] == '1' && $subscribe)
 				{
-					if ($subscribe && !$is_subscribed)
-						$db->query('INSERT INTO '.$db->prefix.'topic_subscriptions (user_id, topic_id) VALUES('.$pun_user['id'].' ,'.$tid.')') or error('Unable to add subscription', __FILE__, __LINE__, $db->error());
-					else if (!$subscribe && $is_subscribed)
-						$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$tid) or error('Unable to remove subscription', __FILE__, __LINE__, $db->error());
+					$result = $db->query('SELECT 1 FROM '.$db->prefix.'subscriptions WHERE user_id='.$pun_user['id'].' AND topic_id='.$tid) or error('Impossible de retrouver les informations d\'abonnement', __FILE__, __LINE__, $db->error());
+					if (!$db->num_rows($result))
+						$db->query('INSERT INTO '.$db->prefix.'subscriptions (user_id, topic_id) VALUES('.$pun_user['id'].' ,'.$tid.')') or error('Impossible d\'ajouter l\'abonnement', __FILE__, __LINE__, $db->error());
 				}
 			}
@@ -184,15 +192,15 @@
 			{
 				// It's a guest. Insert the new post
-				$email_sql = ($pun_config['p_force_guest_email'] == '1' || $email != '') ? '\''.$db->escape($email).'\'' : 'NULL';
-				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_ip, poster_email, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', \''.get_remote_address().'\', '.$email_sql.', \''.$db->escape($message).'\', '.$hide_smilies.', '.$now.', '.$tid.')') or error('Unable to create post', __FILE__, __LINE__, $db->error());
+				$email_sql = ($pun_config['p_force_guest_email'] == '1' || $email != '') ? '\''.$email.'\'' : 'NULL';
+				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_ip, poster_email, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', \''.get_remote_address().'\', '.$email_sql.', \''.$db->escape($message).'\', \''.$hide_smilies.'\', '.$now.', '.$tid.')') or error('Impossible de crÃ©er le message', __FILE__, __LINE__, $db->error());
 				$new_pid = $db->insert_id();
 			}
 
 			// Count number of replies in the topic
-			$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'posts WHERE topic_id='.$tid) or error('Unable to fetch post count for topic', __FILE__, __LINE__, $db->error());
+			$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'posts WHERE topic_id='.$tid) or error('Impossible de retrouver le total de messages de la discussion', __FILE__, __LINE__, $db->error());
 			$num_replies = $db->result($result, 0) - 1;
 
 			// Update topic
-			$db->query('UPDATE '.$db->prefix.'topics SET num_replies='.$num_replies.', last_post='.$now.', last_post_id='.$new_pid.', last_poster=\''.$db->escape($username).'\' WHERE id='.$tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'topics SET num_replies='.$num_replies.', last_post='.$now.', last_post_id='.$new_pid.', last_poster=\''.$db->escape($username).'\' WHERE id='.$tid) or error('Impossible de modifier la discussion', __FILE__, __LINE__, $db->error());
 
 			update_search_index('post', $new_pid, $message);
@@ -201,12 +209,12 @@
 
 			// Should we send out notifications?
-			if ($pun_config['o_topic_subscriptions'] == '1')
+			if ($pun_config['o_subscriptions'] == '1')
 			{
 				// Get the post time for the previous post in this topic
-				$result = $db->query('SELECT posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT 1, 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT 1, 1') or error('Impossible de retrouver les information de message', __FILE__, __LINE__, $db->error());
 				$previous_post_time = $db->result($result);
 
 				// Get any subscribed users that should be notified (banned users are excluded)
-				$result = $db->query('SELECT u.id, u.email, u.notify_with_post, u.language FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'topic_subscriptions AS s ON u.id=s.user_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id='.$cur_posting['id'].' AND fp.group_id=u.group_id) LEFT JOIN '.$db->prefix.'online AS o ON u.id=o.user_id LEFT JOIN '.$db->prefix.'bans AS b ON u.username=b.username WHERE b.username IS NULL AND COALESCE(o.logged, u.last_visit)>'.$previous_post_time.' AND (fp.read_forum IS NULL OR fp.read_forum=1) AND s.topic_id='.$tid.' AND u.id!='.$pun_user['id']) or error('Unable to fetch subscription info', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT u.id, u.email, u.notify_with_post, u.language FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'subscriptions AS s ON u.id=s.user_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id='.$cur_posting['id'].' AND fp.group_id=u.group_id) LEFT JOIN '.$db->prefix.'online AS o ON u.id=o.user_id LEFT JOIN '.$db->prefix.'bans AS b ON u.username=b.username WHERE b.username IS NULL AND COALESCE(o.logged, u.last_visit)>'.$previous_post_time.' AND (fp.read_forum IS NULL OR fp.read_forum=1) AND s.topic_id='.$tid.' AND u.id!='.intval($pun_user['id'])) or error('Impossible de retrouver les informations d\'abonnement', __FILE__, __LINE__, $db->error());
 				if ($db->num_rows($result))
 				{
@@ -215,13 +223,8 @@
 					$notification_emails = array();
 
-					if ($pun_config['o_censoring'] == '1')
-						$cleaned_message = bbcode2email($censored_message, -1);
-					else
-						$cleaned_message = bbcode2email($message, -1);
-
-					// Loop through subscribed users and send emails
+					// Loop through subscribed users and send e-mails
 					while ($cur_subscriber = $db->fetch_assoc($result))
 					{
-						// Is the subscription email for $cur_subscriber['language'] cached or not?
+						// Is the subscription e-mail for $cur_subscriber['language'] cached or not?
 						if (!isset($notification_emails[$cur_subscriber['language']]))
 						{
@@ -243,18 +246,18 @@
 								$mail_message_full = trim(substr($mail_tpl_full, $first_crlf));
 
-								$mail_subject = str_replace('<topic_subject>', $cur_posting['subject'], $mail_subject);
-								$mail_message = str_replace('<topic_subject>', $cur_posting['subject'], $mail_message);
+								$mail_subject = str_replace('<topic_subject>', '\''.$cur_posting['subject'].'\'', $mail_subject);
+								$mail_message = str_replace('<topic_subject>', '\''.$cur_posting['subject'].'\'', $mail_message);
 								$mail_message = str_replace('<replier>', $username, $mail_message);
-								$mail_message = str_replace('<post_url>', get_base_url().'/viewtopic.php?pid='.$new_pid.'#p'.$new_pid, $mail_message);
-								$mail_message = str_replace('<unsubscribe_url>', get_base_url().'/misc.php?action=unsubscribe&tid='.$tid, $mail_message);
-								$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-								$mail_subject_full = str_replace('<topic_subject>', $cur_posting['subject'], $mail_subject_full);
-								$mail_message_full = str_replace('<topic_subject>', $cur_posting['subject'], $mail_message_full);
+								$mail_message = str_replace('<post_url>', $pun_config['o_base_url'].'/viewtopic.php?pid='.$new_pid.'#p'.$new_pid, $mail_message);
+								$mail_message = str_replace('<unsubscribe_url>', $pun_config['o_base_url'].'/misc.php?unsubscribe='.$tid, $mail_message);
+								$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
+
+								$mail_subject_full = str_replace('<topic_subject>', '\''.$cur_posting['subject'].'\'', $mail_subject_full);
+								$mail_message_full = str_replace('<topic_subject>', '\''.$cur_posting['subject'].'\'', $mail_message_full);
 								$mail_message_full = str_replace('<replier>', $username, $mail_message_full);
-								$mail_message_full = str_replace('<message>', $cleaned_message, $mail_message_full);
-								$mail_message_full = str_replace('<post_url>', get_base_url().'/viewtopic.php?pid='.$new_pid.'#p'.$new_pid, $mail_message_full);
-								$mail_message_full = str_replace('<unsubscribe_url>', get_base_url().'/misc.php?action=unsubscribe&tid='.$tid, $mail_message_full);
-								$mail_message_full = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message_full);
+								$mail_message_full = str_replace('<message>', $message, $mail_message_full);
+								$mail_message_full = str_replace('<post_url>', $pun_config['o_base_url'].'/viewtopic.php?pid='.$new_pid.'#p'.$new_pid, $mail_message_full);
+								$mail_message_full = str_replace('<unsubscribe_url>', $pun_config['o_base_url'].'/misc.php?unsubscribe='.$tid, $mail_message_full);
+								$mail_message_full = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message_full);
 
 								$notification_emails[$cur_subscriber['language']][0] = $mail_subject;
@@ -276,6 +279,4 @@
 						}
 					}
-
-					unset($cleaned_message);
 				}
 			}
@@ -285,5 +286,5 @@
 		{
 			// Create the topic
-			$db->query('INSERT INTO '.$db->prefix.'topics (poster, subject, posted, last_post, last_poster, sticky, forum_id) VALUES(\''.$db->escape($username).'\', \''.$db->escape($subject).'\', '.$now.', '.$now.', \''.$db->escape($username).'\', '.$stick_topic.', '.$fid.')') or error('Unable to create topic', __FILE__, __LINE__, $db->error());
+			$db->query('INSERT INTO '.$db->prefix.'topics (poster, subject, posted, last_post, last_poster, forum_id) VALUES(\''.$db->escape($username).'\', \''.$db->escape($subject).'\', '.$now.', '.$now.', \''.$db->escape($username).'\', '.$fid.')') or error('Impossible de crÃ©er la discussion', __FILE__, __LINE__, $db->error());
 			$new_tid = $db->insert_id();
 
@@ -291,122 +292,24 @@
 			{
 				// To subscribe or not to subscribe, that ...
-				if ($pun_config['o_topic_subscriptions'] == '1' && $subscribe)
-					$db->query('INSERT INTO '.$db->prefix.'topic_subscriptions (user_id, topic_id) VALUES('.$pun_user['id'].' ,'.$new_tid.')') or error('Unable to add subscription', __FILE__, __LINE__, $db->error());
+				if ($pun_config['o_subscriptions'] == '1' && (isset($_POST['subscribe']) && $_POST['subscribe'] == '1'))
+					$db->query('INSERT INTO '.$db->prefix.'subscriptions (user_id, topic_id) VALUES('.$pun_user['id'].' ,'.$new_tid.')') or error('Impossible d\'ajouter l\'abonnement', __FILE__, __LINE__, $db->error());
 
 				// Create the post ("topic post")
-				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_id, poster_ip, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', '.$pun_user['id'].', \''.get_remote_address().'\', \''.$db->escape($message).'\', '.$hide_smilies.', '.$now.', '.$new_tid.')') or error('Unable to create post', __FILE__, __LINE__, $db->error());
+				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_id, poster_ip, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', '.$pun_user['id'].', \''.get_remote_address().'\', \''.$db->escape($message).'\', \''.$hide_smilies.'\', '.$now.', '.$new_tid.')') or error('Impossible de crÃ©er le message', __FILE__, __LINE__, $db->error());
 			}
 			else
 			{
 				// Create the post ("topic post")
-				$email_sql = ($pun_config['p_force_guest_email'] == '1' || $email != '') ? '\''.$db->escape($email).'\'' : 'NULL';
-				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_ip, poster_email, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', \''.get_remote_address().'\', '.$email_sql.', \''.$db->escape($message).'\', '.$hide_smilies.', '.$now.', '.$new_tid.')') or error('Unable to create post', __FILE__, __LINE__, $db->error());
+				$email_sql = ($pun_config['p_force_guest_email'] == '1' || $email != '') ? '\''.$email.'\'' : 'NULL';
+				$db->query('INSERT INTO '.$db->prefix.'posts (poster, poster_ip, poster_email, message, hide_smilies, posted, topic_id) VALUES(\''.$db->escape($username).'\', \''.get_remote_address().'\', '.$email_sql.', \''.$db->escape($message).'\', \''.$hide_smilies.'\', '.$now.', '.$new_tid.')') or error('Impossible de crÃ©er le message', __FILE__, __LINE__, $db->error());
 			}
 			$new_pid = $db->insert_id();
 
 			// Update the topic with last_post_id
-			$db->query('UPDATE '.$db->prefix.'topics SET last_post_id='.$new_pid.', first_post_id='.$new_pid.' WHERE id='.$new_tid) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'topics SET last_post_id='.$new_pid.' WHERE id='.$new_tid) or error('Impossible de modifier la discussion', __FILE__, __LINE__, $db->error());
 
 			update_search_index('post', $new_pid, $message, $subject);
 
 			update_forum($fid);
-
-			// Should we send out notifications?
-			if ($pun_config['o_forum_subscriptions'] == '1')
-			{
-				// Get any subscribed users that should be notified (banned users are excluded)
-				$result = $db->query('SELECT u.id, u.email, u.notify_with_post, u.language FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'forum_subscriptions AS s ON u.id=s.user_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id='.$cur_posting['id'].' AND fp.group_id=u.group_id) LEFT JOIN '.$db->prefix.'bans AS b ON u.username=b.username WHERE b.username IS NULL AND (fp.read_forum IS NULL OR fp.read_forum=1) AND s.forum_id='.$cur_posting['id'].' AND u.id!='.$pun_user['id']) or error('Unable to fetch subscription info', __FILE__, __LINE__, $db->error());
-				if ($db->num_rows($result))
-				{
-					require_once PUN_ROOT.'include/email.php';
-
-					$notification_emails = array();
-
-					if ($pun_config['o_censoring'] == '1')
-						$cleaned_message = bbcode2email($censored_message, -1);
-					else
-						$cleaned_message = bbcode2email($message, -1);
-
-					// Loop through subscribed users and send emails
-					while ($cur_subscriber = $db->fetch_assoc($result))
-					{
-						// Is the subscription email for $cur_subscriber['language'] cached or not?
-						if (!isset($notification_emails[$cur_subscriber['language']]))
-						{
-							if (file_exists(PUN_ROOT.'lang/'.$cur_subscriber['language'].'/mail_templates/new_topic.tpl'))
-							{
-								// Load the "new topic" template
-								$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$cur_subscriber['language'].'/mail_templates/new_topic.tpl'));
-
-								// Load the "new topic full" template (with post included)
-								$mail_tpl_full = trim(file_get_contents(PUN_ROOT.'lang/'.$cur_subscriber['language'].'/mail_templates/new_topic_full.tpl'));
-
-								// The first row contains the subject (it also starts with "Subject:")
-								$first_crlf = strpos($mail_tpl, "\n");
-								$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-								$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-								$first_crlf = strpos($mail_tpl_full, "\n");
-								$mail_subject_full = trim(substr($mail_tpl_full, 8, $first_crlf-8));
-								$mail_message_full = trim(substr($mail_tpl_full, $first_crlf));
-
-								$mail_subject = str_replace('<forum_name>', $cur_posting['forum_name'], $mail_subject);
-								$mail_message = str_replace('<topic_subject>', $pun_config['o_censoring'] == '1' ? $censored_subject : $subject, $mail_message);
-								$mail_message = str_replace('<forum_name>', $cur_posting['forum_name'], $mail_message);
-								$mail_message = str_replace('<poster>', $username, $mail_message);
-								$mail_message = str_replace('<topic_url>', get_base_url().'/viewtopic.php?id='.$new_tid, $mail_message);
-								$mail_message = str_replace('<unsubscribe_url>', get_base_url().'/misc.php?action=unsubscribe&fid='.$cur_posting['id'], $mail_message);
-								$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-								$mail_subject_full = str_replace('<forum_name>', $cur_posting['forum_name'], $mail_subject_full);
-								$mail_message_full = str_replace('<topic_subject>', $pun_config['o_censoring'] == '1' ? $censored_subject : $subject, $mail_message_full);
-								$mail_message_full = str_replace('<forum_name>', $cur_posting['forum_name'], $mail_message_full);
-								$mail_message_full = str_replace('<poster>', $username, $mail_message_full);
-								$mail_message_full = str_replace('<message>', $cleaned_message, $mail_message_full);
-								$mail_message_full = str_replace('<topic_url>', get_base_url().'/viewtopic.php?id='.$new_tid, $mail_message_full);
-								$mail_message_full = str_replace('<unsubscribe_url>', get_base_url().'/misc.php?action=unsubscribe&fid='.$cur_posting['id'], $mail_message_full);
-								$mail_message_full = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message_full);
-
-								$notification_emails[$cur_subscriber['language']][0] = $mail_subject;
-								$notification_emails[$cur_subscriber['language']][1] = $mail_message;
-								$notification_emails[$cur_subscriber['language']][2] = $mail_subject_full;
-								$notification_emails[$cur_subscriber['language']][3] = $mail_message_full;
-
-								$mail_subject = $mail_message = $mail_subject_full = $mail_message_full = null;
-							}
-						}
-
-						// We have to double check here because the templates could be missing
-						if (isset($notification_emails[$cur_subscriber['language']]))
-						{
-							if ($cur_subscriber['notify_with_post'] == '0')
-								pun_mail($cur_subscriber['email'], $notification_emails[$cur_subscriber['language']][0], $notification_emails[$cur_subscriber['language']][1]);
-							else
-								pun_mail($cur_subscriber['email'], $notification_emails[$cur_subscriber['language']][2], $notification_emails[$cur_subscriber['language']][3]);
-						}
-					}
-
-					unset($cleaned_message);
-				}
-			}
-		}
-
-		// If we previously found out that the email was banned
-		if ($pun_user['is_guest'] && $banned_email && $pun_config['o_mailing_list'] != '')
-		{
-			// Load the "banned email post" template
-			$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/banned_email_post.tpl'));
-
-			// The first row contains the subject
-			$first_crlf = strpos($mail_tpl, "\n");
-			$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-			$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-			$mail_message = str_replace('<username>', $username, $mail_message);
-			$mail_message = str_replace('<email>', $email, $mail_message);
-			$mail_message = str_replace('<post_url>', get_base_url().'/viewtopic.php?pid='.$new_pid.'#p'.$new_pid, $mail_message);
-			$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-			pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
 		}
 
@@ -414,13 +317,6 @@
 		if (!$pun_user['is_guest'])
 		{
-			$db->query('UPDATE '.$db->prefix.'users SET num_posts=num_posts+1, last_post='.$now.' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
-
-			$tracked_topics = get_tracked_topics();
-			$tracked_topics['topics'][$new_tid] = time();
-			set_tracked_topics($tracked_topics);
-		}
-		else
-		{
-			$db->query('UPDATE '.$db->prefix.'online SET last_post='.$now.' WHERE ident=\''.$db->escape(get_remote_address()).'\'' ) or error('Unable to update user', __FILE__, __LINE__, $db->error());
+			$low_prio = ($db_type == 'mysql') ? 'LOW_PRIORITY ' : '';
+			$db->query('UPDATE '.$low_prio.$db->prefix.'users SET num_posts=num_posts+1, last_post='.$now.' WHERE id='.$pun_user['id']) or error('Impossible de modifier l\'utilisateur', __FILE__, __LINE__, $db->error());
 		}
 
@@ -430,5 +326,5 @@
 
 
-// If a topic ID was specified in the url (it's a reply)
+// If a topic id was specified in the url (it's a reply).
 if ($tid)
 {
@@ -436,5 +332,5 @@
 	$form = '<form id="post" method="post" action="post.php?action=post&amp;tid='.$tid.'" onsubmit="this.submit.disabled=true;if(process_form(this)){return true;}else{this.submit.disabled=false;return false;}">';
 
-	// If a quote ID was specified in the url
+	// If a quote-id was specified in the url.
 	if (isset($_GET['qid']))
 	{
@@ -443,5 +339,5 @@
 			message($lang_common['Bad request']);
 
-		$result = $db->query('SELECT poster, message FROM '.$db->prefix.'posts WHERE id='.$qid.' AND topic_id='.$tid) or error('Unable to fetch quote info', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT poster, message FROM '.$db->prefix.'posts WHERE id='.$qid.' AND topic_id='.$tid) or error('Impossible de retrouver les informations de citation', __FILE__, __LINE__, $db->error());
 		if (!$db->num_rows($result))
 			message($lang_common['Bad request']);
@@ -449,38 +345,9 @@
 		list($q_poster, $q_message) = $db->fetch_row($result);
 
-		// If the message contains a code tag we have to split it up (text within [code][/code] shouldn't be touched)
-		if (strpos($q_message, '[code]') !== false && strpos($q_message, '[/code]') !== false)
-		{
-			$errors = array();
-			list($inside, $outside) = split_text($q_message, '[code]', '[/code]', $errors);
-			if (!empty($errors)) // Technically this shouldn't happen, since $q_message is an existing post it should only exist if it previously passed validation
-				message($errors[0]);
-
-			$q_message = implode("\1", $outside);
-		}
-
-		// Remove [img] tags from quoted message
-		$q_message = preg_replace('%\[img(?:=(?:[^\[]*?))?\]((ht|f)tps?://)([^\s<"]*?)\[/img\]%U', '\1\3', $q_message);
-
-		// If we split up the message before we have to concatenate it together again (code tags)
-		if (isset($inside))
-		{
-			$outside = explode("\1", $q_message);
-			$q_message = '';
-
-			$num_tokens = count($outside);
-			for ($i = 0; $i < $num_tokens; ++$i)
-			{
-				$q_message .= $outside[$i];
-				if (isset($inside[$i]))
-					$q_message .= '[code]'.$inside[$i].'[/code]';
-			}
-
-			unset($inside);
-		}
-
-		if ($pun_config['o_censoring'] == '1')
-			$q_message = censor_words($q_message);
-
+		// Mod: Flash MP3 Player (1 nouvelle ligne suit)
+		$q_message = preg_replace("/\[mp3 url=([^ ]+)\]/", "[url]$1[/url]", $q_message);
+
+		$q_message = str_replace('[img]', '[url]', $q_message);
+		$q_message = str_replace('[/img]', '[/url]', $q_message);
 		$q_message = pun_htmlspecialchars($q_message);
 
@@ -510,12 +377,16 @@
 		}
 		else
-			$quote = '> '.$q_poster.' '.$lang_common['wrote']."\n\n".'> '.$q_message."\n";
+			$quote = '> '.$q_poster.' '.$lang_common['wrote'].':'."\n\n".'> '.$q_message."\n";
 	}
-}
-// If a forum ID was specified in the url (new topic)
+
+	$forum_name = '<a href="viewforum.php?id='.$cur_posting['id'].'">'.pun_htmlspecialchars($cur_posting['forum_name']).'</a>';
+}
+// If a forum_id was specified in the url (new topic).
 else if ($fid)
 {
 	$action = $lang_post['Post new topic'];
 	$form = '<form id="post" method="post" action="post.php?action=post&amp;fid='.$fid.'" onsubmit="return process_form(this)">';
+
+	$forum_name = pun_htmlspecialchars($cur_posting['forum_name']);
 }
 else
@@ -523,6 +394,6 @@
 
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $action);
-$required_fields = array('req_email' => $lang_common['Email'], 'req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message']);
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$action;
+$required_fields = array('req_email' => $lang_common['E-mail'], 'req_subject' => $lang_common['Subject'], 'req_message' => $lang_common['Message']);
 $focus_element = array('post');
 
@@ -535,5 +406,4 @@
 }
 
-define('PUN_ACTIVE_PAGE', 'index');
 require PUN_ROOT.'header.php';
 
@@ -541,10 +411,5 @@
 <div class="linkst">
 	<div class="inbox">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $cur_posting['id'] ?>"><?php echo pun_htmlspecialchars($cur_posting['forum_name']) ?></a></li>
-<?php if (isset($cur_posting['subject'])): ?>			<li><span>Â»&#160;</span><a href="viewtopic.php?id=<?php echo $tid ?>"><?php echo pun_htmlspecialchars($cur_posting['subject']) ?></a></li>
-<?php endif; ?>			<li><span>Â»&#160;</span><strong><?php echo $action ?></strong></li>
-		</ul>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li><li>&#160;&raquo;&#160;<?php echo $forum_name ?><?php if (isset($cur_posting['subject'])) echo '</li><li>&#160;&raquo;&#160;'.pun_htmlspecialchars($cur_posting['subject']) ?></li></ul>
 	</div>
 </div>
@@ -560,10 +425,10 @@
 	<h2><span><?php echo $lang_post['Post errors'] ?></span></h2>
 	<div class="box">
-		<div class="inbox error-info">
+		<div class="inbox">
 			<p><?php echo $lang_post['Post errors info'] ?></p>
-			<ul class="error-list">
-<?php
-
-	foreach ($errors as $cur_error)
+			<ul>
+<?php
+
+	while (list(, $cur_error) = each($errors))
 		echo "\t\t\t\t".'<li><strong>'.$cur_error.'</strong></li>'."\n";
 ?>
@@ -586,9 +451,7 @@
 	<div class="box">
 		<div class="inbox">
-			<div class="postbody">
-				<div class="postright">
-					<div class="postmsg">
-						<?php echo $preview_message."\n" ?>
-					</div>
+			<div class="postright">
+				<div class="postmsg">
+					<?php echo $preview_message."\n" ?>
 				</div>
 			</div>
@@ -605,5 +468,5 @@
 
 ?>
-<div id="postform" class="blockform">
+<div class="blockform">
 	<h2><span><?php echo $action ?></span></h2>
 	<div class="box">
@@ -614,14 +477,14 @@
 					<div class="infldset txtarea">
 						<input type="hidden" name="form_sent" value="1" />
+						<input type="hidden" name="form_user" value="<?php echo (!$pun_user['is_guest']) ? pun_htmlspecialchars($pun_user['username']) : 'InvitÃ©'; ?>" />
 <?php
 
 if ($pun_user['is_guest'])
 {
-	$email_label = ($pun_config['p_force_guest_email'] == '1') ? '<strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong>' : $lang_common['Email'];
+	$email_label = ($pun_config['p_force_guest_email'] == '1') ? '<strong>'.$lang_common['E-mail'].'</strong>' : $lang_common['E-mail'];
 	$email_form_name = ($pun_config['p_force_guest_email'] == '1') ? 'req_email' : 'email';
 
-?>
-						<label class="conl required"><strong><?php echo $lang_post['Guest name'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="req_username" value="<?php if (isset($_POST['req_username'])) echo pun_htmlspecialchars($username); ?>" size="25" maxlength="25" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
-						<label class="conl<?php echo ($pun_config['p_force_guest_email'] == '1') ? ' required' : '' ?>"><?php echo $email_label ?><br /><input type="text" name="<?php echo $email_form_name ?>" value="<?php if (isset($_POST[$email_form_name])) echo pun_htmlspecialchars($email); ?>" size="50" maxlength="80" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
+?>						<label class="conl"><strong><?php echo $lang_post['Guest name'] ?></strong><br /><input type="text" name="req_username" value="<?php if (isset($_POST['req_username'])) echo pun_htmlspecialchars($username); ?>" size="25" maxlength="25" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
+						<label class="conl"><?php echo $email_label ?><br /><input type="text" name="<?php echo $email_form_name ?>" value="<?php if (isset($_POST[$email_form_name])) echo pun_htmlspecialchars($email); ?>" size="50" maxlength="50" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
 						<div class="clearer"></div>
 <?php
@@ -630,11 +493,12 @@
 
 if ($fid): ?>
-						<label class="required"><strong><?php echo $lang_common['Subject'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input class="longinput" type="text" name="req_subject" value="<?php if (isset($_POST['req_subject'])) echo pun_htmlspecialchars($subject); ?>" size="80" maxlength="70" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
-<?php endif; ?>						<label class="required"><strong><?php echo $lang_common['Message'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
-						<textarea name="req_message" rows="20" cols="95" tabindex="<?php echo $cur_index++ ?>"><?php echo isset($_POST['req_message']) ? pun_htmlspecialchars($orig_message) : (isset($quote) ? $quote : ''); ?></textarea><br /></label>
+						<label><strong><?php echo $lang_common['Subject'] ?></strong><br /><input class="longinput" type="text" name="req_subject" value="<?php if (isset($_POST['req_subject'])) echo pun_htmlspecialchars($subject); ?>" size="80" maxlength="70" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
+<?php endif; require PUN_ROOT.'mod_easy_bbcode.php'; ?>						<label><strong><?php echo $lang_common['Message'] ?></strong><br />
+
+						<textarea name="req_message" rows="20" cols="95" tabindex="<?php echo $cur_index++ ?>"><?php echo isset($_POST['req_message']) ? pun_htmlspecialchars($message) : (isset($quote) ? $quote : ''); ?></textarea><br /></label>
 						<ul class="bblinks">
-							<li><span><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a> <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-							<li><span><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a> <?php echo ($pun_config['p_message_bbcode'] == '1' && $pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-							<li><span><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a> <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
+							<li><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a>: <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+							<li><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a>: <?php echo ($pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+							<li><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a>: <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
 						</ul>
 					</div>
@@ -643,31 +507,14 @@
 
 $checkboxes = array();
-if ($is_admmod)
-	$checkboxes[] = '<label><input type="checkbox" name="stick_topic" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['stick_topic']) ? ' checked="checked"' : '').' />'.$lang_common['Stick topic'].'<br /></label>';
-
 if (!$pun_user['is_guest'])
 {
 	if ($pun_config['o_smilies'] == '1')
-		$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['hide_smilies']) ? ' checked="checked"' : '').' />'.$lang_post['Hide smilies'].'<br /></label>';
-
-	if ($pun_config['o_topic_subscriptions'] == '1')
-	{
-		$subscr_checked = false;
-
-		// If it's a preview
-		if (isset($_POST['preview']))
-			$subscr_checked = isset($_POST['subscribe']) ? true : false;
-		// If auto subscribed
-		else if ($pun_user['auto_notify'])
-			$subscr_checked = true;
-		// If already subscribed to the topic
-		else if ($is_subscribed)
-			$subscr_checked = true;
-
-		$checkboxes[] = '<label><input type="checkbox" name="subscribe" value="1" tabindex="'.($cur_index++).'"'.($subscr_checked ? ' checked="checked"' : '').' />'.($is_subscribed ? $lang_post['Stay subscribed'] : $lang_post['Subscribe']).'<br /></label>';
-	}
+		$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['hide_smilies']) ? ' checked="checked"' : '').' />'.$lang_post['Hide smilies'];
+
+	if ($pun_config['o_subscriptions'] == '1')
+		$checkboxes[] = '<label><input type="checkbox" name="subscribe" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['subscribe']) ? ' checked="checked"' : '').' />'.$lang_post['Subscribe'];
 }
 else if ($pun_config['o_smilies'] == '1')
-	$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['hide_smilies']) ? ' checked="checked"' : '').' />'.$lang_post['Hide smilies'].'<br /></label>';
+	$checkboxes[] = '<label><input type="checkbox" name="hide_smilies" value="1" tabindex="'.($cur_index++).'"'.(isset($_POST['hide_smilies']) ? ' checked="checked"' : '').' />'.$lang_post['Hide smilies'];
 
 if (!empty($checkboxes))
@@ -681,5 +528,5 @@
 					<div class="infldset">
 						<div class="rbox">
-							<?php echo implode("\n\t\t\t\t\t\t\t", $checkboxes)."\n" ?>
+							<?php echo implode('<br /></label>'."\n\t\t\t\t", $checkboxes).'<br /></label>'."\n" ?>
 						</div>
 					</div>
@@ -691,5 +538,5 @@
 ?>
 			</div>
-			<p class="buttons"><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="s" /> <input type="submit" name="preview" value="<?php echo $lang_post['Preview'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="p" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="submit" value="<?php echo $lang_common['Submit'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="s" /><input type="submit" name="preview" value="<?php echo $lang_post['Preview'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="p" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -698,22 +545,26 @@
 <?php
 
-// Check to see if the topic review is to be displayed
+// Check to see if the topic review is to be displayed.
 if ($tid && $pun_config['o_topic_review'] != '0')
 {
 	require_once PUN_ROOT.'include/parser.php';
 
-	$result = $db->query('SELECT poster, message, hide_smilies, posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT '.$pun_config['o_topic_review']) or error('Unable to fetch topic review', __FILE__, __LINE__, $db->error());
-
-?>
-
-<div id="postreview">
+	$result = $db->query('SELECT poster, message, hide_smilies, posted FROM '.$db->prefix.'posts WHERE topic_id='.$tid.' ORDER BY id DESC LIMIT '.$pun_config['o_topic_review']) or error('Impossible de retrouver le rÃ©sumÃ© de la discussion', __FILE__, __LINE__, $db->error());
+
+?>
+
+<div id="postreview" class="blockpost">
 	<h2><span><?php echo $lang_post['Topic review'] ?></span></h2>
 <?php
 
-	// Set background switching on
+	//Set background switching on
+	$bg_switch = true;
 	$post_count = 0;
 
 	while ($cur_post = $db->fetch_assoc($result))
 	{
+		// Switch the background color for every message.
+		$bg_switch = ($bg_switch) ? $bg_switch = false : $bg_switch = true;
+		$vtbg = ($bg_switch) ? ' roweven' : ' rowodd';
 		$post_count++;
 
@@ -721,22 +572,18 @@
 
 ?>
-	<div class="blockpost">
-		<div class="box<?php echo ($post_count % 2 == 0) ? ' roweven' : ' rowodd' ?>">
-			<div class="inbox">
-				<div class="postbody">
-					<div class="postleft">
-						<dl>
-							<dt><strong><?php echo pun_htmlspecialchars($cur_post['poster']) ?></strong></dt>
-							<dd><span><?php echo format_time($cur_post['posted']) ?></span></dd>
-						</dl>
-					</div>
-					<div class="postright">
-						<div class="postmsg">
-							<?php echo $cur_post['message']."\n" ?>
-						</div>
-					</div>
+	<div class="box<?php echo $vtbg ?>">
+		<div class="inbox">
+			<div class="postleft">
+				<dl>
+					<dt><strong><?php echo pun_htmlspecialchars($cur_post['poster']) ?></strong></dt>
+					<dd><?php echo format_time($cur_post['posted']) ?></dd>
+				</dl>
+			</div>
+			<div class="postright">
+				<div class="postmsg">
+					<?php echo $cur_post['message'] ?>
 				</div>
-				<div class="clearer"></div>
 			</div>
+			<div class="clearer"></div>
 		</div>
 	</div>
Index: trunk/web/punbb/profile.php
===================================================================
--- trunk/web/punbb/profile.php	(revision 10)
+++ trunk/web/punbb/profile.php	(revision 1)
@@ -1,17 +1,30 @@
 <?php
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
-
-// Include UTF-8 function
-require PUN_ROOT.'include/utf8/substr_replace.php';
-require PUN_ROOT.'include/utf8/ucwords.php'; // utf8_ucwords needs utf8_substr_replace
-require PUN_ROOT.'include/utf8/strcasecmp.php';
 
 $action = isset($_GET['action']) ? $_GET['action'] : null;
@@ -21,11 +34,6 @@
 	message($lang_common['Bad request']);
 
-if ($action != 'change_pass' || !isset($_GET['key']))
-{
-	if ($pun_user['g_read_board'] == '0')
-		message($lang_common['No view']);
-	else if ($pun_user['g_view_users'] == '0' && ($pun_user['is_guest'] || $pun_user['id'] != $id))
-		message($lang_common['No permission']);
-}
+if ($pun_user['g_read_board'] == '0' && ($action != 'change_pass' || !isset($_GET['key'])))
+	message($lang_common['No view']);
 
 // Load the profile.php/register.php language file
@@ -49,12 +57,12 @@
 		$key = $_GET['key'];
 
-		$result = $db->query('SELECT * FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch new password', __FILE__, __LINE__, $db->error());
-		$cur_user = $db->fetch_assoc($result);
-
-		if ($key == '' || $key != $cur_user['activate_key'])
+		$result = $db->query('SELECT activate_string, activate_key FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver le nouveau mot de passe', __FILE__, __LINE__, $db->error());
+		list($new_password_hash, $new_password_key) = $db->fetch_row($result);
+
+		if ($key == '' || $key != $new_password_key)
 			message($lang_profile['Pass key bad'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
 		else
 		{
-			$db->query('UPDATE '.$db->prefix.'users SET password=\''.$cur_user['activate_string'].'\', activate_string=NULL, activate_key=NULL'.(!empty($cur_user['salt']) ? ', salt=NULL' : '').' WHERE id='.$id) or error('Unable to update password', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'users SET password=\''.$new_password_hash.'\', activate_string=NULL, activate_key=NULL WHERE id='.$id) or error('Impossible de modifier le mot de passe', __FILE__, __LINE__, $db->error());
 
 			message($lang_profile['Pass updated'], true);
@@ -65,15 +73,13 @@
 	if ($pun_user['id'] != $id)
 	{
-		if (!$pun_user['is_admmod']) // A regular user trying to change another users password?
+		if ($pun_user['g_id'] > PUN_MOD)	// A regular user trying to change another users password?
 			message($lang_common['No permission']);
-		else if ($pun_user['g_moderator'] == '1') // A moderator trying to change a users password?
-		{
-			$result = $db->query('SELECT u.group_id, g.g_moderator FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON (g.g_id=u.group_id) WHERE u.id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+		else if ($pun_user['g_id'] == PUN_MOD)	// A moderator trying to change a users password?
+		{
+			$result = $db->query('SELECT group_id FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 			if (!$db->num_rows($result))
 				message($lang_common['Bad request']);
 
-			list($group_id, $is_moderator) = $db->fetch_row($result);
-
-			if ($pun_user['g_mod_edit_users'] == '0' || $pun_user['g_mod_change_passwords'] == '0' || $group_id == PUN_ADMIN || $is_moderator == '1')
+			if ($pun_config['p_mod_edit_users'] == '0' || $pun_config['p_mod_change_passwords'] == '0' || $db->result($result) < PUN_GUEST)
 				message($lang_common['No permission']);
 		}
@@ -82,26 +88,28 @@
 	if (isset($_POST['form_sent']))
 	{
-		if ($pun_user['is_admmod'])
-			confirm_referrer('profile.php');
-
-		$old_password = isset($_POST['req_old_password']) ? pun_trim($_POST['req_old_password']) : '';
-		$new_password1 = pun_trim($_POST['req_new_password1']);
-		$new_password2 = pun_trim($_POST['req_new_password2']);
+		$old_password = isset($_POST['req_old_password']) ? trim($_POST['req_old_password']) : '';
+		$new_password1 = trim($_POST['req_new_password1']);
+		$new_password2 = trim($_POST['req_new_password2']);
 
 		if ($new_password1 != $new_password2)
 			message($lang_prof_reg['Pass not match']);
-		if (pun_strlen($new_password1) < 4)
+		if (strlen($new_password1) < 4)
 			message($lang_prof_reg['Pass too short']);
 
-		$result = $db->query('SELECT * FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch password', __FILE__, __LINE__, $db->error());
-		$cur_user = $db->fetch_assoc($result);
+		$result = $db->query('SELECT password, save_pass FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver le mot de passe', __FILE__, __LINE__, $db->error());
+		list($db_password_hash, $save_pass) = $db->fetch_row($result);
 
 		$authorized = false;
 
-		if (!empty($cur_user['password']))
-		{
-			$old_password_hash = pun_hash($old_password);
-
-			if ($cur_user['password'] == $old_password_hash || $pun_user['is_admmod'])
+		if (!empty($db_password_hash))
+		{
+			$sha1_in_db = (strlen($db_password_hash) == 40) ? true : false;
+			$sha1_available = (function_exists('sha1') || function_exists('mhash')) ? true : false;
+
+			$old_password_hash = pun_hash($old_password);	// This could result in either an SHA-1 or an MD5 hash
+
+			if (($sha1_in_db && $sha1_available && $db_password_hash == $old_password_hash) ||
+				(!$sha1_in_db && $db_password_hash == md5($old_password)) ||
+				$pun_user['g_id'] < PUN_GUEST)
 				$authorized = true;
 		}
@@ -112,16 +120,18 @@
 		$new_password_hash = pun_hash($new_password1);
 
-		$db->query('UPDATE '.$db->prefix.'users SET password=\''.$new_password_hash.'\''.(!empty($cur_user['salt']) ? ', salt=NULL' : '').' WHERE id='.$id) or error('Unable to update password', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'users SET password=\''.$new_password_hash.'\' WHERE id='.$id) or error('Impossible de modifier le mot de passe', __FILE__, __LINE__, $db->error());
 
 		if ($pun_user['id'] == $id)
-			pun_setcookie($pun_user['id'], $new_password_hash, time() + $pun_config['o_timeout_visit']);
+		{
+			$expire = ($save_pass == '1') ? time() + 31536000 : 0;
+			pun_setcookie($pun_user['id'], $new_password_hash, $expire);
+		}
 
 		redirect('profile.php?section=essentials&amp;id='.$id, $lang_profile['Pass updated redirect']);
 	}
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Change pass']);
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 	$required_fields = array('req_old_password' => $lang_profile['Old pass'], 'req_new_password1' => $lang_profile['New pass'], 'req_new_password2' => $lang_profile['Confirm new pass']);
-	$focus_element = array('change_pass', ((!$pun_user['is_admmod']) ? 'req_old_password' : 'req_new_password1'));
-	define('PUN_ACTIVE_PAGE', 'profile');
+	$focus_element = array('change_pass', (($pun_user['g_id'] > PUN_MOD) ? 'req_old_password' : 'req_new_password1'));
 	require PUN_ROOT.'header.php';
 
@@ -136,15 +146,15 @@
 					<legend><?php echo $lang_profile['Change pass legend'] ?></legend>
 					<div class="infldset">
-<?php if (!$pun_user['is_admmod']): ?>						<label class="required"><strong><?php echo $lang_profile['Old pass'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
-						<input type="password" name="req_old_password" size="16" /><br /></label>
-<?php endif; ?>						<label class="conl required"><strong><?php echo $lang_profile['New pass'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
-						<input type="password" name="req_new_password1" size="16" /><br /></label>
-						<label class="conl required"><strong><?php echo $lang_profile['Confirm new pass'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
-						<input type="password" name="req_new_password2" size="16" /><br /></label>
-						<p class="clearb"><?php echo $lang_profile['Pass info'] ?></p>
+<?php if ($pun_user['g_id'] > PUN_MOD): ?>						<label><strong><?php echo $lang_profile['Old pass'] ?></strong><br />
+						<input type="password" name="req_old_password" size="16" maxlength="16" /><br /></label>
+<?php endif; ?>						<label class="conl"><strong><?php echo $lang_profile['New pass'] ?></strong><br />
+						<input type="password" name="req_new_password1" size="16" maxlength="16" /><br /></label>
+						<label class="conl"><strong><?php echo $lang_profile['Confirm new pass'] ?></strong><br />
+						<input type="password" name="req_new_password2" size="16" maxlength="16" /><br /></label>
+						<div class="clearb"></div>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -158,18 +168,16 @@
 else if ($action == 'change_email')
 {
-	// Make sure we are allowed to change this users email
+	// Make sure we are allowed to change this users e-mail
 	if ($pun_user['id'] != $id)
 	{
-		if (!$pun_user['is_admmod']) // A regular user trying to change another users email?
+		if ($pun_user['g_id'] > PUN_MOD)	// A regular user trying to change another users e-mail?
 			message($lang_common['No permission']);
-		else if ($pun_user['g_moderator'] == '1') // A moderator trying to change a users email?
-		{
-			$result = $db->query('SELECT u.group_id, g.g_moderator FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON (g.g_id=u.group_id) WHERE u.id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+		else if ($pun_user['g_id'] == PUN_MOD)	// A moderator trying to change a users e-mail?
+		{
+			$result = $db->query('SELECT group_id FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 			if (!$db->num_rows($result))
 				message($lang_common['Bad request']);
 
-			list($group_id, $is_moderator) = $db->fetch_row($result);
-
-			if ($pun_user['g_mod_edit_users'] == '0' || $group_id == PUN_ADMIN || $is_moderator == '1')
+			if ($pun_config['p_mod_edit_users'] == '0' || $db->result($result) < PUN_GUEST)
 				message($lang_common['No permission']);
 		}
@@ -180,14 +188,14 @@
 		$key = $_GET['key'];
 
-		$result = $db->query('SELECT activate_string, activate_key FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch activation data', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT activate_string, activate_key FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver les donnÃ©es d\'activation', __FILE__, __LINE__, $db->error());
 		list($new_email, $new_email_key) = $db->fetch_row($result);
 
-		if ($key == '' || $key != $new_email_key)
-			message($lang_profile['Email key bad'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
+		if ($key != $new_email_key)
+			message($lang_profile['E-mail key bad'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
 		else
 		{
-			$db->query('UPDATE '.$db->prefix.'users SET email=activate_string, activate_string=NULL, activate_key=NULL WHERE id='.$id) or error('Unable to update email address', __FILE__, __LINE__, $db->error());
-
-			message($lang_profile['Email updated'], true);
+			$db->query('UPDATE '.$db->prefix.'users SET email=activate_string, activate_string=NULL, activate_key=NULL WHERE id='.$id) or error('Impossible de modifier l\'adresse e-mail', __FILE__, __LINE__, $db->error());
+
+			message($lang_profile['E-mail updated'], true);
 		}
 	}
@@ -199,28 +207,18 @@
 		require PUN_ROOT.'include/email.php';
 
-		// Validate the email address
+		// Validate the email-address
 		$new_email = strtolower(trim($_POST['req_new_email']));
 		if (!is_valid_email($new_email))
-			message($lang_common['Invalid email']);
-
-		// Check if it's a banned email address
+			message($lang_common['Invalid e-mail']);
+
+		// Check it it's a banned e-mail address
 		if (is_banned_email($new_email))
 		{
 			if ($pun_config['p_allow_banned_email'] == '0')
-				message($lang_prof_reg['Banned email']);
+				message($lang_prof_reg['Banned e-mail']);
 			else if ($pun_config['o_mailing_list'] != '')
 			{
-				// Load the "banned email change" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/banned_email_change.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				$mail_message = str_replace('<username>', $pun_user['username'], $mail_message);
-				$mail_message = str_replace('<email>', $new_email, $mail_message);
-				$mail_message = str_replace('<profile_url>', get_base_url().'/profile.php?id='.$id, $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
+				$mail_subject = 'Alerte - Adresse e-mail bannis dÃ©tectÃ©e';
+				$mail_message = 'L\'utilisateur \''.$pun_user['username'].'\' a changÃ© son e-mail en une adresse interdite : '.$new_email."\n\n".'Profil utilisateur : '.$pun_config['o_base_url'].'/profile.php?id='.$id."\n\n".'-- '."\n".'E-mail automatique'."\n".'(Ne rÃ©pondez pas Ã  ce message)';
 
 				pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
@@ -228,10 +226,10 @@
 		}
 
-		// Check if someone else already has registered with that email address
-		$result = $db->query('SELECT id, username FROM '.$db->prefix.'users WHERE email=\''.$db->escape($new_email).'\'') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+		// Check if someone else already has registered with that e-mail address
+		$result = $db->query('SELECT id, username FROM '.$db->prefix.'users WHERE email=\''.$db->escape($new_email).'\'') or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 		if ($db->num_rows($result))
 		{
 			if ($pun_config['p_allow_dupe_email'] == '0')
-				message($lang_prof_reg['Dupe email']);
+				message($lang_prof_reg['Dupe e-mail']);
 			else if ($pun_config['o_mailing_list'] != '')
 			{
@@ -239,16 +237,6 @@
 					$dupe_list[] = $cur_dupe['username'];
 
-				// Load the "dupe email change" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/dupe_email_change.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				$mail_message = str_replace('<username>', $pun_user['username'], $mail_message);
-				$mail_message = str_replace('<dupe_list>', implode(', ', $dupe_list), $mail_message);
-				$mail_message = str_replace('<profile_url>', get_base_url().'/profile.php?id='.$id, $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
+				$mail_subject = 'Alerte - Adresse e-mail en doublon dÃ©tectÃ©e';
+				$mail_message = 'L\'utilisateur \''.$pun_user['username'].'\' a changÃ© son e-mail pour une adresse qui appartient dÃ©jÃ  Ã  : '.implode(', ', $dupe_list)."\n\n".'Profil utilisateur : '.$pun_config['o_base_url'].'/profile.php?id='.$id."\n\n".'-- '."\n".'E-mail automatique'."\n".'(Ne rÃ©pondez pas Ã  ce message)';
 
 				pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
@@ -259,7 +247,7 @@
 		$new_email_key = random_pass(8);
 
-		$db->query('UPDATE '.$db->prefix.'users SET activate_string=\''.$db->escape($new_email).'\', activate_key=\''.$new_email_key.'\' WHERE id='.$id) or error('Unable to update activation data', __FILE__, __LINE__, $db->error());
-
-		// Load the "activate email" template
+		$db->query('UPDATE '.$db->prefix.'users SET activate_string=\''.$db->escape($new_email).'\', activate_key=\''.$new_email_key.'\' WHERE id='.$id) or error('Impossible de modifier les donnÃ©es d\'activation', __FILE__, __LINE__, $db->error());
+
+		// Load the "activate e-mail" template
 		$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/activate_email.tpl'));
 
@@ -270,36 +258,35 @@
 
 		$mail_message = str_replace('<username>', $pun_user['username'], $mail_message);
-		$mail_message = str_replace('<base_url>', get_base_url(), $mail_message);
-		$mail_message = str_replace('<activation_url>', get_base_url().'/profile.php?action=change_email&id='.$id.'&key='.$new_email_key, $mail_message);
-		$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
+		$mail_message = str_replace('<base_url>', $pun_config['o_base_url'], $mail_message);
+		$mail_message = str_replace('<activation_url>', $pun_config['o_base_url'].'/profile.php?action=change_email&id='.$id.'&key='.$new_email_key, $mail_message);
+		$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
 
 		pun_mail($new_email, $mail_subject, $mail_message);
 
-		message($lang_profile['Activate email sent'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
-	}
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Change email']);
-	$required_fields = array('req_new_email' => $lang_profile['New email'], 'req_password' => $lang_common['Password']);
+		message($lang_profile['Activate e-mail sent'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
+	}
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
+	$required_fields = array('req_new_email' => $lang_profile['New e-mail'], 'req_password' => $lang_common['Password']);
 	$focus_element = array('change_email', 'req_new_email');
-	define('PUN_ACTIVE_PAGE', 'profile');
 	require PUN_ROOT.'header.php';
 
 ?>
 <div class="blockform">
-	<h2><span><?php echo $lang_profile['Change email'] ?></span></h2>
+	<h2><span><?php echo $lang_profile['Change e-mail'] ?></span></h2>
 	<div class="box">
 		<form id="change_email" method="post" action="profile.php?action=change_email&amp;id=<?php echo $id ?>" id="change_email" onsubmit="return process_form(this)">
 			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_profile['Email legend'] ?></legend>
+					<legend><?php echo $lang_profile['E-mail legend'] ?></legend>
 					<div class="infldset">
 						<input type="hidden" name="form_sent" value="1" />
-						<label class="required"><strong><?php echo $lang_profile['New email'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="req_new_email" size="50" maxlength="80" /><br /></label>
-						<label class="required"><strong><?php echo $lang_common['Password'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="password" name="req_password" size="16" /><br /></label>
-						<p><?php echo $lang_profile['Email instructions'] ?></p>
+						<label><strong><?php echo $lang_profile['New e-mail'] ?></strong><br /><input type="text" name="req_new_email" size="50" maxlength="50" /><br /></label>
+						<label><strong><?php echo $lang_common['Password'] ?></strong><br /><input type="password" name="req_password" size="16" maxlength="16" /><br /></label>
+						<p><?php echo $lang_profile['E-mail instructions'] ?></p>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="new_email" value="<?php echo $lang_common['Submit'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="new_email" value="<?php echo $lang_common['Submit'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -316,5 +303,5 @@
 		message($lang_profile['Avatars disabled']);
 
-	if ($pun_user['id'] != $id && !$pun_user['is_admmod'])
+	if ($pun_user['id'] != $id && $pun_user['g_id'] > PUN_MOD)
 		message($lang_common['No permission']);
 
@@ -323,5 +310,5 @@
 		if (!isset($_FILES['req_file']))
 			message($lang_profile['No file']);
-
+			
 		$uploaded_file = $_FILES['req_file'];
 
@@ -331,18 +318,18 @@
 			switch ($uploaded_file['error'])
 			{
-				case 1: // UPLOAD_ERR_INI_SIZE
-				case 2: // UPLOAD_ERR_FORM_SIZE
+				case 1:	// UPLOAD_ERR_INI_SIZE
+				case 2:	// UPLOAD_ERR_FORM_SIZE
 					message($lang_profile['Too large ini']);
 					break;
 
-				case 3: // UPLOAD_ERR_PARTIAL
+				case 3:	// UPLOAD_ERR_PARTIAL
 					message($lang_profile['Partial upload']);
 					break;
 
-				case 4: // UPLOAD_ERR_NO_FILE
+				case 4:	// UPLOAD_ERR_NO_FILE
 					message($lang_profile['No file']);
 					break;
 
-				case 6: // UPLOAD_ERR_NO_TMP_DIR
+				case 6:	// UPLOAD_ERR_NO_TMP_DIR
 					message($lang_profile['No tmp directory']);
 					break;
@@ -358,5 +345,4 @@
 		if (is_uploaded_file($uploaded_file['tmp_name']))
 		{
-			// Preliminary file check, adequate in most cases
 			$allowed_types = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png');
 			if (!in_array($uploaded_file['type'], $allowed_types))
@@ -365,48 +351,51 @@
 			// Make sure the file isn't too big
 			if ($uploaded_file['size'] > $pun_config['o_avatars_size'])
-				message($lang_profile['Too large'].' '.forum_number_format($pun_config['o_avatars_size']).' '.$lang_profile['bytes'].'.');
-
-			// Move the file to the avatar directory. We do this before checking the width/height to circumvent open_basedir restrictions
-			if (!@move_uploaded_file($uploaded_file['tmp_name'], PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp'))
+				message($lang_profile['Too large'].' '.$pun_config['o_avatars_size'].' '.$lang_profile['bytes'].'.');
+
+			// Determine type
+			$extensions = null;
+			if ($uploaded_file['type'] == 'image/gif')
+				$extensions = array('.gif', '.jpg', '.png');
+			else if ($uploaded_file['type'] == 'image/jpeg' || $uploaded_file['type'] == 'image/pjpeg')
+				$extensions = array('.jpg', '.gif', '.png');
+			else
+				$extensions = array('.png', '.gif', '.jpg');
+
+			// Move the file to the avatar directory. We do this before checking the width/height to circumvent open_basedir restrictions.
+			if (!@move_uploaded_file($uploaded_file['tmp_name'], $pun_config['o_avatars_dir'].'/'.$id.'.tmp'))
 				message($lang_profile['Move failed'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
 
-			list($width, $height, $type,) = @getimagesize(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp');
-
-			// Determine type
-			if ($type == IMAGETYPE_GIF)
-				$extension = '.gif';
-			else if ($type == IMAGETYPE_JPEG)
-				$extension = '.jpg';
-			else if ($type == IMAGETYPE_PNG)
-				$extension = '.png';
-			else
-			{
-				// Invalid type
-				@unlink(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp');
-				message($lang_profile['Bad type']);
-			}
-
 			// Now check the width/height
+			list($width, $height, $type,) = getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.tmp');
 			if (empty($width) || empty($height) || $width > $pun_config['o_avatars_width'] || $height > $pun_config['o_avatars_height'])
 			{
-				@unlink(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp');
+				@unlink($pun_config['o_avatars_dir'].'/'.$id.'.tmp');
 				message($lang_profile['Too wide or high'].' '.$pun_config['o_avatars_width'].'x'.$pun_config['o_avatars_height'].' '.$lang_profile['pixels'].'.');
 			}
+			else if ($type == 1 && $uploaded_file['type'] != 'image/gif')	// Prevent dodgy uploads
+			{
+				@unlink($pun_config['o_avatars_dir'].'/'.$id.'.tmp');
+				message($lang_profile['Bad type']);
+			}			
 
 			// Delete any old avatars and put the new one in place
-			delete_avatar($id);
-			@rename(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.'.tmp', PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.$extension);
-			@chmod(PUN_ROOT.$pun_config['o_avatars_dir'].'/'.$id.$extension, 0644);
+			@unlink($pun_config['o_avatars_dir'].'/'.$id.$extensions[0]);
+			@unlink($pun_config['o_avatars_dir'].'/'.$id.$extensions[1]);
+			@unlink($pun_config['o_avatars_dir'].'/'.$id.$extensions[2]);
+			@rename($pun_config['o_avatars_dir'].'/'.$id.'.tmp', $pun_config['o_avatars_dir'].'/'.$id.$extensions[0]);
+			@chmod($pun_config['o_avatars_dir'].'/'.$id.$extensions[0], 0644);
 		}
 		else
 			message($lang_profile['Unknown failure']);
 
+		// Enable use_avatar (seems sane since the user just uploaded an avatar)
+		$db->query('UPDATE '.$db->prefix.'users SET use_avatar=1 WHERE id='.$id) or error('Impossible de modifier l\'Ã©tat de l\'avatar', __FILE__, __LINE__, $db->error());
+
 		redirect('profile.php?section=personality&amp;id='.$id, $lang_profile['Avatar upload redirect']);
 	}
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Upload avatar']);
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 	$required_fields = array('req_file' => $lang_profile['File']);
 	$focus_element = array('upload_avatar', 'req_file');
-	define('PUN_ACTIVE_PAGE', 'profile');
 	require PUN_ROOT.'header.php';
 
@@ -422,10 +411,10 @@
 						<input type="hidden" name="form_sent" value="1" />
 						<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $pun_config['o_avatars_size'] ?>" />
-						<label class="required"><strong><?php echo $lang_profile['File'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input name="req_file" type="file" size="40" /><br /></label>
-						<p><?php echo $lang_profile['Avatar desc'].' '.$pun_config['o_avatars_width'].' x '.$pun_config['o_avatars_height'].' '.$lang_profile['pixels'].' '.$lang_common['and'].' '.forum_number_format($pun_config['o_avatars_size']).' '.$lang_profile['bytes'].' ('.file_size($pun_config['o_avatars_size']).').' ?></p>
+						<label><strong><?php echo $lang_profile['File'] ?></strong><br /><input name="req_file" type="file" size="40" /><br /></label>
+						<p><?php echo $lang_profile['Avatar desc'].' '.$pun_config['o_avatars_width'].' x '.$pun_config['o_avatars_height'].' '.$lang_profile['pixels'].' '.$lang_common['and'].' '.$pun_config['o_avatars_size'].' '.$lang_profile['bytes'].' ('.ceil($pun_config['o_avatars_size'] / 1024) ?> KB).</p>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="upload" value="<?php echo $lang_profile['Upload'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="upload" value="<?php echo $lang_profile['Upload'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -439,10 +428,15 @@
 else if ($action == 'delete_avatar')
 {
-	if ($pun_user['id'] != $id && !$pun_user['is_admmod'])
+	if ($pun_user['id'] != $id && $pun_user['g_id'] > PUN_MOD)
 		message($lang_common['No permission']);
 
 	confirm_referrer('profile.php');
 
-	delete_avatar($id);
+	@unlink($pun_config['o_avatars_dir'].'/'.$id.'.jpg');
+	@unlink($pun_config['o_avatars_dir'].'/'.$id.'.png');
+	@unlink($pun_config['o_avatars_dir'].'/'.$id.'.gif');
+
+	// Disable use_avatar
+	$db->query('UPDATE '.$db->prefix.'users SET use_avatar=0 WHERE id='.$id) or error('Impossible de modifier l\'Ã©tat de l\'avatar', __FILE__, __LINE__, $db->error());
 
 	redirect('profile.php?section=personality&amp;id='.$id, $lang_profile['Avatar deleted redirect']);
@@ -459,19 +453,10 @@
 	$new_group_id = intval($_POST['group_id']);
 
-	$db->query('UPDATE '.$db->prefix.'users SET group_id='.$new_group_id.' WHERE id='.$id) or error('Unable to change user group', __FILE__, __LINE__, $db->error());
-
-	// Regenerate the users info cache
-	if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-		require PUN_ROOT.'include/cache.php';
-
-	generate_users_info_cache();
-
-	$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$new_group_id) or error('Unable to fetch group', __FILE__, __LINE__, $db->error());
-	$new_group_mod = $db->result($result);
+	$db->query('UPDATE '.$db->prefix.'users SET group_id='.$new_group_id.' WHERE id='.$id) or error('Impossible de change de groupe', __FILE__, __LINE__, $db->error());
 
 	// If the user was a moderator or an administrator, we remove him/her from the moderator list in all forums as well
-	if ($new_group_id != PUN_ADMIN && $new_group_mod != '1')
-	{
-		$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
+	if ($new_group_id > PUN_MOD)
+	{
+		$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Impossible de retrouver la liste des forums', __FILE__, __LINE__, $db->error());
 
 		while ($cur_forum = $db->fetch_assoc($result))
@@ -485,5 +470,5 @@
 				$cur_moderators = (!empty($cur_moderators)) ? '\''.$db->escape(serialize($cur_moderators)).'\'' : 'NULL';
 
-				$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
+				$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Impossible de modifier le forum', __FILE__, __LINE__, $db->error());
 			}
 		}
@@ -502,5 +487,5 @@
 
 	// Get the username of the user we are processing
-	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 	$username = $db->result($result);
 
@@ -508,5 +493,5 @@
 
 	// Loop through all forums
-	$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Impossible de retrouver la liste des forums', __FILE__, __LINE__, $db->error());
 
 	while ($cur_forum = $db->fetch_assoc($result))
@@ -517,7 +502,7 @@
 		{
 			$cur_moderators[$username] = $id;
-			uksort($cur_moderators, 'utf8_strcasecmp');
-
-			$db->query('UPDATE '.$db->prefix.'forums SET moderators=\''.$db->escape(serialize($cur_moderators)).'\' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
+			ksort($cur_moderators);
+
+			$db->query('UPDATE '.$db->prefix.'forums SET moderators=\''.$db->escape(serialize($cur_moderators)).'\' WHERE id='.$cur_forum['id']) or error('Impossible de modifier les forums', __FILE__, __LINE__, $db->error());
 		}
 		// If the user shouldn't have moderator access (and he/she already has it)
@@ -527,5 +512,5 @@
 			$cur_moderators = (!empty($cur_moderators)) ? '\''.$db->escape(serialize($cur_moderators)).'\'' : 'NULL';
 
-			$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Impossible de modifier les forums', __FILE__, __LINE__, $db->error());
 		}
 	}
@@ -537,20 +522,8 @@
 else if (isset($_POST['ban']))
 {
-	if ($pun_user['g_id'] != PUN_ADMIN && ($pun_user['g_moderator'] != '1' || $pun_user['g_mod_ban_users'] == '0'))
+	if ($pun_user['g_id'] > PUN_MOD || ($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_ban_users'] == '0'))
 		message($lang_common['No permission']);
 
-	// Get the username of the user we are banning
-	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch username', __FILE__, __LINE__, $db->error());
-	$username = $db->result($result);
-
-	// Check whether user is already banned
-	$result = $db->query('SELECT id FROM '.$db->prefix.'bans WHERE username = \''.$db->escape($username).'\' ORDER BY expire IS NULL DESC, expire DESC LIMIT 1') or error('Unable to fetch ban ID', __FILE__, __LINE__, $db->error());
-	if ($db->num_rows($result))
-	{
-		$ban_id = $db->result($result);
-		redirect('admin_bans.php?edit_ban='.$ban_id.'&amp;exists', $lang_profile['Ban redirect']);
-	}
-	else
-		redirect('admin_bans.php?add_ban='.$id, $lang_profile['Ban redirect']);
+	redirect('admin_bans.php?add_ban='.$id, $lang_profile['Ban redirect']);
 }
 
@@ -564,19 +537,16 @@
 
 	// Get the username and group of the user we are deleting
-	$result = $db->query('SELECT group_id, username FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT group_id, username FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 	list($group_id, $username) = $db->fetch_row($result);
-
-	if ($group_id == PUN_ADMIN)
-		message($lang_profile['No delete admin message']);
+	
+	if ($group_id == PUN_ADMIN)  
+		message('Les administrateurs ne peuvent Ãªtres supprimÃ©s. Afin de supprimer cet utilisateur vous devez d\'abord le dÃ©placer dans un autre groupe.');  
 
 	if (isset($_POST['delete_user_comply']))
 	{
 		// If the user is a moderator or an administrator, we remove him/her from the moderator list in all forums as well
-		$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch group', __FILE__, __LINE__, $db->error());
-		$group_mod = $db->result($result);
-
-		if ($group_id == PUN_ADMIN || $group_mod == '1')
-		{
-			$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
+		if ($group_id < PUN_GUEST)
+		{
+			$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Impossible de retrouver la liste des forums', __FILE__, __LINE__, $db->error());
 
 			while ($cur_forum = $db->fetch_assoc($result))
@@ -589,5 +559,5 @@
 					$cur_moderators = (!empty($cur_moderators)) ? '\''.$db->escape(serialize($cur_moderators)).'\'' : 'NULL';
 
-					$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
+					$db->query('UPDATE '.$db->prefix.'forums SET moderators='.$cur_moderators.' WHERE id='.$cur_forum['id']) or error('Impossible de modifier les forums', __FILE__, __LINE__, $db->error());
 				}
 			}
@@ -595,9 +565,8 @@
 
 		// Delete any subscriptions
-		$db->query('DELETE FROM '.$db->prefix.'topic_subscriptions WHERE user_id='.$id) or error('Unable to delete topic subscriptions', __FILE__, __LINE__, $db->error());
-		$db->query('DELETE FROM '.$db->prefix.'forum_subscriptions WHERE user_id='.$id) or error('Unable to delete forum subscriptions', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'subscriptions WHERE user_id='.$id) or error('Unable to delete subscriptions', __FILE__, __LINE__, $db->error());
 
 		// Remove him/her from the online list (if they happen to be logged in)
-		$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$id) or error('Unable to remove user from online list', __FILE__, __LINE__, $db->error());
+		$db->query('DELETE FROM '.$db->prefix.'online WHERE user_id='.$id) or error('Impossible de retirer l\'utilisateur de la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 
 		// Should we delete all posts made by this user?
@@ -608,5 +577,5 @@
 
 			// Find all posts made by this user
-			$result = $db->query('SELECT p.id, p.topic_id, t.forum_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE p.poster_id='.$id) or error('Unable to fetch posts', __FILE__, __LINE__, $db->error());
+			$result = $db->query('SELECT p.id, p.topic_id, t.forum_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE p.poster_id='.$id) or error('Impossible de retrouver les messages', __FILE__, __LINE__, $db->error());
 			if ($db->num_rows($result))
 			{
@@ -614,5 +583,5 @@
 				{
 					// Determine whether this post is the "topic post" or not
-					$result2 = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$cur_post['topic_id'].' ORDER BY posted LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+					$result2 = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$cur_post['topic_id'].' ORDER BY posted LIMIT 1') or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 
 					if ($db->result($result2) == $cur_post['id'])
@@ -627,23 +596,13 @@
 		else
 			// Set all his/her posts to guest
-			$db->query('UPDATE '.$db->prefix.'posts SET poster_id=1 WHERE poster_id='.$id) or error('Unable to update posts', __FILE__, __LINE__, $db->error());
+			$db->query('UPDATE '.$db->prefix.'posts SET poster_id=1 WHERE poster_id='.$id) or error('Impossible de modifier les messages', __FILE__, __LINE__, $db->error());
 
 		// Delete the user
-		$db->query('DELETE FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to delete user', __FILE__, __LINE__, $db->error());
-
-		// Delete user avatar
-		delete_avatar($id);
-
-		// Regenerate the users info cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_users_info_cache();
+		$db->query('DELETE FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de supprimer l\'utilisateur', __FILE__, __LINE__, $db->error());
 
 		redirect('index.php', $lang_profile['User delete redirect']);
 	}
 
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Confirm delete user']);
-	define('PUN_ACTIVE_PAGE', 'profile');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 	require PUN_ROOT.'header.php';
 
@@ -657,5 +616,5 @@
 					<legend><?php echo $lang_profile['Confirm delete legend'] ?></legend>
 					<div class="infldset">
-						<p><?php echo $lang_profile['Confirmation info'].' <strong>'.pun_htmlspecialchars($username).'</strong>.' ?></p>
+						<p><?php echo $lang_profile['Confirmation info'].' '.pun_htmlspecialchars($username).'.' ?></p>
 						<div class="rbox">
 							<label><input type="checkbox" name="delete_posts" value="1" checked="checked" /><?php echo $lang_profile['Delete posts'] ?><br /></label>
@@ -665,5 +624,5 @@
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="delete_user_comply" value="<?php echo $lang_profile['Delete'] ?>" /> <a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
+			<p><input type="submit" name="delete_user_comply" value="<?php echo $lang_profile['Delete'] ?>" /><a href="javascript:history.go(-1)"><?php echo $lang_common['Go back'] ?></a></p>
 		</form>
 	</div>
@@ -678,20 +637,32 @@
 {
 	// Fetch the user group of the user we are editing
-	$result = $db->query('SELECT u.username, u.group_id, g.g_moderator FROM '.$db->prefix.'users AS u INNER JOIN '.$db->prefix.'groups AS g ON (g.g_id=u.group_id) WHERE u.id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT group_id FROM '.$db->prefix.'users WHERE id='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
 		message($lang_common['Bad request']);
 
-	list($old_username, $group_id, $is_moderator) = $db->fetch_row($result);
-
-	if ($pun_user['id'] != $id &&																	// If we arent the user (i.e. editing your own profile)
-		(!$pun_user['is_admmod'] ||																	// and we are not an admin or mod
-		($pun_user['g_id'] != PUN_ADMIN &&															// or we aren't an admin and ...
-		($pun_user['g_mod_edit_users'] == '0' ||													// mods aren't allowed to edit users
-		$group_id == PUN_ADMIN ||																	// or the user is an admin
-		$is_moderator))))																			// or the user is another mod
+	$group_id = $db->result($result);
+
+	if ($pun_user['id'] != $id &&
+		($pun_user['g_id'] > PUN_MOD ||
+		($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_edit_users'] == '0') ||
+		($pun_user['g_id'] == PUN_MOD && $group_id < PUN_GUEST)))
 		message($lang_common['No permission']);
 
-	if ($pun_user['is_admmod'])
+	if ($pun_user['g_id'] < PUN_GUEST)
 		confirm_referrer('profile.php');
+
+	// Extract allowed elements from $_POST['form']
+	function extract_elements($allowed_elements)
+	{
+		$form = array();
+
+		while (list($key, $value) = @each($_POST['form']))
+		{
+		    if (in_array($key, $allowed_elements))
+		        $form[$key] = $value;
+		}
+
+		return $form;
+	}
 
 	$username_updated = false;
@@ -702,41 +673,34 @@
 		case 'essentials':
 		{
-			$form = array(
-				'timezone'		=> floatval($_POST['form']['timezone']),
-				'dst'			=> isset($_POST['form']['dst']) ? '1' : '0',
-				'time_format'	=> intval($_POST['form']['time_format']),
-				'date_format'	=> intval($_POST['form']['date_format']),
-			);
-
-			// Make sure we got a valid language string
-			if (isset($_POST['form']['language']))
+			$form = extract_elements(array('timezone', 'language'));
+
+			if ($pun_user['g_id'] < PUN_GUEST)
 			{
-				$languages = forum_list_langs();
-				$form['language'] = pun_trim($_POST['form']['language']);
-				if (!in_array($form['language'], $languages))
-					message($lang_common['Bad request']);
-			}
-
-			if ($pun_user['is_admmod'])
-			{
-				$form['admin_note'] = pun_trim($_POST['admin_note']);
+				$form['admin_note'] = trim($_POST['admin_note']);
 
 				// Are we allowed to change usernames?
-				if ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && $pun_user['g_mod_rename_users'] == '1'))
+				if ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_rename_users'] == '1'))
 				{
-					$form['username'] = pun_trim($_POST['req_username']);
+					$form['username'] = trim($_POST['req_username']);
+					$old_username = trim($_POST['old_username']);
+
+					if (strlen($form['username']) < 2)
+						message($lang_prof_reg['Username too short']);
+					else if (pun_strlen($form['username']) > 25)	// This usually doesn't happen since the form element only accepts 25 characters
+					    message($lang_common['Bad request']);
+					else if (!strcasecmp($form['username'], 'invitÃ©') || !strcasecmp($form['username'], $lang_common['Guest']))
+						message($lang_prof_reg['Username guest']);
+					else if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $form['username']))
+						message($lang_prof_reg['Username IP']);
+					else if (preg_match('#\[b\]|\[/b\]|\[u\]|\[/u\]|\[i\]|\[/i\]|\[color|\[/color\]|\[quote\]|\[quote=|\[/quote\]|\[code\]|\[/code\]|\[img\]|\[/img\]|\[url|\[/url\]|\[email|\[/email\]#i', $form['username']))
+						message($lang_prof_reg['Username BBCode']);
+
+					// Check that the username is not already registered
+					$result = $db->query('SELECT 1 FROM '.$db->prefix.'users WHERE username=\''.$db->escape($form['username']).'\' AND id!='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
+					if ($db->num_rows($result))
+						message($lang_profile['Dupe username']);
 
 					if ($form['username'] != $old_username)
-					{
-						// Check username
-						require PUN_ROOT.'lang/'.$pun_user['language'].'/register.php';
-
-						$errors = array();
-						check_username($form['username'], $id);
-						if (!empty($errors))
-							message($errors[0]);
-
 						$username_updated = true;
-					}
 				}
 
@@ -746,14 +710,19 @@
 			}
 
-			if ($pun_config['o_regs_verify'] == '0' || $pun_user['is_admmod'])
+			if ($pun_config['o_regs_verify'] == '0' || $pun_user['g_id'] < PUN_GUEST)
 			{
 				require PUN_ROOT.'include/email.php';
 
-				// Validate the email address
+				// Validate the email-address
 				$form['email'] = strtolower(trim($_POST['req_email']));
 				if (!is_valid_email($form['email']))
-					message($lang_common['Invalid email']);
+					message($lang_common['Invalid e-mail']);
 			}
-
+			
+			// Make sure we got a valid language string
+			$form['language'] = preg_replace('#[\.\\\/]#', '', $form['language']);
+			if (!file_exists(PUN_ROOT.'lang/'.$form['language'].'/common.php'))
+				message($lang_common['Bad request']);
+			
 			break;
 		}
@@ -761,26 +730,11 @@
 		case 'personal':
 		{
-			$form = array(
-				'realname'		=> pun_trim($_POST['form']['realname']),
-				'url'			=> pun_trim($_POST['form']['url']),
-				'location'		=> pun_trim($_POST['form']['location']),
-			);
-
-			// Add http:// if the URL doesn't contain it already (while allowing https://, too)
-			if ($form['url'] != '')
-			{
-				$url = url_valid($form['url']);
-
-				if ($url === false)
-					message($lang_profile['Invalid website URL']);
-
-				$form['url'] = $url['url'];
-			}
+			$form = extract_elements(array('realname', 'url', 'location'));
 
 			if ($pun_user['g_id'] == PUN_ADMIN)
-				$form['title'] = pun_trim($_POST['title']);
+				$form['title'] = trim($_POST['title']);
 			else if ($pun_user['g_set_title'] == '1')
 			{
-				$form['title'] = pun_trim($_POST['title']);
+				$form['title'] = trim($_POST['title']);
 
 				if ($form['title'] != '')
@@ -788,11 +742,15 @@
 					// A list of words that the title may not contain
 					// If the language is English, there will be some duplicates, but it's not the end of the world
-					$forbidden = array('member', 'moderator', 'administrator', 'banned', 'guest', utf8_strtolower($lang_common['Member']), utf8_strtolower($lang_common['Moderator']), utf8_strtolower($lang_common['Administrator']), utf8_strtolower($lang_common['Banned']), utf8_strtolower($lang_common['Guest']));
-
-					if (in_array(utf8_strtolower($form['title']), $forbidden))
+					$forbidden = array('Member', 'Moderator', 'Administrator', 'Banned', 'Guest', $lang_common['Member'], $lang_common['Moderator'], $lang_common['Administrator'], $lang_common['Banned'], $lang_common['Guest']);
+
+					if (in_array($form['title'], $forbidden))
 						message($lang_profile['Forbidden title']);
 				}
 			}
 
+			// Add http:// if the URL doesn't contain it already
+			if ($form['url'] != '' && !stristr($form['url'], 'http://'))
+				$form['url'] = 'http://'.$form['url'];
+
 			break;
 		}
@@ -800,14 +758,8 @@
 		case 'messaging':
 		{
-			$form = array(
-				'jabber'		=> pun_trim($_POST['form']['jabber']),
-				'icq'			=> pun_trim($_POST['form']['icq']),
-				'msn'			=> pun_trim($_POST['form']['msn']),
-				'aim'			=> pun_trim($_POST['form']['aim']),
-				'yahoo'			=> pun_trim($_POST['form']['yahoo']),
-			);
+			$form = extract_elements(array('jabber', 'icq', 'msn', 'aim', 'yahoo'));
 
 			// If the ICQ UIN contains anything other than digits it's invalid
-			if (preg_match('%[^0-9]%', $form['icq']))
+			if ($form['icq'] != '' && preg_match('/[^0-9]/', $form['icq']))
 				message($lang_prof_reg['Bad ICQ']);
 
@@ -817,33 +769,26 @@
 		case 'personality':
 		{
-			$form = array();
+			$form = extract_elements(array('use_avatar'));
 
 			// Clean up signature from POST
-			if ($pun_config['o_signatures'] == '1')
+			$form['signature'] = pun_linebreaks(trim($_POST['signature']));
+
+			// Validate signature
+			if (pun_strlen($form['signature']) > $pun_config['p_sig_length'])
+				message($lang_prof_reg['Sig too long'].' '.$pun_config['p_sig_length'].' '.$lang_prof_reg['characters'].'.');
+			else if (substr_count($form['signature'], "\n") > ($pun_config['p_sig_lines']-1))
+				message($lang_prof_reg['Sig too many lines'].' '.$pun_config['p_sig_lines'].' '.$lang_prof_reg['lines'].'.');
+			else if ($form['signature'] && $pun_config['p_sig_all_caps'] == '0' && strtoupper($form['signature']) == $form['signature'] && $pun_user['g_id'] > PUN_MOD)
+				$form['signature'] = ucwords(strtolower($form['signature']));
+
+			// Validate BBCode syntax
+			if ($pun_config['p_sig_bbcode'] == '1' && strpos($form['signature'], '[') !== false && strpos($form['signature'], ']') !== false)
 			{
-				$form['signature'] = pun_linebreaks(pun_trim($_POST['signature']));
-
-				// Validate signature
-				if (pun_strlen($form['signature']) > $pun_config['p_sig_length'])
-					message(sprintf($lang_prof_reg['Sig too long'], $pun_config['p_sig_length'], pun_strlen($form['signature']) - $pun_config['p_sig_length']));
-				else if (substr_count($form['signature'], "\n") > ($pun_config['p_sig_lines']-1))
-					message(sprintf($lang_prof_reg['Sig too many lines'], $pun_config['p_sig_lines']));
-				else if ($form['signature'] && $pun_config['p_sig_all_caps'] == '0' && is_all_uppercase($form['signature']) && !$pun_user['is_admmod'])
-					$form['signature'] = utf8_ucwords(utf8_strtolower($form['signature']));
-
-				// Validate BBCode syntax
-				if ($pun_config['p_sig_bbcode'] == '1')
-				{
-					require PUN_ROOT.'include/parser.php';
-
-					$errors = array();
-
-					$form['signature'] = preparse_bbcode($form['signature'], $errors, true);
-
-					if(count($errors) > 0)
-						message('<ul><li>'.implode('</li><li>', $errors).'</li></ul>');
-				}
+				require PUN_ROOT.'include/parser.php';
+				$form['signature'] = preparse_bbcode($form['signature'], $foo, true);
 			}
 
+			if (!isset($form['use_avatar']) || $form['use_avatar'] != '1') $form['use_avatar'] = '0';
+
 			break;
 		}
@@ -851,54 +796,36 @@
 		case 'display':
 		{
-			$form = array(
-				'disp_topics'		=> pun_trim($_POST['form']['disp_topics']),
-				'disp_posts'		=> pun_trim($_POST['form']['disp_posts']),
-				'show_smilies'		=> isset($_POST['form']['show_smilies']) ? '1' : '0',
-				'show_img'			=> isset($_POST['form']['show_img']) ? '1' : '0',
-				'show_img_sig'		=> isset($_POST['form']['show_img_sig']) ? '1' : '0',
-				'show_avatars'		=> isset($_POST['form']['show_avatars']) ? '1' : '0',
-				'show_sig'			=> isset($_POST['form']['show_sig']) ? '1' : '0',
-			);
-
-			if ($form['disp_topics'] != '')
+			$form = extract_elements(array('disp_topics', 'disp_posts', 'show_smilies', 'show_img', 'show_img_sig', 'show_avatars', 'show_sig', 'style'));
+
+			if ($form['disp_topics'] != '' && intval($form['disp_topics']) < 3) $form['disp_topics'] = 3;
+			if ($form['disp_topics'] != '' && intval($form['disp_topics']) > 75) $form['disp_topics'] = 75;
+			if ($form['disp_posts'] != '' && intval($form['disp_posts']) < 3) $form['disp_posts'] = 3;
+			if ($form['disp_posts'] != '' && intval($form['disp_posts']) > 75) $form['disp_posts'] = 75;
+
+			if (!isset($form['show_smilies']) || $form['show_smilies'] != '1') $form['show_smilies'] = '0';
+			if (!isset($form['show_img']) || $form['show_img'] != '1') $form['show_img'] = '0';
+			if (!isset($form['show_img_sig']) || $form['show_img_sig'] != '1') $form['show_img_sig'] = '0';
+			if (!isset($form['show_avatars']) || $form['show_avatars'] != '1') $form['show_avatars'] = '0';
+			if (!isset($form['show_sig']) || $form['show_sig'] != '1') $form['show_sig'] = '0';
+
+			break;
+		}
+
+		case 'privacy':
+		{
+			$form = extract_elements(array('email_setting', 'save_pass', 'notify_with_post'));
+
+			$form['email_setting'] = intval($form['email_setting']);
+			if ($form['email_setting'] < 0 && $form['email_setting'] > 2) $form['email_setting'] = 1;
+
+			if (!isset($form['save_pass']) || $form['save_pass'] != '1') $form['save_pass'] = '0';
+			if (!isset($form['notify_with_post']) || $form['notify_with_post'] != '1') $form['notify_with_post'] = '0';
+
+			// If the save_pass setting has changed, we need to set a new cookie with the appropriate expire date
+			if ($pun_user['id'] == $id && $form['save_pass'] != $pun_user['save_pass'])
 			{
-				$form['disp_topics'] = intval($form['disp_topics']);
-				if ($form['disp_topics'] < 3)
-					$form['disp_topics'] = 3;
-				else if ($form['disp_topics'] > 75)
-					$form['disp_topics'] = 75;
+				$result = $db->query('SELECT password FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch user password hash', __FILE__, __LINE__, $db->error());
+				pun_setcookie($id, $db->result($result), ($form['save_pass'] == '1') ? time() + 31536000 : 0);
 			}
-
-			if ($form['disp_posts'] != '')
-			{
-				$form['disp_posts'] = intval($form['disp_posts']);
-				if ($form['disp_posts'] < 3)
-					$form['disp_posts'] = 3;
-				else if ($form['disp_posts'] > 75)
-					$form['disp_posts'] = 75;
-			}
-
-			// Make sure we got a valid style string
-			if (isset($_POST['form']['style']))
-			{
-				$styles = forum_list_styles();
-				$form['style'] = pun_trim($_POST['form']['style']);
-				if (!in_array($form['style'], $styles))
-					message($lang_common['Bad request']);
-			}
-
-			break;
-		}
-
-		case 'privacy':
-		{
-			$form = array(
-				'email_setting'			=> intval($_POST['form']['email_setting']),
-				'notify_with_post'		=> isset($_POST['form']['notify_with_post']) ? '1' : '0',
-				'auto_notify'			=> isset($_POST['form']['auto_notify']) ? '1' : '0',
-			);
-
-			if ($form['email_setting'] < 0 || $form['email_setting'] > 2)
-				$form['email_setting'] = $pun_config['o_default_email_setting'];
 
 			break;
@@ -910,7 +837,7 @@
 
 
-	// Single quotes around non-empty values and NULL for empty values
+	// Singlequotes around non-empty values and NULL for empty values
 	$temp = array();
-	foreach ($form as $key => $input)
+	while (list($key, $input) = @each($form))
 	{
 		$value = ($input !== '') ? '\''.$db->escape($input).'\'' : 'NULL';
@@ -921,7 +848,6 @@
 	if (empty($temp))
 		message($lang_common['Bad request']);
-
-
-	$db->query('UPDATE '.$db->prefix.'users SET '.implode(',', $temp).' WHERE id='.$id) or error('Unable to update profile', __FILE__, __LINE__, $db->error());
+	
+	$db->query('UPDATE '.$db->prefix.'users SET '.implode(',', $temp).' WHERE id='.$id) or error('Impossible de modifier le profil utilisateur', __FILE__, __LINE__, $db->error());
 
 	// If we changed the username we have to update some stuff
@@ -929,9 +855,8 @@
 	{
 		$db->query('UPDATE '.$db->prefix.'posts SET poster=\''.$db->escape($form['username']).'\' WHERE poster_id='.$id) or error('Unable to update posts', __FILE__, __LINE__, $db->error());
-		$db->query('UPDATE '.$db->prefix.'posts SET edited_by=\''.$db->escape($form['username']).'\' WHERE edited_by=\''.$db->escape($old_username).'\'') or error('Unable to update posts', __FILE__, __LINE__, $db->error());
-		$db->query('UPDATE '.$db->prefix.'topics SET poster=\''.$db->escape($form['username']).'\' WHERE poster=\''.$db->escape($old_username).'\'') or error('Unable to update topics', __FILE__, __LINE__, $db->error());
-		$db->query('UPDATE '.$db->prefix.'topics SET last_poster=\''.$db->escape($form['username']).'\' WHERE last_poster=\''.$db->escape($old_username).'\'') or error('Unable to update topics', __FILE__, __LINE__, $db->error());
-		$db->query('UPDATE '.$db->prefix.'forums SET last_poster=\''.$db->escape($form['username']).'\' WHERE last_poster=\''.$db->escape($old_username).'\'') or error('Unable to update forums', __FILE__, __LINE__, $db->error());
-		$db->query('UPDATE '.$db->prefix.'online SET ident=\''.$db->escape($form['username']).'\' WHERE ident=\''.$db->escape($old_username).'\'') or error('Unable to update online list', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'topics SET poster=\''.$db->escape($form['username']).'\' WHERE poster=\''.$db->escape($old_username).'\'') or error('Impossible de modifier les discussions', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'topics SET last_poster=\''.$db->escape($form['username']).'\' WHERE last_poster=\''.$db->escape($old_username).'\'') or error('Impossible de modifier les discussions', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'forums SET last_poster=\''.$db->escape($form['username']).'\' WHERE last_poster=\''.$db->escape($old_username).'\'') or error('Impossible de modifier les forums', __FILE__, __LINE__, $db->error());
+		$db->query('UPDATE '.$db->prefix.'online SET ident=\''.$db->escape($form['username']).'\' WHERE ident=\''.$db->escape($old_username).'\'') or error('Impossible de modifier la liste des utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 
 		// If the user is a moderator or an administrator we have to update the moderator lists
@@ -939,10 +864,7 @@
 		$group_id = $db->result($result);
 
-		$result = $db->query('SELECT g_moderator FROM '.$db->prefix.'groups WHERE g_id='.$group_id) or error('Unable to fetch group', __FILE__, __LINE__, $db->error());
-		$group_mod = $db->result($result);
-
-		if ($group_id == PUN_ADMIN || $group_mod == '1')
-		{
-			$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Unable to fetch forum list', __FILE__, __LINE__, $db->error());
+		if ($group_id < PUN_GUEST)
+		{
+			$result = $db->query('SELECT id, moderators FROM '.$db->prefix.'forums') or error('Impossible de retrouver la liste des forums', __FILE__, __LINE__, $db->error());
 
 			while ($cur_forum = $db->fetch_assoc($result))
@@ -954,16 +876,10 @@
 					unset($cur_moderators[$old_username]);
 					$cur_moderators[$form['username']] = $id;
-					uksort($cur_moderators, 'utf8_strcasecmp');
-
-					$db->query('UPDATE '.$db->prefix.'forums SET moderators=\''.$db->escape(serialize($cur_moderators)).'\' WHERE id='.$cur_forum['id']) or error('Unable to update forum', __FILE__, __LINE__, $db->error());
+					ksort($cur_moderators);
+
+					$db->query('UPDATE '.$db->prefix.'forums SET moderators=\''.$db->escape(serialize($cur_moderators)).'\' WHERE id='.$cur_forum['id']) or error('Impossible de modifier les forums', __FILE__, __LINE__, $db->error());
 				}
 			}
 		}
-
-		// Regenerate the users info cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_users_info_cache();
 	}
 
@@ -972,5 +888,6 @@
 
 
-$result = $db->query('SELECT u.username, u.email, u.title, u.realname, u.url, u.jabber, u.icq, u.msn, u.aim, u.yahoo, u.location, u.signature, u.disp_topics, u.disp_posts, u.email_setting, u.notify_with_post, u.auto_notify, u.show_smilies, u.show_img, u.show_img_sig, u.show_avatars, u.show_sig, u.timezone, u.dst, u.language, u.style, u.num_posts, u.last_post, u.registered, u.registration_ip, u.admin_note, u.date_format, u.time_format, u.last_visit, g.g_id, g.g_user_title, g.g_moderator FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+
+$result = $db->query('SELECT u.username, u.email, u.title, u.realname, u.url, u.jabber, u.icq, u.msn, u.aim, u.yahoo, u.location, u.use_avatar, u.signature, u.disp_topics, u.disp_posts, u.email_setting, u.save_pass, u.notify_with_post, u.show_smilies, u.show_img, u.show_img_sig, u.show_avatars, u.show_sig, u.timezone, u.language, u.style, u.num_posts, u.last_post, u.registered, u.registration_ip, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id='.$id) or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 if (!$db->num_rows($result))
 	message($lang_common['Bad request']);
@@ -988,141 +905,55 @@
 
 // View or edit?
-if ($pun_user['id'] != $id &&																	// If we arent the user (i.e. editing your own profile)
-	(!$pun_user['is_admmod'] ||																	// and we are not an admin or mod
-	($pun_user['g_id'] != PUN_ADMIN &&															// or we aren't an admin and ...
-	($pun_user['g_mod_edit_users'] == '0' ||													// mods aren't allowed to edit users
-	$user['g_id'] == PUN_ADMIN ||																// or the user is an admin
-	$user['g_moderator'] == '1'))))																// or the user is another mod
+if ($pun_user['id'] != $id &&
+	($pun_user['g_id'] > PUN_MOD ||
+	($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_edit_users'] == '0') ||
+	($pun_user['g_id'] == PUN_MOD && $user['g_id'] < PUN_GUEST)))
 {
-	$user_personal = array();
-
-	$user_personal[] = '<dt>'.$lang_common['Username'].'</dt>';
-	$user_personal[] = '<dd>'.pun_htmlspecialchars($user['username']).'</dd>';
+	if ($user['email_setting'] == '0' && !$pun_user['is_guest'])
+		$email_field = '<a href="mailto:'.$user['email'].'">'.$user['email'].'</a>';
+	else if ($user['email_setting'] == '1' && !$pun_user['is_guest'])
+		$email_field = '<a href="misc.php?email='.$id.'">'.$lang_common['Send e-mail'].'</a>';
+	else
+		$email_field = $lang_profile['Private'];
 
 	$user_title_field = get_title($user);
-	$user_personal[] = '<dt>'.$lang_common['Title'].'</dt>';
-	$user_personal[] = '<dd>'.(($pun_config['o_censoring'] == '1') ? censor_words($user_title_field) : $user_title_field).'</dd>';
-
-	if ($user['realname'] != '')
-	{
-		$user_personal[] = '<dt>'.$lang_profile['Realname'].'</dt>';
-		$user_personal[] = '<dd>'.pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['realname']) : $user['realname']).'</dd>';
-	}
-
-	if ($user['location'] != '')
-	{
-		$user_personal[] = '<dt>'.$lang_profile['Location'].'</dt>';
-		$user_personal[] = '<dd>'.pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['location']) : $user['location']).'</dd>';
-	}
 
 	if ($user['url'] != '')
 	{
-		$user['url'] = pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['url']) : $user['url']);
-		$user_personal[] = '<dt>'.$lang_profile['Website'].'</dt>';
-		$user_personal[] = '<dd><span class="website"><a href="'.$user['url'].'">'.$user['url'].'</a></span></dd>';
-	}
-
-	if ($user['email_setting'] == '0' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
-		$email_field = '<a href="mailto:'.$user['email'].'">'.$user['email'].'</a>';
-	else if ($user['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
-		$email_field = '<a href="misc.php?email='.$id.'">'.$lang_common['Send email'].'</a>';
+		$user['url'] = pun_htmlspecialchars($user['url']);
+
+		if ($pun_config['o_censoring'] == '1')
+			$user['url'] = censor_words($user['url']);
+
+		$url = '<a href="'.$user['url'].'">'.$user['url'].'</a>';
+	}
 	else
-		$email_field = '';
-	if ($email_field != '')
-	{
-		$user_personal[] = '<dt>'.$lang_common['Email'].'</dt>';
-		$user_personal[] = '<dd><span class="email">'.$email_field.'</span></dd>';
-	}
-
-	$user_messaging = array();
-
-	if ($user['jabber'] != '')
-	{
-		$user_messaging[] = '<dt>'.$lang_profile['Jabber'].'</dt>';
-		$user_messaging[] = '<dd>'.pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['jabber']) : $user['jabber']).'</dd>';
-	}
-
-	if ($user['icq'] != '')
-	{
-		$user_messaging[] = '<dt>'.$lang_profile['ICQ'].'</dt>';
-		$user_messaging[] = '<dd>'.$user['icq'].'</dd>';
-	}
-
-	if ($user['msn'] != '')
-	{
-		$user_messaging[] = '<dt>'.$lang_profile['MSN'].'</dt>';
-		$user_messaging[] = '<dd>'.pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['msn']) : $user['msn']).'</dd>';
-	}
-
-	if ($user['aim'] != '')
-	{
-		$user_messaging[] = '<dt>'.$lang_profile['AOL IM'].'</dt>';
-		$user_messaging[] = '<dd>'.pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['aim']) : $user['aim']).'</dd>';
-	}
-
-	if ($user['yahoo'] != '')
-	{
-		$user_messaging[] = '<dt>'.$lang_profile['Yahoo'].'</dt>';
-		$user_messaging[] = '<dd>'.pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['yahoo']) : $user['yahoo']).'</dd>';
-	}
-
-	$user_personality = array();
+		$url = $lang_profile['Unknown'];
 
 	if ($pun_config['o_avatars'] == '1')
 	{
-		$avatar_field = generate_avatar_markup($id);
-		if ($avatar_field != '')
-		{
-			$user_personality[] = '<dt>'.$lang_profile['Avatar'].'</dt>';
-			$user_personality[] = '<dd>'.$avatar_field.'</dd>';
-		}
-	}
-
-	if ($pun_config['o_signatures'] == '1')
-	{
-		if (isset($parsed_signature))
-		{
-			$user_personality[] = '<dt>'.$lang_profile['Signature'].'</dt>';
-			$user_personality[] = '<dd><div class="postsignature postmsg">'.$parsed_signature.'</div></dd>';
-		}
-	}
-
-	$user_activity = array();
+		if ($user['use_avatar'] == '1')
+		{
+			if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.gif'))
+				$avatar_field = '<img src="'.$pun_config['o_avatars_dir'].'/'.$id.'.gif" '.$img_size[3].' alt="" />';
+			else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.jpg'))
+				$avatar_field = '<img src="'.$pun_config['o_avatars_dir'].'/'.$id.'.jpg" '.$img_size[3].' alt="" />';
+			else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.png'))
+				$avatar_field = '<img src="'.$pun_config['o_avatars_dir'].'/'.$id.'.png" '.$img_size[3].' alt="" />';
+			else
+				$avatar_field = $lang_profile['No avatar'];
+		}
+		else
+			$avatar_field = $lang_profile['No avatar'];
+	}
 
 	$posts_field = '';
-	if ($pun_config['o_show_post_count'] == '1' || $pun_user['is_admmod'])
-		$posts_field = forum_number_format($user['num_posts']);
+	if ($pun_config['o_show_post_count'] == '1' || $pun_user['g_id'] < PUN_GUEST)
+		$posts_field = $user['num_posts'];
 	if ($pun_user['g_search'] == '1')
-	{
-		$quick_searches = array();
-		if ($user['num_posts'] > 0)
-		{
-			$quick_searches[] = '<a href="search.php?action=show_user_topics&amp;user_id='.$id.'">'.$lang_profile['Show topics'].'</a>';
-			$quick_searches[] = '<a href="search.php?action=show_user_posts&amp;user_id='.$id.'">'.$lang_profile['Show posts'].'</a>';
-		}
-		if ($pun_user['is_admmod'] && $pun_config['o_topic_subscriptions'] == '1')
-			$quick_searches[] = '<a href="search.php?action=show_subscriptions&amp;user_id='.$id.'">'.$lang_profile['Show subscriptions'].'</a>';
-
-		if (!empty($quick_searches))
-			$posts_field .= (($posts_field != '') ? ' - ' : '').implode(' - ', $quick_searches);
-	}
-	if ($posts_field != '')
-	{
-		$user_activity[] = '<dt>'.$lang_common['Posts'].'</dt>';
-		$user_activity[] = '<dd>'.$posts_field.'</dd>';
-	}
-
-	if ($user['num_posts'] > 0)
-	{
-		$user_activity[] = '<dt>'.$lang_common['Last post'].'</dt>';
-		$user_activity[] = '<dd>'.$last_post.'</dd>';
-	}
-
-	$user_activity[] = '<dt>'.$lang_common['Registered'].'</dt>';
-	$user_activity[] = '<dd>'.format_time($user['registered'], true).'</dd>';
-
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), sprintf($lang_profile['Users profile'], pun_htmlspecialchars($user['username'])));
+		$posts_field .= (($posts_field != '') ? ' - ' : '').'<a href="search.php?action=show_user&amp;user_id='.$id.'">'.$lang_profile['Show posts'].'</a>';
+
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 	define('PUN_ALLOW_INDEX', 1);
-	define('PUN_ACTIVE_PAGE', 'index');
 	require PUN_ROOT.'header.php';
 
@@ -1137,5 +968,16 @@
 					<div class="infldset">
 						<dl>
-							<?php echo implode("\n\t\t\t\t\t\t\t", $user_personal)."\n" ?>
+							<dt><?php echo $lang_common['Username'] ?>: </dt>
+							<dd><?php echo pun_htmlspecialchars($user['username']) ?></dd>
+							<dt><?php echo $lang_common['Title'] ?>: </dt>
+							<dd><?php echo ($pun_config['o_censoring'] == '1') ? censor_words($user_title_field) : $user_title_field; ?></dd>
+							<dt><?php echo $lang_profile['Realname'] ?>: </dt>
+							<dd><?php echo ($user['realname'] !='') ? pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['realname']) : $user['realname']) : $lang_profile['Unknown']; ?></dd>
+							<dt><?php echo $lang_profile['Location'] ?>: </dt>
+							<dd><?php echo ($user['location'] !='') ? pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['location']) : $user['location']) : $lang_profile['Unknown']; ?></dd>
+							<dt><?php echo $lang_profile['Website'] ?>: </dt>
+							<dd><?php echo $url ?>&#160;</dd>
+							<dt><?php echo $lang_common['E-mail'] ?>: </dt>
+							<dd><?php echo $email_field ?></dd>
 						</dl>
 						<div class="clearer"></div>
@@ -1143,10 +985,19 @@
 				</fieldset>
 			</div>
-<?php if (!empty($user_messaging)): ?>			<div class="inform">
+			<div class="inform">
 				<fieldset>
 				<legend><?php echo $lang_profile['Section messaging'] ?></legend>
 					<div class="infldset">
 						<dl>
-							<?php echo implode("\n\t\t\t\t\t\t\t", $user_messaging)."\n" ?>
+							<dt><?php echo $lang_profile['Jabber'] ?>: </dt>
+							<dd><?php echo ($user['jabber'] !='') ? pun_htmlspecialchars($user['jabber']) : $lang_profile['Unknown']; ?></dd>
+							<dt><?php echo $lang_profile['ICQ'] ?>: </dt>
+							<dd><?php echo ($user['icq'] !='') ? $user['icq'] : $lang_profile['Unknown']; ?></dd>
+							<dt><?php echo $lang_profile['MSN'] ?>: </dt>
+							<dd><?php echo ($user['msn'] !='') ? pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['msn']) : $user['msn']) : $lang_profile['Unknown']; ?></dd>
+							<dt><?php echo $lang_profile['AOL IM'] ?>: </dt>
+							<dd><?php echo ($user['aim'] !='') ? pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['aim']) : $user['aim']) : $lang_profile['Unknown']; ?></dd>
+							<dt><?php echo $lang_profile['Yahoo'] ?>: </dt>
+							<dd><?php echo ($user['yahoo'] !='') ? pun_htmlspecialchars(($pun_config['o_censoring'] == '1') ? censor_words($user['yahoo']) : $user['yahoo']) : $lang_profile['Unknown']; ?></dd>
 						</dl>
 						<div class="clearer"></div>
@@ -1154,10 +1005,13 @@
 				</fieldset>
 			</div>
-<?php endif; if (!empty($user_personality)): ?>			<div class="inform">
+			<div class="inform">
 				<fieldset>
 				<legend><?php echo $lang_profile['Section personality'] ?></legend>
 					<div class="infldset">
 						<dl>
-							<?php echo implode("\n\t\t\t\t\t\t\t", $user_personality)."\n" ?>
+<?php if ($pun_config['o_avatars'] == '1'): ?>							<dt><?php echo $lang_profile['Avatar'] ?>: </dt>
+							<dd><?php echo $avatar_field ?></dd>
+<?php endif; ?>							<dt><?php echo $lang_profile['Signature'] ?>: </dt>
+							<dd><div><?php echo isset($parsed_signature) ? $parsed_signature : $lang_profile['No sig']; ?></div></dd>
 						</dl>
 						<div class="clearer"></div>
@@ -1165,10 +1019,15 @@
 				</fieldset>
 			</div>
-<?php endif; ?>			<div class="inform">
+			<div class="inform">
 				<fieldset>
 				<legend><?php echo $lang_profile['User activity'] ?></legend>
 					<div class="infldset">
 						<dl>
-							<?php echo implode("\n\t\t\t\t\t\t\t", $user_activity)."\n" ?>
+<?php if ($posts_field != ''): ?>							<dt><?php echo $lang_common['Posts'] ?>: </dt>
+							<dd><?php echo $posts_field ?></dd>
+<?php endif; ?>							<dt><?php echo $lang_common['Last post'] ?>: </dt>
+							<dd><?php echo $last_post ?></dd>
+							<dt><?php echo $lang_common['Registered'] ?>: </dt>
+							<dd><?php echo format_time($user['registered'], true) ?></dd>
 						</dl>
 						<div class="clearer"></div>
@@ -1188,12 +1047,12 @@
 	if (!$section || $section == 'essentials')
 	{
-		if ($pun_user['is_admmod'])
-		{
-			if ($pun_user['g_id'] == PUN_ADMIN || $pun_user['g_mod_rename_users'] == '1')
-				$username_field = '<label class="required"><strong>'.$lang_common['Username'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_username" value="'.pun_htmlspecialchars($user['username']).'" size="25" maxlength="25" /><br /></label>'."\n";
+		if ($pun_user['g_id'] < PUN_GUEST)
+		{
+			if ($pun_user['g_id'] == PUN_ADMIN || $pun_config['p_mod_rename_users'] == '1')
+				$username_field = '<input type="hidden" name="old_username" value="'.pun_htmlspecialchars($user['username']).'" /><label><strong>'.$lang_common['Username'].'</strong><br /><input type="text" name="req_username" value="'.pun_htmlspecialchars($user['username']).'" size="25" maxlength="25" /><br /></label>'."\n";
 			else
-				$username_field = '<p>'.sprintf($lang_profile['Username info'], pun_htmlspecialchars($user['username'])).'</p>'."\n";
-
-			$email_field = '<label class="required"><strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="80" /><br /></label><p><span class="email"><a href="misc.php?email='.$id.'">'.$lang_common['Send email'].'</a></span></p>'."\n";
+				$username_field = '<p>'.$lang_common['Username'].': '.pun_htmlspecialchars($user['username']).'</p>'."\n";
+
+			$email_field = '<label><strong>'.$lang_common['E-mail'].'</strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="50" /><br /></label><p><a href="misc.php?email='.$id.'">'.$lang_common['Send e-mail'].'</a></p>'."\n";
 		}
 		else
@@ -1202,32 +1061,18 @@
 
 			if ($pun_config['o_regs_verify'] == '1')
-				$email_field = '<p>'.sprintf($lang_profile['Email info'], $user['email'].' - <a href="profile.php?action=change_email&amp;id='.$id.'">'.$lang_profile['Change email'].'</a>').'</p>'."\n";
+				$email_field = '<p>'.$lang_common['E-mail'].': '.$user['email'].'&#160;-&#160;<a href="profile.php?action=change_email&amp;id='.$id.'">'.$lang_profile['Change e-mail'].'</a></p>'."\n";
 			else
-				$email_field = '<label class="required"><strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="80" /><br /></label>'."\n";
-		}
-
-		$posts_field = '';
-		$posts_actions = array();
+				$email_field = '<label><strong>'.$lang_common['E-mail'].'</strong><br /><input type="text" name="req_email" value="'.$user['email'].'" size="40" maxlength="50" /><br /></label>'."\n";
+		}
 
 		if ($pun_user['g_id'] == PUN_ADMIN)
-			$posts_field .= '<label>'.$lang_common['Posts'].'<br /><input type="text" name="num_posts" value="'.$user['num_posts'].'" size="8" maxlength="8" /><br /></label>';
-		else if ($pun_config['o_show_post_count'] == '1' || $pun_user['is_admmod'])
-			$posts_actions[] = sprintf($lang_profile['Posts info'], forum_number_format($user['num_posts']));
-
-		if ($pun_user['g_search'] == '1' || $pun_user['g_id'] == PUN_ADMIN)
-		{
-			$posts_actions[] = '<a href="search.php?action=show_user_topics&amp;user_id='.$id.'">'.$lang_profile['Show topics'].'</a>';
-			$posts_actions[] = '<a href="search.php?action=show_user_posts&amp;user_id='.$id.'">'.$lang_profile['Show posts'].'</a>';
-
-			if ($pun_config['o_topic_subscriptions'] == '1')
-				$posts_actions[] = '<a href="search.php?action=show_subscriptions&amp;user_id='.$id.'">'.$lang_profile['Show subscriptions'].'</a>';
-		}
-
-		$posts_field .= (!empty($posts_actions) ? '<p class="actions">'.implode(' - ', $posts_actions).'</p>' : '')."\n";
-
-
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section essentials']);
-		$required_fields = array('req_username' => $lang_common['Username'], 'req_email' => $lang_common['Email']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+			$posts_field = '<label>'.$lang_common['Posts'].'<br /><input type="text" name="num_posts" value="'.$user['num_posts'].'" size="8" maxlength="8" /><br /></label><p><a href="search.php?action=show_user&amp;user_id='.$id.'">'.$lang_profile['Show posts'].'</a></p>'."\n";
+		else if ($pun_config['o_show_post_count'] == '1' || $pun_user['g_id'] < PUN_GUEST)
+			$posts_field = '<p>'.$lang_common['Posts'].': '.$user['num_posts'].' - <a href="search.php?action=show_user&amp;user_id='.$id.'">'.$lang_profile['Show posts'].'</a></p>'."\n";
+		else
+			$posts_field = '<p><a href="search.php?action=show_user&amp;user_id='.$id.'">'.$lang_profile['Show posts'].'</a></p>'."\n";
+
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
+		$required_fields = array('req_username' => $lang_common['Username'], 'req_email' => $lang_common['E-mail']);
 		require PUN_ROOT.'header.php';
 
@@ -1245,11 +1090,11 @@
 							<input type="hidden" name="form_sent" value="1" />
 							<?php echo $username_field ?>
-<?php if ($pun_user['id'] == $id || $pun_user['g_id'] == PUN_ADMIN || ($user['g_moderator'] == '0' && $pun_user['g_mod_change_passwords'] == '1')): ?>							<p class="actions"><span><a href="profile.php?action=change_pass&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Change pass'] ?></a></span></p>
-<?php endif; ?>						</div>
+<?php if ($pun_user['id'] == $id || $pun_user['g_id'] == PUN_ADMIN || ($user['g_id'] > PUN_MOD && $pun_config['p_mod_change_passwords'] == '1')): ?><p><a href="profile.php?action=change_pass&amp;id=<?php echo $id ?>"><?php echo $lang_profile['Change pass'] ?></a></p>
+<?php endif; ?>					</div>
 					</fieldset>
 				</div>
 				<div class="inform">
 					<fieldset>
-						<legend><?php echo $lang_prof_reg['Email legend'] ?></legend>
+						<legend><?php echo $lang_prof_reg['E-mail legend'] ?></legend>
 						<div class="infldset">
 							<?php echo $email_field ?>
@@ -1261,101 +1106,67 @@
 						<legend><?php echo $lang_prof_reg['Localisation legend'] ?></legend>
 						<div class="infldset">
-							<p><?php echo $lang_prof_reg['Time zone info'] ?></p>
-							<label><?php echo $lang_prof_reg['Time zone']."\n" ?>
+							<label><?php echo $lang_prof_reg['Timezone'] ?>: <?php echo $lang_prof_reg['Timezone info'] ?>
 							<br /><select name="form[timezone]">
-								<option value="-12"<?php if ($user['timezone'] == -12) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-12:00'] ?></option>
-								<option value="-11"<?php if ($user['timezone'] == -11) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-11:00'] ?></option>
-								<option value="-10"<?php if ($user['timezone'] == -10) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-10:00'] ?></option>
-								<option value="-9.5"<?php if ($user['timezone'] == -9.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-09:30'] ?></option>
-								<option value="-9"<?php if ($user['timezone'] == -9) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-09:00'] ?></option>
-								<option value="-8.5"<?php if ($user['timezone'] == -8.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-08:30'] ?></option>
-								<option value="-8"<?php if ($user['timezone'] == -8) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-08:00'] ?></option>
-								<option value="-7"<?php if ($user['timezone'] == -7) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-07:00'] ?></option>
-								<option value="-6"<?php if ($user['timezone'] == -6) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-06:00'] ?></option>
-								<option value="-5"<?php if ($user['timezone'] == -5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-05:00'] ?></option>
-								<option value="-4"<?php if ($user['timezone'] == -4) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-04:00'] ?></option>
-								<option value="-3.5"<?php if ($user['timezone'] == -3.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-03:30'] ?></option>
-								<option value="-3"<?php if ($user['timezone'] == -3) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-03:00'] ?></option>
-								<option value="-2"<?php if ($user['timezone'] == -2) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-02:00'] ?></option>
-								<option value="-1"<?php if ($user['timezone'] == -1) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-01:00'] ?></option>
-								<option value="0"<?php if ($user['timezone'] == 0) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC'] ?></option>
-								<option value="1"<?php if ($user['timezone'] == 1) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+01:00'] ?></option>
-								<option value="2"<?php if ($user['timezone'] == 2) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+02:00'] ?></option>
-								<option value="3"<?php if ($user['timezone'] == 3) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+03:00'] ?></option>
-								<option value="3.5"<?php if ($user['timezone'] == 3.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+03:30'] ?></option>
-								<option value="4"<?php if ($user['timezone'] == 4) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+04:00'] ?></option>
-								<option value="4.5"<?php if ($user['timezone'] == 4.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+04:30'] ?></option>
-								<option value="5"<?php if ($user['timezone'] == 5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+05:00'] ?></option>
-								<option value="5.5"<?php if ($user['timezone'] == 5.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+05:30'] ?></option>
-								<option value="5.75"<?php if ($user['timezone'] == 5.75) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+05:45'] ?></option>
-								<option value="6"<?php if ($user['timezone'] == 6) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+06:00'] ?></option>
-								<option value="6.5"<?php if ($user['timezone'] == 6.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+06:30'] ?></option>
-								<option value="7"<?php if ($user['timezone'] == 7) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+07:00'] ?></option>
-								<option value="8"<?php if ($user['timezone'] == 8) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+08:00'] ?></option>
-								<option value="8.75"<?php if ($user['timezone'] == 8.75) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+08:45'] ?></option>
-								<option value="9"<?php if ($user['timezone'] == 9) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+09:00'] ?></option>
-								<option value="9.5"<?php if ($user['timezone'] == 9.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+09:30'] ?></option>
-								<option value="10"<?php if ($user['timezone'] == 10) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+10:00'] ?></option>
-								<option value="10.5"<?php if ($user['timezone'] == 10.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+10:30'] ?></option>
-								<option value="11"<?php if ($user['timezone'] == 11) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+11:00'] ?></option>
-								<option value="11.5"<?php if ($user['timezone'] == 11.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+11:30'] ?></option>
-								<option value="12"<?php if ($user['timezone'] == 12) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+12:00'] ?></option>
-								<option value="12.75"<?php if ($user['timezone'] == 12.75) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+12:45'] ?></option>
-								<option value="13"<?php if ($user['timezone'] == 13) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+13:00'] ?></option>
-								<option value="14"<?php if ($user['timezone'] == 14) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+14:00'] ?></option>
+								<option value="-12"<?php if ($user['timezone'] == -12) echo ' selected="selected"' ?>>-12</option>
+								<option value="-11"<?php if ($user['timezone'] == -11) echo ' selected="selected"' ?>>-11</option>
+								<option value="-10"<?php if ($user['timezone'] == -10) echo ' selected="selected"' ?>>-10</option>
+								<option value="-9.5"<?php if ($user['timezone'] == -9.5) echo ' selected="selected"' ?>>-09.5</option>
+								<option value="-9"<?php if ($user['timezone'] == -9) echo ' selected="selected"' ?>>-09</option>
+								<option value="-8.5"<?php if ($user['timezone'] == -8.5) echo ' selected="selected"' ?>>-08.5</option>
+								<option value="-8"<?php if ($user['timezone'] == -8) echo ' selected="selected"' ?>>-08 PST</option>
+								<option value="-7"<?php if ($user['timezone'] == -7) echo ' selected="selected"' ?>>-07 MST</option>
+								<option value="-6"<?php if ($user['timezone'] == -6) echo ' selected="selected"' ?>>-06 CST</option>
+								<option value="-5"<?php if ($user['timezone'] == -5) echo ' selected="selected"' ?>>-05 EST</option>
+								<option value="-4"<?php if ($user['timezone'] == -4) echo ' selected="selected"' ?>>-04 AST</option>
+								<option value="-3.5"<?php if ($user['timezone'] == -3.5) echo ' selected="selected"' ?>>-03.5</option>
+								<option value="-3"<?php if ($user['timezone'] == -3) echo ' selected="selected"' ?>>-03 ADT</option>
+								<option value="-2"<?php if ($user['timezone'] == -2) echo ' selected="selected"' ?>>-02</option>
+								<option value="-1"<?php if ($user['timezone'] == -1) echo ' selected="selected"' ?>>-01</option>
+								<option value="0"<?php if ($user['timezone'] == 0) echo ' selected="selected"' ?>>00 GMT</option>
+								<option value="1"<?php if ($user['timezone'] == 1) echo ' selected="selected"' ?>>+01 CET</option>
+								<option value="2"<?php if ($user['timezone'] == 2) echo ' selected="selected"' ?>>+02</option>
+								<option value="3"<?php if ($user['timezone'] == 3) echo ' selected="selected"' ?>>+03</option>
+								<option value="3.5"<?php if ($user['timezone'] == 3.5) echo ' selected="selected"' ?>>+03.5</option>
+								<option value="4"<?php if ($user['timezone'] == 4) echo ' selected="selected"' ?>>+04</option>
+								<option value="4.5"<?php if ($user['timezone'] == 4.5) echo ' selected="selected"' ?>>+04.5</option>
+								<option value="5"<?php if ($user['timezone'] == 5) echo ' selected="selected"' ?>>+05</option>
+								<option value="5.5"<?php if ($user['timezone'] == 5.5) echo ' selected="selected"' ?>>+05.5</option>
+								<option value="6"<?php if ($user['timezone'] == 6) echo ' selected="selected"' ?>>+06</option>
+								<option value="6.5"<?php if ($user['timezone'] == 6.5) echo ' selected="selected"' ?>>+06.5</option>
+								<option value="7"<?php if ($user['timezone'] == 7) echo ' selected="selected"' ?>>+07</option>
+								<option value="8"<?php if ($user['timezone'] == 8) echo ' selected="selected"' ?>>+08</option>
+								<option value="9"<?php if ($user['timezone'] == 9) echo ' selected="selected"' ?>>+09</option>
+								<option value="9.5"<?php if ($user['timezone'] == 9.5) echo ' selected="selected"' ?>>+09.5</option>
+								<option value="10"<?php if ($user['timezone'] == 10) echo ' selected="selected"' ?>>+10</option>
+								<option value="10.5"<?php if ($user['timezone'] == 10.5) echo ' selected="selected"' ?>>+10.5</option>
+								<option value="11"<?php if ($user['timezone'] == 11) echo ' selected="selected"' ?>>+11</option>
+								<option value="11.5"<?php if ($user['timezone'] == 11.5) echo ' selected="selected"' ?>>+11.5</option>
+								<option value="12"<?php if ($user['timezone'] == 12) echo ' selected="selected"' ?>>+12</option>
+								<option value="13"<?php if ($user['timezone'] == 13) echo ' selected="selected"' ?>>+13</option>
+								<option value="14"<?php if ($user['timezone'] == 14) echo ' selected="selected"' ?>>+14</option>
 							</select>
 							<br /></label>
-							<div class="rbox">
-								<label><input type="checkbox" name="form[dst]" value="1"<?php if ($user['dst'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['DST'] ?><br /></label>
-							</div>
-							<label><?php echo $lang_prof_reg['Time format'] ?>
-
-							<br /><select name="form[time_format]">
-<?php
-								foreach (array_unique($forum_time_formats) as $key => $time_format)
-								{
-									echo "\t\t\t\t\t\t\t\t".'<option value="'.$key.'"';
-									if ($user['time_format'] == $key)
-										echo ' selected="selected"';
-									echo '>'. format_time(time(), false, null, $time_format, true, true);
-									if ($key == 0)
-										echo ' ('.$lang_prof_reg['Default'].')';
-									echo "</option>\n";
-								}
-								?>
-							</select>
-							<br /></label>
-							<label><?php echo $lang_prof_reg['Date format'] ?>
-
-							<br /><select name="form[date_format]">
-<?php
-								foreach (array_unique($forum_date_formats) as $key => $date_format)
-								{
-									echo "\t\t\t\t\t\t\t\t".'<option value="'.$key.'"';
-									if ($user['date_format'] == $key)
-										echo ' selected="selected"';
-									echo '>'. format_time(time(), true, $date_format, null, false, true);
-									if ($key == 0)
-										echo ' ('.$lang_prof_reg['Default'].')';
-									echo "</option>\n";
-								}
-								?>
-							</select>
-							<br /></label>
-
-<?php
-
-		$languages = forum_list_langs();
+<?php
+
+		$languages = array();
+		$d = dir(PUN_ROOT.'lang');
+		while (($entry = $d->read()) !== false)
+		{
+			if ($entry != '.' && $entry != '..' && is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/common.php'))
+				$languages[] = $entry;
+		}
+		$d->close();
 
 		// Only display the language selection box if there's more than one language available
 		if (count($languages) > 1)
 		{
-
-?>
-							<label><?php echo $lang_prof_reg['Language'] ?>
+			natsort($languages);
+
+?>
+							<label><?php echo $lang_prof_reg['Language'] ?>: <?php echo $lang_prof_reg['Language info'] ?>
 							<br /><select name="form[language]">
 <?php
 
-			foreach ($languages as $temp)
+			while (list(, $temp) = @each($languages))
 			{
 				if ($user['language'] == $temp)
@@ -1380,14 +1191,13 @@
 						<legend><?php echo $lang_profile['User activity'] ?></legend>
 						<div class="infldset">
-							<p><?php printf($lang_profile['Registered info'], format_time($user['registered'], true).(($pun_user['is_admmod']) ? ' (<a href="moderate.php?get_host='.pun_htmlspecialchars($user['registration_ip']).'">'.pun_htmlspecialchars($user['registration_ip']).'</a>)' : '')) ?></p>
-							<p><?php printf($lang_profile['Last post info'], $last_post) ?></p>
-							<p><?php printf($lang_profile['Last visit info'], format_time($user['last_visit'])) ?></p>
-							<?php echo $posts_field ?>
-<?php if ($pun_user['is_admmod']): ?>							<label><?php echo $lang_profile['Admin note'] ?><br />
+							<p><?php echo $lang_common['Registered'] ?>: <?php echo format_time($user['registered'], true); if ($pun_user['g_id'] < PUN_GUEST) echo ' (<a href="moderate.php?get_host='.pun_htmlspecialchars($user['registration_ip']).'">'.pun_htmlspecialchars($user['registration_ip']).'</a>)'; ?></p>
+							<p><?php echo $lang_common['Last post'] ?>: <?php echo $last_post ?></p>
+								<?php echo $posts_field ?>
+<?php if ($pun_user['g_id'] < PUN_GUEST): ?>							<label><?php echo $lang_profile['Admin note'] ?><br />
 							<input id="admin_note" type="text" name="admin_note" value="<?php echo pun_htmlspecialchars($user['admin_note']) ?>" size="30" maxlength="30" /><br /></label>
-<?php endif; ?>						</div>
-					</fieldset>
+						</div>
+<?php endif; ?>					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <?php echo $lang_profile['Instructions'] ?></p>
+				<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /><?php echo $lang_profile['Instructions'] ?></p>
 			</form>
 		</div>
@@ -1399,8 +1209,7 @@
 	{
 		if ($pun_user['g_set_title'] == '1')
-			$title_field = '<label>'.$lang_common['Title'].' <em>('.$lang_profile['Leave blank'].')</em><br /><input type="text" name="title" value="'.pun_htmlspecialchars($user['title']).'" size="30" maxlength="50" /><br /></label>'."\n";
-
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section personal']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+			$title_field = '<label>'.$lang_common['Title'].'&#160;&#160;(<em>'.$lang_profile['Leave blank'].'</em>)<br /><input type="text" name="title" value="'.pun_htmlspecialchars($user['title']).'" size="30" maxlength="50" /><br /></label>'."\n";
+
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 		require PUN_ROOT.'header.php';
 
@@ -1418,5 +1227,5 @@
 							<input type="hidden" name="form_sent" value="1" />
 							<label><?php echo $lang_profile['Realname'] ?><br /><input type="text" name="form[realname]" value="<?php echo pun_htmlspecialchars($user['realname']) ?>" size="40" maxlength="40" /><br /></label>
-<?php if (isset($title_field)): ?>							<?php echo $title_field ?>
+<?php if (isset($title_field)): ?>					<?php echo $title_field ?>
 <?php endif; ?>							<label><?php echo $lang_profile['Location'] ?><br /><input type="text" name="form[location]" value="<?php echo pun_htmlspecialchars($user['location']) ?>" size="30" maxlength="30" /><br /></label>
 							<label><?php echo $lang_profile['Website'] ?><br /><input type="text" name="form[url]" value="<?php echo pun_htmlspecialchars($user['url']) ?>" size="50" maxlength="80" /><br /></label>
@@ -1424,5 +1233,5 @@
 					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <?php echo $lang_profile['Instructions'] ?></p>
+				<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /><?php echo $lang_profile['Instructions'] ?></p>
 			</form>
 		</div>
@@ -1434,6 +1243,5 @@
 	{
 
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section messaging']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 		require PUN_ROOT.'header.php';
 
@@ -1458,5 +1266,5 @@
 					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <?php echo $lang_profile['Instructions'] ?></p>
+				<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /><?php echo $lang_profile['Instructions'] ?></p>
 			</form>
 		</div>
@@ -1467,22 +1275,24 @@
 	else if ($section == 'personality')
 	{
-		if ($pun_config['o_avatars'] == '0' && $pun_config['o_signatures'] == '0')
-			message($lang_common['Bad request']);
-
-		$avatar_field = '<span><a href="profile.php?action=upload_avatar&amp;id='.$id.'">'.$lang_profile['Change avatar'].'</a></span>';
-
-		$user_avatar = generate_avatar_markup($id);
-		if ($user_avatar)
-			$avatar_field .= ' <span><a href="profile.php?action=delete_avatar&amp;id='.$id.'">'.$lang_profile['Delete avatar'].'</a></span>';
+		$avatar_field = '<a href="profile.php?action=upload_avatar&amp;id='.$id.'">'.$lang_profile['Change avatar'].'</a>';
+		if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.gif'))
+			$avatar_format = 'gif';
+		else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.jpg'))
+			$avatar_format = 'jpg';
+		else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$id.'.png'))
+			$avatar_format = 'png';
 		else
-			$avatar_field = '<span><a href="profile.php?action=upload_avatar&amp;id='.$id.'">'.$lang_profile['Upload avatar'].'</a></span>';
+			$avatar_field = '<a href="profile.php?action=upload_avatar&amp;id='.$id.'">'.$lang_profile['Upload avatar'].'</a>';
+
+		// Display the delete avatar link?
+		if ($img_size)
+			$avatar_field .= '&#160;&#160;&#160;<a href="profile.php?action=delete_avatar&amp;id='.$id.'">'.$lang_profile['Delete avatar'].'</a>';
 
 		if ($user['signature'] != '')
-			$signature_preview = '<p>'.$lang_profile['Sig preview'].'</p>'."\n\t\t\t\t\t\t\t".'<div class="postsignature postmsg">'."\n\t\t\t\t\t\t\t\t".'<hr />'."\n\t\t\t\t\t\t\t\t".$parsed_signature."\n\t\t\t\t\t\t\t".'</div>'."\n";
+			$signature_preview = '<p>'.$lang_profile['Sig preview'].'</p>'."\n\t\t\t\t\t".'<div class="postsignature">'."\n\t\t\t\t\t\t".'<hr />'."\n\t\t\t\t\t\t".$parsed_signature."\n\t\t\t\t\t".'</div>'."\n";
 		else
 			$signature_preview = '<p>'.$lang_profile['No sig'].'</p>'."\n";
 
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section personality']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 		require PUN_ROOT.'header.php';
 
@@ -1500,11 +1310,14 @@
 						<legend><?php echo $lang_profile['Avatar legend'] ?></legend>
 						<div class="infldset">
-<?php if ($user_avatar): ?>							<div class="useravatar"><?php echo $user_avatar ?></div>
-<?php endif; ?>							<p><?php echo $lang_profile['Avatar info'] ?></p>
-							<p class="clearb actions"><?php echo $avatar_field ?></p>
+<?php if (isset($avatar_format)): ?>					<img src="<?php echo $pun_config['o_avatars_dir'].'/'.$id.'.'.$avatar_format ?>" <?php echo $img_size[3] ?> alt="" />
+<?php endif; ?>					<p><?php echo $lang_profile['Avatar info'] ?></p>
+							<div class="rbox">
+								<label><input type="checkbox" name="form[use_avatar]" value="1"<?php if ($user['use_avatar'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Use avatar'] ?><br /></label>
+							</div>
+							<p class="clearb"><?php echo $avatar_field ?></p>
 						</div>
 					</fieldset>
 				</div>
-<?php endif; if ($pun_config['o_signatures'] == '1'): ?>				<div class="inform">
+<?php endif; ?>				<div class="inform">
 					<fieldset>
 						<legend><?php echo $lang_profile['Signature legend'] ?></legend>
@@ -1512,11 +1325,11 @@
 							<p><?php echo $lang_profile['Signature info'] ?></p>
 							<div class="txtarea">
-								<label><?php printf($lang_profile['Sig max size'], forum_number_format($pun_config['p_sig_length']), $pun_config['p_sig_lines']) ?><br />
+								<label><?php echo $lang_profile['Sig max length'] ?>: <?php echo $pun_config['p_sig_length'] ?> / <?php echo $lang_profile['Sig max lines'] ?>: <?php echo $pun_config['p_sig_lines'] ?><br />
 								<textarea name="signature" rows="4" cols="65"><?php echo pun_htmlspecialchars($user['signature']) ?></textarea><br /></label>
 							</div>
 							<ul class="bblinks">
-								<li><span><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a> <?php echo ($pun_config['p_sig_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-								<li><span><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a> <?php echo ($pun_config['p_sig_bbcode'] == '1' && $pun_config['p_sig_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-								<li><span><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a> <?php echo ($pun_config['o_smilies_sig'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
+								<li><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a>: <?php echo ($pun_config['p_sig_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+								<li><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a>: <?php echo ($pun_config['p_sig_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+								<li><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a>: <?php echo ($pun_config['o_smilies_sig'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
 							</ul>
 							<?php echo $signature_preview ?>
@@ -1524,5 +1337,5 @@
 					</fieldset>
 				</div>
-<?php endif; ?>				<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <?php echo $lang_profile['Instructions'] ?></p>
+				<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /><?php echo $lang_profile['Instructions'] ?></p>
 			</form>
 		</div>
@@ -1533,6 +1346,5 @@
 	else if ($section == 'display')
 	{
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section display']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 		require PUN_ROOT.'header.php';
 
@@ -1547,5 +1359,12 @@
 <?php
 
-		$styles = forum_list_styles();
+		$styles = array();
+		$d = dir(PUN_ROOT.'style');
+		while (($entry = $d->read()) !== false)
+		{
+			if (substr($entry, strlen($entry)-4) == '.css')
+				$styles[] = substr($entry, 0, strlen($entry)-4);
+		}
+		$d->close();
 
 		// Only display the style selection box if there's more than one style available
@@ -1554,5 +1373,5 @@
 		else if (count($styles) > 1)
 		{
-
+			natsort($styles);
 ?>
 				<div class="inform">
@@ -1560,9 +1379,10 @@
 						<legend><?php echo $lang_profile['Style legend'] ?></legend>
 						<div class="infldset">
-							<label><?php echo $lang_profile['Styles'] ?><br />
+							<label><?php echo $lang_profile['Style info'] ?><br />
+
 							<select name="form[style]">
 <?php
 
-			foreach ($styles as $temp)
+			while (list(, $temp) = @each($styles))
 			{
 				if ($user['style'] == $temp)
@@ -1583,5 +1403,4 @@
 
 ?>
-<?php if ($pun_config['o_smilies'] == '1' || $pun_config['o_smilies_sig'] == '1' || $pun_config['o_signatures'] == '1' || $pun_config['o_avatars'] == '1' || ($pun_config['p_message_bbcode'] == '1' && $pun_config['p_message_img_tag'] == '1')): ?>
 				<div class="inform">
 					<fieldset>
@@ -1590,15 +1409,13 @@
 							<p><?php echo $lang_profile['Post display info'] ?></p>
 							<div class="rbox">
-<?php if ($pun_config['o_smilies'] == '1' || $pun_config['o_smilies_sig'] == '1'): ?>								<label><input type="checkbox" name="form[show_smilies]" value="1"<?php if ($user['show_smilies'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show smilies'] ?><br /></label>
-<?php endif; if ($pun_config['o_signatures'] == '1'): ?>								<label><input type="checkbox" name="form[show_sig]" value="1"<?php if ($user['show_sig'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show sigs'] ?><br /></label>
-<?php endif; if ($pun_config['o_avatars'] == '1'): ?>								<label><input type="checkbox" name="form[show_avatars]" value="1"<?php if ($user['show_avatars'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show avatars'] ?><br /></label>
-<?php endif; if ($pun_config['p_message_bbcode'] == '1' && $pun_config['p_message_img_tag'] == '1'): ?>								<label><input type="checkbox" name="form[show_img]" value="1"<?php if ($user['show_img'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show images'] ?><br /></label>
-<?php endif; if ($pun_config['o_signatures'] == '1' && $pun_config['p_sig_bbcode'] == '1' && $pun_config['p_sig_img_tag'] == '1'): ?>								<label><input type="checkbox" name="form[show_img_sig]" value="1"<?php if ($user['show_img_sig'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show images sigs'] ?><br /></label>
-<?php endif; ?>
+								<label><input type="checkbox" name="form[show_smilies]" value="1"<?php if ($user['show_smilies'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show smilies'] ?><br /></label>
+								<label><input type="checkbox" name="form[show_sig]" value="1"<?php if ($user['show_sig'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show sigs'] ?><br /></label>
+<?php if ($pun_config['o_avatars'] == '1'): ?>							<label><input type="checkbox" name="form[show_avatars]" value="1"<?php if ($user['show_avatars'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show avatars'] ?><br /></label>
+<?php endif; ?>								<label><input type="checkbox" name="form[show_img]" value="1"<?php if ($user['show_img'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show images'] ?><br /></label>
+								<label><input type="checkbox" name="form[show_img_sig]" value="1"<?php if ($user['show_img_sig'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Show images sigs'] ?><br /></label>
 							</div>
 						</div>
 					</fieldset>
 				</div>
-<?php endif; ?>
 				<div class="inform">
 					<fieldset>
@@ -1611,5 +1428,5 @@
 					</fieldset>
 				</div>
-				<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <?php echo $lang_profile['Instructions'] ?></p>
+				<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" />  <?php echo $lang_profile['Instructions'] ?></p>
 			</form>
 		</div>
@@ -1620,6 +1437,5 @@
 	else if ($section == 'privacy')
 	{
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section privacy']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 		require PUN_ROOT.'header.php';
 
@@ -1636,26 +1452,22 @@
 						<div class="infldset">
 							<input type="hidden" name="form_sent" value="1" />
-							<p><?php echo $lang_prof_reg['Email setting info'] ?></p>
+							<p><?php echo $lang_prof_reg['E-mail setting info'] ?></p>
 							<div class="rbox">
-								<label><input type="radio" name="form[email_setting]" value="0"<?php if ($user['email_setting'] == '0') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Email setting 1'] ?><br /></label>
-								<label><input type="radio" name="form[email_setting]" value="1"<?php if ($user['email_setting'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Email setting 2'] ?><br /></label>
-								<label><input type="radio" name="form[email_setting]" value="2"<?php if ($user['email_setting'] == '2') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Email setting 3'] ?><br /></label>
+								<label><input type="radio" name="form[email_setting]" value="0"<?php if ($user['email_setting'] == '0') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['E-mail setting 1'] ?><br /></label>
+								<label><input type="radio" name="form[email_setting]" value="1"<?php if ($user['email_setting'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['E-mail setting 2'] ?><br /></label>
+								<label><input type="radio" name="form[email_setting]" value="2"<?php if ($user['email_setting'] == '2') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['E-mail setting 3'] ?><br /></label>
+							</div>
+							<p><?php echo $lang_prof_reg['Save user/pass info'] ?></p>
+							<div class="rbox">
+								<label><input type="checkbox" name="form[save_pass]" value="1"<?php if ($user['save_pass'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Save user/pass'] ?><br /></label>
+							</div>
+							<p><?php echo $lang_profile['Notify full info'] ?></p>
+							<div class="rbox">
+								<label><input type="checkbox" name="form[notify_with_post]" value="1"<?php if ($user['notify_with_post'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Notify full'] ?><br /></label>
 							</div>
 						</div>
 					</fieldset>
 				</div>
-<?php if ($pun_config['o_forum_subscriptions'] == '1' || $pun_config['o_topic_subscriptions'] == '1'): ?>				<div class="inform">
-					<fieldset>
-						<legend><?php echo $lang_profile['Subscription legend'] ?></legend>
-						<div class="infldset">
-							<div class="rbox">
-								<label><input type="checkbox" name="form[notify_with_post]" value="1"<?php if ($user['notify_with_post'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Notify full'] ?><br /></label>
-<?php if ($pun_config['o_topic_subscriptions'] == '1'): ?>								<label><input type="checkbox" name="form[auto_notify]" value="1"<?php if ($user['auto_notify'] == '1') echo ' checked="checked"' ?> /><?php echo $lang_profile['Auto notify full'] ?><br /></label>
-<?php endif; ?>
-							</div>
-						</div>
-					</fieldset>
-				</div>
-<?php endif; ?>				<p class="buttons"><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /> <?php echo $lang_profile['Instructions'] ?></p>
+				<p><input type="submit" name="update" value="<?php echo $lang_common['Submit'] ?>" /><?php echo $lang_profile['Instructions'] ?></p>
 			</form>
 		</div>
@@ -1666,9 +1478,8 @@
 	else if ($section == 'admin')
 	{
-		if (!$pun_user['is_admmod'] || ($pun_user['g_moderator'] == '1' && $pun_user['g_mod_ban_users'] == '0'))
+		if ($pun_user['g_id'] > PUN_MOD || ($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_ban_users'] == '0'))
 			message($lang_common['Bad request']);
 
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['Profile'], $lang_profile['Section admin']);
-		define('PUN_ACTIVE_PAGE', 'profile');
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['Profile'];
 		require PUN_ROOT.'header.php';
 
@@ -1679,5 +1490,5 @@
 		<h2><span><?php echo pun_htmlspecialchars($user['username']).' - '.$lang_profile['Section admin'] ?></span></h2>
 		<div class="box">
-			<form id="profile7" method="post" action="profile.php?section=admin&amp;id=<?php echo $id ?>">
+			<form id="profile7" method="post" action="profile.php?section=admin&amp;id=<?php echo $id ?>&amp;action=foo">
 				<div class="inform">
 				<input type="hidden" name="form_sent" value="1" />
@@ -1685,5 +1496,5 @@
 <?php
 
-		if ($pun_user['g_moderator'] == '1')
+		if ($pun_user['g_id'] == PUN_MOD)
 		{
 
@@ -1700,6 +1511,6 @@
 		else
 		{
-			if ($pun_user['id'] != $id)
-			{
+			if ($pun_user['id'] != $id)  
+			{  
 
 ?>
@@ -1709,13 +1520,13 @@
 <?php
 
-				$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' ORDER BY g_title') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
-
-				while ($cur_group = $db->fetch_assoc($result))
-				{
-					if ($cur_group['g_id'] == $user['g_id'] || ($cur_group['g_id'] == $pun_config['o_default_user_group'] && $user['g_id'] == ''))
-						echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'" selected="selected">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
-					else
-						echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
-				}
+					$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' ORDER BY g_title') or error('Impossible de retrouver la liste des groupes utilisateurs', __FILE__, __LINE__, $db->error());
+
+					while ($cur_group = $db->fetch_assoc($result))  
+					{  
+						if ($cur_group['g_id'] == $user['g_id'] || ($cur_group['g_id'] == $pun_config['o_default_user_group'] && $user['g_id'] == ''))
+							echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'" selected="selected">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
+						else  
+							echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
+					}  
 
 ?>
@@ -1727,5 +1538,5 @@
 				<div class="inform">
 					<fieldset>
-<?php
+<?php  
 
 			}
@@ -1734,5 +1545,5 @@
 						<legend><?php echo $lang_profile['Delete ban legend'] ?></legend>
 						<div class="infldset">
-							<input type="submit" name="delete_user" value="<?php echo $lang_profile['Delete user'] ?>" /> <input type="submit" name="ban" value="<?php echo $lang_profile['Ban user'] ?>" />
+							<input type="submit" name="delete_user" value="<?php echo $lang_profile['Delete user'] ?>" />&#160;&#160;<input type="submit" name="ban" value="<?php echo $lang_profile['Ban user'] ?>" />
 						</div>
 					</fieldset>
@@ -1740,5 +1551,5 @@
 <?php
 
-			if ($user['g_moderator'] == '1' || $user['g_id'] == PUN_ADMIN)
+			if ($user['g_id'] == PUN_MOD || $user['g_id'] == PUN_ADMIN)
 			{
 
@@ -1751,10 +1562,10 @@
 <?php
 
-				$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.moderators FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id WHERE f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position') or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.moderators FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id WHERE f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position') or error('Impossible de retrouver la liste des catÃ©gories et des forums', __FILE__, __LINE__, $db->error());
 
 				$cur_category = 0;
 				while ($cur_forum = $db->fetch_assoc($result))
 				{
-					if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
+					if ($cur_forum['cid'] != $cur_category)	// A new category since last iteration?
 					{
 						if ($cur_category)
@@ -1792,6 +1603,4 @@
 
 	}
-	else
-		message($lang_common['Bad request']);
 
 ?>
Index: trunk/web/punbb/pun_integration.php
===================================================================
--- trunk/web/punbb/pun_integration.php	(revision 10)
+++ trunk/web/punbb/pun_integration.php	(revision 1)
@@ -1,12 +1,5 @@
 <?php
-
-  if(!isset($env))
-  { $site_path = "../";
-    require $site_path."pathes.php";
-    require_once $site_path.RSR_APP_PATH."env.php";
-    $env = new env($site_path.RSR_CONFIG_FILE, $site_path);
-  }
-
-  # traitement de la requete
+  
+  # traitement de la requÃÂšte
   require $env->path("app")."main.php";
 
Index: trunk/web/punbb/register.php
===================================================================
--- trunk/web/punbb/register.php	(revision 10)
+++ trunk/web/punbb/register.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -35,11 +52,10 @@
 else if ($pun_config['o_rules'] == '1' && !isset($_GET['agree']) && !isset($_POST['form_sent']))
 {
-	$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_register['Register'], $lang_register['Forum rules']);
-	define('PUN_ACTIVE_PAGE', 'register');
+	$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Register'];
 	require PUN_ROOT.'header.php';
 
 ?>
-<div id="rules" class="blockform">
-	<div class="hd"><h2><span><?php echo $lang_register['Forum rules'] ?></span></h2></div>
+<div class="blockform">
+	<h2><span><?php echo $lang_register['Forum rules'] ?></span></h2>
 	<div class="box">
 		<form method="get" action="register.php">
@@ -48,9 +64,9 @@
 					<legend><?php echo $lang_register['Rules legend'] ?></legend>
 					<div class="infldset">
-						<div class="usercontent"><?php echo $pun_config['o_rules_message'] ?></div>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="agree" value="<?php echo $lang_register['Agree'] ?>" /> <input type="submit" name="cancel" value="<?php echo $lang_register['Cancel'] ?>" /></p>
+						<p><?php echo $pun_config['o_rules_message'] ?></p>
+					</div>
+				</fieldset>
+			</div>
+			<p><input type="submit" name="agree" value="<?php echo $lang_register['Agree'] ?>" /><input type="submit" name="cancel" value="<?php echo $lang_register['Cancel'] ?>" /></p>
 		</form>
 	</div>
@@ -61,17 +77,8 @@
 }
 
-// Start with a clean slate
-$errors = array();
-
-if (isset($_POST['form_sent']))
+
+else if (isset($_POST['form_sent']))
 {
-	// Check that someone from this IP didn't register a user within the last hour (DoS prevention)
-	$result = $db->query('SELECT 1 FROM '.$db->prefix.'users WHERE registration_ip=\''.get_remote_address().'\' AND registered>'.(time() - 3600)) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
-
-	if ($db->num_rows($result))
-		message($lang_register['Registration flood']);
-
-
-	$username = pun_trim($_POST['req_user']);
+	$username = pun_trim($_POST['req_username']);
 	$email1 = strtolower(trim($_POST['req_email1']));
 
@@ -85,43 +92,74 @@
 	else
 	{
-		$password1 = pun_trim($_POST['req_password1']);
-		$password2 = pun_trim($_POST['req_password2']);
-	}
+		$password1 = trim($_POST['req_password1']);
+		$password2 = trim($_POST['req_password2']);
+	}
+
+	// Convert multiple whitespace characters into one (to prevent people from registering with indistinguishable usernames)
+	$username = preg_replace('#\s+#s', ' ', $username);
 
 	// Validate username and passwords
-	check_username($username);
-
-	if (pun_strlen($password1) < 4)
-		$errors[] = $lang_prof_reg['Pass too short'];
+	if (strlen($username) < 2)
+		message($lang_prof_reg['Username too short']);
+	else if (pun_strlen($username) > 25)	// This usually doesn't happen since the form element only accepts 25 characters
+	    message($lang_common['Bad request']);
+	else if (strlen($password1) < 4)
+		message($lang_prof_reg['Pass too short']);
 	else if ($password1 != $password2)
-		$errors[] = $lang_prof_reg['Pass not match'];
-
-	// Validate email
+		message($lang_prof_reg['Pass not match']);
+	else if (!strcasecmp($username, 'invitÃ©') || !strcasecmp($username, $lang_common['Guest']))
+		message($lang_prof_reg['Username guest']);
+	else if (preg_match('/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/', $username))
+		message($lang_prof_reg['Username IP']);
+	else if ((strpos($username, '[') !== false || strpos($username, ']') !== false) && strpos($username, '\'') !== false && strpos($username, '"') !== false)
+		message($lang_prof_reg['Username reserved chars']);
+	else if (preg_match('#\[b\]|\[/b\]|\[u\]|\[/u\]|\[i\]|\[/i\]|\[color|\[/color\]|\[quote\]|\[quote=|\[/quote\]|\[code\]|\[/code\]|\[img\]|\[/img\]|\[url|\[/url\]|\[email|\[/email\]#i', $username))
+		message($lang_prof_reg['Username BBCode']);
+
+	// Check username for any censored words
+	if ($pun_config['o_censoring'] == '1')
+	{
+		// If the censored username differs from the username
+		if (censor_words($username) != $username)
+			message($lang_register['Username censor']);
+	}
+
+	// Check that the username (or a too similar username) is not already registered
+	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE UPPER(username)=UPPER(\''.$db->escape($username).'\') OR UPPER(username)=UPPER(\''.$db->escape(preg_replace('/[^\w]/', '', $username)).'\')') or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
+
+	if ($db->num_rows($result))
+	{
+		$busy = $db->result($result);
+		message($lang_register['Username dupe 1'].' '.pun_htmlspecialchars($busy).'. '.$lang_register['Username dupe 2']);
+	}
+
+
+	// Validate e-mail
 	require PUN_ROOT.'include/email.php';
 
 	if (!is_valid_email($email1))
-		$errors[] = $lang_common['Invalid email'];
+		message($lang_common['Invalid e-mail']);
 	else if ($pun_config['o_regs_verify'] == '1' && $email1 != $email2)
-		$errors[] = $lang_register['Email not match'];
-
-	// Check if it's a banned email address
+		message($lang_register['E-mail not match']);
+
+	// Check it it's a banned e-mail address
 	if (is_banned_email($email1))
 	{
 		if ($pun_config['p_allow_banned_email'] == '0')
-			$errors[] = $lang_prof_reg['Banned email'];
-
-		$banned_email = true; // Used later when we send an alert email
+			message($lang_prof_reg['Banned e-mail']);
+
+		$banned_email = true;	// Used later when we send an alert e-mail
 	}
 	else
 		$banned_email = false;
 
-	// Check if someone else already has registered with that email address
+	// Check if someone else already has registered with that e-mail address
 	$dupe_list = array();
 
-	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE email=\''.$db->escape($email1).'\'') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE email=\''.$email1.'\'') or error('Impossible de retrouver les informations utilisateur', __FILE__, __LINE__, $db->error());
 	if ($db->num_rows($result))
 	{
 		if ($pun_config['p_allow_dupe_email'] == '0')
-			$errors[] = $lang_prof_reg['Dupe email'];
+			message($lang_prof_reg['Dupe e-mail']);
 
 		while ($cur_dupe = $db->fetch_assoc($result))
@@ -129,171 +167,88 @@
 	}
 
-	// Make sure we got a valid language string
-	if (isset($_POST['language']))
-	{
-		$language = preg_replace('%[\.\\\/]%', '', $_POST['language']);
-		if (!file_exists(PUN_ROOT.'lang/'.$language.'/common.php'))
-			message($lang_common['Bad request']);
-	}
-	else
-		$language = $pun_config['o_default_lang'];
-
-	$timezone = round($_POST['timezone'], 1);
-
-	$dst = isset($_POST['dst']) ? '1' : '0';
+	$timezone = intval($_POST['timezone']);
+	$language = isset($_POST['language']) ? $_POST['language'] : $pun_config['o_default_lang'];
+	$save_pass = (!isset($_POST['save_pass']) || $_POST['save_pass'] != '1') ? '0' : '1';
 
 	$email_setting = intval($_POST['email_setting']);
-	if ($email_setting < 0 || $email_setting > 2)
-		$email_setting = $pun_config['o_default_email_setting'];
-
-	// Did everything go according to plan?
-	if (empty($errors))
-	{
-		// Insert the new user into the database. We do this now to get the last inserted ID for later use
-		$now = time();
-
-		$intial_group_id = ($pun_config['o_regs_verify'] == '0') ? $pun_config['o_default_user_group'] : PUN_UNVERIFIED;
-		$password_hash = pun_hash($password1);
-
-		// Add the user
-		$db->query('INSERT INTO '.$db->prefix.'users (username, group_id, password, email, email_setting, timezone, dst, language, style, registered, registration_ip, last_visit) VALUES(\''.$db->escape($username).'\', '.$intial_group_id.', \''.$password_hash.'\', \''.$db->escape($email1).'\', '.$email_setting.', '.$timezone.' , '.$dst.', \''.$db->escape($language).'\', \''.$pun_config['o_default_style'].'\', '.$now.', \''.get_remote_address().'\', '.$now.')') or error('Unable to create user', __FILE__, __LINE__, $db->error());
-		$new_uid = $db->insert_id();
-
-		// If the mailing list isn't empty, we may need to send out some alerts
-		if ($pun_config['o_mailing_list'] != '')
-		{
-			// If we previously found out that the email was banned
-			if ($banned_email)
-			{
-				// Load the "banned email register" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/banned_email_register.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				$mail_message = str_replace('<username>', $username, $mail_message);
-				$mail_message = str_replace('<email>', $email1, $mail_message);
-				$mail_message = str_replace('<profile_url>', get_base_url().'/profile.php?id='.$new_uid, $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-				pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
-			}
-
-			// If we previously found out that the email was a dupe
-			if (!empty($dupe_list))
-			{
-				// Load the "dupe email register" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/dupe_email_register.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				$mail_message = str_replace('<username>', $username, $mail_message);
-				$mail_message = str_replace('<dupe_list>', implode(', ', $dupe_list), $mail_message);
-				$mail_message = str_replace('<profile_url>', get_base_url().'/profile.php?id='.$new_uid, $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-				pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
-			}
-
-			// Should we alert people on the admin mailing list that a new user has registered?
-			if ($pun_config['o_regs_report'] == '1')
-			{
-				// Load the "new user" template
-				$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/new_user.tpl'));
-
-				// The first row contains the subject
-				$first_crlf = strpos($mail_tpl, "\n");
-				$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-				$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-				$mail_message = str_replace('<username>', $username, $mail_message);
-				$mail_message = str_replace('<base_url>', get_base_url().'/', $mail_message);
-				$mail_message = str_replace('<profile_url>', get_base_url().'/profile.php?id='.$new_uid, $mail_message);
-				$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-				pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
-			}
-		}
-
-		// Must the user verify the registration or do we log him/her in right now?
-		if ($pun_config['o_regs_verify'] == '1')
-		{
-			// Load the "welcome" template
-			$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/welcome.tpl'));
-
-			// The first row contains the subject
-			$first_crlf = strpos($mail_tpl, "\n");
-			$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
-			$mail_message = trim(substr($mail_tpl, $first_crlf));
-
-			$mail_subject = str_replace('<board_title>', $pun_config['o_board_title'], $mail_subject);
-			$mail_message = str_replace('<base_url>', get_base_url().'/', $mail_message);
-			$mail_message = str_replace('<username>', $username, $mail_message);
-			$mail_message = str_replace('<password>', $password1, $mail_message);
-			$mail_message = str_replace('<login_url>', get_base_url().'/login.php', $mail_message);
-			$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'], $mail_message);
-
-			pun_mail($email1, $mail_subject, $mail_message);
-
-			message($lang_register['Reg email'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
-		}
-
-		// Regenerate the users info cache
-		if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
-			require PUN_ROOT.'include/cache.php';
-
-		generate_users_info_cache();
-
-		pun_setcookie($new_uid, $password_hash, time() + $pun_config['o_timeout_visit']);
-
-		redirect('index.php', $lang_register['Reg complete']);
-	}
+	if ($email_setting < 0 || $email_setting > 2) $email_setting = 1;
+
+	// Insert the new user into the database. We do this now to get the last inserted id for later use.
+	$now = time();
+
+	$intial_group_id = ($pun_config['o_regs_verify'] == '0') ? $pun_config['o_default_user_group'] : PUN_UNVERIFIED;
+	$password_hash = pun_hash($password1);
+
+	// Add the user
+	$db->query('INSERT INTO '.$db->prefix.'users (username, group_id, password, email, email_setting, save_pass, timezone, language, style, registered, registration_ip, last_visit) VALUES(\''.$db->escape($username).'\', '.$intial_group_id.', \''.$password_hash.'\', \''.$email1.'\', '.$email_setting.', '.$save_pass.', '.$timezone.' , \''.$db->escape($language).'\', \''.$pun_config['o_default_style'].'\', '.$now.', \''.get_remote_address().'\', '.$now.')') or error('Impossible de crÃ©er un utilisateur', __FILE__, __LINE__, $db->error());
+	$new_uid = $db->insert_id();
+
+
+	// If we previously found out that the e-mail was banned
+	if ($banned_email && $pun_config['o_mailing_list'] != '')
+	{
+		$mail_subject = 'Alerte - Adresse e-mail bannis dÃ©tectÃ©e';
+		$mail_message = 'L\'utilisateur \''.$username.'\' s\est inscrit avec l\'adresse e-mail bannis : '.$email1."\n\n".'Profil utilisateur : '.$pun_config['o_base_url'].'/profile.php?id='.$new_uid."\n\n".'-- '."\n".'E-mail automatique'."\n".'(Ne rÃ©pondez pas Ã  ce message)';
+
+		pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
+	}
+
+	// If we previously found out that the e-mail was a dupe
+	if (!empty($dupe_list) && $pun_config['o_mailing_list'] != '')
+	{
+		$mail_subject = 'Alerte - Adresse e-mail en doublon dÃ©tÃ©ctÃ©e';
+		$mail_message = 'L\'utilisateur \''.$username.'\' s\'est inscrit avec l\'adresse qui appartient Ã©galement Ã  : '.implode(', ', $dupe_list)."\n\n".'User profile: '.$pun_config['o_base_url'].'/profile.php?id='.$new_uid."\n\n".'-- '."\n".'E-mail automatique'."\n".'(Ne rÃ©pondez pas Ã  ce message)';
+
+		pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
+	}
+
+	// Should we alert people on the admin mailing list that a new user has registered?
+	if ($pun_config['o_regs_report'] == '1')
+	{
+		$mail_subject = 'Alerte - Nouvelle inscription';
+		$mail_message = 'L\'utilisateur \''.$username.'\' registered in the forums at '.$pun_config['o_base_url']."\n\n".'Profil utilisateur : '.$pun_config['o_base_url'].'/profile.php?id='.$new_uid."\n\n".'-- '."\n".'E-mail automatique'."\n".'(Ne rÃ©pondez pas Ã  ce message)';
+
+		pun_mail($pun_config['o_mailing_list'], $mail_subject, $mail_message);
+	}
+
+	// Must the user verify the registration or do we log him/her in right now?
+	if ($pun_config['o_regs_verify'] == '1')
+	{
+		// Load the "welcome" template
+		$mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/welcome.tpl'));
+
+		// The first row contains the subject
+		$first_crlf = strpos($mail_tpl, "\n");
+		$mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
+		$mail_message = trim(substr($mail_tpl, $first_crlf));
+
+		$mail_subject = str_replace('<board_title>', $pun_config['o_board_title'], $mail_subject);
+		$mail_message = str_replace('<base_url>', $pun_config['o_base_url'].'/', $mail_message);
+		$mail_message = str_replace('<username>', $username, $mail_message);
+		$mail_message = str_replace('<password>', $password1, $mail_message);
+		$mail_message = str_replace('<login_url>', $pun_config['o_base_url'].'/login.php', $mail_message);
+		$mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
+
+		pun_mail($email1, $mail_subject, $mail_message);
+
+		message($lang_register['Reg e-mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
+	}
+
+	pun_setcookie($new_uid, $password_hash, ($save_pass != '0') ? $now + 31536000 : 0);
+
+	redirect(isset($_GET["from"]) ? urldecode($_GET["from"]) : "index.php", $lang_register['Reg complete']);
 }
 
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_register['Register']);
-$required_fields = array('req_user' => $lang_common['Username'], 'req_password1' => $lang_common['Password'], 'req_password2' => $lang_prof_reg['Confirm pass'], 'req_email1' => $lang_common['Email'], 'req_email2' => $lang_common['Email'].' 2');
-$focus_element = array('register', 'req_user');
-define('PUN_ACTIVE_PAGE', 'register');
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Register'];
+$required_fields = array('req_username' => $lang_common['Username'], 'req_password1' => $lang_common['Password'], 'req_password2' => $lang_prof_reg['Confirm pass'], 'req_email1' => $lang_common['E-mail'], 'req_email2' => $lang_common['E-mail'].' 2');
+$focus_element = array('register', 'req_username');
 require PUN_ROOT.'header.php';
 
-$timezone = isset($timezone) ? $timezone : $pun_config['o_default_timezone'];
-$dst = isset($dst) ? $dst : $pun_config['o_default_dst'];
-$email_setting = isset($email_setting) ? $email_setting : $pun_config['o_default_email_setting'];
-
-// If there are errors, we display them
-if (!empty($errors))
-{
-
-?>
-<div id="posterror" class="block">
-	<h2><span><?php echo $lang_register['Registration errors'] ?></span></h2>
-	<div class="box">
-		<div class="inbox error-info">
-			<p><?php echo $lang_register['Registration errors info'] ?></p>
-			<ul class="error-list">
-<?php
-
-	foreach ($errors as $cur_error)
-		echo "\t\t\t\t".'<li><strong>'.$cur_error.'</strong></li>'."\n";
-?>
-			</ul>
-		</div>
-	</div>
-</div>
-
-<?php
-
-}
-?>
-<div id="regform" class="blockform">
+?>
+<div class="blockform">
 	<h2><span><?php echo $lang_register['Register'] ?></span></h2>
 	<div class="box">
-		<form id="register" method="post" action="register.php?action=register" onsubmit="this.register.disabled=true;if(process_form(this)){return true;}else{this.register.disabled=false;return false;}">
+  <form id="register" method="post" action="register.php?action=register<?php echo isset($_GET["from"]) ? "&from=".$_GET["from"] : ""; ?>"
+                      onsubmit="this.register.disabled=true;if(process_form(this)){return true;}else{this.register.disabled=false;return false;}">
 			<div class="inform">
 				<div class="forminfo">
@@ -306,5 +261,5 @@
 					<div class="infldset">
 						<input type="hidden" name="form_sent" value="1" />
-						<label class="required"><strong><?php echo $lang_common['Username'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="req_user" value="<?php if (isset($_POST['req_user'])) echo pun_htmlspecialchars($_POST['req_user']); ?>" size="25" maxlength="25" /><br /></label>
+						<label><strong><?php echo $lang_common['Username'] ?></strong><br /><input type="text" name="req_username" size="25" maxlength="25" /><br /></label>
 					</div>
 				</fieldset>
@@ -312,8 +267,8 @@
 <?php if ($pun_config['o_regs_verify'] == '0'): ?>			<div class="inform">
 				<fieldset>
-					<legend><?php echo $lang_register['Pass legend'] ?></legend>
-					<div class="infldset">
-						<label class="conl required"><strong><?php echo $lang_common['Password'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="password" name="req_password1" value="<?php if (isset($_POST['req_password1'])) echo pun_htmlspecialchars($_POST['req_password1']); ?>" size="16" /><br /></label>
-						<label class="conl required"><strong><?php echo $lang_prof_reg['Confirm pass'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="password" name="req_password2" value="<?php if (isset($_POST['req_password2'])) echo pun_htmlspecialchars($_POST['req_password2']); ?>" size="16" /><br /></label>
+					<legend><?php echo $lang_register['Pass legend 1'] ?></legend>
+					<div class="infldset">
+						<label class="conl"><strong><?php echo $lang_common['Password'] ?></strong><br /><input type="password" name="req_password1" size="16" maxlength="16" /><br /></label>
+						<label class="conl"><strong><?php echo $lang_prof_reg['Confirm pass'] ?></strong><br /><input type="password" name="req_password2" size="16" maxlength="16" /><br /></label>
 						<p class="clearb"><?php echo $lang_register['Pass info'] ?></p>
 					</div>
@@ -322,11 +277,11 @@
 <?php endif; ?>			<div class="inform">
 				<fieldset>
-					<legend><?php echo ($pun_config['o_regs_verify'] == '1') ? $lang_prof_reg['Email legend 2'] : $lang_prof_reg['Email legend'] ?></legend>
-					<div class="infldset">
-<?php if ($pun_config['o_regs_verify'] == '1'): ?>						<p><?php echo $lang_register['Email info'] ?></p>
-<?php endif; ?>						<label class="required"><strong><?php echo $lang_common['Email'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
-						<input type="text" name="req_email1" value="<?php if (isset($_POST['req_email1'])) echo pun_htmlspecialchars($_POST['req_email1']); ?>" size="50" maxlength="80" /><br /></label>
-<?php if ($pun_config['o_regs_verify'] == '1'): ?>						<label class="required"><strong><?php echo $lang_register['Confirm email'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br />
-						<input type="text" name="req_email2" value="<?php if (isset($_POST['req_email2'])) echo pun_htmlspecialchars($_POST['req_email2']); ?>" size="50" maxlength="80" /><br /></label>
+					<legend><?php echo ($pun_config['o_regs_verify'] == '1') ? $lang_prof_reg['E-mail legend 2'] : $lang_prof_reg['E-mail legend'] ?></legend>
+					<div class="infldset">
+<?php if ($pun_config['o_regs_verify'] == '1'): ?>			<p><?php echo $lang_register['E-mail info'] ?></p>
+<?php endif; ?>					<label><strong><?php echo $lang_common['E-mail'] ?></strong><br />
+						<input type="text" name="req_email1" size="50" maxlength="50" /><br /></label>
+<?php if ($pun_config['o_regs_verify'] == '1'): ?>						<label><strong><?php echo $lang_register['Confirm e-mail'] ?></strong><br />
+						<input type="text" name="req_email2" size="50" maxlength="50" /><br /></label>
 <?php endif; ?>					</div>
 				</fieldset>
@@ -336,55 +291,55 @@
 					<legend><?php echo $lang_prof_reg['Localisation legend'] ?></legend>
 					<div class="infldset">
-						<p><?php echo $lang_prof_reg['Time zone info'] ?></p>
-						<label><?php echo $lang_prof_reg['Time zone']."\n" ?>
+						<label><?php echo $lang_prof_reg['Timezone'] ?>: <?php echo $lang_prof_reg['Timezone info'] ?>
 						<br /><select id="time_zone" name="timezone">
-							<option value="-12"<?php if ($timezone == -12) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-12:00'] ?></option>
-							<option value="-11"<?php if ($timezone == -11) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-11:00'] ?></option>
-							<option value="-10"<?php if ($timezone == -10) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-10:00'] ?></option>
-							<option value="-9.5"<?php if ($timezone == -9.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-09:30'] ?></option>
-							<option value="-9"<?php if ($timezone == -9) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-09:00'] ?></option>
-							<option value="-8.5"<?php if ($timezone == -8.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-08:30'] ?></option>
-							<option value="-8"<?php if ($timezone == -8) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-08:00'] ?></option>
-							<option value="-7"<?php if ($timezone == -7) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-07:00'] ?></option>
-							<option value="-6"<?php if ($timezone == -6) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-06:00'] ?></option>
-							<option value="-5"<?php if ($timezone == -5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-05:00'] ?></option>
-							<option value="-4"<?php if ($timezone == -4) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-04:00'] ?></option>
-							<option value="-3.5"<?php if ($timezone == -3.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-03:30'] ?></option>
-							<option value="-3"<?php if ($timezone == -3) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-03:00'] ?></option>
-							<option value="-2"<?php if ($timezone == -2) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-02:00'] ?></option>
-							<option value="-1"<?php if ($timezone == -1) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC-01:00'] ?></option>
-							<option value="0"<?php if ($timezone == 0) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC'] ?></option>
-							<option value="1"<?php if ($timezone == 1) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+01:00'] ?></option>
-							<option value="2"<?php if ($timezone == 2) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+02:00'] ?></option>
-							<option value="3"<?php if ($timezone == 3) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+03:00'] ?></option>
-							<option value="3.5"<?php if ($timezone == 3.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+03:30'] ?></option>
-							<option value="4"<?php if ($timezone == 4) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+04:00'] ?></option>
-							<option value="4.5"<?php if ($timezone == 4.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+04:30'] ?></option>
-							<option value="5"<?php if ($timezone == 5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+05:00'] ?></option>
-							<option value="5.5"<?php if ($timezone == 5.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+05:30'] ?></option>
-							<option value="5.75"<?php if ($timezone == 5.75) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+05:45'] ?></option>
-							<option value="6"<?php if ($timezone == 6) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+06:00'] ?></option>
-							<option value="6.5"<?php if ($timezone == 6.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+06:30'] ?></option>
-							<option value="7"<?php if ($timezone == 7) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+07:00'] ?></option>
-							<option value="8"<?php if ($timezone == 8) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+08:00'] ?></option>
-							<option value="8.75"<?php if ($timezone == 8.75) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+08:45'] ?></option>
-							<option value="9"<?php if ($timezone == 9) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+09:00'] ?></option>
-							<option value="9.5"<?php if ($timezone == 9.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+09:30'] ?></option>
-							<option value="10"<?php if ($timezone == 10) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+10:00'] ?></option>
-							<option value="10.5"<?php if ($timezone == 10.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+10:30'] ?></option>
-							<option value="11"<?php if ($timezone == 11) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+11:00'] ?></option>
-							<option value="11.5"<?php if ($timezone == 11.5) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+11:30'] ?></option>
-							<option value="12"<?php if ($timezone == 12) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+12:00'] ?></option>
-							<option value="12.75"<?php if ($timezone == 12.75) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+12:45'] ?></option>
-							<option value="13"<?php if ($timezone == 13) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+13:00'] ?></option>
-							<option value="14"<?php if ($timezone == 14) echo ' selected="selected"' ?>><?php echo $lang_prof_reg['UTC+14:00'] ?></option>
+							<option value="-12"<?php if ($pun_config['o_server_timezone'] == -12 ) echo ' selected="selected"' ?>>-12</option>
+							<option value="-11"<?php if ($pun_config['o_server_timezone'] == -11) echo ' selected="selected"' ?>>-11</option>
+							<option value="-10"<?php if ($pun_config['o_server_timezone'] == -10) echo ' selected="selected"' ?>>-10</option>
+							<option value="-9.5"<?php if ($pun_config['o_server_timezone'] == -9.5) echo ' selected="selected"' ?>>-9.5</option>
+							<option value="-9"<?php if ($pun_config['o_server_timezone'] == -9 ) echo ' selected="selected"' ?>>-09</option>
+							<option value="-8.5"<?php if ($pun_config['o_server_timezone'] == -8.5) echo ' selected="selected"' ?>>-8.5</option>
+							<option value="-8"<?php if ($pun_config['o_server_timezone'] == -8 ) echo ' selected="selected"' ?>>-08 PST</option>
+							<option value="-7"<?php if ($pun_config['o_server_timezone'] == -7 ) echo ' selected="selected"' ?>>-07 MST</option>
+							<option value="-6"<?php if ($pun_config['o_server_timezone'] == -6 ) echo ' selected="selected"' ?>>-06 CST</option>
+							<option value="-5"<?php if ($pun_config['o_server_timezone'] == -5 ) echo ' selected="selected"' ?>>-05 EST</option>
+							<option value="-4"<?php if ($pun_config['o_server_timezone'] == -4 ) echo ' selected="selected"' ?>>-04 AST</option>
+							<option value="-3.5"<?php if ($pun_config['o_server_timezone'] == -3.5) echo ' selected="selected"' ?>>-3.5</option>
+							<option value="-3"<?php if ($pun_config['o_server_timezone'] == -3 ) echo ' selected="selected"' ?>>-03 ADT</option>
+							<option value="-2"<?php if ($pun_config['o_server_timezone'] == -2 ) echo ' selected="selected"' ?>>-02</option>
+							<option value="-1"<?php if ($pun_config['o_server_timezone'] == -1) echo ' selected="selected"' ?>>-01</option>
+							<option value="0"<?php if ($pun_config['o_server_timezone'] == 0) echo ' selected="selected"' ?>>00 GMT</option>
+							<option value="1"<?php if ($pun_config['o_server_timezone'] == 1) echo ' selected="selected"' ?>>+01 CET</option>
+							<option value="2"<?php if ($pun_config['o_server_timezone'] == 2 ) echo ' selected="selected"' ?>>+02</option>
+							<option value="3"<?php if ($pun_config['o_server_timezone'] == 3 ) echo ' selected="selected"' ?>>+03</option>
+							<option value="3.5"<?php if ($pun_config['o_server_timezone'] == 3.5 ) echo ' selected="selected"' ?>>+03.5</option>
+							<option value="4"<?php if ($pun_config['o_server_timezone'] == 4 ) echo ' selected="selected"' ?>>+04</option>
+							<option value="4.5"<?php if ($pun_config['o_server_timezone'] == 4.5 ) echo ' selected="selected"' ?>>+04.5</option>
+							<option value="5"<?php if ($pun_config['o_server_timezone'] == 5 ) echo ' selected="selected"' ?>>+05</option>
+							<option value="5.5"<?php if ($pun_config['o_server_timezone'] == 5.5 ) echo ' selected="selected"' ?>>+05.5</option>
+							<option value="6"<?php if ($pun_config['o_server_timezone'] == 6 ) echo ' selected="selected"' ?>>+06</option>
+							<option value="6.5"<?php if ($pun_config['o_server_timezone'] == 6.5 ) echo ' selected="selected"' ?>>+06.5</option>
+							<option value="7"<?php if ($pun_config['o_server_timezone'] == 7 ) echo ' selected="selected"' ?>>+07</option>
+							<option value="8"<?php if ($pun_config['o_server_timezone'] == 8 ) echo ' selected="selected"' ?>>+08</option>
+							<option value="9"<?php if ($pun_config['o_server_timezone'] == 9 ) echo ' selected="selected"' ?>>+09</option>
+							<option value="9.5"<?php if ($pun_config['o_server_timezone'] == 9.5 ) echo ' selected="selected"' ?>>+09.5</option>
+							<option value="10"<?php if ($pun_config['o_server_timezone'] == 10) echo ' selected="selected"' ?>>+10</option>
+							<option value="10.5"<?php if ($pun_config['o_server_timezone'] == 10.5 ) echo ' selected="selected"' ?>>+10.5</option>
+							<option value="11"<?php if ($pun_config['o_server_timezone'] == 11) echo ' selected="selected"' ?>>+11</option>
+							<option value="11.5"<?php if ($pun_config['o_server_timezone'] == 11.5 ) echo ' selected="selected"' ?>>+11.5</option>
+							<option value="12"<?php if ($pun_config['o_server_timezone'] == 12 ) echo ' selected="selected"' ?>>+12</option>
+							<option value="13"<?php if ($pun_config['o_server_timezone'] == 13 ) echo ' selected="selected"' ?>>+13</option>
+							<option value="14"<?php if ($pun_config['o_server_timezone'] == 14 ) echo ' selected="selected"' ?>>+14</option>
 						</select>
 						<br /></label>
-						<div class="rbox">
-							<label><input type="checkbox" name="dst" value="1"<?php if ($dst == '1') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['DST'] ?><br /></label>
-						</div>
-<?php
-
-		$languages = forum_list_langs();
+<?php
+
+		$languages = array();
+		$d = dir(PUN_ROOT.'lang');
+		while (($entry = $d->read()) !== false)
+		{
+			if ($entry != '.' && $entry != '..' && is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/common.php'))
+				$languages[] = $entry;
+		}
+		$d->close();
 
 		// Only display the language selection box if there's more than one language available
@@ -393,9 +348,9 @@
 
 ?>
-							<label><?php echo $lang_prof_reg['Language'] ?>
+							<label><?php echo $lang_prof_reg['Language'] ?>: <?php echo $lang_prof_reg['Language info'] ?>
 							<br /><select name="language">
 <?php
 
-			foreach ($languages as $temp)
+			while (list(, $temp) = @each($languages))
 			{
 				if ($pun_config['o_default_lang'] == $temp)
@@ -419,14 +374,18 @@
 					<legend><?php echo $lang_prof_reg['Privacy options legend'] ?></legend>
 					<div class="infldset">
-						<p><?php echo $lang_prof_reg['Email setting info'] ?></p>
+						<p><?php echo $lang_prof_reg['E-mail setting info'] ?></p>
 						<div class="rbox">
-							<label><input type="radio" name="email_setting" value="0"<?php if ($email_setting == '0') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Email setting 1'] ?><br /></label>
-							<label><input type="radio" name="email_setting" value="1"<?php if ($email_setting == '1') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Email setting 2'] ?><br /></label>
-							<label><input type="radio" name="email_setting" value="2"<?php if ($email_setting == '2') echo ' checked="checked"' ?> /><?php echo $lang_prof_reg['Email setting 3'] ?><br /></label>
+							<label><input type="radio" name="email_setting" value="0" /><?php echo $lang_prof_reg['E-mail setting 1'] ?><br /></label>
+							<label><input type="radio" name="email_setting" value="1" checked="checked" /><?php echo $lang_prof_reg['E-mail setting 2'] ?><br /></label>
+							<label><input type="radio" name="email_setting" value="2" /><?php echo $lang_prof_reg['E-mail setting 3'] ?><br /></label>
 						</div>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="register" value="<?php echo $lang_register['Register'] ?>" /></p>
+						<p><?php echo $lang_prof_reg['Save user/pass info'] ?></p>
+						<div class="rbox">
+							<label><input type="checkbox" name="save_pass" value="1" checked="checked" /><?php echo $lang_prof_reg['Save user/pass'] ?><br /></label>
+						</div>
+					</div>
+				</fieldset>
+			</div>
+			<p><input type="submit" name="register" value="<?php echo $lang_register['Register'] ?>" /></p>
 		</form>
 	</div>
Index: trunk/web/punbb/search.php
===================================================================
--- trunk/web/punbb/search.php	(revision 10)
+++ trunk/web/punbb/search.php	(revision 1)
@@ -1,19 +1,37 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
 
 // The contents of this file are very much inspired by the file search.php
-// from the phpBB Group forum software phpBB2 (http://www.phpbb.com)
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+// from the phpBB Group forum software phpBB2 (http://www.phpbb.com).
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
+
 
 // Load the search.php language file
 require PUN_ROOT.'lang/'.$pun_user['language'].'/search.php';
-require PUN_ROOT.'lang/'.$pun_user['language'].'/forum.php';
 
 
@@ -23,5 +41,8 @@
 	message($lang_search['No search permission']);
 
-require PUN_ROOT.'include/search_idx.php';
+
+// Detect two byte character sets
+$multibyte = (isset($lang_common['lang_multibyte']) && $lang_common['lang_multibyte']) ? true : false;
+
 
 // Figure out what to do :-)
@@ -29,14 +50,7 @@
 {
 	$action = (isset($_GET['action'])) ? $_GET['action'] : null;
-	$forums = isset($_GET['forums']) ? (is_array($_GET['forums']) ? $_GET['forums'] : explode(',', $_GET['forums'])) : (isset($_GET['forum']) ? array($_GET['forum']) : array());
-	$sort_dir = (isset($_GET['sort_dir']) && $_GET['sort_dir'] == 'DESC') ? 'DESC' : 'ASC';
-
-	$forums = array_map('intval', $forums);
-
-	// Allow the old action names for backwards compatibility reasons
-	if ($action == 'show_user')
-		$action = 'show_user_posts';
-	else if ($action == 'show_24h')
-		$action = 'show_recent';
+	$forum = (isset($_GET['forum'])) ? intval($_GET['forum']) : -1;
+	$sort_dir = (isset($_GET['sort_dir'])) ? (($_GET['sort_dir'] == 'DESC') ? 'DESC' : 'ASC') : 'DESC';
+	if (isset($search_id)) unset($search_id);
 
 	// If a search_id was supplied
@@ -50,11 +64,11 @@
 	else if ($action == 'search')
 	{
-		$keywords = (isset($_GET['keywords'])) ? utf8_strtolower(pun_trim($_GET['keywords'])) : null;
-		$author = (isset($_GET['author'])) ? utf8_strtolower(pun_trim($_GET['author'])) : null;
-
-		if (preg_match('%^[\*\%]+$%', $keywords) || (pun_strlen(str_replace(array('*', '%'), '', $keywords)) < PUN_SEARCH_MIN_WORD && !is_cjk($keywords)))
+		$keywords = (isset($_GET['keywords'])) ? strtolower(trim($_GET['keywords'])) : null;
+		$author = (isset($_GET['author'])) ? strtolower(trim($_GET['author'])) : null;
+		
+		if (preg_match('#^[\*%]+$#', $keywords) || strlen(str_replace(array('*', '%'), '', $keywords)) < 3)
 			$keywords = '';
 
-		if (preg_match('%^[\*\%]+$%', $author) || pun_strlen(str_replace(array('*', '%'), '', $author)) < 2)
+		if (preg_match('#^[\*%]+$#', $author) || strlen(str_replace(array('*', '%'), '', $author)) < 3)
 			$author = '';
 
@@ -65,28 +79,20 @@
 			$author = str_replace('*', '%', $author);
 
-		$show_as = (isset($_GET['show_as']) && $_GET['show_as'] == 'topics') ? 'topics' : 'posts';
-		$sort_by = (isset($_GET['sort_by'])) ? intval($_GET['sort_by']) : 0;
-		$search_in = (!isset($_GET['search_in']) || $_GET['search_in'] == '0') ? 0 : (($_GET['search_in'] == '1') ? 1 : -1);
+		$show_as = (isset($_GET['show_as'])) ? $_GET['show_as'] : 'posts';
+		$sort_by = (isset($_GET['sort_by'])) ? intval($_GET['sort_by']) : null;
+		$search_in = (!isset($_GET['search_in']) || $_GET['search_in'] == 'all') ? 0 : (($_GET['search_in'] == 'message') ? 1 : -1);
 	}
-	// If it's a user search (by ID)
-	else if ($action == 'show_user_posts' || $action == 'show_user_topics' || $action == 'show_subscriptions')
+	// If it's a user search (by id)
+	else if ($action == 'show_user')
 	{
-		$user_id = (isset($_GET['user_id'])) ? intval($_GET['user_id']) : $pun_user['id'];
+		$user_id = intval($_GET['user_id']);
 		if ($user_id < 2)
 			message($lang_common['Bad request']);
-
-		// Subscribed topics can only be viewed by admins, moderators and the users themselves
-		if ($action == 'show_subscriptions' && !$pun_user['is_admmod'] && $user_id != $pun_user['id'])
-			message($lang_common['No permission']);
 	}
-	else if ($action == 'show_recent')
-		$interval = isset($_GET['value']) ? intval($_GET['value']) : 86400;
-	else if ($action == 'show_replies')
+	else
 	{
-		if ($pun_user['is_guest'])
+		if ($action != 'show_new' && $action != 'show_24h' && $action != 'show_unanswered' && $action != 'show_subscriptions')
 			message($lang_common['Bad request']);
 	}
-	else if ($action != 'show_new' && $action != 'show_unanswered')
-		message($lang_common['Bad request']);
 
 
@@ -96,15 +102,14 @@
 		$ident = ($pun_user['is_guest']) ? get_remote_address() : $pun_user['username'];
 
-		$result = $db->query('SELECT search_data FROM '.$db->prefix.'search_cache WHERE id='.$search_id.' AND ident=\''.$db->escape($ident).'\'') or error('Unable to fetch search results', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT search_data FROM '.$db->prefix.'search_cache WHERE id='.$search_id.' AND ident=\''.$db->escape($ident).'\'') or error('Impossible de retrouver les rÃ©sultats de la recherche', __FILE__, __LINE__, $db->error());
 		if ($row = $db->fetch_assoc($result))
 		{
 			$temp = unserialize($row['search_data']);
 
-			$search_ids = unserialize($temp['search_ids']);
+			$search_results = $temp['search_results'];
 			$num_hits = $temp['num_hits'];
 			$sort_by = $temp['sort_by'];
 			$sort_dir = $temp['sort_dir'];
 			$show_as = $temp['show_as'];
-			$search_type = $temp['search_type'];
 
 			unset($temp);
@@ -118,62 +123,54 @@
 
 		// Search a specific forum?
-		$forum_sql = (!empty($forums) || (empty($forums) && $pun_config['o_search_all_forums'] == '0' && !$pun_user['is_admmod'])) ? ' AND t.forum_id IN ('.implode(',', $forums).')' : '';
+		$forum_sql = ($forum != -1) ? ' AND t.forum_id = '.$forum : '';
 
 		if (!empty($author) || !empty($keywords))
 		{
-			// Flood protection
-			if ($pun_user['last_search'] && (time() - $pun_user['last_search']) < $pun_user['g_search_flood'] && (time() - $pun_user['last_search']) >= 0)
-				message(sprintf($lang_search['Search flood'], $pun_user['g_search_flood']));
-
-			if (!$pun_user['is_guest'])
-				$db->query('UPDATE '.$db->prefix.'users SET last_search='.time().' WHERE id='.$pun_user['id']) or error('Unable to update user', __FILE__, __LINE__, $db->error());
-			else
-				$db->query('UPDATE '.$db->prefix.'online SET last_search='.time().' WHERE ident=\''.$db->escape(get_remote_address()).'\'' ) or error('Unable to update user', __FILE__, __LINE__, $db->error());
-
-			switch ($sort_by)
-			{
-				case 1:
-					$sort_by_sql = ($show_as == 'topics') ? 't.poster' : 'p.poster';
-					$sort_type = SORT_STRING;
-					break;
-
-				case 2:
-					$sort_by_sql = 't.subject';
-					$sort_type = SORT_STRING;
-					break;
-
-				case 3:
-					$sort_by_sql = 't.forum_id';
-					$sort_type = SORT_NUMERIC;
-					break;
-
-				case 4:
-					$sort_by_sql = 't.last_post';
-					$sort_type = SORT_NUMERIC;
-					break;
-
-				default:
-					$sort_by_sql = ($show_as == 'topics') ? 't.last_post' : 'p.posted';
-					$sort_type = SORT_NUMERIC;
-					break;
-			}
-
 			// If it's a search for keywords
 			if ($keywords)
 			{
-				// split the keywords into words
-				$keywords_array = split_words($keywords, false);
-
-				if (empty($keywords_array))
-					message($lang_search['No hits']);
-
-				// Should we search in message body or topic subject specifically?
-				$search_in_cond = ($search_in) ? (($search_in > 0) ? ' AND m.subject_match = 0' : ' AND m.subject_match = 1') : '';
+				$stopwords = (array)@file(PUN_ROOT.'lang/'.$pun_user['language'].'/stopwords.txt');
+				$stopwords = array_map('trim', $stopwords);
+
+				// Are we searching for multibyte charset text?
+				if ($multibyte)
+				{
+					// Strip out excessive whitespace
+					$keywords = trim(preg_replace('#\s+#', ' ', $keywords));
+
+					$keywords_array = explode(' ', $keywords);
+				}
+				else
+				{
+					// Filter out non-alphabetical chars
+					$noise_match = array('^', '$', '&', '(', ')', '<', '>', '`', '\'', '"', '|', ',', '@', '_', '?', '%', '~', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!', 'Â€');
+					$noise_replace = array(' ', ' ', ' ', ' ', ' ', ' ', ' ', '',  '',   ' ', ' ', ' ', ' ', '',  ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '' ,  ' ', ' ', ' ', ' ',  ' ', ' ', ' ');
+					$keywords = str_replace($noise_match, $noise_replace, $keywords);
+
+					// Strip out excessive whitespace
+					$keywords = trim(preg_replace('#\s+#', ' ', $keywords));
+
+					// Fill an array with all the words
+					$keywords_array = explode(' ', $keywords);
+
+					if (empty($keywords_array))
+						message($lang_search['No hits']);
+
+					while (list($i, $word) = @each($keywords_array))
+					{
+						$num_chars = pun_strlen($word);
+
+						if ($num_chars < 3 || $num_chars > 20 || in_array($word, $stopwords))
+							unset($keywords_array[$i]);
+					}
+
+					// Should we search in message body or topic subject specifically?
+					$search_in_cond = ($search_in) ? (($search_in > 0) ? ' AND m.subject_match = 0' : ' AND m.subject_match = 1') : '';
+				}
 
 				$word_count = 0;
 				$match_type = 'and';
-
-				$sort_data = array();
-				foreach ($keywords_array as $cur_word)
+				@reset($keywords_array);
+				while (list(, $cur_word) = @each($keywords_array))
 				{
 					switch ($cur_word)
@@ -187,45 +184,45 @@
 						default:
 						{
-							if (is_cjk($cur_word))
+							// Are we searching for multibyte charset text?
+							if ($multibyte)
 							{
-								$where_cond = str_replace('*', '%', $cur_word);
-								$where_cond = ($search_in ? (($search_in > 0) ? 'p.message LIKE \'%'.$db->escape($where_cond).'%\'' : 't.subject LIKE \'%'.$db->escape($where_cond).'%\'') : 'p.message LIKE \'%'.$db->escape($where_cond).'%\' OR t.subject LIKE \'%'.$db->escape($where_cond).'%\'');
-
-								$result = $db->query('SELECT p.id AS post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE ('.$where_cond.') AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
+								$cur_word = $db->escape('%'.str_replace('*', '', $cur_word).'%');
+								$cur_word_like = ($db_type == 'pgsql') ? 'ILIKE \''.$cur_word.'\'' : 'LIKE \''.$cur_word.'\'';
+
+								if ($search_in > 0)
+									$sql = 'SELECT id FROM '.$db->prefix.'posts WHERE message '.$cur_word_like;
+								else if ($search_in < 0)
+									$sql = 'SELECT p.id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE t.subject '.$cur_word_like.' GROUP BY p.id, t.id';
+								else
+									$sql = 'SELECT p.id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE p.message '.$cur_word_like.' OR t.subject '.$cur_word_like.' GROUP BY p.id, t.id';
 							}
 							else
-								$result = $db->query('SELECT m.post_id, p.topic_id, '.$sort_by_sql.' AS sort_by FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id INNER JOIN '.$db->prefix.'posts AS p ON p.id=m.post_id INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE w.word LIKE \''.$db->escape(str_replace('*', '%', $cur_word)).'\''.$search_in_cond.' AND (fp.read_forum IS NULL OR fp.read_forum=1)'.$forum_sql, true) or error('Unable to search for posts', __FILE__, __LINE__, $db->error());
+							{
+								$cur_word = str_replace('*', '%', $cur_word);
+								$sql = 'SELECT m.post_id FROM '.$db->prefix.'search_words AS w INNER JOIN '.$db->prefix.'search_matches AS m ON m.word_id = w.id WHERE w.word LIKE \''.$cur_word.'\''.$search_in_cond;
+							}
+
+							$result = $db->query($sql, true) or error('Impossible de rechercher les messages', __FILE__, __LINE__, $db->error());
 
 							$row = array();
-							while ($temp = $db->fetch_assoc($result))
+							while ($temp = $db->fetch_row($result))
 							{
-								$row[$temp['post_id']] = $temp['topic_id'];
+								$row[$temp[0]] = 1;
 
 								if (!$word_count)
-								{
-									$keyword_results[$temp['post_id']] = $temp['topic_id'];
-									$sort_data[$temp['post_id']] = $temp['sort_by'];
-								}
+									$result_list[$temp[0]] = 1;
 								else if ($match_type == 'or')
-								{
-									$keyword_results[$temp['post_id']] = $temp['topic_id'];
-									$sort_data[$temp['post_id']] = $temp['sort_by'];
-								}
+									$result_list[$temp[0]] = 1;
 								else if ($match_type == 'not')
-								{
-									unset($keyword_results[$temp['post_id']]);
-									unset($sort_data[$temp['post_id']]);
-								}
+									$result_list[$temp[0]] = 0;
 							}
 
 							if ($match_type == 'and' && $word_count)
 							{
-								foreach ($keyword_results as $post_id => $topic_id)
+								@reset($result_list);
+								while (list($post_id,) = @each($result_list))
 								{
 									if (!isset($row[$post_id]))
-									{
-										unset($keyword_results[$post_id]);
-										unset($sort_data[$post_id]);
-									}
+										$result_list[$post_id] = 0;
 								}
 							}
@@ -239,30 +236,25 @@
 				}
 
-				// Sort the results - annoyingly array_multisort re-indexes arrays with numeric keys, so we need to split the keys out into a seperate array then combine them again after
-				$post_ids = array_keys($keyword_results);
-				$topic_ids = array_values($keyword_results);
-
-				array_multisort(array_values($sort_data), $sort_dir == 'DESC' ? SORT_DESC : SORT_ASC, $sort_type, $post_ids, $topic_ids);
-
-				// combine the arrays back into a key=>value array (array_combine is PHP5 only unfortunately)
-				$num_results = count($keyword_results);
-				$keyword_results = array();
-				for ($i = 0;$i < $num_results;$i++)
-					$keyword_results[$post_ids[$i]] = $topic_ids[$i];
-
-				unset($sort_data, $post_ids, $topic_ids);
+				@reset($result_list);
+				while (list($post_id, $matches) = @each($result_list))
+				{
+					if ($matches)
+						$keyword_results[] = $post_id;
+				}
+
+				unset($result_list);
 			}
 
 			// If it's a search for author name (and that author name isn't Guest)
-			if ($author && $author != 'guest' && $author != utf8_strtolower($lang_common['Guest']))
+			if ($author && strcasecmp($author, 'Guest') && strcasecmp($author, $lang_common['Guest']))
 			{
 				switch ($db_type)
 				{
 					case 'pgsql':
-						$result = $db->query('SELECT id FROM '.$db->prefix.'users WHERE username ILIKE \''.$db->escape($author).'\'') or error('Unable to fetch users', __FILE__, __LINE__, $db->error());
+						$result = $db->query('SELECT id FROM '.$db->prefix.'users WHERE username ILIKE \''.$db->escape($author).'\'') or error('Impossible de retrouver les membres', __FILE__, __LINE__, $db->error());
 						break;
 
 					default:
-						$result = $db->query('SELECT id FROM '.$db->prefix.'users WHERE username LIKE \''.$db->escape($author).'\'') or error('Unable to fetch users', __FILE__, __LINE__, $db->error());
+						$result = $db->query('SELECT id FROM '.$db->prefix.'users WHERE username LIKE \''.$db->escape($author).'\'') or error('Impossible de retrouver les membres', __FILE__, __LINE__, $db->error());
 						break;
 				}
@@ -270,11 +262,13 @@
 				if ($db->num_rows($result))
 				{
-					$user_ids = array();
+					$user_ids = '';
 					while ($row = $db->fetch_row($result))
-						$user_ids[] = $row[0];
-
-					$result = $db->query('SELECT p.id AS post_id, p.topic_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.poster_id IN('.implode(',', $user_ids).')'.$forum_sql.' ORDER BY '.$sort_by_sql.' '.$sort_dir) or error('Unable to fetch matched posts list', __FILE__, __LINE__, $db->error());
-					while ($temp = $db->fetch_assoc($result))
-						$author_results[$temp['post_id']] = $temp['topic_id'];
+						$user_ids .= (($user_ids != '') ? ',' : '').$row[0];
+
+					$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE poster_id IN('.$user_ids.')') or error('Impossible de retrouver la liste des messages correspondants', __FILE__, __LINE__, $db->error());
+
+					$search_ids = array();
+					while ($row = $db->fetch_row($result))
+						$author_results[] = $row[0];
 
 					$db->free_result($result);
@@ -282,43 +276,49 @@
 			}
 
-			// If we searched for both keywords and author name we want the intersection between the results
+
 			if ($author && $keywords)
 			{
-				$search_ids = array_intersect_assoc($keyword_results, $author_results);
-				$search_type = array('both', array($keywords, pun_trim($_GET['author'])), implode(',', $forums), $search_in);
+				// If we searched for both keywords and author name we want the intersection between the results
+				$search_ids = array_intersect($keyword_results, $author_results);
+				unset($keyword_results, $author_results);
 			}
 			else if ($keywords)
-			{
 				$search_ids = $keyword_results;
-				$search_type = array('keywords', $keywords, implode(',', $forums), $search_in);
-			}
 			else
-			{
 				$search_ids = $author_results;
-				$search_type = array('author', pun_trim($_GET['author']), implode(',', $forums), $search_in);
-			}
-
-			unset($keyword_results, $author_results);
-
-			if ($show_as == 'topics')
-				$search_ids = array_values($search_ids);
-			else
-				$search_ids = array_keys($search_ids);
-
-			$search_ids = array_unique($search_ids);
 
 			$num_hits = count($search_ids);
 			if (!$num_hits)
 				message($lang_search['No hits']);
-		}
-		else if ($action == 'show_new' || $action == 'show_recent' || $action == 'show_replies' || $action == 'show_user_posts' || $action == 'show_user_topics' || $action == 'show_subscriptions' || $action == 'show_unanswered')
-		{
-			$search_type = array('action', $action);
-			$show_as = 'topics';
-			// We want to sort things after last post
-			$sort_by = 0;
-			$sort_dir = 'DESC';
-
-			// If it's a search for new posts since last visit
+
+
+			if ($show_as == 'topics')
+			{
+				$result = $db->query('SELECT t.id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id IN('.implode(',', $search_ids).')'.$forum_sql.' GROUP BY t.id', true) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
+
+				$search_ids = array();
+				while ($row = $db->fetch_row($result))
+					$search_ids[] = $row[0];
+
+				$db->free_result($result);
+
+				$num_hits = count($search_ids);
+			}
+			else
+			{
+				$result = $db->query('SELECT p.id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.id IN('.implode(',', $search_ids).')'.$forum_sql, true) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
+
+				$search_ids = array();
+				while ($row = $db->fetch_row($result))
+					$search_ids[] = $row[0];
+
+				$db->free_result($result);
+
+				$num_hits = count($search_ids);
+			}
+		}
+		else if ($action == 'show_new' || $action == 'show_24h' || $action == 'show_user' || $action == 'show_subscriptions' || $action == 'show_unanswered')
+		{
+			// If it's a search for new posts
 			if ($action == 'show_new')
 			{
@@ -326,5 +326,5 @@
 					message($lang_common['No permission']);
 
-				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.last_post>'.$pun_user['last_visit'].' AND t.moved_to IS NULL'.(isset($_GET['fid']) ? ' AND t.forum_id='.intval($_GET['fid']) : '').' ORDER BY t.last_post DESC') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.last_post>'.$pun_user['last_visit']) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
 				$num_hits = $db->num_rows($result);
 
@@ -332,8 +332,8 @@
 					message($lang_search['No new posts']);
 			}
-			// If it's a search for recent posts (in a certain time interval)
-			else if ($action == 'show_recent')
-			{
-				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.last_post>'.(time() - $interval).' AND t.moved_to IS NULL'.(isset($_GET['fid']) ? ' AND t.forum_id='.intval($_GET['fid']) : '').' ORDER BY t.last_post DESC') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
+			// If it's a search for todays posts
+			else if ($action == 'show_24h')
+			{
+				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.last_post>'.(time() - 86400)) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
 				$num_hits = $db->num_rows($result);
 
@@ -341,8 +341,8 @@
 					message($lang_search['No recent posts']);
 			}
-			// If it's a search for topics in which the user has posted
-			else if ($action == 'show_replies')
-			{
-				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.poster_id='.$pun_user['id'].' GROUP BY t.id'.($db_type == 'pgsql' ? ', t.last_post' : '').' ORDER BY t.last_post DESC') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
+			// If it's a search for posts by a specific user ID
+			else if ($action == 'show_user')
+			{
+				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.poster_id='.$user_id.' GROUP BY t.id') or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
 				$num_hits = $db->num_rows($result);
 
@@ -350,30 +350,4 @@
 					message($lang_search['No user posts']);
 			}
-			// If it's a search for posts by a specific user ID
-			else if ($action == 'show_user_posts')
-			{
-				$show_as = 'posts';
-
-				$result = $db->query('SELECT p.id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON p.topic_id=t.id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.poster_id='.$user_id.' ORDER BY p.posted DESC') or error('Unable to fetch user posts', __FILE__, __LINE__, $db->error());
-				$num_hits = $db->num_rows($result);
-
-				if (!$num_hits)
-					message($lang_search['No user posts']);
-
-				// Pass on the user ID so that we can later know whos posts we're searching for
-				$search_type[2] = $user_id;
-			}
-			// If it's a search for topics by a specific user ID
-			else if ($action == 'show_user_topics')
-			{
-				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'posts AS p ON t.first_post_id=p.id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND p.poster_id='.$user_id.' ORDER BY t.last_post DESC') or error('Unable to fetch user topics', __FILE__, __LINE__, $db->error());
-				$num_hits = $db->num_rows($result);
-
-				if (!$num_hits)
-					message($lang_search['No user topics']);
-
-				// Pass on the user ID so that we can later know whos topics we're searching for
-				$search_type[2] = $user_id;
-			}
 			// If it's a search for subscribed topics
 			else if ($action == 'show_subscriptions')
@@ -382,17 +356,14 @@
 					message($lang_common['Bad request']);
 
-				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'topic_subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$user_id.') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) ORDER BY t.last_post DESC') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1)') or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
 				$num_hits = $db->num_rows($result);
 
 				if (!$num_hits)
 					message($lang_search['No subscriptions']);
-
-				// Pass on user ID so that we can later know whose subscriptions we're searching for
-				$search_type[2] = $user_id;
 			}
 			// If it's a search for unanswered posts
 			else
 			{
-				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=t.forum_id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.num_replies=0 AND t.moved_to IS NULL ORDER BY t.last_post DESC') or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
+				$result = $db->query('SELECT t.id FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.num_replies=0 AND t.moved_to IS NULL') or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
 				$num_hits = $db->num_rows($result);
 
@@ -400,4 +371,7 @@
 					message($lang_search['No unanswered']);
 			}
+
+			// We want to sort things after last post
+			$sort_by = 4;
 
 			$search_ids = array();
@@ -406,4 +380,6 @@
 
 			$db->free_result($result);
+
+			$show_as = 'topics';
 		}
 		else
@@ -413,5 +389,5 @@
 		// Prune "old" search results
 		$old_searches = array();
-		$result = $db->query('SELECT ident FROM '.$db->prefix.'online') or error('Unable to fetch online list', __FILE__, __LINE__, $db->error());
+		$result = $db->query('SELECT ident FROM '.$db->prefix.'online') or error('Impossible de retrouver la liste de utilisateurs en ligne', __FILE__, __LINE__, $db->error());
 
 		if ($db->num_rows($result))
@@ -420,23 +396,24 @@
 				$old_searches[] = '\''.$db->escape($row[0]).'\'';
 
-			$db->query('DELETE FROM '.$db->prefix.'search_cache WHERE ident NOT IN('.implode(',', $old_searches).')') or error('Unable to delete search results', __FILE__, __LINE__, $db->error());
-		}
+			$db->query('DELETE FROM '.$db->prefix.'search_cache WHERE ident NOT IN('.implode(',', $old_searches).')') or error('Impossible de supprimer les rÃ©sultats de recherches', __FILE__, __LINE__, $db->error());
+		}
+
+		// Final search results
+		$search_results = implode(',', $search_ids);
 
 		// Fill an array with our results and search properties
-		$temp = serialize(array(
-			'search_ids'		=> serialize($search_ids),
-			'num_hits'			=> $num_hits,
-			'sort_by'			=> $sort_by,
-			'sort_dir'			=> $sort_dir,
-			'show_as'			=> $show_as,
-			'search_type'		=> $search_type
-		));
+		$temp['search_results'] = $search_results;
+		$temp['num_hits'] = $num_hits;
+		$temp['sort_by'] = $sort_by;
+		$temp['sort_dir'] = $sort_dir;
+		$temp['show_as'] = $show_as;
+		$temp = serialize($temp);
 		$search_id = mt_rand(1, 2147483647);
 
 		$ident = ($pun_user['is_guest']) ? get_remote_address() : $pun_user['username'];
 
-		$db->query('INSERT INTO '.$db->prefix.'search_cache (id, ident, search_data) VALUES('.$search_id.', \''.$db->escape($ident).'\', \''.$db->escape($temp).'\')') or error('Unable to insert search results', __FILE__, __LINE__, $db->error());
-
-		if ($search_type[0] != 'action')
+		$db->query('INSERT INTO '.$db->prefix.'search_cache (id, ident, search_data) VALUES('.$search_id.', \''.$db->escape($ident).'\', \''.$db->escape($temp).'\')') or error('Impossible d\'insÃ©rer les rÃ©sultats de recherche', __FILE__, __LINE__, $db->error());
+
+		if ($action != 'show_new' && $action != 'show_24h')
 		{
 			$db->end_transaction();
@@ -449,13 +426,9 @@
 	}
 
-	$forum_actions = array();
-
-	// If we're on the new posts search, display a "mark all as read" link
-	if (!$pun_user['is_guest'] && $search_type[0] == 'action' && $search_type[1] == 'show_new')
-		$forum_actions[] = '<a href="misc.php?action=markread">'.$lang_common['Mark all as read'].'</a>';
 
 	// Fetch results to display
-	if (!empty($search_ids))
+	if ($search_results != '')
 	{
+		$group_by_sql = '';
 		switch ($sort_by)
 		{
@@ -472,8 +445,27 @@
 				break;
 
+			case 4:
+				$sort_by_sql = 't.last_post';
+				break;
+
 			default:
-				$sort_by_sql = ($show_as == 'topics') ? 't.last_post' : 'p.posted';
+			{
+				$sort_by_sql = ($show_as == 'topics') ? 't.posted' : 'p.posted';
+
+				if ($show_as == 'topics')
+					$group_by_sql = ', t.posted';
+
 				break;
-		}
+			}
+		}
+
+		if ($show_as == 'posts')
+		{
+			$substr_sql = ($db_type != 'sqlite') ? 'SUBSTRING' : 'SUBSTR';
+			$sql = 'SELECT p.id AS pid, p.poster AS pposter, p.posted AS pposted, p.poster_id, '.$substr_sql.'(p.message, 1, 1000) AS message, t.id AS tid, t.poster, t.subject, t.last_post, t.last_post_id, t.last_poster, t.num_replies, t.forum_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE p.id IN('.$search_results.') ORDER BY '.$sort_by_sql;
+		}
+		else
+			$sql = 'SELECT t.id AS tid, t.poster, t.subject, t.last_post, t.last_post_id, t.last_poster, t.num_replies, t.closed, t.forum_id FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id WHERE t.id IN('.$search_results.') GROUP BY t.id, t.poster, t.subject, t.last_post, t.last_post_id, t.last_poster, t.num_replies, t.closed, t.forum_id'.$group_by_sql.' ORDER BY '.$sort_by_sql;
+
 
 		// Determine the topic or post offset (based on $_GET['p'])
@@ -481,18 +473,14 @@
 		$num_pages = ceil($num_hits / $per_page);
 
-		$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
+		$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 		$start_from = $per_page * ($p - 1);
 
 		// Generate paging links
-		$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'search.php?search_id='.$search_id);
-
-		// throw away the first $start_from of $search_ids, only keep the top $per_page of $search_ids
-		$search_ids = array_slice($search_ids, $start_from, $per_page);
-
-		// Run the query and fetch the results
-		if ($show_as == 'posts')
-			$result = $db->query('SELECT p.id AS pid, p.poster AS pposter, p.posted AS pposted, p.poster_id, p.message, p.hide_smilies, t.id AS tid, t.poster, t.subject, t.first_post_id, t.last_post, t.last_post_id, t.last_poster, t.num_replies, t.forum_id, f.forum_name FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE p.id IN('.implode(',', $search_ids).') ORDER BY '.$sort_by_sql.' '.$sort_dir) or error('Unable to fetch search results', __FILE__, __LINE__, $db->error());
-		else
-			$result = $db->query('SELECT t.id AS tid, t.poster, t.subject, t.last_post, t.last_post_id, t.last_poster, t.num_replies, t.closed, t.sticky, t.forum_id, f.forum_name FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id WHERE t.id IN('.implode(',', $search_ids).') ORDER BY '.$sort_by_sql.' '.$sort_dir) or error('Unable to fetch search results', __FILE__, __LINE__, $db->error());
+		$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'search.php?search_id='.$search_id);
+
+
+		$sql .= ' '.$sort_dir.' LIMIT '.$start_from.', '.$per_page;
+
+		$result = $db->query($sql) or error('Impossible de retrouver les rÃ©sultats de recherches', __FILE__, __LINE__, $db->error());
 
 		$search_set = array();
@@ -500,68 +488,14 @@
 			$search_set[] = $row;
 
-		$crumbs_text = array();
-		$crumbs_text['show_as'] = $lang_search['Search'];
-
-		if ($search_type[0] == 'action')
-		{
-			if ($search_type[1] == 'show_user_topics')
-				$crumbs_text['search_type'] = '<a href="search.php?action=show_user_topics&amp;user_id='.$search_type[2].'">'.sprintf($lang_search['Quick search show_user_topics'], pun_htmlspecialchars($search_set[0]['poster'])).'</a>';
-			else if ($search_type[1] == 'show_user_posts')
-				$crumbs_text['search_type'] = '<a href="search.php?action=show_user_posts&amp;user_id='.$search_type[2].'">'.sprintf($lang_search['Quick search show_user_posts'], pun_htmlspecialchars($search_set[0]['pposter'])).'</a>';
-			else if ($search_type[1] == 'show_subscriptions')
-			{
-				// Fetch username of subscriber
-				$subscriber_id = $search_type[2];
-				$result = $db->query('SELECT username FROM '.$db->prefix.'users WHERE id='.$subscriber_id) or error('Unable to fetch username of subscriber', __FILE__, __LINE__, $db->error());
-
-				if ($db->num_rows($result))
-					$subscriber_name = $db->result($result);
-				else
-					message($lang_common['Bad request']);
-
-				$crumbs_text['search_type'] = '<a href="search.php?action=show_subscriptions&amp;user_id='.$subscriber_id.'">'.sprintf($lang_search['Quick search show_subscriptions'], pun_htmlspecialchars($subscriber_name)).'</a>';
-			}
-			else
-				$crumbs_text['search_type'] = '<a href="search.php?action='.$search_type[1].'">'.$lang_search['Quick search '.$search_type[1]].'</a>';
-		}
-		else
-		{
-			$keywords = $author = '';
-
-			if ($search_type[0] == 'both')
-			{
-				list ($keywords, $author) = $search_type[1];
-				$crumbs_text['search_type'] = sprintf($lang_search['By both show as '.$show_as], pun_htmlspecialchars($keywords), pun_htmlspecialchars($author));
-			}
-			else if ($search_type[0] == 'keywords')
-			{
-				$keywords = $search_type[1];
-				$crumbs_text['search_type'] = sprintf($lang_search['By keywords show as '.$show_as], pun_htmlspecialchars($keywords));
-			}
-			else if ($search_type[0] == 'author')
-			{
-				$author = $search_type[1];
-				$crumbs_text['search_type'] = sprintf($lang_search['By user show as '.$show_as], pun_htmlspecialchars($author));
-			}
-
-			$crumbs_text['search_type'] = '<a href="search.php?action=search&amp;keywords='.urlencode($keywords).'&amp;author='.urlencode($author).'&amp;forums='.$search_type[2].'&amp;search_in='.$search_type[3].'&amp;sort_by='.$sort_by.'&amp;sort_dir='.$sort_dir.'&amp;show_as='.$show_as.'">'.$crumbs_text['search_type'].'</a>';
-		}
-
-		$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_search['Search results']);
-		define('PUN_ACTIVE_PAGE', 'search');
+		$db->free_result($result);
+
+		$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_search['Search results'];
 		require PUN_ROOT.'header.php';
+
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="search.php"><?php echo $crumbs_text['show_as'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $crumbs_text['search_type'] ?></strong></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<p class="pagelink"><?php echo $paging_links ?></p>
 	</div>
 </div>
@@ -569,11 +503,13 @@
 <?php
 
+		//Set background switching on for show as posts
+		$bg_switch = true;
+
 		if ($show_as == 'topics')
 		{
-			$topic_count = 0;
 
 ?>
 <div id="vf" class="blocktable">
-	<h2><span><?php echo $lang_search['Search results'] ?></span></h2>
+	<h2><span><?php echo $lang_search['Search results']; ?></span></h2>
 	<div class="box">
 		<div class="inbox">
@@ -581,5 +517,5 @@
 			<thead>
 				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_common['Topic'] ?></th>
+					<th class="tcl" scope="col"><?php echo $lang_common['Topic']; ?></th>
 					<th class="tc2" scope="col"><?php echo $lang_common['Forum'] ?></th>
 					<th class="tc3" scope="col"><?php echo $lang_common['Replies'] ?></th>
@@ -591,87 +527,73 @@
 
 		}
-		else if ($show_as == 'posts')
-		{
-			require PUN_ROOT.'lang/'.$pun_user['language'].'/topic.php';
-
-			require PUN_ROOT.'include/parser.php';
-
-			$post_count = 0;
-		}
-
-		// Get topic/forum tracking data
-		if (!$pun_user['is_guest'])
-			$tracked_topics = get_tracked_topics();
-
-		foreach ($search_set as $cur_search)
-		{
-			$forum = '<a href="viewforum.php?id='.$cur_search['forum_id'].'">'.pun_htmlspecialchars($cur_search['forum_name']).'</a>';
+
+		// Fetch the list of forums
+		$result = $db->query('SELECT id, forum_name FROM '.$db->prefix.'forums') or error('Impossible de retrouver la liste des forums', __FILE__, __LINE__, $db->error());
+
+		$forum_list = array();
+		while ($forum_list[] = $db->fetch_row($result))
+			;
+
+		// Finally, lets loop through the results and output them
+		for ($i = 0; $i < count($search_set); ++$i)
+		{
+			@reset($forum_list);
+			while (list(, $temp) = @each($forum_list))
+			{
+				if ($temp[0] == $search_set[$i]['forum_id'])
+					$forum = '<a href="viewforum.php?id='.$temp[0].'">'.pun_htmlspecialchars($temp[1]).'</a>';
+			}
 
 			if ($pun_config['o_censoring'] == '1')
-				$cur_search['subject'] = censor_words($cur_search['subject']);
+				$search_set[$i]['subject'] = censor_words($search_set[$i]['subject']);
+
 
 			if ($show_as == 'posts')
 			{
-				++$post_count;
-				$icon_type = 'icon';
-
-				if (!$pun_user['is_guest'] && $cur_search['last_post'] > $pun_user['last_visit'] && (!isset($tracked_topics['topics'][$cur_search['tid']]) || $tracked_topics['topics'][$cur_search['tid']] < $cur_search['last_post']) && (!isset($tracked_topics['forums'][$cur_search['forum_id']]) || $tracked_topics['forums'][$cur_search['forum_id']] < $cur_search['last_post']))
-				{
-					$item_status = 'inew';
-					$icon_type = 'icon icon-new';
-					$icon_text = $lang_topic['New icon'];
-				}
-				else
-				{
-					$item_status = '';
-					$icon_text = '<!-- -->';
-				}
+				$icon = '<div class="icon"><div class="nosize">'.$lang_common['Normal icon'].'</div></div>'."\n";
+				$subject = '<a href="viewtopic.php?id='.$search_set[$i]['tid'].'">'.pun_htmlspecialchars($search_set[$i]['subject']).'</a>';
+
+				if (!$pun_user['is_guest'] && $search_set[$i]['last_post'] > $pun_user['last_visit'])
+					$icon = '<div class="icon inew"><div class="nosize">'.$lang_common['New icon'].'</div></div>'."\n";
+
 
 				if ($pun_config['o_censoring'] == '1')
-					$cur_search['message'] = censor_words($cur_search['message']);
-
-				$message = parse_message($cur_search['message'], $cur_search['hide_smilies']);
-				$pposter = pun_htmlspecialchars($cur_search['pposter']);
-
-				if ($cur_search['poster_id'] > 1)
-				{
-					if ($pun_user['g_view_users'] == '1')
-						$pposter = '<strong><a href="profile.php?id='.$cur_search['poster_id'].'">'.$pposter.'</a></strong>';
-					else
-						$pposter = '<strong>'.$pposter.'</strong>';
-				}
+					$search_set[$i]['message'] = censor_words($search_set[$i]['message']);
+
+				$message = str_replace("\n", '<br />', pun_htmlspecialchars($search_set[$i]['message']));
+				$pposter = pun_htmlspecialchars($search_set[$i]['pposter']);
+
+				if ($search_set[$i]['poster_id'] > 1)
+					$pposter = '<strong><a href="profile.php?id='.$search_set[$i]['poster_id'].'">'.$pposter.'</a></strong>';
+
+				if (pun_strlen($message) >= 1000)
+					$message .= ' &hellip;';
+
+				$vtpost1 = ($i == 0) ? ' vtp1' : '';
+
+				// Switch the background color for every message.
+				$bg_switch = ($bg_switch) ? $bg_switch = false : $bg_switch = true;
+				$vtbg = ($bg_switch) ? ' rowodd' : ' roweven';
 
 
 ?>
-<div class="blockpost<?php echo ($post_count % 2 == 0) ? ' roweven' : ' rowodd' ?><?php if ($cur_search['pid'] == $cur_search['first_post_id']) echo ' firstpost' ?><?php if ($post_count == 1) echo ' blockpost1' ?><?php if ($item_status != '') echo ' '.$item_status ?>">
-	<h2><span><span class="conr">#<?php echo ($start_from + $post_count) ?></span> <span><?php if ($cur_search['pid'] != $cur_search['first_post_id']) echo $lang_topic['Re'].' ' ?><?php echo $forum ?></span> <span>Â»&#160;<a href="viewtopic.php?id=<?php echo $cur_search['tid'] ?>"><?php echo pun_htmlspecialchars($cur_search['subject']) ?></a></span> <span>Â»&#160;<a href="viewtopic.php?pid=<?php echo $cur_search['pid'].'#p'.$cur_search['pid'] ?>"><?php echo format_time($cur_search['pposted']) ?></a></span></span></h2>
+<div class="blockpost searchposts<?php echo $vtbg ?>">
+	<h2><?php echo $forum ?>&#160;&raquo;&#160;<?php echo $subject ?>&#160;&raquo;&#160;<a href="viewtopic.php?pid=<?php echo $search_set[$i]['pid'].'#p'.$search_set[$i]['pid'] ?>"><?php echo format_time($search_set[$i]['pposted']) ?></a></h2>
 	<div class="box">
 		<div class="inbox">
-			<div class="postbody">
-				<div class="postleft">
-					<dl>
-						<dt><?php echo $pposter ?></dt>
-<?php if ($cur_search['pid'] == $cur_search['first_post_id']) : ?>						<dd><span><?php echo $lang_topic['Replies'].' '.forum_number_format($cur_search['num_replies']) ?></span></dd>
-<?php endif; ?>
-						<dd><div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo $icon_text ?></div></div></dd>
-					</dl>
-				</div>
-				<div class="postright">
-					<div class="postmsg">
-						<?php echo $message."\n" ?>
-					</div>
-				</div>
-				<div class="clearer"></div>
+			<div class="postleft">
+				<dl>
+					<dt><?php echo $pposter ?></dt>
+					<dd>Replies: <?php echo $search_set[$i]['num_replies'] ?></dd>
+					<dd><?php echo $icon; ?></dd>
+					<dd><p class="clearb"><a href="viewtopic.php?pid=<?php echo $search_set[$i]['pid'].'#p'.$search_set[$i]['pid'] ?>"><?php echo $lang_search['Go to post'] ?></a></p></dd>
+				</dl>
 			</div>
-		</div>
-		<div class="inbox">
-			<div class="postfoot clearb">
-				<div class="postfootright">
-					<ul>
-						<li><span><a href="viewtopic.php?id=<?php echo $cur_search['tid'] ?>"><?php echo $lang_search['Go to topic'] ?></a></span></li>
-						<li><span><a href="viewtopic.php?pid=<?php echo $cur_search['pid'].'#p'.$cur_search['pid'] ?>"><?php echo $lang_search['Go to post'] ?></a></span></li>
-					</ul>
+			<div class="postright">
+				<div class="postmsg">
+					<p><?php echo $message ?></p>
 				</div>
 			</div>
+			<div class="clearer"></div>
 		</div>
 	</div>
@@ -682,40 +604,34 @@
 			else
 			{
-				++$topic_count;
-				$status_text = array();
-				$item_status = ($topic_count % 2 == 0) ? 'roweven' : 'rowodd';
+				$icon = '<div class="icon"><div class="nosize">'.$lang_common['Normal icon'].'</div></div>'."\n";
+
+				$icon_text = $lang_common['Normal icon'];
+				$item_status = '';
 				$icon_type = 'icon';
 
-				$subject = '<a href="viewtopic.php?id='.$cur_search['tid'].'">'.pun_htmlspecialchars($cur_search['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_search['poster']).'</span>';
-
-				if ($cur_search['sticky'] == '1')
-				{
-					$item_status .= ' isticky';
-					$status_text[] = '<span class="stickytext">'.$lang_forum['Sticky'].'</span>';
-				}
-
-				if ($cur_search['closed'] != '0')
-				{
-					$status_text[] = '<span class="closedtext">'.$lang_forum['Closed'].'</span>';
-					$item_status .= ' iclosed';
-				}
-
-				if (!$pun_user['is_guest'] && $cur_search['last_post'] > $pun_user['last_visit'] && (!isset($tracked_topics['topics'][$cur_search['tid']]) || $tracked_topics['topics'][$cur_search['tid']] < $cur_search['last_post']) && (!isset($tracked_topics['forums'][$cur_search['forum_id']]) || $tracked_topics['forums'][$cur_search['forum_id']] < $cur_search['last_post']))
-				{
+
+				$subject = '<a href="viewtopic.php?id='.$search_set[$i]['tid'].'">'.pun_htmlspecialchars($search_set[$i]['subject']).'</a> <span class="byuser">'.$lang_common['by'].'&#160;'.pun_htmlspecialchars($search_set[$i]['poster']).'</span>';
+
+				if ($search_set[$i]['closed'] != '0')
+				{
+					$icon_text = $lang_common['Closed icon'];
+					$item_status = 'iclosed';
+				}
+
+				if (!$pun_user['is_guest'] && $search_set[$i]['last_post'] > $pun_user['last_visit'])
+				{
+					$icon_text .= ' '.$lang_common['New icon'];
 					$item_status .= ' inew';
-					$icon_type = 'icon icon-new';
+					$icon_type = 'icon inew';
 					$subject = '<strong>'.$subject.'</strong>';
-					$subject_new_posts = '<span class="newtext">[ <a href="viewtopic.php?id='.$cur_search['tid'].'&amp;action=new" title="'.$lang_common['New posts info'].'">'.$lang_common['New posts'].'</a> ]</span>';
+					$subject_new_posts = '<span class="newtext">[&#160;<a href="viewtopic.php?id='.$search_set[$i]['tid'].'&amp;action=new" title="'.$lang_common['New posts info'].'">'.$lang_common['New posts'].'</a>&#160;]</span>';
 				}
 				else
 					$subject_new_posts = null;
 
-				// Insert the status text before the subject
-				$subject = implode(' ', $status_text).' '.$subject;
-
-				$num_pages_topic = ceil(($cur_search['num_replies'] + 1) / $pun_user['disp_posts']);
+				$num_pages_topic = ceil(($search_set[$i]['num_replies'] + 1) / $pun_user['disp_posts']);
 
 				if ($num_pages_topic > 1)
-					$subject_multipage = '<span class="pagestext">[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$cur_search['tid']).' ]</span>';
+					$subject_multipage = '[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$search_set[$i]['tid']).' ]';
 				else
 					$subject_multipage = null;
@@ -724,14 +640,14 @@
 				if (!empty($subject_new_posts) || !empty($subject_multipage))
 				{
-					$subject .= !empty($subject_new_posts) ? ' '.$subject_new_posts : '';
+					$subject .= '&#160; '.(!empty($subject_new_posts) ? $subject_new_posts : '');
 					$subject .= !empty($subject_multipage) ? ' '.$subject_multipage : '';
 				}
 
 ?>
-				<tr class="<?php echo $item_status ?>">
+				<tr<?php if ($item_status != '') echo ' class="'.trim($item_status).'"'; ?>>
 					<td class="tcl">
-						<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo forum_number_format($topic_count + $start_from) ?></div></div>
-						<div class="tclcon">
-							<div>
+						<div class="intd">
+							<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo trim($icon_text) ?></div></div>
+							<div class="tclcon">
 								<?php echo $subject."\n" ?>
 							</div>
@@ -739,6 +655,6 @@
 					</td>
 					<td class="tc2"><?php echo $forum ?></td>
-					<td class="tc3"><?php echo forum_number_format($cur_search['num_replies']) ?></td>
-					<td class="tcr"><?php echo '<a href="viewtopic.php?pid='.$cur_search['last_post_id'].'#p'.$cur_search['last_post_id'].'">'.format_time($cur_search['last_post']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_search['last_poster']) ?></span></td>
+					<td class="tc3"><?php echo $search_set[$i]['num_replies'] ?></td>
+					<td class="tcr"><?php echo '<a href="viewtopic.php?pid='.$search_set[$i]['last_post_id'].'#p'.$search_set[$i]['last_post_id'].'">'.format_time($search_set[$i]['last_post']).'</a> '.$lang_common['by'].'&#160;'.pun_htmlspecialchars($search_set[$i]['last_poster']) ?></td>
 				</tr>
 <?php
@@ -752,19 +668,11 @@
 ?>
 <div class="<?php echo ($show_as == 'topics') ? 'linksb' : 'postlinksb'; ?>">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink"><?php echo $paging_links ?></p>
-		</div>
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="search.php"><?php echo $crumbs_text['show_as'] ?></a></li>
-			<li><span>Â»&#160;</span><strong><?php echo $crumbs_text['search_type'] ?></strong></li>
-		</ul>
-<?php echo (!empty($forum_actions) ? "\t\t".'<p class="subscribelink clearb">'.implode(' - ', $forum_actions).'</p>'."\n" : '') ?>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<p class="pagelink"><?php echo $paging_links ?></p>
 	</div>
 </div>
 <?php
 
+		$footer_style = 'search';
 		require PUN_ROOT.'footer.php';
 	}
@@ -774,7 +682,6 @@
 
 
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_search['Search']);
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_search['Search'];
 $focus_element = array('search', 'keywords');
-define('PUN_ACTIVE_PAGE', 'search');
 require PUN_ROOT.'header.php';
 
@@ -799,71 +706,40 @@
 					<legend><?php echo $lang_search['Search in legend'] ?></legend>
 					<div class="infldset">
+						<label class="conl"><?php echo $lang_search['Forum search'] ?>
+						<br /><select id="forum" name="forum">
 <?php
 
-$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Unable to fetch category/forum list', __FILE__, __LINE__, $db->error());
-
-// We either show a list of forums of which multiple can be selected
-if ($pun_config['o_search_all_forums'] == '1' || $pun_user['is_admmod'])
+if ($pun_config['o_search_all_forums'] == '1' || $pun_user['g_id'] < PUN_GUEST)
+	echo "\t\t\t\t\t\t\t".'<option value="-1">'.$lang_search['All forums'].'</option>'."\n";
+
+$result = $db->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url FROM '.$db->prefix.'categories AS c INNER JOIN '.$db->prefix.'forums AS f ON c.id=f.cat_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.redirect_url IS NULL ORDER BY c.disp_position, c.id, f.disp_position', true) or error('Impossible de retrouver la liste des catÃ©gories et des forums', __FILE__, __LINE__, $db->error());
+
+$cur_category = 0;
+while ($cur_forum = $db->fetch_assoc($result))
 {
-	echo "\t\t\t\t\t\t".'<div class="conl multiselect">'.$lang_search['Forum search']."\n";
-	echo "\t\t\t\t\t\t".'<br />'."\n";
-	echo "\t\t\t\t\t\t".'<div class="checklist">'."\n";
-
-	$cur_category = 0;
-	while ($cur_forum = $db->fetch_assoc($result))
+	if ($cur_forum['cid'] != $cur_category)	// A new category since last iteration?
 	{
-		if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
-		{
-			if ($cur_category)
-				echo "\t\t\t\t\t\t\t".'</fieldset>'."\n";
-
-			echo "\t\t\t\t\t\t\t".'<fieldset><legend><span>'.pun_htmlspecialchars($cur_forum['cat_name']).'</span></legend>'."\n";
-			$cur_category = $cur_forum['cid'];
-		}
-
-		echo "\t\t\t\t\t\t\t\t".'<div class="checklist-item"><span class="fld-input"><input type="checkbox" name="forums[]" id="forum-'.$cur_forum['fid'].'" value="'.$cur_forum['fid'].'" /></span> <label for="forum-'.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</label></div>'."\n";
+		if ($cur_category)
+			echo "\t\t\t\t\t\t\t".'</optgroup>'."\n";
+
+		echo "\t\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($cur_forum['cat_name']).'">'."\n";
+		$cur_category = $cur_forum['cid'];
 	}
 
-	echo "\t\t\t\t\t\t\t".'</fieldset>'."\n";
-	echo "\t\t\t\t\t\t".'</div>'."\n";
-	echo "\t\t\t\t\t\t".'</div>'."\n";
+	echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</option>'."\n";
 }
-// ... or a simple select list for one forum only
-else
-{
-	echo "\t\t\t\t\t\t".'<label class="conl">'.$lang_search['Forum search']."\n";
-	echo "\t\t\t\t\t\t".'<br />'."\n";
-	echo "\t\t\t\t\t\t".'<select id="forum" name="forum">'."\n";
-
-	$cur_category = 0;
-	while ($cur_forum = $db->fetch_assoc($result))
-	{
-		if ($cur_forum['cid'] != $cur_category) // A new category since last iteration?
-		{
-			if ($cur_category)
-				echo "\t\t\t\t\t\t\t".'</optgroup>'."\n";
-
-			echo "\t\t\t\t\t\t\t".'<optgroup label="'.pun_htmlspecialchars($cur_forum['cat_name']).'">'."\n";
-			$cur_category = $cur_forum['cid'];
-		}
-
-		echo "\t\t\t\t\t\t\t\t".'<option value="'.$cur_forum['fid'].'">'.pun_htmlspecialchars($cur_forum['forum_name']).'</option>'."\n";
-	}
-
-	echo "\t\t\t\t\t\t\t".'</optgroup>'."\n";
-	echo "\t\t\t\t\t\t".'</select>'."\n";
-	echo "\t\t\t\t\t\t".'<br /></label>'."\n";
-}
 
 ?>
-						<label class="conl"><?php echo $lang_search['Search in']."\n" ?>
-						<br /><select id="search_in" name="search_in">
-							<option value="0"><?php echo $lang_search['Message and subject'] ?></option>
-							<option value="1"><?php echo $lang_search['Message only'] ?></option>
-							<option value="-1"><?php echo $lang_search['Topic only'] ?></option>
+							</optgroup>
 						</select>
 						<br /></label>
-						<p class="clearl"><?php echo $lang_search['Search in info'] ?></p>
-<?php echo ($pun_config['o_search_all_forums'] == '1' || $pun_user['is_admmod'] ? '<p>'.$lang_search['Search multiple forums info'].'</p>' : '') ?>
+						<label class="conl"><?php echo $lang_search['Search in'] ?>
+						<br /><select id="search_in" name="search_in">
+							<option value="all"><?php echo $lang_search['Message and subject'] ?></option>
+							<option value="message"><?php echo $lang_search['Message only'] ?></option>
+							<option value="topic"><?php echo $lang_search['Topic only'] ?></option>
+						</select>
+						<br /></label>
+						<p class="clearb"><?php echo $lang_search['Search in info'] ?></p>
 					</div>
 				</fieldset>
@@ -873,5 +749,5 @@
 					<legend><?php echo $lang_search['Search results legend'] ?></legend>
 					<div class="infldset">
-						<label class="conl"><?php echo $lang_search['Sort by']."\n" ?>
+						<label class="conl"><?php echo $lang_search['Sort by'] ?>
 						<br /><select name="sort_by">
 							<option value="0"><?php echo $lang_search['Sort by post time'] ?></option>
@@ -881,5 +757,5 @@
 						</select>
 						<br /></label>
-						<label class="conl"><?php echo $lang_search['Sort order']."\n" ?>
+						<label class="conl"><?php echo $lang_search['Sort order'] ?>
 						<br /><select name="sort_dir">
 							<option value="DESC"><?php echo $lang_search['Descending'] ?></option>
@@ -887,5 +763,5 @@
 						</select>
 						<br /></label>
-						<label class="conl"><?php echo $lang_search['Show as']."\n" ?>
+						<label class="conl"><?php echo $lang_search['Show as'] ?>
 						<br /><select name="show_as">
 							<option value="topics"><?php echo $lang_search['Show as topics'] ?></option>
@@ -897,5 +773,5 @@
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="search" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /></p>
+			<p><input type="submit" name="search" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /></p>
 		</form>
 	</div>
Index: trunk/web/punbb/style/Air.css
===================================================================
--- trunk/web/punbb/style/Air.css	(revision 10)
+++ 	(revision )
@@ -1,1687 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-html, body, .pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3, .pun h4, .pun h5, .pun pre, .pun blockquote,
-.pun ul, .pun ol, .pun li, .pun dl, .pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun legend .pun img,
-.pun abbr, .pun cite {
-	border: 0;
-	font-style: normal;
-	font-weight: normal;
-	margin: 0;
-	padding: 0;
-}
-
-.pun ul, .pun ol {
-	list-style: none;
-}
-
-.pun select {
-	padding-bottom: 1px;
-	padding-top: 1px;
-}
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 81.25%/1.462em Arial, Helvetica, sans-serif;
-}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun legend {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 1em;
-}
-
-.pun pre, .pun code {
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace;
-	font-size: 1em;
-}
-
-.pun pre code {
-	font-size: 1em;
-}
-
-.pun table {
-	border-collapse: collapse;
-	border-spacing: 0;
-	border: 0;
-	empty-cells: show;
-	width: 100%;
-}
-
-.pun h1 {
-	font:2.154em/1em "Trebuchet MS", Arial, Helvetica, sans-serif;
-	padding: 7px 0;
-}
-
-.pun h2, .pun .hd h2 {
-	font: 1.462em/1em "Trebuchet MS", Arial, Helvetica, sans-serif;
-	padding: 7px 0;
-}
-
-.pun h3 {
-	font-size: 1.154em;
-	line-height: 1.267em;
-	padding: 7px 0;
-}
-
-.pun h4 {
-	font-size: 1.077em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun h5, .pun h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun p, .pun ul, .pun ol, .pun dl, .pun th, .pun td, .pun legend {
-	padding: 7px 0;
-}
-
-.pun strong, .pun th, .pun span.warntext, .pun p.warntext {
-	font-weight: bold;
-}
-
-.pun em {
-	font-style: italic;
-}
-
-.pun a, .pun a:link, .pun a:visited {
-	text-decoration: none;
-}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	text-decoration: underline;
-}
-
-.pun .actions span {
-	padding-left: 16px;
-	padding-right: 8px;
-	background: url(Air/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #debug h2, #brdstats .conl dt, #brdstats .conr dt, #modcontrols dt,
-#searchlinks dt, div.postright h3, .pun .subscribelink span, #announce .hd, #reportform h2, #punmoderate #vf h2,
-#punviewforum #vf h2, .pun .required strong span, .pun .icon div {
-	display: block;
-	overflow: hidden;
-	position: absolute;
-	text-indent: -9999em;
-	width: 0;
-}
-
-/* Generic Float Clear
-----------------------------------------------------------------*/
-
-.pun .inbox, .pun #brdmain, .pun .crumbs, .pun .pagepost, .pun .block2col {
-	min-height: 1px;
-}
-
-* html .pun .inbox, * html .pun #brdmain, * html .pun .infldset, * html .pun .crumbs, * html .pun .pagepost, * html .pun .block2col {
-	display: inline-block;
-}
-
-* html .pun .inbox, * html .pun #bdrdmain, * html .pun .infldset, * html .pun .crumbs, * html .pun .pagepost, * html .pun .block2col {
-	display: block;
-}
-
-.pun .inbox:after, .pun #brdmain:after, .pun .crumbs:after, .pun .pagepost:after, .pun .block2col:after {
-	content: " ";
-	display: block;
-	height: 0;
-	font-size: 0;
-	clear: both;
-	visibility: hidden;
-}
-
-.pun .block2col .inbox:after {
-	content: none;
-	clear: none;
-}
-
-.clearl {
-	clear: left;
-}
-
-
-/*****************************************************************
-2. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-.pun {
-	padding: 30px 40px;
-}
-
-#punredirect, #punmaint {
-	padding: 60px 20% 12px 20%;
-}
-
-#puninstall, #pundb_update {
-	padding: 20px 10%;
-}
-
-.pun .punwrap {
-	border: 1px solid;
-	padding: 18px;
-}
-
-.pun .top-box {
-	height: 18px;
-	margin-bottom: -18px;
-	position: relative;
-	background: url(Air/img/main_top.png) top left no-repeat;
-}
-
-.pun .top-box div {
-	height: 18px;
-	margin-left: 50%;
-	background: url(Air/img/main_top.png) top right no-repeat;
-}
-
-.pun .end-box {
-	margin-top: -17px;
-	height: 18px;
-	position: relative;
-	background: url(Air/img/main_end.png) bottom left no-repeat;
-}
-
-.pun .end-box div {
-	height: 18px;
-	margin-left: 50%;
-	background: url(Air/img/main_end.png) bottom right no-repeat;
-}
-
-#punredirect h2, #punmaint h2 {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-	margin-bottom: 3px;
-}
-
-/* Section Spacing and Borders
-----------------------------------------------------------------*/
-
-#brdmain {
-	border-style: solid none;
-	border-width: 2px 0;
-	margin-bottom: 12px;
-	padding: 12px 0;
-}
-
-#punindex #brdmain {
-	padding-top: 24px;
-}
-
-#punredirect #brdmain, #punmaint #brdmain {
-	border: 0;
-	margin: 0;
-	padding: 0;
-}
-
-#brdstats {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	margin-top: 24px;
-	padding-top: 12px;
-}
-
-#quickpost {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	margin-top: 12px;
-	padding-top: 12px;
-}
-
-#announce {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	padding-top: 3px;
-}
-
-/*****************************************************************
-3. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Logo, Description and Main Menu
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	padding: 0 0 10px 0;
-}
-
-#brddesc {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	padding: 10px 0;
-}
-
-#brddesc p {
-	padding: 0;
-}
-
-#brdmenu ul {
-	padding: 0;
-}
-
-#brdmenu li {
-	float: left;
-}
-
-#brdmenu a:link, #brdmenu a:visited {
-	border-right-style: solid;
-	border-width: 1px;
-	display: block;
-	min-width: 60px;
-	padding: 12px 16px 6px 8px;
-	white-space: nowrap;
-}
-
-#brdmenu a:hover, #brmenu a:active, #brdmenu a:focus {
-	text-decoration: none;
-}
-
-/* Welcome Box
-----------------------------------------------------------------*/
-
-#brdwelcome {
-	padding: 10px 0;
-}
-
-#brdwelcome .conl, #brdwelcome .conr, #brdwelcome p, #brdwelcome li {
-	display: inline;
-	padding: 0;
-}
-
-#brdwelcome .conl {
-  float: left;
-}
-
-#brdwelcome .conr {
-  float: right;
-}
-
-#brdwelcome li span {
-	background: url(Air/img/bull.png) center left no-repeat;
-	padding-left: 18px;
-	margin-right: 3px;
-	display: inline-block;
-	line-height: normal;
-	white-space: nowrap;
-}
-
-#brdwelcome .conl li:first-child span {
-	padding-left: 0;
-	background: none;
-}
-
-/* Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-}
-
-#brdstats #onlinelist {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	clear: both;
-}
-
-#brdstats #onlinelist dt, #brdstats #onlinelist dd {
-	display: inline;
-}
-
-/* Footer
-----------------------------------------------------------------*/
-
-.pun #modcontrols {
-	border-style: none none dotted none;
-	border-width: 0 0 1px 0;
-	margin-bottom: 4px;
-	text-align: center;
-	width: 100%;
-}
-
-.pun #modcontrols dd {
-	display: inline;
-}
-
-.pun #brdfooter #modcontrols dd span {
-	background: url(Air/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #brdfooter .conl {
-	float: left;
-}
-
-.pun #brdfooter .conr {
-	text-align: right;
-	float: right;
-}
-
-.pun #brdfooter #poweredby a {
-	font-size: 1.077em;
-	font-weight: bold;
-}
-
-.pun #brdfooter #qjump {
-	padding-top: 5px;
-}
-
-.pun #brdfooter #qjump * {
-	white-space: nowrap;
-}
-
-.pun #brdfooter #searchlinks dd span {
-	background: url(Air/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #brdfooter #feedlinks {
-	padding-bottom: 0;
-}
-
-.pun #brdfooter #feedlinks span {
-	background: url(Air/img/feed.png) center left no-repeat;
-	display: inline-block;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #debugtime {
-	border-style: dotted none none none;
-	border-width: 1px 0 0 0;
-	margin-top: 7px;
-	text-align: center;
-}
-
-/* Breadcrumbs, Postlink, Pagination
-----------------------------------------------------------------*/
-
-.pun .linkst .inbox, .pun linksb .inbox, .pun .postlinksb .inbox {
-	overflow: hidden;
-}
-
-.pun .linksb, .pun .postlinksb, .pun .linkst, .pun .crumbs {
-	clear: both;
-	position: relative;
-}
-
-.pun .linkst .crumbs {
-	font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
-	font-size: 1.462em;
-	line-height: 1.211em;
-	padding: 7px 0;
-}
-
-.pun .linksb .crumbs, .pun .postlinksb .crumbs {
-	font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
-	font-size: 1.154em;
-}
-
-.pun .linkst .crumbsplus .pagepost {
-	border-top-style: dotted;
-	border-top-width: 1px;
-}
-
-.pun .linksb .crumbsplus .pagepost, .pun .postlinksb .crumbsplus .pagepost {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-}
-
-.pun .postlinksb .crumbs {
-	margin-right: 11em;
-}
-
-.pun .crumbs li {
-	float: left;
-	padding-right: 0.4em;
-	white-space: nowrap;
-}
-
-.pun .crumbs li strong {
-	font-weight: normal;
-}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-}
-
-.pun .pagelink strong, .pun .pagelink a, .pun .pagelink span.spacer {
-	border-style: none none none solid;
-	border-width: 0 0 0 1px;
-	display: inline-block;
-	padding: 0 12px 0 10px;
-	margin-right: -6px;
-}
-
-.pun .pagelink .item1 {
-	border: 0;
-}
-
-.pun .pagelink .pages-label {
-	display: inline-block;
-}
-
-.pun .postlink {
-	float: right;
-	font-weight: bold;
-	text-align: right;
-}
-
-.pun .modbuttons {
-	float: right;
-	padding: 5px 0 3px 0;
-}
-
-.pun .modbuttons input {
-	margin-left: 8px;
-}
-
-.pun .subscribelink {
-	position: absolute;
-	right: 0;
-	text-align: right;
-	top: 33px;
-}
-
-#punindex .subscribelink {
-	top: 0px;
-}
-
-#punindex .linksb {
-	height: 12px;
-}
-
-/*****************************************************************
-4. MAIN TABLES
-*****************************************************************/
-
-.pun #brdmain .blocktable {
-	position: relative;
-}
-
-#punindex #brdmain .blocktable h2, #punsearch #vf h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	font-weight: bold;
-	margin: 1px 1px 0 1px;
-	padding-left: 8px;
-	position: absolute;
-	left: 0;
-	white-space: nowrap;
-	z-index: 100;
-}
-
-#punindex .blocktable th.tcl, #punsearch #vf th.tcl {
-	font-size: 0;
-	text-indent: -9999em;
-}
-
-.pun .blocktable .box {
-	border-style: solid;
-	border-width: 1px;
-	margin-bottom: -1px;
-	overflow: hidden;
-	position: relative;
-}
-
-* html .pun .blocktable .box {
-	display: inline-block;
-}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	margin-bottom: -1px;
-}
-
-.pun .blocktable th {
-	padding: 7px 8px;
-	border-style: none none solid none;
-	border-width: 1px;
-	text-align: left;
-}
-
-.pun .blocktable td {
-	padding: 7px 8px;
-	line-height: 1.3077em;
-	border-style: none none solid none;
-	border-width: 1px;
-	text-align: left;
-}
-
-.pun .blocktable h3 {
-	font-size: 1.077em;
-	font-weight: bold;
-	padding: 0;
-}
-
-.pun .blocktable p {
-	padding: 0;
-}
-
-.pun .blocktable .tcl p {
-	padding: 5px 0 0 0;
-}
-
-.pun .blocktable .tcl {
-	width: auto;
-}
-
-.pun .blocktable .tc2, .pun .blocktable .tc3, .pun .blocktable .tcmod {
-	padding-left: 0;
-	padding-right: 0;
-	text-align: center;
-	width: 11%;
-}
-
-.pun .blocktable .tcr {
-	width: 30%;
-}
-
-.pun .blocktable td .newtext, .pun .blocktable td .pagestext, .pun .blocktable td .byuser {
-	white-space: nowrap;
-}
-
-.pun .blocktable .tcl h3 span.newtext {
-	font-size: 0.929em;
-	font-weight: normal;
-}
-
-.pun #vf td.tcl span.stickytext, .pun #vf td.tcl span.closedtext {
-	font-size: 1em;
-	font-weight: bold;
-}
-
-#punsearch #vf .tc2 {
-	padding-left: 8px;
-	padding-right: 8px;
-	text-align: left;
-	width: 18%;
-}
-
-#users1 .tcr {
-	width: 25%;
-}
-
-#users1 .tc2 {
-	padding-left: 8px;
-	padding-right: 8px;
-	text-align: left;
-	width: 25%;
-}
-
-#debug {
-	margin-top: 12px;
-}
-
-#debug .tcl {
-	width: 10%;
-}
-
-#punredirect #debug .tcl, #punmaint #debug .tcl {
-	width: 20%;
-}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-}
-
-#punindex .tcr .byuser {
-	display: block
-}
-
-#punindex td.tc2, #punindex td.tc3, #punindex td.tcr, .pun #vf td.tc2, .pun #vf td.tc3,
-.pun #vf td.tcr, #punindex td.tcl div.forumdesc, .pun #vf td.tcl span {
-	font-size: 0.923em;
-}
-
-.pun #vf td.tcl a {
-	font-weight: bold;
-}
-
-.pun #vf td.tcl span a {
-	font-weight: normal;
-}
-
-.pun .blocktable .tclcon {
-	height: 1%;
-	min-height: 1px;
-	overflow: hidden;
-	padding: 0 11px 0 12px;
-	position: relative;
-}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-}
-
-.pun .icon {
-	border-style: solid;
-	border-width: 8px;
-	float: left;
-	height: 0;
-	overflow: hidden;
-	width: 0;
-}
-
-.pun .iposted .ipost {
-	font-weight: bold;
-	left: 0;
-	padding-left: 4px;
-	position: absolute;
-	text-align: center;
-	top: 0;
-	width: 8px;
-}
-
-/*****************************************************************
-MAIN POSTS
-*****************************************************************/
-
-/* Structure
-----------------------------------------------------------------*/
-
-.pun .blockpost {
-	border-style: solid;
-	border-width: 1px;
-	margin-bottom: -1px;
-	overflow: hidden;
-	position: relative;
-}
-
-* html .pun .blockpost {
-	display: inline-block;
-}
-
-.pun .blockpost h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	white-space: nowrap;
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	height: 1.462em;
-	padding: 0.538em 8px 0.538em 236px;
-	font-weight: normal;
-}
-
-#punsearch .blockpost h2 {
-	height: auto;
-	padding-left: 36px;
-	white-space: normal;
-}
-
-#punsearch .blockpost h2 span span {
-	white-space: nowrap;
-	display: inline-block;
-	font: 1.077em "Trebuchet MS", Arial, Helvetica, sans-serif
-}
-
-#punsearch .blockpost .icon {
-	position: absolute;
-	top: 0;
-	margin-top: -2.154em;
-}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-}
-
-.pun .blockpost .inbox {
-	float: right;
-	position: relative;
-	width: 100%;
-}
-
-.pun .blockpost .postbody, .pun .blockpost .postfoot {
-	border-left-style: solid;
-	border-left-width: 1px;
-	float: right;
-	margin-right: -218px;
-	position: relative;
-	text-align: left;
-	width: 100%;
-}
-
-.pun .blockpost .postleft, .pun .blockpost .postfootleft {
-	width: 194px;
-	padding: 7px 12px 7px 12px;
-	float: left;
-	margin-left: -218px;
-	position: relative;
-}
-
-.pun .blockpost .postleft dl {
-	padding: 0;
-}
-
-#punviewtopic .blockpost dt, #punmoderate .blockpost dt {
-	display: block;
-	position: absolute;
-	padding: 0.538em 0 0.538em 12px;
-	height: 1.462em;
-	top: -2.615em;
-	left: 0;
-	overflow: hidden;
-	width: 206px;
-}
-
-.pun .blockpost dt strong {
-	font-size: 1.231em;
-	font-weight: bold;
-}
-
-.pun .blockpost .postleft dd {
-	font-size: 0.923em;
-}
-
-.pun .blockpost .postleft .usertitle {
-	padding: 4px 0 6px 0;
-	font-size: 1em;
-}
-
-.pun .blockpost .postleft .postavatar {
-	display: block;
-	margin: 0 0 4px 0;
-}
-
-.pun .blockpost .postright {
-	position: relative;
-	padding: 4px 230px 7px 18px;
-}
-
-.pun .postmsg {
-	width:100%;
-	overflow: hidden;
-	word-wrap: break-word;
-}
-
-.pun .blockpost .postfootright {
-	position: relative;
-	padding: 7px 230px 7px 18px;
-	text-align: right;
-}
-
-.pun .postfoot p, .pun .postfoot ul {
-	padding: 0;
-}
-
-.pun .blockpost .postfootright li {
-	display: inline;
-}
-
-.pun .blockpost .postfootright li span {
-	display: inline-block;
-	padding-left: 16px;
-	margin-left: 8px;
-	line-height: normal;
-	background: url(Air/img/bull.png) center left no-repeat;
-}
-
-.pun .blockpost .usercontacts {
-	padding: 7px 0;
-}
-
-.pun .blockpost .usercontacts .email {
-	background: url(Air/img/email.png) left 65% no-repeat;
-	margin-right: 5px;
-	padding-left: 21px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun .blockpost .usercontacts .website {
-	background: url(Air/img/ext.png) left 65% no-repeat;
-	padding-left: 18px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun .postsignature hr {
-	border:none;
-	height: 1px;
-	margin-left: 0px;
-	text-align: left;
-}
-
-/* Content (includes other user content)
-----------------------------------------------------------------*/
-
-.pun .usercontent {
-	padding: 7px 0;
-}
-
-.pun .postmsg p, .pun .postmsg li, #punhelp p samp {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-}
-
-.pun .usercontent h1, .pun .usercontent h2, .pun .usercontent h3,
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	padding: 7px 0 0 0;
-}
-
-.pun .postmsg h5, #punhelp h5 {
-	font-size: 1.231em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	list-style: disc;
-	padding: 4px 13px 4px 30px;
-}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	list-style: decimal;
-	padding: 4px 13px 4px 30px;
-}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha;
-}
-
-.pun .usercontent li, .pun .postmsg li {
-	padding: 0 3px;
-}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0;
-}
-
-.pun span.bbu {
-	text-decoration: underline;
-}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-}
-
-.pun .blockpost .postmsg .postedit {
-	font-size: 0.857em;
-}
-
-.pun .blockform .postsignature, .pun .blockpost .postsignature {
-	font-size: 0.923em;
-}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px 1px 1px 3px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	font-weight: bold;
-	line-height: 1.462em;
-}
-
-.pun .quotebox blockquote {
-	overflow: hidden;
-	width: 100%;
-}
-
-.pun .codebox pre {
-	overflow-y:hidden;
-	overflow: auto;
-	width: 100%;
-	direction: ltr;
-	text-align: left;
-}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-}
-
-*:first-child+html .pun .codebox pre {
-	padding-bottom: 10px;
-}
-
-.pun .codebox pre code {
-	padding: 0.75em;
-	white-space: pre;
-}
-
-.pun div[class*=codebox] pre code {
-	display: inline-block;
-}
-
-* html .pun .codebox pre code {
-	display: block;
-}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-}
-
-.pun .postmsg img, #punhelp samp img {
-	vertical-align: text-top;
-}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-/*****************************************************************
-MAIN FORMS
-*****************************************************************/
-
-#punedit .blockform h2, #punpost .blockform h2, #postpreview h2, #posterror h2,
-.pun #quickpost h2, .pun #reportform h2, #pundelete .blockform h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	font-weight: bold;
-	white-space: nowrap;
-	padding: 10px 19px 4px 37px;
-	border: 0;
-}
-
-#punpost .blockform h2, #punedit .blockform h2,.pun #quickpost h2,
-#pundelete .blockform h2 {
-	margin: 1px 1px 0 1px;
-	width: 25em;
-	position: absolute;
-	z-index: 100;
-}
-
-.pun #quickpost legend, #punpost legend, #punedit legend {
-	width: 25em;
-	overflow: hidden;
-	white-space: nowrap;
-}
-
-.pun .blockform .box {
-	border-style: solid;
-	border-width: 1px;
-	padding-bottom: 12px;
-}
-
-.pun #posterror {
-	border-style: solid;
-	border-width: 1px;
-}
-
-.pun #posterror .box {
-	padding: 0 18px 12px 18px;
-}
-
-* html .pun .blockform .box, * html .pun #posterror {
-	display: inline-block;
-}
-
-.pun .blockform .forminfo, .pun .error-info {
-	padding: 12px 18px;
-	border-style: solid;
-	border-width: 1px;
-	position: relative;
-}
-
-.pun .blockform .forminfo {
-	margin-top: 12px;
-}
-
-#pundelete .blockform .forminfo {
-	margin-top: 33px;
-}
-
-.pun .forminfo h3 {
-	padding-bottom: 0;
-}
-
-.pun .error-list li {
-	padding-left: 24px;
-	background: url(Air/img/exclaim.png) center left no-repeat;
-}
-
-.pun .inform {
-	padding: 0 18px;
-}
-
-.pun legend {
-	font-weight: bold;
-	padding: 10px 19px 4px 19px;
-}
-
-* html .pun legend {
-	margin-left: -7px;
-}
-
-*:first-child+html .pun legend {
-	margin-left: -7px;
-}
-
-.pun .infldset {
-	border-style: solid;
-	border-width: 1px;
-	padding: 12px 18px;
-}
-
-#punregister #rules .infldset {
-	padding: 5px 18px;
-}
-
-.pun fieldset p {
-	padding: 0 0 7px 0;
-	width: 100%;
-}
-
-.pun fieldset .usercontent p {
-	padding: 7px 0;
-}
-
-.pun fieldset label {
-	display: block;
-	padding: 0 0 7px 0;
-}
-
-.pun label em {
-	font-weight: normal;
-	font-style: normal;
-}
-
-.pun .required strong {
-	background: url(Air/img/asterisk.png) center right no-repeat;
-	font-weight: normal;
-	padding-right: 14px;
-	white-space: pre;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun label input, .pun label select, .pun label textarea {
-	margin-top: 2px;
-}
-
-.pun label.conl {
-	display: inline-block;
-	padding-right: 12px;
-}
-
-.pun form .buttons {
-	padding: 8px 19px 8px 34px;
-	margin-bottom: -12px;
-}
-
-.pun .blockform .buttons input {
-	margin-right: 12px;
-}
-
-.pun .rbox {
-	padding: 3px 0;
-}
-
-.pun .rbox label {
-	padding: 3px 0 3px 1.75em;
-	position: relative;
-	min-height: 1px;
-}
-
-* html .pun .rbox label {
-	text-indent: -3px;
-	height: 1%;
-}
-
-.pun .rbox input {
-	margin: 3px 0.75em 3px -1.75em;
-	float: left;
-	position: relative;
-	vertical-align: middle;
-	padding: 0;
-	height: 1em;
-	width: 1em;
-}
-
-.pun input[type=text], .pun select, .pun textarea {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 98%;
-}
-
-.pun #quickpost .txtarea {
-	padding-right: 12px;
-	position: relative;
-}
-
-.pun .blockform .bblinks {
-	padding-top: 0;
-}
-
-.pun .blockform .bblinks li {
-	display: inline;
-}
-
-.pun .blockform .bblinks li span {
-	background: url(Air/img/help.png) center left no-repeat;
-	margin-right: 8px;
-	padding-left: 20px;
-	display: inline-block;
-}
-
-.pun #quickpost .bblinks {
-	padding-top: 0;
-}
-
-.pun #quickpost .bblinks li {
-	display: inline;
-}
-
-.pun #login p.clearb {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	font-size: 0;
-	height: 0;
-	line-height: 0;
-	margin-top: 7px;
-	overflow: hidden;
-	padding-bottom: 3px;
-	padding-top: 7px;
-	text-indent: -9999em;
-	width: 100%;
-}
-
-.pun #postreview {
-	padding-top: 12px;
-}
-
-.pun #postpreview, .pun #posterror {
-	margin-bottom: 12px;
-}
-
-.pun #postpreview .postright {
-	padding: 0;
-}
-
-.pun #postpreview .postbody {
-	border-style: solid;
-	border-width: 1px;
-	float: none;
-	margin: 0 18px 12px 18px;
-	padding: 0;
-	padding: 4px 18px 4px 18px;
-	width: auto;
-}
-
-.pun span.email {
-	background: url(Air/img/email.png) left 65% no-repeat;
-	margin-right: 5px;
-	padding-left: 21px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun span.website {
-	background: url(Air/img/ext.png) left 65% no-repeat;
-	padding-left: 18px;
-	display: inline-block;
-	line-height: normal;
-}
-
-#punmisc #rules .box {
-	border-style: solid;
-	border-width: 1px;
-	padding: 5px 18px;
-}
-
-
-#punhelp .box {
-	border-style: solid;
-	border-width: 1px;
-	padding: 7px 12px;
-}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.25em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-}
-
-.pun .checklist legend {
-	padding: 0;
-}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-}
-
-.pun .checklist .checklist-item {
-	position: relative;
-}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 1.75em;
-}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.55em;
-	width: 1.55em;
-}
-
-/*****************************************************************
-PROFILES (+ ADMIN MENU)
-*****************************************************************/
-
-/* Profile / Admin
-----------------------------------------------------------------*/
-
-.pun .blockmenu {
-	width: 13em;
-	float: left;
-	padding-bottom: 12px;
-}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 15em;
-}
-
-.pun .blockmenu .block2 {
-	padding-top: 19px;
-}
-
-.pun .blockmenu ul {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	padding: 0;
-}
-
-.pun .blockmenu li {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-	font-weight: bold;
-	padding: 0;
-}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	display: block;
-	padding: 9px 6px 3px 6px;
-	min-height: 1px;
-	text-decoration: none;
-}
-
-* html .pun .blockmenu a:link,  * html .pun .blockmenu a:visited {
-	height: 1%;
-}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active, .pun .blockmenu a:focus {
-	text-decoration: none;
-}
-
-#viewprofile .box {
-	border-style: solid;
-	border-width: 1px;
-	padding-bottom: 18px;
-}
-
-#viewprofile dt, #adstats dt {
-	padding: 7px 0;
-	position: absolute;
-	width: 13em;
-	left: 0;
-}
-
-#viewprofile dl {
-	border-style: solid none none none;
-	border-width: 1px;
-	margin: 7px 0;
-	padding: 0;
-	width: 100%;
-	position: relative;
-}
-
-#adintro, #adstats {
-	border-style: solid;
-	border-width: 1px;
-	padding: 18px;
-}
-
-#adintro li span {
-	display: inline-block;
-	padding-left: 16px;
-	margin-left: 8px;
-	line-height: normal;
-	background: url(Air/img/bull.png) center left no-repeat;
-}
-
-#adstats .inbox, #adintro .inbox {
-	border-style: solid;
-	border-width: 1px;
-	padding: 18px;
-}
-
-#adstats dl {
-	margin: 0;
-	padding: 0;
-	width: 100%;
-	position: relative;
-}
-
-#viewprofile dd, #adstats dd {
-	border-style: none none solid none;
-	border-width: 1px;
-	padding: 7px 0 7px 13em;
-}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Basic defaults and Common Items
-----------------------------------------------------------------*/
-
-html, body, .pun {
-	background: #f6f9fc;
-	color: #333;
-}
-
-.pun .punwrap {
-	background: #fff;
-	border-color: #cad7e1;
-	color: #566579;
-}
-
-#brdtitle #brddesc, .pun .pagepost, #brdstats #onlinelist, #brdfooter #searchlinks, #brdfooter #modcontrols,
-#punmaint h2, #punredirect h2, #adminconsole .submittop, .pun #debugtime, .pun .pagelink a, .pun .pagelink * {
-	border-color: #b9c5ce;
-}
-
-.pun a, .pun a:link, .pun a:visited {
-	color: #2365B0;
-}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #b50000;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #22538a;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #b50000;
-}
-
-/* Primary Navigation
-----------------------------------------------------------------*/
-
-#brdmenu {
-	background: #44699c;
-}
-
-#brdmenu a, #brdmenu a:link, #brdmenu a:visited {
-	background: #44699c;
-	border-color: #fff;
-	color: #d4dae2;
-}
-
-#brdmenu a:hover, #brdmenu a:active, #brdmenu a:focus {
-	background: #b50000;
-	border-color: #fff;
-	color: #fff;
-}
-
-/* Main Tables
-----------------------------------------------------------------*/
-
-.pun .blocktable .box {
-	background: #fcfdfe;
-	border-color: #b9c5ce #d9e1e7;
-}
-
-#punindex .blocktable h2, .pun #vf h2 {
-	color: #357082;
-}
-
-#adminconsole fieldset th, #adminconsole fieldset td {
-	background: #f6f9fc;
-	border-color: #dfe6ee;
-}
-
-.pun #users1 h2 {
-	background: #fff;
-}
-
-.pun .blocktable td {
-	border-color: #dfe6ee;
-}
-
-.pun .blocktable th {
-	background: #ebf1f5;
-	border-color: #cad7e1;
-	color: #357082;
-}
-
-.pun .blocktable td.tcl span.stickytext {
-	color: #3399CC;
-}
-
-/* Main Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost {
-	background: #f6f9fc;
-	border-color: #b9c5ce #d9e1e7;
-}
-
-.pun .blockpost h2 {
-	background: #ebf1f5;
-	border-color: #cad7e1;
-	color: #357082;
-}
-
-.pun .blockpost .postbody, .pun .blockpost .postfoot {
-	background: #fcfdfe;
-	border-color: #dfe6ee;
-}
-
-.pun .blockpost .postfootright li {
-	color: #fcfdfe;
-}
-
-.pun .postmsg, #punhelp code, #punhelp samp {
-	color: #333;
-}
-
-.pun .postsignature, .pun .postmsg .postedit {
-	color: #566579;
-}
-
-.pun .quotebox {
-	background: #f8f9f0;
-	border-color: #7aadbd;
-	color: #566579;
-}
-
-.pun .quotebox cite {
-	color: #357082;
-}
-
-.pun .codebox, #punhelp .codebox code {
-	background: #333;
-	color: #fff;
-}
-
-.pun .postmsg hr {
-	background: #b9c5ce;
-}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-}
-
-/* Main Forms + Profile
-----------------------------------------------------------------*/
-
-.pun .blockform .box, #adstats, #adintro, #postpreview, #posterror {
-	border-color: #b9c5ce #d9e1e7;
-	background: #ebf1f5;
-}
-
-#punmisc #rules .box, #punhelp .box {
-	border-color: #b9c5ce #d9e1e7;
-	background: #f6f9fc;
-}
-
-.pun #quickpost h2, #punpost .blockform h2, #punedit .blockform h2, #posterror h2,
-#pundelete .blockform h2 {
-	background: #ebf1f5;
-	color: #357082;
-}
-
-.pun .forminfo {
-	background: #fff;
-	border-color: #dfe6ee;
-}
-
-#puninstall form#install .forminfo {
-	background: #44699c;
-	color: #fff;
-}
-
-.pun #posterror .error-info {
-	background: #ffffe1;
-	border-color: #dfe6ee;
-}
-
-#puninstall form#install .error-info {
-	background: #ffffe1;
-	border-color: #dfe6ee;
-	color: #333;
-}
-
-.pun .infldset, #adintro .inbox, #adstats .inbox {
-	background: #f6f9fc;
-	border-color: #dfe6ee;
-}
-
-.pun label, .pun legend, #adminconsole fieldset th {
-	color: #357082;
-}
-
-.pun fieldset p {
-	border-color: #b9c5ce;
-}
-
-.pun .blockmenu ul, .pun .blockmenu li {
-	border-color: #b9c5ce;
-}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active, .pun .blockmenu a:focus {
-	background: #ffffe6;
-}
-
-.pun .blockmenu .isactive a:link, .pun .blockmenu .isactive a:visited {
-	color: #333;
-	background: #f6f9fc;
-	}
-
-.pun #viewprofile .box {
-	border-color: #b9c5ce #d9e1e7;
-	background: #ebf1f5;
-}
-
-.pun #viewprofile dt, #adstats dt {
-	color: #357082;
-}
-
-.pun #viewprofile dl, .pun #viewprofile dd, #adstats dl, #adstats dd {
-	border-color: #dfe6ee;
-}
-
-#adminconsole fieldset td.nodefault {
-	background: #d59b9b;
-}
-
-.pun .multiselect {
-	color: #357082;
-}
-
-.pun .checklist {
-	background: white;
-	border-color: #ccc;
-}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #e8ecf1 #d4d9dd #dfe3e8 #e8ecf1;
-}
-
-.pun .iredirect .icon {
-	border-color: #b9c5ce;
-	border-width: 1px;
-	padding: 7px;
-}
-
-.pun .inew .icon {
-	border-color: #91b3d9 #87a8d1 #6c85bb #7292c3;
-}
Index: trunk/web/punbb/style/Cobalt.css
===================================================================
--- trunk/web/punbb/style/Cobalt.css	(revision 10)
+++ 	(revision )
@@ -1,1171 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3, span.closedtext,
-.pun .required strong span {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 68.75%/1.4545em Verdana, Helvetica, Arial, sans-serif;
-	line-height: normal;
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: verdana, helvetica, arial, sans-serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1em;
-	font-weight: normal;
-	padding: 4px 6px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.75em 0
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-html, body {
-	margin: 0;
-	padding: 0
-	}
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#brdtitle p {
-	padding-top: 0px
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .blockpost {
-	margin-bottom: -1px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-#brdheader .box {
-	border-top-width: 4px;
-	}
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu li {
-	display: inline;
-	margin-right: 12px;
-	}
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none
-	}
-
-#brdmenu a:hover, #brdmenu a:active {
-	text-decoration: underline
-	}
-
-#brdwelcome .conl {
-	float: left;
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-	}
-
-.pun .postlink {
-	font-weight: bold;
-	white-space: nowrap;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	text-decoration: none
-	}
-
-.pun .postlink a:hover, .pun .postlink a:active {
-	text-decoration: underline;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin:0 6px;
-	}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td, .pun th {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .tcl h3 span.newtext {
-	font-size: 0.917em;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap;
-	font-weight: normal;
-	}
-
-.pun td span.byuser {
-	white-space: nowrap;
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	margin: 0.1em 0 0 0.2em;
-	border-width: 0.6em;
-	border-style: solid;
-	height: 0;
-	width: 0;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-.pun .blockform form, .pun .fakeform {
-	PADDING: 20px 20px 15px 20px
-	}
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-.pun .inform {
-	padding-bottom: 12px
-	}
-
-.pun fieldset {
-	padding: 0px 12px 0px 12px;
-	border-style: solid;
-	border-width: 1px
-	}
-
-.pun legend {
-	padding: 0px 6px
-	}
-
-.pun .infldset {
-	padding: 9px 0px 12px 0
-	}
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 75%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 12px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun p.actions span {
-	margin-right: 12px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.3em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist fieldset {
-	border: 0;
-	padding: 0;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	margin: .2em 0;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 2.1em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.15em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 10px 6px 5px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-	}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-#debugtime {
-	margin-top: -12px;
-	text-align: center;
-	}
-
-#brdwelcome, #brdfooter dl a, div.blockmenu li, div.rbox input {
-	line-height: 1.4em
-	}
-
-#announce div.inbox div {
-	padding: 3px 0
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #2a2a2a;
-	color: #d4d4d4
-	}
-
-.pun {
-	color: #d4d4d4
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #383838
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#brdfooter #modcontrols, #adminconsole fieldset td, .pun .blockmenu .box, #adstats dd {
-	background-color: #424242
-	}
-
-.pun h2, #brdmenu {
-	background-color: #565656;
-	color: #d4d4d4
-	}
-
-.pun th {
-	background-color: #484848
-	}
-
-.pun legend {
-	color: #60a0dc
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #d4d4d4
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #d4d4d4
-	}
-
-.pun textarea, .pun input, .pun select {
-	background-color: #2a2a2a;
-	color: #d4d4d4
-	}
-
-.pun .multiselect, .pun .checklist {
-	color: #D4D4D4;
-	}
-
-.pun .checklist {
-	border-color: #666;
-	}
-
-/* Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #383838
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #424242
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #424242
-	}
-
-.pun .blockpost h2 {
-	background-color: #565656
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #a19e96
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-.pun hr {
-	background-color: #606060;
-	color: #606060
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-color:#565656
-	}
-
-.pun td, #brdfooter #modcontrols {
-	border-color: #565656
-	}
-
-.pun th {
-	border-color: #484848
-	}
-
-.pun fieldset {
-	border-color: #606060
-	}
-
-#adminconsole td, #adminconsole th {
-	border-color: #383838
-	}
-
-.pun .quotebox, .pun .codebox, .pun .forminfo,
-.pun .blockpost label, .pun .deletemsg {
-	border-color: #606060
-	}
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #60a0dc
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #80d6ff
-	}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #60a0dc;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #80d6ff;
-}
-
-.pun h2 a:link, .pun h2 a:visited,
-#brdmenu a:link, #brdmenu a:visited {
-	color: #d4d4d4
-	}
-
-.pun h2 a:hover, .pun h2 a:active,
-#brdmenu a:hover, #brdmenu a:active {
-	color: #d4d4d4
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #ff4000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #ff5010
-	}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #484848 #404040 #3c3c3c #444444
-	}
-
-.pun .iredirect .icon {
-	border-color: #383838 #383838 #383838 #383838
-	}
-
-.pun .inew .icon {
-	border-color: #5496d8 #4b85c0 #4377ac #4f8dcb
-	}
Index: trunk/web/punbb/style/Earth.css
===================================================================
--- trunk/web/punbb/style/Earth.css	(revision 10)
+++ 	(revision )
@@ -1,1686 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-html, body, .pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3, .pun h4, .pun h5, .pun pre, .pun blockquote,
-.pun ul, .pun ol, .pun li, .pun dl, .pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun legend .pun img,
-.pun abbr, .pun cite {
-	border: 0;
-	font-style: normal;
-	font-weight: normal;
-	margin: 0;
-	padding: 0;
-}
-
-.pun ul, .pun ol {
-	list-style: none;
-}
-
-.pun select {
-	padding-bottom: 1px;
-	padding-top: 1px;
-}
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 81.25%/1.462em Arial, Helvetica, sans-serif;
-}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun legend {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 1em;
-}
-
-.pun pre, .pun code {
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace;
-	font-size: 1em;
-}
-
-.pun pre code {
-	font-size: 1em;
-}
-
-.pun table {
-	border-collapse: collapse;
-	border-spacing: 0;
-	border: 0;
-	empty-cells: show;
-	width: 100%;
-}
-
-.pun h1 {
-	font:2.154em/1em "Trebuchet MS", Arial, Helvetica, sans-serif;
-	padding: 7px 0;
-}
-
-.pun h2, .pun .hd h2 {
-	font: 1.462em/1em "Trebuchet MS", Arial, Helvetica, sans-serif;
-	padding: 7px 0;
-}
-
-.pun h3 {
-	font-size: 1.154em;
-	line-height: 1.267em;
-	padding: 7px 0;
-}
-
-.pun h4 {
-	font-size: 1.077em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun h5, .pun h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun p, .pun ul, .pun ol, .pun dl, .pun th, .pun td, .pun legend {
-	padding: 7px 0;
-}
-
-.pun strong, .pun th, .pun span.warntext, .pun p.warntext {
-	font-weight: bold;
-}
-
-.pun em {
-	font-style: italic;
-}
-
-.pun a, .pun a:link, .pun a:visited {
-	text-decoration: none;
-}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	text-decoration: underline;
-}
-
-.pun .actions span {
-	padding-left: 16px;
-	padding-right: 8px;
-	background: url(Earth/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #debug h2, #brdstats .conl dt, #brdstats .conr dt, #modcontrols dt,
-#searchlinks dt, div.postright h3, .pun .subscribelink span, #announce .hd, #reportform h2, #punmoderate #vf h2,
-#punviewforum #vf h2, .pun .required strong span, .pun .icon div {
-	display: block;
-	overflow: hidden;
-	position: absolute;
-	text-indent: -9999em;
-	width: 0;
-}
-
-/* Generic Float Clear
-----------------------------------------------------------------*/
-
-.pun .inbox, .pun #brdmain, .pun .crumbs, .pun .pagepost, .pun .block2col {
-	min-height: 1px;
-}
-
-* html .pun .inbox, * html .pun #brdmain, * html .pun .infldset, * html .pun .crumbs, * html .pun .pagepost, * html .pun .block2col {
-	display: inline-block;
-}
-
-* html .pun .inbox, * html .pun #bdrdmain, * html .pun .infldset, * html .pun .crumbs, * html .pun .pagepost, * html .pun .block2col {
-	display: block;
-}
-
-.pun .inbox:after, .pun #brdmain:after, .pun .crumbs:after, .pun .pagepost:after, .pun .block2col:after {
-	content: " ";
-	display: block;
-	height: 0;
-	font-size: 0;
-	clear: both;
-	visibility: hidden;
-}
-
-.pun .block2col .inbox:after {
-	content: none;
-	clear: none;
-}
-
-.clearl {
-	clear: left;
-}
-
-/*****************************************************************
-2. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-.pun {
-	padding: 30px 40px;
-}
-
-#punredirect, #punmaint {
-	padding: 60px 20% 12px 20%;
-}
-
-#puninstall, #pundb_update {
-	padding: 20px 10%;
-}
-
-.pun .punwrap {
-	border: 1px solid;
-	padding: 18px;
-}
-
-.pun .top-box {
-	height: 18px;
-	margin-bottom: -18px;
-	position: relative;
-	background: url(Earth/img/main_top.png) top left no-repeat;
-}
-
-.pun .top-box div {
-	height: 18px;
-	margin-left: 50%;
-	background: url(Earth/img/main_top.png) top right no-repeat;
-}
-
-.pun .end-box {
-	margin-top: -17px;
-	height: 18px;
-	position: relative;
-	background: url(Earth/img/main_end.png) bottom left no-repeat;
-}
-
-.pun .end-box div {
-	height: 18px;
-	margin-left: 50%;
-	background: url(Earth/img/main_end.png) bottom right no-repeat;
-}
-
-#punredirect h2, #punmaint h2 {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-	margin-bottom: 3px;
-}
-
-/* Section Spacing and Borders
-----------------------------------------------------------------*/
-
-#brdmain {
-	border-style: solid none;
-	border-width: 2px 0;
-	margin-bottom: 12px;
-	padding: 12px 0;
-}
-
-#punindex #brdmain {
-	padding-top: 24px;
-}
-
-#punredirect #brdmain, #punmaint #brdmain {
-	border: 0;
-	margin: 0;
-	padding: 0;
-}
-
-#brdstats {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	margin-top: 24px;
-	padding-top: 12px;
-}
-
-#quickpost {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	margin-top: 12px;
-	padding-top: 12px;
-}
-
-#announce {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	padding-top: 3px;
-}
-
-/*****************************************************************
-3. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Logo, Description and Main Menu
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	padding: 0 0 10px 0;
-}
-
-#brddesc {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	padding: 10px 0;
-}
-
-#brddesc p {
-	padding: 0;
-}
-
-#brdmenu ul {
-	padding: 0;
-}
-
-#brdmenu li {
-	float: left;
-}
-
-#brdmenu a:link, #brdmenu a:visited {
-	border-right-style: solid;
-	border-width: 1px;
-	display: block;
-	min-width: 60px;
-	padding: 12px 16px 6px 8px;
-	white-space: nowrap;
-}
-
-#brdmenu a:hover, #brmenu a:active, #brdmenu a:focus {
-	text-decoration: none;
-}
-
-/* Welcome Box
-----------------------------------------------------------------*/
-
-#brdwelcome {
-	padding: 10px 0;
-}
-
-#brdwelcome .conl, #brdwelcome .conr, #brdwelcome p, #brdwelcome li {
-	display: inline;
-	padding: 0;
-}
-
-#brdwelcome .conl {
-  float: left;
-}
-
-#brdwelcome .conr {
-  float: right;
-}
-
-#brdwelcome li span {
-	background: url(Earth/img/bull.png) center left no-repeat;
-	padding-left: 18px;
-	margin-right: 3px;
-	display: inline-block;
-	line-height: normal;
-	white-space: nowrap;
-}
-
-#brdwelcome .conl li:first-child span {
-	padding-left: 0;
-	background: none;
-}
-
-/* Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-}
-
-#brdstats #onlinelist {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	clear: both;
-}
-
-#brdstats #onlinelist dt, #brdstats #onlinelist dd {
-	display: inline;
-}
-
-/* Footer
-----------------------------------------------------------------*/
-
-.pun #modcontrols {
-	border-style: none none dotted none;
-	border-width: 0 0 1px 0;
-	margin-bottom: 4px;
-	text-align: center;
-	width: 100%;
-}
-
-.pun #modcontrols dd {
-	display: inline;
-}
-
-.pun #brdfooter #modcontrols dd span {
-	background: url(Earth/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #brdfooter .conl {
-	float: left;
-}
-
-.pun #brdfooter .conr {
-	text-align: right;
-	float: right;
-}
-
-.pun #brdfooter #poweredby a {
-	font-size: 1.077em;
-	font-weight: bold;
-}
-
-.pun #brdfooter #qjump {
-	padding-top: 5px;
-}
-
-.pun #brdfooter #qjump * {
-	white-space: nowrap;
-}
-
-.pun #brdfooter #searchlinks dd span {
-	background: url(Earth/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #brdfooter #feedlinks {
-	padding-bottom: 0;
-}
-
-.pun #brdfooter #feedlinks span {
-	background: url(Earth/img/feed.png) center left no-repeat;
-	display: inline-block;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #debugtime {
-	border-style: dotted none none none;
-	border-width: 1px 0 0 0;
-	margin-top: 7px;
-	text-align: center;
-}
-
-/* Breadcrumbs, Postlink, Pagination
-----------------------------------------------------------------*/
-
-.pun .linkst .inbox, .pun linksb .inbox, .pun .postlinksb .inbox {
-	overflow: hidden;
-}
-
-.pun .linksb, .pun .postlinksb, .pun .linkst, .pun .crumbs {
-	clear: both;
-	position: relative;
-}
-
-.pun .linkst .crumbs {
-	font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
-	font-size: 1.462em;
-	line-height: 1.211em;
-	padding: 7px 0;
-}
-
-.pun .linksb .crumbs, .pun .postlinksb .crumbs {
-	font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
-	font-size: 1.154em;
-}
-
-.pun .linkst .crumbsplus .pagepost {
-	border-top-style: dotted;
-	border-top-width: 1px;
-}
-
-.pun .linksb .crumbsplus .pagepost, .pun .postlinksb .crumbsplus .pagepost {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-}
-
-.pun .postlinksb .crumbs {
-	margin-right: 11em;
-}
-
-.pun .crumbs li {
-	float: left;
-	padding-right: 0.4em;
-	white-space: nowrap;
-}
-
-.pun .crumbs li strong {
-	font-weight: normal;
-}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-}
-
-.pun .pagelink strong, .pun .pagelink a, .pun .pagelink span.spacer {
-	border-style: none none none solid;
-	border-width: 0 0 0 1px;
-	display: inline-block;
-	padding: 0 12px 0 10px;
-	margin-right: -6px;
-}
-
-.pun .pagelink .item1 {
-	border: 0;
-}
-
-.pun .pagelink .pages-label {
-	display: inline-block;
-}
-
-.pun .postlink {
-	float: right;
-	font-weight: bold;
-	text-align: right;
-}
-
-.pun .modbuttons {
-	float: right;
-	padding: 5px 0 3px 0;
-}
-
-.pun .modbuttons input {
-	margin-left: 8px;
-}
-
-.pun .subscribelink {
-	position: absolute;
-	right: 0;
-	text-align: right;
-	top: 33px;
-}
-
-#punindex .subscribelink {
-	top: 0px;
-}
-
-#punindex .linksb {
-	height: 12px;
-}
-
-/*****************************************************************
-4. MAIN TABLES
-*****************************************************************/
-
-.pun #brdmain .blocktable {
-	position: relative;
-}
-
-#punindex #brdmain .blocktable h2, #punsearch #vf h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	font-weight: bold;
-	margin: 1px 1px 0 1px;
-	padding-left: 8px;
-	position: absolute;
-	left: 0;
-	white-space: nowrap;
-	z-index: 100;
-}
-
-#punindex .blocktable th.tcl, #punsearch #vf th.tcl {
-	font-size: 0;
-	text-indent: -9999em;
-}
-
-.pun .blocktable .box {
-	border-style: solid;
-	border-width: 1px;
-	margin-bottom: -1px;
-	overflow: hidden;
-	position: relative;
-}
-
-* html .pun .blocktable .box {
-	display: inline-block;
-}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	margin-bottom: -1px;
-}
-
-.pun .blocktable th {
-	padding: 7px 8px;
-	border-style: none none solid none;
-	border-width: 1px;
-	text-align: left;
-}
-
-.pun .blocktable td {
-	padding: 7px 8px;
-	line-height: 1.3077em;
-	border-style: none none solid none;
-	border-width: 1px;
-	text-align: left;
-}
-
-.pun .blocktable h3 {
-	font-size: 1.077em;
-	font-weight: bold;
-	padding: 0;
-}
-
-.pun .blocktable p {
-	padding: 0;
-}
-
-.pun .blocktable .tcl p {
-	padding: 5px 0 0 0;
-}
-
-.pun .blocktable .tcl {
-	width: auto;
-}
-
-.pun .blocktable .tc2, .pun .blocktable .tc3, .pun .blocktable .tcmod {
-	padding-left: 0;
-	padding-right: 0;
-	text-align: center;
-	width: 11%;
-}
-
-.pun .blocktable .tcr {
-	width: 30%;
-}
-
-.pun .blocktable td .newtext, .pun .blocktable td .pagestext, .pun .blocktable td .byuser {
-	white-space: nowrap;
-}
-
-.pun .blocktable .tcl h3 span.newtext {
-	font-size: 0.929em;
-	font-weight: normal;
-}
-
-.pun #vf td.tcl span.stickytext, .pun #vf td.tcl span.closedtext {
-	font-size: 1em;
-	font-weight: bold;
-}
-
-#punsearch #vf .tc2 {
-	padding-left: 8px;
-	padding-right: 8px;
-	text-align: left;
-	width: 18%;
-}
-
-#users1 .tcr {
-	width: 25%;
-}
-
-#users1 .tc2 {
-	padding-left: 8px;
-	padding-right: 8px;
-	text-align: left;
-	width: 25%;
-}
-
-#debug {
-	margin-top: 12px;
-}
-
-#debug .tcl {
-	width: 10%;
-}
-
-#punredirect #debug .tcl, #punmaint #debug .tcl {
-	width: 20%;
-}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-}
-
-#punindex .tcr .byuser {
-	display: block
-}
-
-#punindex td.tc2, #punindex td.tc3, #punindex td.tcr, .pun #vf td.tc2, .pun #vf td.tc3,
-.pun #vf td.tcr, #punindex td.tcl div.forumdesc, .pun #vf td.tcl span {
-	font-size: 0.923em;
-}
-
-.pun #vf td.tcl a {
-	font-weight: bold;
-}
-
-.pun #vf td.tcl span a {
-	font-weight: normal;
-}
-
-.pun .blocktable .tclcon {
-	height: 1%;
-	min-height: 1px;
-	overflow: hidden;
-	padding: 0 11px 0 12px;
-	position: relative;
-}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-}
-
-.pun .icon {
-	border-style: solid;
-	border-width: 8px;
-	float: left;
-	height: 0;
-	overflow: hidden;
-	width: 0;
-}
-
-.pun .iposted .ipost {
-	font-weight: bold;
-	left: 0;
-	padding-left: 4px;
-	position: absolute;
-	text-align: center;
-	top: 0;
-	width: 8px;
-}
-
-/*****************************************************************
-MAIN POSTS
-*****************************************************************/
-
-/* Structure
-----------------------------------------------------------------*/
-
-.pun .blockpost {
-	border-style: solid;
-	border-width: 1px;
-	margin-bottom: -1px;
-	overflow: hidden;
-	position: relative;
-}
-
-* html .pun .blockpost {
-	display: inline-block;
-}
-
-.pun .blockpost h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	white-space: nowrap;
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	height: 1.462em;
-	padding: 0.538em 8px 0.538em 236px;
-	font-weight: normal;
-}
-
-#punsearch .blockpost h2 {
-	height: auto;
-	padding-left: 36px;
-	white-space: normal;
-}
-
-#punsearch .blockpost h2 span span {
-	white-space: nowrap;
-	display: inline-block;
-	font: 1.077em "Trebuchet MS", Arial, Helvetica, sans-serif
-}
-
-#punsearch .blockpost .icon {
-	position: absolute;
-	top: 0;
-	margin-top: -2.154em;
-}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-}
-
-.pun .blockpost .inbox {
-	float: right;
-	position: relative;
-	width: 100%;
-}
-
-.pun .blockpost .postbody, .pun .blockpost .postfoot {
-	border-left-style: solid;
-	border-left-width: 1px;
-	float: right;
-	margin-right: -218px;
-	position: relative;
-	text-align: left;
-	width: 100%;
-}
-
-.pun .blockpost .postleft, .pun .blockpost .postfootleft {
-	width: 194px;
-	padding: 7px 12px 7px 12px;
-	float: left;
-	margin-left: -218px;
-	position: relative;
-}
-
-.pun .blockpost .postleft dl {
-	padding: 0;
-}
-
-#punviewtopic .blockpost dt, #punmoderate .blockpost dt {
-	display: block;
-	position: absolute;
-	padding: 0.538em 0 0.538em 12px;
-	height: 1.462em;
-	top: -2.615em;
-	left: 0;
-	overflow: hidden;
-	width: 206px;
-}
-
-.pun .blockpost dt strong {
-	font-size: 1.231em;
-	font-weight: bold;
-}
-
-.pun .blockpost .postleft dd {
-	font-size: 0.923em;
-}
-
-.pun .blockpost .postleft .usertitle {
-	padding: 4px 0 6px 0;
-	font-size: 1em;
-}
-
-.pun .blockpost .postleft .postavatar {
-	display: block;
-	margin: 0 0 4px 0;
-}
-
-.pun .blockpost .postright {
-	position: relative;
-	padding: 4px 230px 7px 18px;
-}
-
-.pun .postmsg {
-	width:100%;
-	overflow: hidden;
-	word-wrap: break-word;
-}
-
-.pun .blockpost .postfootright {
-	position: relative;
-	padding: 7px 230px 7px 18px;
-	text-align: right;
-}
-
-.pun .postfoot p, .pun .postfoot ul {
-	padding: 0;
-}
-
-.pun .blockpost .postfootright li {
-	display: inline;
-}
-
-.pun .blockpost .postfootright li span {
-	display: inline-block;
-	padding-left: 16px;
-	margin-left: 8px;
-	line-height: normal;
-	background: url(Earth/img/bull.png) center left no-repeat;
-}
-
-.pun .blockpost .usercontacts {
-	padding: 7px 0;
-}
-
-.pun .blockpost .usercontacts .email {
-	background: url(Earth/img/email.png) left 65% no-repeat;
-	margin-right: 5px;
-	padding-left: 21px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun .blockpost .usercontacts .website {
-	background: url(Earth/img/ext.png) left 65% no-repeat;
-	padding-left: 18px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun .postsignature hr {
-	border:none;
-	height: 1px;
-	margin-left: 0px;
-	text-align: left;
-}
-
-/* Content (includes other user content)
-----------------------------------------------------------------*/
-
-.pun .usercontent {
-	padding: 7px 0;
-}
-
-.pun .postmsg p, .pun .postmsg li, #punhelp p samp {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-}
-
-.pun .usercontent h1, .pun .usercontent h2, .pun .usercontent h3,
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	padding: 7px 0 0 0;
-}
-
-.pun .postmsg h5, #punhelp h5 {
-	font-size: 1.231em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	list-style: disc;
-	padding: 4px 13px 4px 30px;
-}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	list-style: decimal;
-	padding: 4px 13px 4px 30px;
-}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha;
-}
-
-.pun .usercontent li, .pun .postmsg li {
-	padding: 0 3px;
-}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0;
-}
-
-.pun span.bbu {
-	text-decoration: underline;
-}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-}
-
-.pun .blockpost .postmsg .postedit {
-	font-size: 0.857em;
-}
-
-.pun .blockform .postsignature, .pun .blockpost .postsignature {
-	font-size: 0.923em;
-}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px 1px 1px 3px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	font-weight: bold;
-	line-height: 1.462em;
-}
-
-.pun .quotebox blockquote {
-	overflow: hidden;
-	width: 100%;
-}
-
-.pun .codebox pre {
-	overflow-y:hidden;
-	overflow: auto;
-	width: 100%;
-	direction: ltr;
-	text-align: left;
-}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-}
-
-*:first-child+html .pun .codebox pre {
-	padding-bottom: 10px;
-}
-
-.pun .codebox pre code {
-	padding: 0.75em;
-	white-space: pre;
-}
-
-.pun div[class*=codebox] pre code {
-	display: inline-block;
-}
-
-* html .pun .codebox pre code {
-	display: block;
-}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-}
-
-.pun .postmsg img, #punhelp samp img {
-	vertical-align: text-top;
-}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-/*****************************************************************
-MAIN FORMS
-*****************************************************************/
-
-#punedit .blockform h2, #punpost .blockform h2, #postpreview h2, #posterror h2,
-.pun #quickpost h2, .pun #reportform h2, #pundelete .blockform h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	font-weight: bold;
-	white-space: nowrap;
-	padding: 10px 19px 4px 37px;
-	border: 0;
-}
-
-#punpost .blockform h2, #punedit .blockform h2,.pun #quickpost h2,
-#pundelete .blockform h2 {
-	margin: 1px 1px 0 1px;
-	width: 25em;
-	position: absolute;
-	z-index: 100;
-}
-
-.pun #quickpost legend, #punpost legend, #punedit legend {
-	width: 25em;
-	overflow: hidden;
-	white-space: nowrap;
-}
-
-.pun .blockform .box {
-	border-style: solid;
-	border-width: 1px;
-	padding-bottom: 12px;
-}
-
-.pun #posterror {
-	border-style: solid;
-	border-width: 1px;
-}
-
-.pun #posterror .box {
-	padding: 0 18px 12px 18px;
-}
-
-* html .pun .blockform .box, * html .pun #posterror {
-	display: inline-block;
-}
-
-.pun .blockform .forminfo, .pun .error-info {
-	padding: 12px 18px;
-	border-style: solid;
-	border-width: 1px;
-	position: relative;
-}
-
-.pun .blockform .forminfo {
-	margin-top: 12px;
-}
-
-#pundelete .blockform .forminfo {
-	margin-top: 33px;
-}
-
-.pun .forminfo h3 {
-	padding-bottom: 0;
-}
-
-.pun .error-list li {
-	padding-left: 24px;
-	background: url(Earth/img/exclaim.png) center left no-repeat;
-}
-
-.pun .inform {
-	padding: 0 18px;
-}
-
-.pun legend {
-	font-weight: bold;
-	padding: 10px 19px 4px 19px;
-}
-
-* html .pun legend {
-	margin-left: -7px;
-}
-
-*:first-child+html .pun legend {
-	margin-left: -7px;
-}
-
-.pun .infldset {
-	border-style: solid;
-	border-width: 1px;
-	padding: 12px 18px;
-}
-
-#punregister #rules .infldset {
-	padding: 5px 18px;
-}
-
-.pun fieldset p {
-	padding: 0 0 7px 0;
-	width: 100%;
-}
-
-.pun fieldset .usercontent p {
-	padding: 7px 0;
-}
-
-.pun fieldset label {
-	display: block;
-	padding: 0 0 7px 0;
-}
-
-.pun label em {
-	font-weight: normal;
-	font-style: normal;
-}
-
-.pun .required strong {
-	background: url(Earth/img/asterisk.png) center right no-repeat;
-	font-weight: normal;
-	padding-right: 14px;
-	white-space: pre;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun label input, .pun label select, .pun label textarea {
-	margin-top: 2px;
-}
-
-.pun label.conl {
-	display: inline-block;
-	padding-right: 12px;
-}
-
-.pun form .buttons {
-	padding: 8px 19px 8px 34px;
-	margin-bottom: -12px;
-}
-
-.pun .blockform .buttons input {
-	margin-right: 12px;
-}
-
-.pun .rbox {
-	padding: 3px 0;
-}
-
-.pun .rbox label {
-	padding: 3px 0 3px 1.75em;
-	position: relative;
-	min-height: 1px;
-}
-
-* html .pun .rbox label {
-	text-indent: -3px;
-	height: 1%;
-}
-
-.pun .rbox input {
-	margin: 3px 0.75em 3px -1.75em;
-	float: left;
-	position: relative;
-	vertical-align: middle;
-	padding: 0;
-	height: 1em;
-	width: 1em;
-}
-
-.pun input[type=text], .pun select, .pun textarea {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 98%;
-}
-
-.pun #quickpost .txtarea {
-	padding-right: 12px;
-	position: relative;
-}
-
-.pun .blockform .bblinks {
-	padding-top: 0;
-}
-
-.pun .blockform .bblinks li {
-	display: inline;
-}
-
-.pun .blockform .bblinks li span {
-	background: url(Earth/img/help.png) center left no-repeat;
-	margin-right: 8px;
-	padding-left: 20px;
-	display: inline-block;
-}
-
-.pun #quickpost .bblinks {
-	padding-top: 0;
-}
-
-.pun #quickpost .bblinks li {
-	display: inline;
-}
-
-.pun #login p.clearb {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	font-size: 0;
-	height: 0;
-	line-height: 0;
-	margin-top: 7px;
-	overflow: hidden;
-	padding-bottom: 3px;
-	padding-top: 7px;
-	text-indent: -9999em;
-	width: 100%;
-}
-
-.pun #postreview {
-	padding-top: 12px;
-}
-
-.pun #postpreview, .pun #posterror {
-	margin-bottom: 12px;
-}
-
-.pun #postpreview .postright {
-	padding: 0;
-}
-
-.pun #postpreview .postbody {
-	border-style: solid;
-	border-width: 1px;
-	float: none;
-	margin: 0 18px 12px 18px;
-	padding: 0;
-	padding: 4px 18px 4px 18px;
-	width: auto;
-}
-
-.pun span.email {
-	background: url(Earth/img/email.png) left 65% no-repeat;
-	margin-right: 5px;
-	padding-left: 21px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun span.website {
-	background: url(Earth/img/ext.png) left 65% no-repeat;
-	padding-left: 18px;
-	display: inline-block;
-	line-height: normal;
-}
-
-#punmisc #rules .box {
-	border-style: solid;
-	border-width: 1px;
-	padding: 5px 18px;
-}
-
-
-#punhelp .box {
-	border-style: solid;
-	border-width: 1px;
-	padding: 7px 12px;
-}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.25em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-}
-
-.pun .checklist legend {
-	padding: 0;
-}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-}
-
-.pun .checklist .checklist-item {
-	position: relative;
-}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 1.75em;
-}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.55em;
-	width: 1.55em;
-}
-
-/*****************************************************************
-PROFILES (+ ADMIN MENU)
-*****************************************************************/
-
-/* Profile / Admin
-----------------------------------------------------------------*/
-
-.pun .blockmenu {
-	width: 13em;
-	float: left;
-	padding-bottom: 12px;
-}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 15em;
-}
-
-.pun .blockmenu .block2 {
-	padding-top: 19px;
-}
-
-.pun .blockmenu ul {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	padding: 0;
-}
-
-.pun .blockmenu li {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-	font-weight: bold;
-	padding: 0;
-}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	display: block;
-	padding: 9px 6px 3px 6px;
-	min-height: 1px;
-	text-decoration: none;
-}
-
-* html .pun .blockmenu a:link,  * html .pun .blockmenu a:visited {
-	height: 1%;
-}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active, .pun .blockmenu a:focus {
-	text-decoration: none;
-}
-
-#viewprofile .box {
-	border-style: solid;
-	border-width: 1px;
-	padding-bottom: 18px;
-}
-
-#viewprofile dt, #adstats dt {
-	padding: 7px 0;
-	position: absolute;
-	width: 13em;
-	left: 0;
-}
-
-#viewprofile dl {
-	border-style: solid none none none;
-	border-width: 1px;
-	margin: 7px 0;
-	padding: 0;
-	width: 100%;
-	position: relative;
-}
-
-#adintro, #adstats {
-	border-style: solid;
-	border-width: 1px;
-	padding: 18px;
-}
-
-#adintro li span {
-	display: inline-block;
-	padding-left: 16px;
-	margin-left: 8px;
-	line-height: normal;
-	background: url(Earth/img/bull.png) center left no-repeat;
-}
-
-#adstats .inbox, #adintro .inbox {
-	border-style: solid;
-	border-width: 1px;
-	padding: 18px;
-}
-
-#adstats dl {
-	margin: 0;
-	padding: 0;
-	width: 100%;
-	position: relative;
-}
-
-#viewprofile dd, #adstats dd {
-	border-style: none none solid none;
-	border-width: 1px;
-	padding: 7px 0 7px 13em;
-}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Basic defaults and Common Items
-----------------------------------------------------------------*/
-
-html, body, .pun {
-	background: #eaede2;
-	color: #333;
-}
-
-.pun .punwrap {
-	background: #fff;
-	border-color: #ccd7c1;
-	color: #526550;
-}
-
-#brdtitle #brddesc, .pun .pagepost, #brdstats #onlinelist, #brdfooter #searchlinks, #brdfooter #modcontrols,
-#punmaint h2, #punredirect h2, #adminconsole .submittop, .pun #debugtime, .pun .pagelink a, .pun .pagelink * {
-	border-color: #bbc6b2;
-}
-
-.pun a, .pun a:link, .pun a:visited {
-	color: #047E00;
-}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #73A900;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #047E00;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #73A900;
-}
-
-/* Primary Navigation
-----------------------------------------------------------------*/
-
-#brdmenu {
-	background: #32671d;
-}
-
-#brdmenu a, #brdmenu a:link, #brdmenu a:visited {
-	background: #32671d;
-	border-color: #fff;
-	color: #e3e3c8;
-}
-
-#brdmenu a:hover, #brdmenu a:active, #brdmenu a:focus {
-	background: #2ca100;
-	border-color: #fff;
-	color: #fff;
-}
-
-/* Main Tables
-----------------------------------------------------------------*/
-
-.pun .blocktable .box {
-	background: #fcfcf4;
-	border-color: #bbc6b2 #d8dccf;
-}
-
-#punindex .blocktable h2, .pun #vf h2 {
-	color: #83866a;
-}
-
-#adminconsole fieldset th, #adminconsole fieldset td {
-	background: #f6f6ea;
-	border-color: #dce6d8;
-}
-
-.pun #users1 h2 {
-	background: #fff;
-}
-
-.pun .blocktable td {
-	border-color: #dce6d8;
-}
-
-.pun .blocktable th {
-	background: #eaecda;
-	border-color: #ccd7c1;
-	color: #83866a;
-}
-
-.pun .blocktable td.tcl span.stickytext {
-	color: #c08b20;
-}
-
-/* Main Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost {
-	background: #f6f6ea;
-	border-color: #bbc6b2 #d8dccf;
-}
-
-.pun .blockpost h2 {
-	background: #eaecda;
-	border-color: #ccd7c1;
-	color: #83866a;
-}
-
-.pun .blockpost .postbody, .pun .blockpost .postfoot {
-	background: #fcfcf4;
-	border-color: #dce6d8;
-}
-
-.pun .blockpost .postfootright li {
-	color: #fcfcf4;
-}
-
-.pun .postmsg, #punhelp code, #punhelp samp {
-	color: #333;
-}
-
-.pun .postsignature, .pun .postmsg .postedit {
-	color: #526550;
-}
-
-.pun .quotebox {
-	background: #f9fae5;
-	border-color: #bdbc7a;
-	color: #566579;
-}
-
-.pun .quotebox cite {
-	color: #83866a;
-}
-
-.pun .codebox, #punhelp .codebox code {
-	background: #333;
-	color: #fff;
-}
-
-.pun .postmsg hr {
-	background: #bbc6b2;
-}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-}
-
-/* Main Forms + Profile
-----------------------------------------------------------------*/
-
-.pun .blockform .box, #adstats, #adintro, #postpreview, #posterror {
-	border-color: #bbc6b2 #d8dccf;
-	background: #eaecda;
-}
-
-#punmisc #rules .box, #punhelp .box {
-	border-color: #bbc6b2 #d8dccf;
-	background: #f6f6ea;
-}
-
-.pun #quickpost h2, #punpost .blockform h2, #punedit .blockform h2, #posterror h2,
-#pundelete .blockform h2 {
-	background: #eaecda;
-	color: #83866a;
-}
-
-.pun .forminfo {
-	background: #fff;
-	border-color: #dce6d8;
-}
-
-#puninstall form#install .forminfo {
-	background: #32671d;
-	color: #fff;
-}
-
-.pun #posterror .error-info {
-	background: #ffffe1;
-	border-color: #dfe6ee;
-}
-
-#puninstall form#install .error-info {
-	background: #ffffe1;
-	border-color: #dfe6ee;
-	color: #333;
-}
-
-.pun .infldset, #adintro .inbox, #adstats .inbox {
-	background: #f6f6ea;
-	border-color: #dce6d8;
-}
-
-.pun label, .pun legend, #adminconsole fieldset th {
-	color: #83866a;
-}
-
-.pun fieldset p {
-	border-color: #bbc6b2;
-}
-
-.pun .blockmenu ul, .pun .blockmenu li {
-	border-color: #bbc6b2;
-}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active, .pun .blockmenu a:focus {
-	background: #ffffe6;
-}
-
-.pun .blockmenu .isactive a:link, .pun .blockmenu .isactive a:visited {
-	color: #333;
-	background: #f6f6ea;
-	}
-
-.pun #viewprofile .box {
-	border-color: #bbc6b2 #d8dccf;
-	background: #eaecda;
-}
-
-.pun #viewprofile dt, #adstats dt {
-	color: #83866a;
-}
-
-.pun #viewprofile dl, .pun #viewprofile dd, #adstats dl, #adstats dd {
-	border-color: #dce6d8;
-}
-
-#adminconsole fieldset td.nodefault {
-	background: #d59b9b;
-}
-
-.pun .multiselect {
-	color: #83866A;
-}
-
-.pun .checklist {
-	background: white;
-	border-color: #ccc;
-}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #eef1e8 #dbddd4 #e6e8df #eef1e8;
-}
-
-.pun .iredirect .icon {
-	border-color: #bbc6b2;
-	border-width: 1px;
-	padding: 7px;
-}
-
-.pun .inew .icon {
-	border-color: #50a42f #408426 #32671d #4a982c;
-}
Index: trunk/web/punbb/style/Fire.css
===================================================================
--- trunk/web/punbb/style/Fire.css	(revision 10)
+++ 	(revision )
@@ -1,1686 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-html, body, .pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3, .pun h4, .pun h5, .pun pre, .pun blockquote,
-.pun ul, .pun ol, .pun li, .pun dl, .pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun legend .pun img,
-.pun abbr, .pun cite {
-	border: 0;
-	font-style: normal;
-	font-weight: normal;
-	margin: 0;
-	padding: 0;
-}
-
-.pun ul, .pun ol {
-	list-style: none;
-}
-
-.pun select {
-	padding-bottom: 1px;
-	padding-top: 1px;
-}
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 81.25%/1.462em Arial, Helvetica, sans-serif;
-}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun legend {
-	font-family: Arial, Helvetica, sans-serif;
-	font-size: 1em;
-}
-
-.pun pre, .pun code {
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace;
-	font-size: 1em;
-}
-
-.pun pre code {
-	font-size: 1em;
-}
-
-.pun table {
-	border-collapse: collapse;
-	border-spacing: 0;
-	border: 0;
-	empty-cells: show;
-	width: 100%;
-}
-
-.pun h1 {
-	font:2.154em/1em "Trebuchet MS", Arial, Helvetica, sans-serif;
-	padding: 7px 0;
-}
-
-.pun h2, .pun .hd h2 {
-	font: 1.462em/1em "Trebuchet MS", Arial, Helvetica, sans-serif;
-	padding: 7px 0;
-}
-
-.pun h3 {
-	font-size: 1.154em;
-	line-height: 1.267em;
-	padding: 7px 0;
-}
-
-.pun h4 {
-	font-size: 1.077em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun h5, .pun h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun p, .pun ul, .pun ol, .pun dl, .pun th, .pun td, .pun legend {
-	padding: 7px 0;
-}
-
-.pun strong, .pun th, .pun span.warntext, .pun p.warntext {
-	font-weight: bold;
-}
-
-.pun em {
-	font-style: italic;
-}
-
-.pun a, .pun a:link, .pun a:visited {
-	text-decoration: none;
-}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	text-decoration: underline;
-}
-
-.pun .actions span {
-	padding-left: 16px;
-	padding-right: 8px;
-	background: url(Fire/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #debug h2, #brdstats .conl dt, #brdstats .conr dt, #modcontrols dt,
-#searchlinks dt, div.postright h3, .pun .subscribelink span, #announce .hd, #reportform h2, #punmoderate #vf h2,
-#punviewforum #vf h2, .pun .required strong span, .pun .icon div {
-	display: block;
-	overflow: hidden;
-	position: absolute;
-	text-indent: -9999em;
-	width: 0;
-}
-
-/* Generic Float Clear
-----------------------------------------------------------------*/
-
-.pun .inbox, .pun #brdmain, .pun .crumbs, .pun .pagepost, .pun .block2col {
-	min-height: 1px;
-}
-
-* html .pun .inbox, * html .pun #brdmain, * html .pun .infldset, * html .pun .crumbs, * html .pun .pagepost, * html .pun .block2col {
-	display: inline-block;
-}
-
-* html .pun .inbox, * html .pun #bdrdmain, * html .pun .infldset, * html .pun .crumbs, * html .pun .pagepost, * html .pun .block2col {
-	display: block;
-}
-
-.pun .inbox:after, .pun #brdmain:after, .pun .crumbs:after, .pun .pagepost:after, .pun .block2col:after {
-	content: " ";
-	display: block;
-	height: 0;
-	font-size: 0;
-	clear: both;
-	visibility: hidden;
-}
-
-.pun .block2col .inbox:after {
-	content: none;
-	clear: none;
-}
-
-.clearl {
-	clear: left;
-}
-
-/*****************************************************************
-2. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-.pun {
-	padding: 30px 40px;
-}
-
-#punredirect, #punmaint {
-	padding: 60px 20% 12px 20%;
-}
-
-#puninstall, #pundb_update {
-	padding: 20px 10%;
-}
-
-.pun .punwrap {
-	border: 1px solid;
-	padding: 18px;
-}
-
-.pun .top-box {
-	height: 18px;
-	margin-bottom: -18px;
-	position: relative;
-	background: url(Fire/img/main_top.png) top left no-repeat;
-}
-
-.pun .top-box div {
-	height: 18px;
-	margin-left: 50%;
-	background: url(Fire/img/main_top.png) top right no-repeat;
-}
-
-.pun .end-box {
-	margin-top: -17px;
-	height: 18px;
-	position: relative;
-	background: url(Fire/img/main_end.png) bottom left no-repeat;
-}
-
-.pun .end-box div {
-	height: 18px;
-	margin-left: 50%;
-	background: url(Fire/img/main_end.png) bottom right no-repeat;
-}
-
-#punredirect h2, #punmaint h2 {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-	margin-bottom: 3px;
-}
-
-/* Section Spacing and Borders
-----------------------------------------------------------------*/
-
-#brdmain {
-	border-style: solid none;
-	border-width: 2px 0;
-	margin-bottom: 12px;
-	padding: 12px 0;
-}
-
-#punindex #brdmain {
-	padding-top: 24px;
-}
-
-#punredirect #brdmain, #punmaint #brdmain {
-	border: 0;
-	margin: 0;
-	padding: 0;
-}
-
-#brdstats {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	margin-top: 24px;
-	padding-top: 12px;
-}
-
-#quickpost {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	margin-top: 12px;
-	padding-top: 12px;
-}
-
-#announce {
-	border-style: solid none none none;
-	border-width: 2px 0 0 0;
-	padding-top: 3px;
-}
-
-/*****************************************************************
-3. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Logo, Description and Main Menu
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	padding: 0 0 10px 0;
-}
-
-#brddesc {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	padding: 10px 0;
-}
-
-#brddesc p {
-	padding: 0;
-}
-
-#brdmenu ul {
-	padding: 0;
-}
-
-#brdmenu li {
-	float: left;
-}
-
-#brdmenu a:link, #brdmenu a:visited {
-	border-right-style: solid;
-	border-width: 1px;
-	display: block;
-	min-width: 60px;
-	padding: 12px 16px 6px 8px;
-	white-space: nowrap;
-}
-
-#brdmenu a:hover, #brmenu a:active, #brdmenu a:focus {
-	text-decoration: none;
-}
-
-/* Welcome Box
-----------------------------------------------------------------*/
-
-#brdwelcome {
-	padding: 10px 0;
-}
-
-#brdwelcome .conl, #brdwelcome .conr, #brdwelcome p, #brdwelcome li {
-	display: inline;
-	padding: 0;
-}
-
-#brdwelcome .conl {
-  float: left;
-}
-
-#brdwelcome .conr {
-  float: right;
-}
-
-#brdwelcome li span {
-	background: url(Fire/img/bull.png) center left no-repeat;
-	padding-left: 18px;
-	margin-right: 3px;
-	display: inline-block;
-	line-height: normal;
-	white-space: nowrap;
-}
-
-#brdwelcome .conl li:first-child span {
-	padding-left: 0;
-	background: none;
-}
-
-/* Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-}
-
-#brdstats #onlinelist {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	clear: both;
-}
-
-#brdstats #onlinelist dt, #brdstats #onlinelist dd {
-	display: inline;
-}
-
-/* Footer
-----------------------------------------------------------------*/
-
-.pun #modcontrols {
-	border-style: none none dotted none;
-	border-width: 0 0 1px 0;
-	margin-bottom: 4px;
-	text-align: center;
-	width: 100%;
-}
-
-.pun #modcontrols dd {
-	display: inline;
-}
-
-.pun #brdfooter #modcontrols dd span {
-	background: url(Fire/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #brdfooter .conl {
-	float: left;
-}
-
-.pun #brdfooter .conr {
-	text-align: right;
-	float: right;
-}
-
-.pun #brdfooter #poweredby a {
-	font-size: 1.077em;
-	font-weight: bold;
-}
-
-.pun #brdfooter #qjump {
-	padding-top: 5px;
-}
-
-.pun #brdfooter #qjump * {
-	white-space: nowrap;
-}
-
-.pun #brdfooter #searchlinks dd span {
-	background: url(Fire/img/bull.png) center left no-repeat;
-	display: inline-block;
-	line-height: normal;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #brdfooter #feedlinks {
-	padding-bottom: 0;
-}
-
-.pun #brdfooter #feedlinks span {
-	background: url(Fire/img/feed.png) center left no-repeat;
-	display: inline-block;
-	padding-left: 18px;
-	white-space: nowrap;
-}
-
-.pun #debugtime {
-	border-style: dotted none none none;
-	border-width: 1px 0 0 0;
-	margin-top: 7px;
-	text-align: center;
-}
-
-/* Breadcrumbs, Postlink, Pagination
-----------------------------------------------------------------*/
-
-.pun .linkst .inbox, .pun linksb .inbox, .pun .postlinksb .inbox {
-	overflow: hidden;
-}
-
-.pun .linksb, .pun .postlinksb, .pun .linkst, .pun .crumbs {
-	clear: both;
-	position: relative;
-}
-
-.pun .linkst .crumbs {
-	font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
-	font-size: 1.462em;
-	line-height: 1.211em;
-	padding: 7px 0;
-}
-
-.pun .linksb .crumbs, .pun .postlinksb .crumbs {
-	font-family: "Trebuchet MS", Helvetica, Arial, sans-serif;
-	font-size: 1.154em;
-}
-
-.pun .linkst .crumbsplus .pagepost {
-	border-top-style: dotted;
-	border-top-width: 1px;
-}
-
-.pun .linksb .crumbsplus .pagepost, .pun .postlinksb .crumbsplus .pagepost {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-}
-
-.pun .postlinksb .crumbs {
-	margin-right: 11em;
-}
-
-.pun .crumbs li {
-	float: left;
-	padding-right: 0.4em;
-	white-space: nowrap;
-}
-
-.pun .crumbs li strong {
-	font-weight: normal;
-}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-}
-
-.pun .pagelink strong, .pun .pagelink a, .pun .pagelink span.spacer {
-	border-style: none none none solid;
-	border-width: 0 0 0 1px;
-	display: inline-block;
-	padding: 0 12px 0 10px;
-	margin-right: -6px;
-}
-
-.pun .pagelink .item1 {
-	border: 0;
-}
-
-.pun .pagelink .pages-label {
-	display: inline-block;
-}
-
-.pun .postlink {
-	float: right;
-	font-weight: bold;
-	text-align: right;
-}
-
-.pun .modbuttons {
-	float: right;
-	padding: 5px 0 3px 0;
-}
-
-.pun .modbuttons input {
-	margin-left: 8px;
-}
-
-.pun .subscribelink {
-	position: absolute;
-	right: 0;
-	text-align: right;
-	top: 33px;
-}
-
-#punindex .subscribelink {
-	top: 0px;
-}
-
-#punindex .linksb {
-	height: 12px;
-}
-
-/*****************************************************************
-4. MAIN TABLES
-*****************************************************************/
-
-.pun #brdmain .blocktable {
-	position: relative;
-}
-
-#punindex #brdmain .blocktable h2, #punsearch #vf h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	font-weight: bold;
-	margin: 1px 1px 0 1px;
-	padding-left: 8px;
-	position: absolute;
-	left: 0;
-	white-space: nowrap;
-	z-index: 100;
-}
-
-#punindex .blocktable th.tcl, #punsearch #vf th.tcl {
-	font-size: 0;
-	text-indent: -9999em;
-}
-
-.pun .blocktable .box {
-	border-style: solid;
-	border-width: 1px;
-	margin-bottom: -1px;
-	overflow: hidden;
-	position: relative;
-}
-
-* html .pun .blocktable .box {
-	display: inline-block;
-}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	margin-bottom: -1px;
-}
-
-.pun .blocktable th {
-	padding: 7px 8px;
-	border-style: none none solid none;
-	border-width: 1px;
-	text-align: left;
-}
-
-.pun .blocktable td {
-	padding: 7px 8px;
-	line-height: 1.3077em;
-	border-style: none none solid none;
-	border-width: 1px;
-	text-align: left;
-}
-
-.pun .blocktable h3 {
-	font-size: 1.077em;
-	font-weight: bold;
-	padding: 0;
-}
-
-.pun .blocktable p {
-	padding: 0;
-}
-
-.pun .blocktable .tcl p {
-	padding: 5px 0 0 0;
-}
-
-.pun .blocktable .tcl {
-	width: auto;
-}
-
-.pun .blocktable .tc2, .pun .blocktable .tc3, .pun .blocktable .tcmod {
-	padding-left: 0;
-	padding-right: 0;
-	text-align: center;
-	width: 11%;
-}
-
-.pun .blocktable .tcr {
-	width: 30%;
-}
-
-.pun .blocktable td .newtext, .pun .blocktable td .pagestext, .pun .blocktable td .byuser {
-	white-space: nowrap;
-}
-
-.pun .blocktable .tcl h3 span.newtext {
-	font-size: 0.929em;
-	font-weight: normal;
-}
-
-.pun #vf td.tcl span.stickytext, .pun #vf td.tcl span.closedtext {
-	font-size: 1em;
-	font-weight: bold;
-}
-
-#punsearch #vf .tc2 {
-	padding-left: 8px;
-	padding-right: 8px;
-	text-align: left;
-	width: 18%;
-}
-
-#users1 .tcr {
-	width: 25%;
-}
-
-#users1 .tc2 {
-	padding-left: 8px;
-	padding-right: 8px;
-	text-align: left;
-	width: 25%;
-}
-
-#debug {
-	margin-top: 12px;
-}
-
-#debug .tcl {
-	width: 10%;
-}
-
-#punredirect #debug .tcl, #punmaint #debug .tcl {
-	width: 20%;
-}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-}
-
-#punindex .tcr .byuser {
-	display: block
-}
-
-#punindex td.tc2, #punindex td.tc3, #punindex td.tcr, .pun #vf td.tc2, .pun #vf td.tc3,
-.pun #vf td.tcr, #punindex td.tcl div.forumdesc, .pun #vf td.tcl span {
-	font-size: 0.923em;
-}
-
-.pun #vf td.tcl a {
-	font-weight: bold;
-}
-
-.pun #vf td.tcl span a {
-	font-weight: normal;
-}
-
-.pun .blocktable .tclcon {
-	height: 1%;
-	min-height: 1px;
-	overflow: hidden;
-	padding: 0 11px 0 12px;
-	position: relative;
-}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-}
-
-.pun .icon {
-	border-style: solid;
-	border-width: 8px;
-	float: left;
-	height: 0;
-	overflow: hidden;
-	width: 0;
-}
-
-.pun .iposted .ipost {
-	font-weight: bold;
-	left: 0;
-	padding-left: 4px;
-	position: absolute;
-	text-align: center;
-	top: 0;
-	width: 8px;
-}
-
-/*****************************************************************
-MAIN POSTS
-*****************************************************************/
-
-/* Structure
-----------------------------------------------------------------*/
-
-.pun .blockpost {
-	border-style: solid;
-	border-width: 1px;
-	margin-bottom: -1px;
-	overflow: hidden;
-	position: relative;
-}
-
-* html .pun .blockpost {
-	display: inline-block;
-}
-
-.pun .blockpost h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	white-space: nowrap;
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	height: 1.462em;
-	padding: 0.538em 8px 0.538em 236px;
-	font-weight: normal;
-}
-
-#punsearch .blockpost h2 {
-	height: auto;
-	padding-left: 36px;
-	white-space: normal;
-}
-
-#punsearch .blockpost h2 span span {
-	white-space: nowrap;
-	display: inline-block;
-	font: 1.077em "Trebuchet MS", Arial, Helvetica, sans-serif
-}
-
-#punsearch .blockpost .icon {
-	position: absolute;
-	top: 0;
-	margin-top: -2.154em;
-}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-}
-
-.pun .blockpost .inbox {
-	float: right;
-	position: relative;
-	width: 100%;
-}
-
-.pun .blockpost .postbody, .pun .blockpost .postfoot {
-	border-left-style: solid;
-	border-left-width: 1px;
-	float: right;
-	margin-right: -218px;
-	position: relative;
-	text-align: left;
-	width: 100%;
-}
-
-.pun .blockpost .postleft, .pun .blockpost .postfootleft {
-	width: 194px;
-	padding: 7px 12px 7px 12px;
-	float: left;
-	margin-left: -218px;
-	position: relative;
-}
-
-.pun .blockpost .postleft dl {
-	padding: 0;
-}
-
-#punviewtopic .blockpost dt, #punmoderate .blockpost dt {
-	display: block;
-	position: absolute;
-	padding: 0.538em 0 0.538em 12px;
-	height: 1.462em;
-	top: -2.615em;
-	left: 0;
-	overflow: hidden;
-	width: 206px;
-}
-
-.pun .blockpost dt strong {
-	font-size: 1.231em;
-	font-weight: bold;
-}
-
-.pun .blockpost .postleft dd {
-	font-size: 0.923em;
-}
-
-.pun .blockpost .postleft .usertitle {
-	padding: 4px 0 6px 0;
-	font-size: 1em;
-}
-
-.pun .blockpost .postleft .postavatar {
-	display: block;
-	margin: 0 0 4px 0;
-}
-
-.pun .blockpost .postright {
-	position: relative;
-	padding: 4px 230px 7px 18px;
-}
-
-.pun .postmsg {
-	width:100%;
-	overflow: hidden;
-	word-wrap: break-word;
-}
-
-.pun .blockpost .postfootright {
-	position: relative;
-	padding: 7px 230px 7px 18px;
-	text-align: right;
-}
-
-.pun .postfoot p, .pun .postfoot ul {
-	padding: 0;
-}
-
-.pun .blockpost .postfootright li {
-	display: inline;
-}
-
-.pun .blockpost .postfootright li span {
-	display: inline-block;
-	padding-left: 16px;
-	margin-left: 8px;
-	line-height: normal;
-	background: url(Fire/img/bull.png) center left no-repeat;
-}
-
-.pun .blockpost .usercontacts {
-	padding: 7px 0;
-}
-
-.pun .blockpost .usercontacts .email {
-	background: url(Fire/img/email.png) left 65% no-repeat;
-	margin-right: 5px;
-	padding-left: 21px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun .blockpost .usercontacts .website {
-	background: url(Fire/img/ext.png) left 65% no-repeat;
-	padding-left: 18px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun .postsignature hr {
-	border:none;
-	height: 1px;
-	margin-left: 0px;
-	text-align: left;
-}
-
-/* Content (includes other user content)
-----------------------------------------------------------------*/
-
-.pun .usercontent {
-	padding: 7px 0;
-}
-
-.pun .postmsg p, .pun .postmsg li, #punhelp p samp {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-}
-
-.pun .usercontent h1, .pun .usercontent h2, .pun .usercontent h3,
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	padding: 7px 0 0 0;
-}
-
-.pun .postmsg h5, #punhelp h5 {
-	font-size: 1.231em;
-	font-weight: bold;
-	padding: 7px 0;
-}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	list-style: disc;
-	padding: 4px 13px 4px 30px;
-}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	list-style: decimal;
-	padding: 4px 13px 4px 30px;
-}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha;
-}
-
-.pun .usercontent li, .pun .postmsg li {
-	padding: 0 3px;
-}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0;
-}
-
-.pun span.bbu {
-	text-decoration: underline;
-}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-}
-
-.pun .blockpost .postmsg .postedit {
-	font-size: 0.857em;
-}
-
-.pun .blockform .postsignature, .pun .blockpost .postsignature {
-	font-size: 0.923em;
-}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px 1px 1px 3px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	font-weight: bold;
-	line-height: 1.462em;
-}
-
-.pun .quotebox blockquote {
-	overflow: hidden;
-	width: 100%;
-}
-
-.pun .codebox pre {
-	overflow-y:hidden;
-	overflow: auto;
-	width: 100%;
-	direction: ltr;
-	text-align: left;
-}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-}
-
-*:first-child+html .pun .codebox pre {
-	padding-bottom: 10px;
-}
-
-.pun .codebox pre code {
-	padding: 0.75em;
-	white-space: pre;
-}
-
-.pun div[class*=codebox] pre code {
-	display: inline-block;
-}
-
-* html .pun .codebox pre code {
-	display: block;
-}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-}
-
-.pun .postmsg img, #punhelp samp img {
-	vertical-align: text-top;
-}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-/*****************************************************************
-MAIN FORMS
-*****************************************************************/
-
-#punedit .blockform h2, #punpost .blockform h2, #postpreview h2, #posterror h2,
-.pun #quickpost h2, .pun #reportform h2, #pundelete .blockform h2 {
-	font: 1em/1.462em Arial, Helvetica, sans-serif;
-	font-weight: bold;
-	white-space: nowrap;
-	padding: 10px 19px 4px 37px;
-	border: 0;
-}
-
-#punpost .blockform h2, #punedit .blockform h2,.pun #quickpost h2,
-#pundelete .blockform h2 {
-	margin: 1px 1px 0 1px;
-	width: 25em;
-	position: absolute;
-	z-index: 100;
-}
-
-.pun #quickpost legend, #punpost legend, #punedit legend {
-	width: 25em;
-	overflow: hidden;
-	white-space: nowrap;
-}
-
-.pun .blockform .box {
-	border-style: solid;
-	border-width: 1px;
-	padding-bottom: 12px;
-}
-
-.pun #posterror {
-	border-style: solid;
-	border-width: 1px;
-}
-
-.pun #posterror .box {
-	padding: 0 18px 12px 18px;
-}
-
-* html .pun .blockform .box, * html .pun #posterror {
-	display: inline-block;
-}
-
-.pun .blockform .forminfo, .pun .error-info {
-	padding: 12px 18px;
-	border-style: solid;
-	border-width: 1px;
-	position: relative;
-}
-
-.pun .blockform .forminfo {
-	margin-top: 12px;
-}
-
-#pundelete .blockform .forminfo {
-	margin-top: 33px;
-}
-
-.pun .forminfo h3 {
-	padding-bottom: 0;
-}
-
-.pun .error-list li {
-	padding-left: 24px;
-	background: url(Fire/img/exclaim.png) center left no-repeat;
-}
-
-.pun .inform {
-	padding: 0 18px;
-}
-
-.pun legend {
-	font-weight: bold;
-	padding: 10px 19px 4px 19px;
-}
-
-* html .pun legend {
-	margin-left: -7px;
-}
-
-*:first-child+html .pun legend {
-	margin-left: -7px;
-}
-
-.pun .infldset {
-	border-style: solid;
-	border-width: 1px;
-	padding: 12px 18px;
-}
-
-#punregister #rules .infldset {
-	padding: 5px 18px;
-}
-
-.pun fieldset p {
-	padding: 0 0 7px 0;
-	width: 100%;
-}
-
-.pun fieldset .usercontent p {
-	padding: 7px 0;
-}
-
-.pun fieldset label {
-	display: block;
-	padding: 0 0 7px 0;
-}
-
-.pun label em {
-	font-weight: normal;
-	font-style: normal;
-}
-
-.pun .required strong {
-	background: url(Fire/img/asterisk.png) center right no-repeat;
-	font-weight: normal;
-	padding-right: 14px;
-	white-space: pre;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun label input, .pun label select, .pun label textarea {
-	margin-top: 2px;
-}
-
-.pun label.conl {
-	display: inline-block;
-	padding-right: 12px;
-}
-
-.pun form .buttons {
-	padding: 8px 19px 8px 34px;
-	margin-bottom: -12px;
-}
-
-.pun .blockform .buttons input {
-	margin-right: 12px;
-}
-
-.pun .rbox {
-	padding: 3px 0;
-}
-
-.pun .rbox label {
-	padding: 3px 0 3px 1.75em;
-	position: relative;
-	min-height: 1px;
-}
-
-* html .pun .rbox label {
-	text-indent: -3px;
-	height: 1%;
-}
-
-.pun .rbox input {
-	margin: 3px 0.75em 3px -1.75em;
-	float: left;
-	position: relative;
-	vertical-align: middle;
-	padding: 0;
-	height: 1em;
-	width: 1em;
-}
-
-.pun input[type=text], .pun select, .pun textarea {
-	font-family: Verdana, Arial, Helvetica, sans-serif;
-}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 98%;
-}
-
-.pun #quickpost .txtarea {
-	padding-right: 12px;
-	position: relative;
-}
-
-.pun .blockform .bblinks {
-	padding-top: 0;
-}
-
-.pun .blockform .bblinks li {
-	display: inline;
-}
-
-.pun .blockform .bblinks li span {
-	background: url(Fire/img/help.png) center left no-repeat;
-	margin-right: 8px;
-	padding-left: 20px;
-	display: inline-block;
-}
-
-.pun #quickpost .bblinks {
-	padding-top: 0;
-}
-
-.pun #quickpost .bblinks li {
-	display: inline;
-}
-
-.pun #login p.clearb {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	font-size: 0;
-	height: 0;
-	line-height: 0;
-	margin-top: 7px;
-	overflow: hidden;
-	padding-bottom: 3px;
-	padding-top: 7px;
-	text-indent: -9999em;
-	width: 100%;
-}
-
-.pun #postreview {
-	padding-top: 12px;
-}
-
-.pun #postpreview, .pun #posterror {
-	margin-bottom: 12px;
-}
-
-.pun #postpreview .postright {
-	padding: 0;
-}
-
-.pun #postpreview .postbody {
-	border-style: solid;
-	border-width: 1px;
-	float: none;
-	margin: 0 18px 12px 18px;
-	padding: 0;
-	padding: 4px 18px 4px 18px;
-	width: auto;
-}
-
-.pun span.email {
-	background: url(Fire/img/email.png) left 65% no-repeat;
-	margin-right: 5px;
-	padding-left: 21px;
-	display: inline-block;
-	line-height: normal;
-}
-
-.pun span.website {
-	background: url(Fire/img/ext.png) left 65% no-repeat;
-	padding-left: 18px;
-	display: inline-block;
-	line-height: normal;
-}
-
-#punmisc #rules .box {
-	border-style: solid;
-	border-width: 1px;
-	padding: 5px 18px;
-}
-
-
-#punhelp .box {
-	border-style: solid;
-	border-width: 1px;
-	padding: 7px 12px;
-}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.25em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-}
-
-.pun .checklist legend {
-	padding: 0;
-}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-}
-
-.pun .checklist .checklist-item {
-	position: relative;
-}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 1.75em;
-}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.55em;
-	width: 1.55em;
-}
-
-/*****************************************************************
-PROFILES (+ ADMIN MENU)
-*****************************************************************/
-
-/* Profile / Admin
-----------------------------------------------------------------*/
-
-.pun .blockmenu {
-	width: 13em;
-	float: left;
-	padding-bottom: 12px;
-}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 15em;
-}
-
-.pun .blockmenu .block2 {
-	padding-top: 19px;
-}
-
-.pun .blockmenu ul {
-	border-top-style: dotted;
-	border-top-width: 1px;
-	padding: 0;
-}
-
-.pun .blockmenu li {
-	border-bottom-style: dotted;
-	border-bottom-width: 1px;
-	font-weight: bold;
-	padding: 0;
-}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	display: block;
-	padding: 9px 6px 3px 6px;
-	min-height: 1px;
-	text-decoration: none;
-}
-
-* html .pun .blockmenu a:link,  * html .pun .blockmenu a:visited {
-	height: 1%;
-}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active, .pun .blockmenu a:focus {
-	text-decoration: none;
-}
-
-#viewprofile .box {
-	border-style: solid;
-	border-width: 1px;
-	padding-bottom: 18px;
-}
-
-#viewprofile dt, #adstats dt {
-	padding: 7px 0;
-	position: absolute;
-	width: 13em;
-	left: 0;
-}
-
-#viewprofile dl {
-	border-style: solid none none none;
-	border-width: 1px;
-	margin: 7px 0;
-	padding: 0;
-	width: 100%;
-	position: relative;
-}
-
-#adintro, #adstats {
-	border-style: solid;
-	border-width: 1px;
-	padding: 18px;
-}
-
-#adintro li span {
-	display: inline-block;
-	padding-left: 16px;
-	margin-left: 8px;
-	line-height: normal;
-	background: url(Fire/img/bull.png) center left no-repeat;
-}
-
-#adstats .inbox, #adintro .inbox {
-	border-style: solid;
-	border-width: 1px;
-	padding: 18px;
-}
-
-#adstats dl {
-	margin: 0;
-	padding: 0;
-	width: 100%;
-	position: relative;
-}
-
-#viewprofile dd, #adstats dd {
-	border-style: none none solid none;
-	border-width: 1px;
-	padding: 7px 0 7px 13em;
-}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Basic defaults and Common Items
-----------------------------------------------------------------*/
-
-html, body, .pun {
-	background: #eeedea;
-	color: #333;
-}
-
-.pun .punwrap {
-	background: #fff;
-	border-color: #e1d9ca;
-	color: #665858;
-}
-
-#brdtitle #brddesc, .pun .pagepost, #brdstats #onlinelist, #brdfooter #searchlinks, #brdfooter #modcontrols,
-#punmaint h2, #punredirect h2, #adminconsole .submittop, .pun #debugtime, .pun .pagelink * {
-	border-color: #cec7b9;
-}
-
-.pun a, .pun a:link, .pun a:visited {
-	color: #990000;
-}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #f60;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #990000;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #f60;
-}
-
-/* Primary Navigation
-----------------------------------------------------------------*/
-
-#brdmenu {
-	background: #990000;
-}
-
-#brdmenu a, #brdmenu a:link, #brdmenu a:visited {
-	background: #990000;
-	border-color: #fff;
-	color: #ddd;
-}
-
-#brdmenu a:hover, #brdmenu a:active, #brdmenu a:focus {
-	background: #f60;
-	border-color: #fff;
-	color: #fff;
-}
-
-/* Main Tables
-----------------------------------------------------------------*/
-
-.pun .blocktable .box {
-	background: #fbfaf5;
-	border-color: #cec7b9 #e7e2d9;
-}
-
-#punindex .blocktable h2, .pun #vf h2 {
-	color: #836359;
-}
-
-#adminconsole fieldset th, #adminconsole fieldset td {
-	background: #f3f2ed;
-	border-color: #ebe0dc;
-}
-
-.pun #users1 h2 {
-	background: #fff;
-}
-
-.pun .blocktable td {
-	border-color: #ebe0dc;
-}
-
-.pun .blocktable th {
-	background: #ecebe7;
-	border-color: #e1d9ca;
-	color: #836359;
-}
-
-.pun .blocktable td.tcl span.stickytext {
-	color: #000;
-}
-
-/* Main Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost {
-	background: #f3f2ed;
-	border-color: #cec7b9 #e7e2d9;
-}
-
-.pun .blockpost h2 {
-	background: #ecebe7;
-	border-color: #e1d9ca;
-	color: #836359;
-}
-
-.pun .blockpost .postbody, .pun .blockpost .postfoot {
-	background: #fbfaf5;
-	border-color: #ebe0dc;
-}
-
-.pun .blockpost .postfootright li {
-	color: #fbfaf5;
-}
-
-.pun .postmsg, #punhelp code, #punhelp samp {
-	color: #333;
-}
-
-.pun .postsignature, .pun .postmsg .postedit {
-	color: #665858;
-}
-
-.pun .quotebox {
-	background: #f4f4e8;
-	border-color: #ccc;
-	color: #665858;
-}
-
-.pun .quotebox cite {
-	color: #836359;
-}
-
-.pun .codebox, #punhelp .codebox code {
-	background: #333;
-	color: #fff;
-}
-
-.pun .postmsg hr {
-	background: #cec7b9;
-}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-}
-
-/* Main Forms + Profile
-----------------------------------------------------------------*/
-
-.pun .blockform .box, #adstats, #adintro, #postpreview, #posterror {
-	border-color: #cec7b9 #e7e2d9;
-	background: #ecebe7;
-}
-
-#punmisc #rules .box, #punhelp .box {
-	border-color: #cec7b9 #e7e2d9;
-	background: #f3f2ed;
-}
-
-.pun #quickpost h2, #punpost .blockform h2, #punedit .blockform h2, #posterror h2,
-#pundelete .blockform h2 {
-	background: #ecebe7;
-	color: #836359;
-}
-
-.pun .forminfo {
-	background: #fff;
-	border-color: #ebe0dc;
-}
-
-#puninstall form#install .forminfo {
-	background: #990000;
-	color: #fff;
-}
-
-.pun #posterror .error-info {
-	background: #ffffe1;
-	border-color: #dfe6ee;
-}
-
-#puninstall form#install .error-info {
-	background: #ffffe1;
-	border-color: #dfe6ee;
-	color: #333;
-}
-
-.pun .infldset, #adintro .inbox, #adstats .inbox {
-	background: #f3f2ed;
-	border-color: #ebe0dc;
-}
-
-.pun label, .pun legend, #adminconsole fieldset th {
-	color: #836359;
-}
-
-.pun fieldset p {
-	border-color: #cec7b9;
-}
-
-.pun .blockmenu ul, .pun .blockmenu li {
-	border-color: #cec7b9;
-}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active, .pun .blockmenu a:focus {
-	background: #ffffe6;
-}
-
-.pun .blockmenu .isactive a:link, .pun .blockmenu .isactive a:visited {
-	color: #333;
-	background: #f3f2ed;
-	}
-
-.pun #viewprofile .box {
-	border-color: #cec7b9 #e7e2d9;
-	background: #ecebe7;
-}
-
-.pun #viewprofile dt, #adstats dt {
-	color: #836359;
-}
-
-.pun #viewprofile dl, .pun #viewprofile dd, #adstats dl, #adstats dd {
-	border-color: #ebe0dc;
-}
-
-#adminconsole fieldset td.nodefault {
-	background: #d59b9b;
-}
-
-.pun .multiselect {
-	color: #836359;
-}
-
-.pun .checklist {
-	background: white;
-	border-color: #ccc;
-}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #f1eee8 #dddad4 #e8e5df #f1efe8;
-}
-
-.pun .iredirect .icon {
-	border-color: #cec7b9;
-	border-width: 1px;
-	padding: 7px;
-}
-
-.pun .inew .icon {
-	border-color: #ca0000 #ab0000 #bb0000 #d30000;
-}
Index: trunk/web/punbb/style/Lithium.css
===================================================================
--- trunk/web/punbb/style/Lithium.css	(revision 10)
+++ 	(revision )
@@ -1,1170 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3, span.closedtext,
-.pun .required strong span {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 68.75%/1.4545em Verdana, Helvetica, Arial, sans-serif;
-	line-height: normal;
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: verdana, helvetica, arial, sans-serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1em;
-	font-weight: normal;
-	padding: 4px 6px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.75em 0
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-html, body {
-	margin: 0;
-	padding: 0
-	}
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#brdtitle p {
-	padding-top: 0px
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .blockpost {
-	margin-bottom: -1px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-#brdheader .box {
-	border-top-width: 4px;
-	}
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu li {
-	display: inline;
-	margin-right: 12px;
-	}
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none
-	}
-
-#brdmenu a:hover, #brdmenu a:active {
-	text-decoration: underline
-	}
-
-#brdwelcome .conl {
-	float: left;
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-	}
-
-.pun .postlink {
-	font-weight: bold;
-	white-space: nowrap;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	text-decoration: none
-	}
-
-.pun .postlink a:hover, .pun .postlink a:active {
-	text-decoration: underline;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin:0 6px;
-	}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td, .pun th {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .tcl h3 span.newtext {
-	font-size: 0.917em;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap;
-	font-weight: normal;
-	}
-
-.pun td span.byuser {
-	white-space: nowrap;
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	margin: 0.1em 0 0 0.2em;
-	border-width: 0.6em;
-	border-style: solid;
-	height: 0;
-	width: 0;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-.pun .blockform form, .pun .fakeform {
-	PADDING: 20px 20px 15px 20px
-	}
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-.pun .inform {
-	padding-bottom: 12px
-	}
-
-.pun fieldset {
-	padding: 0px 12px 0px 12px;
-	border-style: solid;
-	border-width: 1px
-	}
-
-.pun legend {
-	padding: 0px 6px
-	}
-
-.pun .infldset {
-	padding: 9px 0px 12px 0
-	}
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 75%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 12px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun p.actions span {
-	margin-right: 12px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.3em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist fieldset {
-	border: 0;
-	padding: 0;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	margin: .2em 0;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 2.1em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.15em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 10px 6px 5px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-	}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-#debugtime {
-	margin-top: -12px;
-	text-align: center;
-	}
-
-#brdwelcome, #brdfooter dl a, div.blockmenu li, div.rbox input {
-	line-height: 1.4em
-	}
-
-#announce div.inbox div {
-	padding: 3px 0
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #fff;
-	color: #333
-	}
-
-.pun {
-	color: #333
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #f1f1f1
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#brdfooter #modcontrols, #adminconsole fieldset td, .pun .blockmenu .box, #adstats dd {
-	background-color: #dedfdf
-	}
-
-.pun h2, #brdmenu {
-	background-color: #6c8a3f;
-	color: #fff
-	}
-
-.pun th {
-	background-color: #d1d1d1
-	}
-
-.pun legend {
-	color: #6c8a3f
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #333
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #333
-	}
-
-.pun .multiselect, .pun .checklist {
-	color: #333;
-	}
-
-.pun .checklist {
-	border-color: #ACA899;
-	}
-
-/* posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #dedfdf
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #f1f1f1
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #f1f1f1
-	}
-
-#punhelp .codebox, #punhelp .quotebox {
-	background-color: #f9f9f9;
-	}
-
-.pun .blockpost h2 {
-	background-color: #7ea34b
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #b7d094
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-.pun hr {
-	background-color: #333;
-	color: #333
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-color: #6c8a3f
-	}
-
-.pun td, #brdfooter #modcontrols {
-	border-color: #cedeb9
-	}
-
-.pun th {
-	border-color: #d1d1d1
-	}
-
-.pun fieldset {
-	border-color: #aca899
-	}
-
-#adminconsole td, #adminconsole th {
-	border-color: #f1f1f1
-	}
-
-.pun .quotebox, .pun .codebox, .pun .forminfo,
-.pun .blockpost label, .pun .deletemsg {
-	border-color: #aca899 #fff #fff #aca899
-	}
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #638137
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #8eb653
-	}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #638137;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #8eb653;
-}
-
-.pun h2 a:link, .pun h2 a:visited,
-#brdmenu a:link, #brdmenu a:visited {
-	color: #fff
-	}
-
-.pun h2 a:hover, .pun h2 a:active,
-#brdmenu a:hover, #brdmenu a:active {
-	color: #fff
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #b42000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #b42000
-	}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #e6e6e6 #dedede #dadada #e2e2e2
-	}
-
-.pun .iredirect .icon {
-	border-color: #f1f1f1 #f1f1f1 #f1f1f1 #f1f1f1
-	}
-
-.pun .inew .icon {
-	border-color: #8bb453 #7a9e48 #709142 #799c47
-	}
Index: trunk/web/punbb/style/Mercury.css
===================================================================
--- trunk/web/punbb/style/Mercury.css	(revision 10)
+++ trunk/web/punbb/style/Mercury.css	(revision 1)
@@ -1,1171 +1,258 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3, span.closedtext,
-.pun .required strong span {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 68.75%/1.4545em Verdana, Helvetica, Arial, sans-serif;
-	line-height: normal;
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: verdana, helvetica, arial, sans-serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1em;
-	font-weight: normal;
-	padding: 4px 6px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.75em 0
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-html, body {
-	margin: 0;
-	padding: 0
-	}
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#brdtitle p {
-	padding-top: 0px
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .blockpost {
-	margin-bottom: -1px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-#brdheader .box {
-	border-top-width: 4px;
-	}
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu li {
-	display: inline;
-	margin-right: 12px;
-	}
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none
-	}
-
-#brdmenu a:hover, #brdmenu a:active {
-	text-decoration: underline
-	}
-
-#brdwelcome .conl {
-	float: left;
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-	}
-
-.pun .postlink {
-	font-weight: bold;
-	white-space: nowrap;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	text-decoration: none
-	}
-
-.pun .postlink a:hover, .pun .postlink a:active {
-	text-decoration: underline;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin:0 6px;
-	}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td, .pun th {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .tcl h3 span.newtext {
-	font-size: 0.917em;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap;
-	font-weight: normal;
-	}
-
-.pun td span.byuser {
-	white-space: nowrap;
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	margin: 0.1em 0 0 0.2em;
-	border-width: 0.6em;
-	border-style: solid;
-	height: 0;
-	width: 0;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-.pun .blockform form, .pun .fakeform {
-	PADDING: 20px 20px 15px 20px
-	}
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-.pun .inform {
-	padding-bottom: 12px
-	}
-
-.pun fieldset {
-	padding: 0px 12px 0px 12px;
-	border-style: solid;
-	border-width: 1px
-	}
-
-.pun legend {
-	padding: 0px 6px
-	}
-
-.pun .infldset {
-	padding: 9px 0px 12px 0
-	}
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 75%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 12px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun p.actions span {
-	margin-right: 12px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.3em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist fieldset {
-	border: 0;
-	padding: 0;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	margin: .2em 0;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 2.1em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.15em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 10px 6px 5px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-	}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-#debugtime {
-	margin-top: -12px;
-	text-align: center;
-	}
-
-#brdwelcome, #brdfooter dl a, div.blockmenu li, div.rbox input {
-	line-height: 1.4em
-	}
-
-#announce div.inbox div {
-	padding: 3px 0
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #2a2a2a;
-	color: #d4d4d4
-	}
-
-.pun {
-	color: #d4d4d4
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #383838
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#brdfooter #modcontrols, #adminconsole fieldset td, .pun .blockmenu .box, #adstats dd {
-	background-color: #424242
-	}
-
-.pun h2, #brdmenu {
-	background-color: #565656;
-	color: #d4d4d4
-	}
-
-.pun th {
-	background-color: #484848
-	}
-
-.pun legend {
-	color: #f6b620
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #d4d4d4
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #d4d4d4
-	}
-
-.pun textarea, .pun input, .pun select {
-	background-color: #2a2a2a;
-	color: #d4d4d4
-	}
-
-.pun .multiselect, .pun .checklist {
-	color: #D4D4D4;
-	}
-
-.pun .checklist {
-	border-color: #666;
-	}
-
-/* Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #383838
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #424242
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #424242
-	}
-
-.pun .blockpost h2 {
-	background-color: #565656
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #a19e96
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-.pun hr {
-	background-color: #606060;
-	color: #606060
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-color:#565656
-	}
-
-.pun td, #brdfooter #modcontrols {
-	border-color: #565656
-	}
-
-.pun th {
-	border-color: #484848
-	}
-
-.pun fieldset {
-	border-color: #565656
-	}
-
-#adminconsole td, #adminconsole th {
-	border-color: #383838
-	}
-
-.pun .quotebox, .pun .codebox, .pun .forminfo,
-.pun .blockpost label, .pun .deletemsg {
-	border-color: #565656
-	}
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #f6b620
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #ffee40
-	}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #f6b620;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #ffee40;
-}
-
-.pun h2 a:link, .pun h2 a:visited,
-#brdmenu a:link, #brdmenu a:visited {
-	color: #d4d4d4
-	}
-
-.pun h2 a:hover, .pun h2 a:active,
-#brdmenu a:hover, #brdmenu a:active {
-	color: #d4d4d4
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #ff4000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #ff5010
-	}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #484848 #404040 #3c3c3c #444444
-	}
-
-.pun .iredirect .icon {
-	border-color: #383838 #383838 #383838 #383838
-	}
-
-.pun .inew .icon {
-	border-color: #f6b620 #ecae1f #d09a1b #e1a61d
-	}
+/****************************************************************/
+/* 1. IMPORTED STYLESHEETS */
+/****************************************************************/
+
+/* Import the basic setup styles */
+@import url(imports/base.css);
+/* Import the colour scheme */
+@import url(imports/Mercury_cs.css);
+
+/****************************************************************/
+/* 2. TEXT SETTINGS */
+/****************************************************************/
+
+/* 2.1 This sets the default Font Group */
+
+.pun, .pun INPUT, .pun SELECT, .pun TEXTAREA, .pun OPTGROUP {
+	FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
+}
+
+.pun {FONT-SIZE: 11px; LINE-HEIGHT: normal}
+
+/* IEWin Font Size only - to allow IEWin to zoom. Do not remove comments \*/
+* HTML .pun {FONT-SIZE: 68.75%}
+/* End IE Win Font Size */
+
+/* Set font size for tables because IE requires it */
+.pun TABLE, .pun INPUT, .pun SELECT, .pun OPTGROUP, .pun TEXTAREA, DIV.postmsg P.postedit {FONT-SIZE: 1em}
+
+/* 2.2 Set the font-size for preformatted text i.e in code boxes */
+
+.pun PRE {FONT-FAMILY: monaco, "Bitstream Vera Sans Mono", "Courier New", courier, monospace}
+
+/* 2.3 Font size for headers */
+
+.pun H2, .pun H4 {FONT-SIZE: 1em}
+.pun H3 {FONT-SIZE: 1.1em}
+#brdtitle H1 {FONT-SIZE: 1.4em}
+
+/* 2.4 Larger text for particular items */
+DIV.postmsg P {LINE-HEIGHT: 1.4}
+DIV.postleft DT {FONT-SIZE: 1.1em}
+.pun PRE {FONT-SIZE: 1.2em}
+
+/* 2.5 Bold text */
+
+DIV.postleft DT, DIV.postmsg H4, TD.tcl H3, DIV.forminfo H3, P.postlink, DIV.linkst LI,
+DIV.linksb LI, DIV.postlinksb LI, .blockmenu LI, #brdtitle H1, .pun SPAN.warntext, .pun P.warntext {FONT-WEIGHT: bold}
+
+/****************************************************************/
+/* 3. LINKS */
+/****************************************************************/
+
+/* 3.1 Remove underlining for main menu, post header links, post links and vertical menus */
+
+#brdmenu A:link, #brdmenu A:visited, .blockpost DT A:link, .blockpost DT A:visited, .blockpost H2 A:link,
+.blockpost H2 A:visited, .postlink A:link, .postlink A:visited, .postfootright A:link, .postfootright A:visited,
+.blockmenu A:link, .blockmenu A:visited {
+	TEXT-DECORATION: none
+}
+
+/* 3.2 Underline on hover for links in headers and main menu */
+
+#brdmenu A:hover, .blockpost H2 A:hover {TEXT-DECORATION: underline}
+
+/****************************************************************/
+/* 4. BORDER WIDTH AND STYLE */
+/****************************************************************/
+
+/* 4.1 By default borders are 1px solid */
+
+DIV.box, .pun TD, .pun TH, .pun BLOCKQUOTE, DIV.codebox, DIV.forminfo, DIV.blockpost LABEL {
+	BORDER-STYLE: solid;
+	BORDER-WIDTH: 1px
+}
+
+/* 4.2 Special settings for the board header. */
+
+#brdheader DIV.box {BORDER-TOP-WIDTH: 4px}
+
+/* 4.3 Borders for table cells */
+
+.pun TD, .pun TH {
+	BORDER-BOTTOM: none;
+	BORDER-RIGHT: none
+}
+
+.pun .tcl {BORDER-LEFT: none}
+
+/* 4.4 Special setting for fieldsets to preserve IE defaults */
+
+DIV>FIELDSET {
+	BORDER-STYLE: solid;
+	BORDER-WIDTH: 1px
+}
+
+/****************************************************************/
+/* 5. VERTICAL AND PAGE SPACING */
+/****************************************************************/
+
+/* 5.1 Page margins */
+
+HTML, BODY {MARGIN: 0; PADDING: 0}
+#punwrap {margin:12px 20px}
+
+/* 5.2 Creates vertical space between main board elements (Margins) */
+
+DIV.blocktable, DIV.block, DIV.blockform, DIV.block2col, #postreview {MARGIN-BOTTOM: 12px}
+#punindex DIV.blocktable, DIV.blockpost {MARGIN-BOTTOM: 6px}
+DIV.block2col DIV.blockform, DIV.block2col DIV.block {MARGIN-BOTTOM: 0px}
+
+/* 5.3 Remove space above breadcrumbs, postlinks and pagelinks with a negative top margin */
+
+DIV.linkst, DIV.linksb {MARGIN-TOP: -12px}
+DIV.postlinksb {MARGIN-TOP: -6px}
+
+/* 5.4 Put a 12px gap above the board information box in index because the category tables only
+have a 6px space beneath them */
+
+#brdstats {MARGIN-TOP: 12px}
+
+/****************************************************************/
+/* 6. SPACING AROUND CONTENT */
+/****************************************************************/
+
+/* 6.1 Default padding for main items */
+
+DIV.block DIV.inbox, DIV.blockmenu DIV.inbox {PADDING: 3px 6px}
+.pun P, .pun UL, .pun DL, DIV.blockmenu LI, .pun LABEL, #announce DIV.inbox DIV {PADDING: 3px 0}
+.pun H2 {PADDING: 4px 6px}
+
+/* 6.2 Special spacing for various elements */
+
+.pun H1 {PADDING: 3px 0px 0px 0}
+#brdtitle P {PADDING-TOP: 0px}
+DIV.linkst {PADDING: 8px 6px 3px 6px}
+DIV.linksb, DIV.postlinksb {PADDING: 3px 6px 8px 6px}
+#brdwelcome, #brdfooter DL A, DIV.blockmenu LI, DIV.rbox INPUT  {LINE-HEIGHT: 1.4em}
+#viewprofile DT, #viewprofile DD {PADDING: 0 3px; LINE-HEIGHT: 2em}
+
+/* 6.4 Create some horizontal spacing for various elements */
+
+#brdmenu LI, DIV.rbox INPUT, DIV.blockform P INPUT  {MARGIN-RIGHT: 12px}
+
+/****************************************************************/
+/* 7. SPACING FOR TABLES */
+/****************************************************************/
+
+.pun TH, .pun TD {PADDING: 4px 6px}
+.pun TD P {PADDING: 5px 0 0 0}
+
+/****************************************************************/
+/* 8. SPACING FOR POSTS */
+/****************************************************************/
+
+/* 8.1 Padding around left and right columns in viewtopic */
+
+DIV.postleft DL, DIV.postright {PADDING: 6px}
+
+/* 8.2 Extra spacing for poster contact details and avatar */
+
+DD.usercontacts, DD.postavatar {MARGIN-TOP: 5px}
+DD.postavatar {MARGIN-BOTTOM: 5px}
+
+/* 8.3 Extra top spacing for signatures and edited by */
+
+DIV.postsignature, DIV.postmsg P.postedit {PADDING-TOP: 15px}
+
+/* 8.4 Spacing for code and quote boxes */
+
+DIV.postmsg H4 {MARGIN-BOTTOM: 10px}
+.pun BLOCKQUOTE, DIV.codebox {MARGIN: 5px 15px 15px 15px; PADDING: 8px}
+
+/* 8.5 Padding for the action links and online indicator in viewtopic */
+
+DIV.postfootleft P, DIV.postfootright UL, DIV.postfootright DIV {PADDING: 10px 6px 5px 6px}
+
+/* 8.6 This is the input on moderators multi-delete view */
+
+DIV.blockpost INPUT, DIV.blockpost LABEL {
+	PADDING: 3px;
+	DISPLAY: inline
+}
+
+P.multidelete {
+	PADDING-TOP: 15px;
+	PADDING-BOTTOM: 5px
+}
+
+/* 8.7 Make sure paragraphs in posts don't get any padding */
+
+DIV.postmsg P {PADDING: 0}
+
+/****************************************************************/
+/* 9. SPECIAL SPACING FOR FORMS */
+/****************************************************************/
+
+/* 9.1 Padding around fieldsets */
+
+DIV.blockform FORM, DIV.fakeform {PADDING: 20px 20px 15px 20px}
+DIV.inform {PADDING-BOTTOM: 12px}
+
+/* 9.2 Padding inside fieldsets */
+
+.pun FIELDSET {PADDING: 0px 12px 0px 12px}
+DIV.infldset {PADDING: 9px 0px 12px 0}
+.pun LEGEND {PADDING: 0px 6px}
+
+/* 9.3 The information box at the top of the registration form and elsewhere */
+
+DIV.forminfo {
+	MARGIN-BOTTOM: 12px;
+	PADDING: 9px 10px
+}
+
+/* 9.4 BBCode help links in post forms */
+
+UL.bblinks LI {PADDING-RIGHT: 20px}
+
+UL.bblinks {PADDING-BOTTOM: 10px; PADDING-LEFT: 4px}
+
+/* 9.5 Horizontal positioning for the submit button on forms */
+
+DIV.blockform P INPUT {MARGIN-LEFT: 12px}
+
+/****************************************************************/
+/* 10. POST STATUS INDICATORS */
+/****************************************************************/
+
+/* 10.1 These are the post status indicators which appear at the left of some tables. 
+.inew = new posts, .iredirect = redirect forums, .iclosed = closed topics and
+.isticky = sticky topics. By default only .inew is different from the default.*/
+
+DIV.icon {
+	FLOAT: left;
+	MARGIN-TOP: 0.1em;
+	MARGIN-LEFT: 0.2em;
+	DISPLAY: block;
+	BORDER-WIDTH: 0.6em 0.6em 0.6em 0.6em;
+	BORDER-STYLE: solid
+}
+
+DIV.searchposts DIV.icon {MARGIN-LEFT: 0}
+
+/* 10.2 Class .tclcon is a div inside the first column of tables with post indicators. The
+margin creates space for the post status indicator */
+
+TD DIV.tclcon {MARGIN-LEFT: 2.3em}
+
+
+
+
+
+
+
+
+
+
+
Index: trunk/web/punbb/style/Oxygen.css
===================================================================
--- trunk/web/punbb/style/Oxygen.css	(revision 10)
+++ 	(revision )
@@ -1,1171 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3, span.closedtext,
-.pun .required strong span {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 68.75%/1.4545em Verdana, Helvetica, Arial, sans-serif;
-	line-height: normal;
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun small, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: verdana, helvetica, arial, sans-serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1em;
-	font-weight: normal;
-	padding: 4px 6px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.75em 0
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-html, body {
-	margin: 0;
-	padding: 0
-	}
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#brdtitle p {
-	padding-top: 0px
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .blockpost {
-	margin-bottom: -1px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-#brdheader .box {
-	border-top-width: 4px;
-	}
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu li {
-	display: inline;
-	margin-right: 12px;
-	}
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none
-	}
-
-#brdmenu a:hover, #brdmenu a:active {
-	text-decoration: underline
-	}
-
-#brdwelcome .conl {
-	float: left;
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-	}
-
-.pun .postlink {
-	font-weight: bold;
-	white-space: nowrap;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	text-decoration: none
-	}
-
-.pun .postlink a:hover, .pun .postlink a:active {
-	text-decoration: underline;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin:0 6px;
-	}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td, .pun th {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .tcl h3 span.newtext {
-	font-size: 0.917em;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap;
-	font-weight: normal;
-	}
-
-.pun td span.byuser {
-	white-space: nowrap;
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	margin: 0.1em 0 0 0.2em;
-	border-width: 0.6em;
-	border-style: solid;
-	height: 0;
-	width: 0;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-.pun .blockform form, .pun .fakeform {
-	PADDING: 20px 20px 15px 20px
-	}
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-.pun .inform {
-	padding-bottom: 12px
-	}
-
-.pun fieldset {
-	padding: 0px 12px 0px 12px;
-	border-style: solid;
-	border-width: 1px
-	}
-
-.pun legend {
-	padding: 0px 6px
-	}
-
-.pun .infldset {
-	padding: 9px 0px 12px 0
-	}
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 75%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 12px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun p.actions span {
-	margin-right: 12px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.3em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist fieldset {
-	border: 0;
-	padding: 0;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	margin: .2em 0;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 2.1em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.15em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 10px 6px 5px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-	}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-#debugtime {
-	margin-top: -12px;
-	text-align: center;
-	}
-
-#brdwelcome, #brdfooter dl a, div.blockmenu li, div.rbox input {
-	line-height: 1.4em
-	}
-
-#announce div.inbox div {
-	padding: 3px 0
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #fff;
-	color: #333
-	}
-
-.pun {
-	color: #333
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #f1f1f1
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#adminconsole fieldset td, .pun .blockmenu .box, #adstats dd, #brdfooter #modcontrols {
-	background-color: #dedfdf
-	}
-
-.pun h2, #brdmenu {
-	background-color: #0066b9;
-	color: #fff
-	}
-
-.pun th {
-	background-color: #d1d1d1
-	}
-
-.pun legend {
-	color: #005cb1
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #333
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #333
-	}
-
-.pun .multiselect, .pun .checklist {
-	color: #333;
-	}
-
-.pun .checklist {
-	border-color: #ACA899;
-	}
-
-/* Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #dedfdf
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #f1f1f1
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #f1f1f1
-	}
-
-#punhelp .codebox, #punhelp .quotebox {
-	background-color: #f9f9f9;
-	}
-
-.pun .blockpost h2 {
-	background-color: #006fc9
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #aabdcd
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-.pun hr {
-	background-color: #333;
-	color: #333
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-color: #0066b9
-	}
-
-.pun td, #brdfooter #modcontrols {
-	border-color: #bbcede
-	}
-
-.pun th {
-	border-color: #d1d1d1
-	}
-
-.pun fieldset {
-	border-color: #aca899
-	}
-
-#adminconsole td, #adminconsole th {
-	border-color: #f1f1f1
-	}
-
-.pun .quotebox, .pun .codebox, .pun .forminfo,
-.pun .blockpost label, .pun .deletemsg {
-	border-color: #aca899 #fff #fff #aca899
-	}
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #005cb1
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #b42000
-	}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #005cb1;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #b42000;
-}
-
-.pun h2 a:link, .pun h2 a:visited,
-#brdmenu a:link, #brdmenu a:visited {
-	color: #fff
-	}
-
-.pun h2 a:hover, .pun h2 a:active,
-#brdmenu a:hover, #brdmenu a:active {
-	color: #fff
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #b42000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #b42000
-	}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #e6e6e6 #dedede #dadada #e2e2e2
-	}
-
-.pun .iredirect .icon {
-	border-color: #f1f1f1 #f1f1f1 #f1f1f1 #f1f1f1
-	}
-
-.pun .inew .icon {
-	border-color: #0080d7 #0065c0 #0058b3 #0072ca
-	}
Index: trunk/web/punbb/style/Radium.css
===================================================================
--- trunk/web/punbb/style/Radium.css	(revision 10)
+++ 	(revision )
@@ -1,1171 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3, span.closedtext,
-.pun .required strong span {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 68.75%/1.4545em Verdana, Helvetica, Arial, sans-serif;
-	line-height: normal;
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: verdana, helvetica, arial, sans-serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1em;
-	font-weight: normal;
-	padding: 4px 6px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.75em 0
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-html, body {
-	margin: 0;
-	padding: 0
-	}
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#brdtitle p {
-	padding-top: 0px
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .blockpost {
-	margin-bottom: -1px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-#brdheader .box {
-	border-top-width: 4px;
-	}
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu li {
-	display: inline;
-	margin-right: 12px;
-	}
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none
-	}
-
-#brdmenu a:hover, #brdmenu a:active {
-	text-decoration: underline
-	}
-
-#brdwelcome .conl {
-	float: left;
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-	}
-
-.pun .postlink {
-	font-weight: bold;
-	white-space: nowrap;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	text-decoration: none
-	}
-
-.pun .postlink a:hover, .pun .postlink a:active {
-	text-decoration: underline;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin:0 6px;
-	}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td, .pun th {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .tcl h3 span.newtext {
-	font-size: 0.917em;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap;
-	font-weight: normal;
-	}
-
-.pun td span.byuser {
-	white-space: nowrap;
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	margin: 0.1em 0 0 0.2em;
-	border-width: 0.6em;
-	border-style: solid;
-	height: 0;
-	width: 0;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-.pun .blockform form, .pun .fakeform {
-	PADDING: 20px 20px 15px 20px
-	}
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-.pun .inform {
-	padding-bottom: 12px
-	}
-
-.pun fieldset {
-	padding: 0px 12px 0px 12px;
-	border-style: solid;
-	border-width: 1px
-	}
-
-.pun legend {
-	padding: 0px 6px
-	}
-
-.pun .infldset {
-	padding: 9px 0px 12px 0
-	}
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 75%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 12px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun p.actions span {
-	margin-right: 12px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.3em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist fieldset {
-	border: 0;
-	padding: 0;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	margin: .2em 0;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 2.1em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.15em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 10px 6px 5px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-	}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-#debugtime {
-	margin-top: -12px;
-	text-align: center;
-	}
-
-#brdwelcome, #brdfooter dl a, div.blockmenu li, div.rbox input {
-	line-height: 1.4em
-	}
-
-#announce div.inbox div {
-	padding: 3px 0
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #2a2a2a;
-	color: #d4d4d4
-	}
-
-.pun {
-	color: #d4d4d4
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #383838
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#brdfooter #modcontrols, #adminconsole fieldset td, .pun .blockmenu .box, #adstats dd {
-	background-color: #424242
-	}
-
-.pun h2, #brdmenu {
-	background-color: #565656;
-	color: #d4d4d4
-	}
-
-.pun th {
-	background-color: #484848
-	}
-
-.pun legend {
-	color: #60c860
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #d4d4d4
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #d4d4d4
-	}
-
-.pun textarea, .pun input, .pun select {
-	background-color: #2a2a2a;
-	color: #d4d4d4
-	}
-
-.pun .multiselect, .pun .checklist {
-	color: #D4D4D4;
-	}
-
-.pun .checklist {
-	border-color: #666;
-	}
-
-/* Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #383838
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #424242
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #424242
-	}
-
-.pun .blockpost h2 {
-	background-color: #565656
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #a19e96
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-.pun hr {
-	background-color: #606060;
-	color: #606060
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-color:#565656
-	}
-
-.pun td, #brdfooter #modcontrols {
-	border-color: #565656
-	}
-
-.pun th {
-	border-color: #484848
-	}
-
-.pun fieldset {
-	border-color: #606060
-	}
-
-#adminconsole td, #adminconsole th {
-	border-color: #383838
-	}
-
-.pun .quotebox, .pun .codebox, .pun .forminfo,
-.pun .blockpost label, .pun .deletemsg {
-	border-color: #606060
-	}
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #60c860
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #80ee80
-	}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #60c860;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #80ee80;
-}
-
-.pun h2 a:link, .pun h2 a:visited,
-#brdmenu a:link, #brdmenu a:visited {
-	color: #d4d4d4
-	}
-
-.pun h2 a:hover, .pun h2 a:active,
-#brdmenu a:hover, #brdmenu a:active {
-	color: #d4d4d4
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #ff4000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #ff5010
-	}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #484848 #404040 #3c3c3c #444444
-	}
-
-.pun .iredirect .icon {
-	border-color: #383838 #383838 #383838 #383838
-	}
-
-.pun .inew .icon {
-	border-color: #60c860 #54af54 #499849 #59b657
-	}
Index: trunk/web/punbb/style/Sulfur.css
===================================================================
--- trunk/web/punbb/style/Sulfur.css	(revision 10)
+++ 	(revision )
@@ -1,1170 +1,0 @@
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3, span.closedtext,
-.pun .required strong span {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 68.75%/1.4545em Verdana, Helvetica, Arial, sans-serif;
-	line-height: normal;
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: verdana, helvetica, arial, sans-serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1em;
-	font-weight: normal;
-	padding: 4px 6px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.75em 0
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-html, body {
-	margin: 0;
-	padding: 0
-	}
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#brdtitle p {
-	padding-top: 0px
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .blockpost {
-	margin-bottom: -1px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-#brdheader .box {
-	border-top-width: 4px;
-	}
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu li {
-	display: inline;
-	margin-right: 12px;
-	}
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none
-	}
-
-#brdmenu a:hover, #brdmenu a:active {
-	text-decoration: underline
-	}
-
-#brdwelcome .conl {
-	float: left;
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .pagelink {
-	float: left;
-	white-space: nowrap;
-	}
-
-.pun .postlink {
-	font-weight: bold;
-	white-space: nowrap;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	text-decoration: none
-	}
-
-.pun .postlink a:hover, .pun .postlink a:active {
-	text-decoration: underline;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin:0 6px;
-	}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td, .pun th {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .tcl h3 span.newtext {
-	font-size: 0.917em;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap;
-	font-weight: normal;
-	}
-
-.pun td span.byuser {
-	white-space: nowrap;
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	margin: 0.1em 0 0 0.2em;
-	border-width: 0.6em;
-	border-style: solid;
-	height: 0;
-	width: 0;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-.pun .blockform form, .pun .fakeform {
-	PADDING: 20px 20px 15px 20px
-	}
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-.pun .inform {
-	padding-bottom: 12px
-	}
-
-.pun fieldset {
-	padding: 0px 12px 0px 12px;
-	border-style: solid;
-	border-width: 1px
-	}
-
-.pun legend {
-	padding: 0px 6px
-	}
-
-.pun .infldset {
-	padding: 9px 0px 12px 0
-	}
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 75%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 12px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun p.actions span {
-	margin-right: 12px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.3em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist fieldset {
-	border: 0;
-	padding: 0;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	margin: .2em 0;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 2.1em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.15em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 10px 6px 5px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-.pun .codebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0;
-	}
-
-.pun .quotebox {
-	border-style: solid;
-	border-width: 1px;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .postmsg .postimg img {
-	max-width: 98%;
-	vertical-align: middle;
-	margin: 7px 0.5em 7px 0;
-}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-style: solid;
-	border-width: 2px;
-}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-#debugtime {
-	margin-top: -12px;
-	text-align: center;
-	}
-
-#brdwelcome, #brdfooter dl a, div.blockmenu li, div.rbox input {
-	line-height: 1.4em
-	}
-
-#announce div.inbox div {
-	padding: 3px 0
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #fff;
-	color: #333
-	}
-
-.pun {
-	color: #333
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #f1f1f1
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#brdfooter #modcontrols, #adminconsole fieldset td, .pun .blockmenu .box, #adstats dd {
-	background-color: #dedfdf
-	}
-
-.pun h2, #brdmenu {
-	background-color: #b84623;
-	color: #fff
-	}
-
-.pun th {
-	background-color: #d1d1d1
-	}
-
-.pun legend {
-	color: #822100
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #333
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #333
-	}
-
-.pun .multiselect, .pun .checklist {
-	color: #333;
-	}
-
-.pun .checklist {
-	border-color: #ACA899;
-	}
-
-/* Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #dedfdf
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #f1f1f1
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #f1f1f1
-	}
-
-#punhelp .codebox, #punhelp .quotebox {
-	background-color: #f9f9f9;
-	}
-
-.pun .blockpost h2 {
-	background-color: #d25028
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #fccfc1
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-.pun hr {
-	background-color: #333;
-	color: #333
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-color: #b84623
-	}
-
-.pun td, #brdfooter #modcontrols {
-	border-color: #e1c3c3
-	}
-
-.pun th {
-	border-color: #d1d1d1
-	}
-
-.pun fieldset {
-	border-color: #aca899
-	}
-
-#adminconsole td, #adminconsole th {
-	border-color: #f1f1f1
-	}
-
-.pun .quotebox, .pun .codebox, .pun .forminfo,
-.pun .blockpost label, .pun .deletemsg {
-	border-color: #aca899 #fff #fff #aca899
-	}
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #822100
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #ca3300
-	}
-
-.pun .postmsg .postimg a:link img, .pun .postmsg .postimg a:visited img {
-	border-color: #822100;
-}
-
-.pun .postmsg .postimg a:hover img, .pun .postmsg .postimg a:active img, .pun .postmsg .postimg a:focus img {
-	border-color: #ca3300;
-}
-
-.pun h2 a:link, .pun h2 a:visited,
-#brdmenu a:link, #brdmenu a:visited {
-	color: #fff
-	}
-
-.pun h2 a:hover, .pun h2 a:active,
-#brdmenu a:hover, #brdmenu a:active {
-	color: #fff
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #b42000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #b42000
-	}
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	border-color: #e6e6e6 #dedede #dadada #e2e2e2
-	}
-
-.pun .iredirect .icon {
-	border-color: #f1f1f1 #f1f1f1 #f1f1f1 #f1f1f1
-	}
-
-.pun .inew .icon {
-	border-color: #c23000 #af2c00 #992600 #ac2b00
-	}
Index: trunk/web/punbb/style/Technetium.css
===================================================================
--- trunk/web/punbb/style/Technetium.css	(revision 10)
+++ 	(revision )
@@ -1,1409 +1,0 @@
-/*****************************************************************
-Technitium theme CSS
-
-Yes, it is valid CSS 3, but unfortunately border-radius doesn't seem to work correctly in my Firefox version so I have to give it the moz versions, which break the validator. Sorry.
-*****************************************************************/
-
-/*****************************************************************
-1. INITIAL SETTINGS
-*****************************************************************/
-
-/* Limited Reset
-----------------------------------------------------------------*/
-
-.pun table, .pun div, .pun form, .pun p, .pun h1, .pun h2, .pun h3,
-.pun h4, .pun h5, .pun pre, .pun blockquote, .pun ul, .pun ol, .pun li, .pun dl,
-.pun dt, .pun dd, .pun th, .pun td, .pun fieldset, .pun img, .pun abbr, .pun cite {
-	margin: 0;
-	padding: 0;
-	border: 0;
-	}
-
-.pun ul, .pun ol {
-	list-style: none
-	}
-
-
-/* Structural Settings
-----------------------------------------------------------------*/
-
-body {
-	line-height: 1.9em;
-}
-
-.pun {
-	width: 95%;
-	margin: 0 auto;
-	}
-
-.pun .clearer, .pun .nosize {
-	height: 0;
-	width: 0;
-	line-height: 0;
-	font-size: 0;
-	overflow: hidden
-	}
-
-.pun .clearer, .pun .clearb {
-	clear: both
-	}
-
-.pun .nosize {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	width: 0;
-	}
-
-* html .inbox, * html .inform, * html .pun, * html .tclcon, * html .codebox {
-	height: 1px
-	}
-
-.pun, .pun .inbox, .pun .inform, .pun .tclcon, .pun .codebox {
-	min-height: 1px
-	}
-
-.clearl {
-	clear: left;
-	}
-
-/* Hidden Elements
-----------------------------------------------------------------*/
-
-#brdfooter h2, #brdstats h2, #brdstats .conl dt, #brdstats .conr dt,
-#modcontrols dt, #searchlinks dt, div.postright h3 {
-	position: absolute;
-	display: block;
-	overflow: hidden;
-	width: 0;
-	left: -9999em;
-	text-indent: -9999em;
-	}
-
-/*****************************************************************
-2. TEXT & CONTENT
-*****************************************************************/
-
-/* Text Defaults
-----------------------------------------------------------------*/
-
-.pun {
-	font: 10pt Georgia, Times, "Times New Roman", serif
-	}
-
-.pun table, .pun td, .pun th, .pun input, .pun select, .pun optgroup, .pun textarea, .pun samp, .pun legend {
-	font-size: 1em;
-	font-family: Georgia, Times, "Times New Roman", serif;
-	}
-
-.pun pre, .pun code {
-	font-size: 1.182em;
-	font-family: consolas, monaco, "bitstream vera sans mono", "courier new", courier, monospace
-	}
-
-.pun pre code {
-	font-size: 1em;
-	}
-
-.pun strong {
-	font-weight: bold;
-	}
-
-.pun em {
-	font-style: italic;
-	}
-
-#vf td {
-	font-size: 1.1em;
-	}
-
-
-/* Content Defaults
-----------------------------------------------------------------*/
-
-.pun p, .pun ul, .pun ol, .pun dl {
-	font-size: 1em;
-	padding: 3px 0;
-	}
-
-.pun h2 {
-	font-size: 1.5em;
-	font-weight: normal;
-	padding: 4px 6px;
-	padding: 6px;
-	-moz-border-radius-topleft: 0.3em;
-	-moz-border-radius-topright: 0.3em;
-	-webkit-border-top-left-radius: 0.3em;
-	-webkit-border-top-right-radius: 0.3em;
-	}
-
-.pun h2 #brdmenu {
-	font-size: 1.1em;
-	}
-
-.pun .blockpost h2 {
-	font-size: 1.0em;
-	padding: 8px;
-	}
-
-.pun h3 {
-	font-size: 1.091em;
-	padding: 3px 0;
-	}
-
-.pun table p, .pun table h3 {
-	padding: 0;
-	}
-
-.pun span.warntext, .pun p.warntext {
-	font-weight: bold
-	}
-
-.pun .postleft dl dt {
-	font-size: 1.4em;
-	}
-
-/* User Content (Announcements, Rules, Posts)
-----------------------------------------------------------------*/
-
-.pun .usercontent p, .pun .postmsg p {
-	padding: 0.5em 0;
-	line-height: 1.6em;
-	}
-
-.pun .usercontent ul, .pun .postmsg ul {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: disc
-	}
-
-.pun .usercontent ol, .pun .postmsg ol {
-	padding: 0.75em 1em 0.75em 2.5em;
-	list-style: decimal
-	}
-
-.pun .usercontent ol.alpha, .pun .postmsg ol.alpha {
-	list-style: lower-alpha
-	}
-
-.pun .usercontent li ol, .pun .usercontent li ul, .pun .postmsg li ol, .pun .postmsg li ul {
-	padding: 0.25em 1em 0.75em 2.5em
-	}
-
-.pun .usercontent li p, .pun .postmsg li p {
-	padding: 0
-	}
-
-.pun .usercontent h1 {
-	font-size: 1.4em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h2 {
-	font-size: 1.2em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h3 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .usercontent h4, .pun .usercontent h5, .pun .usercontent h6 {
-	font-size: 1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0
-	}
-
-.pun .quotebox cite {
-	font-weight: bold;
-	font-style: normal;
-	padding: 0.75em 0.75em 0 0.75em
-	}
-
-.pun span.bbu {
-	text-decoration: underline
-	}
-
-.pun span.bbs, .pun del {
-	text-decoration: line-through;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	text-decoration: none;
-	}
-
-.pun div.postmsg h5, #punhelp h5 {
-	font-size: 1.1em;
-	font-weight: bold;
-	padding: 0.75em 0 0 0;
-	}
-
-/*****************************************************************
-3. COMMON STYLES
-*****************************************************************/
-
-/* Page Layout
-----------------------------------------------------------------*/
-
-.pun {
-	margin: 12px 20px
-	}
-
-#punredirect, #punmaint, #puninstall, #pundb_update {
-	margin: 50px 20% 12px 20%;
-	width: auto;
-	}
-
-
-/* Vertical Element Spacing
-----------------------------------------------------------------*/
-
-#brdheader {
-	margin: 0 0 12px 0;
-	}
-
-#announce, #brdstats {
-	margin: 12px 0 12px 0;
-	}
-
-.pun .blocktable, .pun .block, .pun .blockform, .pun .block2col, #postreview {
-	margin-bottom: 12px
-	}
-
-#punindex .blocktable, .pun .blockpost {
-	margin-bottom: 6px
-	}
-
-#postreview .box {
-	margin-bottom: 3px;
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-bottom: 0px
-	}
-
-.pun .linkst, .pun .linksb {
-	margin-top: -12px
-	}
-
-.pun .postlinksb {
-	margin-top: -6px
-	}
-
-
-/* External Borders
-----------------------------------------------------------------*/
-
-.pun .box {
-	border-style: solid;
-	border-width: 1px;
-	}
-
-
-.pun h2 {
-	border-width: 1px;
-	border-style: solid;
-	border-bottom: none;
-}
-
-
-/* Default Internal Spacing
-----------------------------------------------------------------*/
-
-.pun .block .inbox, .pun .blockmenu .inbox {
-	padding: 3px 6px
-	}
-
-/*****************************************************************
-4. COMMON BOARD ELEMENTS
-*****************************************************************/
-
-/* Board Header
-----------------------------------------------------------------*/
-
-#brdtitle h1 {
-	font-size: 1.5em;
-	line-height: 1.1em;
-	padding: 3px 0 0 0;
-	}
-
-#brdmenu {
-	font-size:1.2em;
-	}
-
-#brddesc {
-	padding: 3px 0;
-	}
-
-#brddesc * {
-	padding-top: 0;
-	padding-bottom: 0;
-	}
-
-
-#brdmenu li {
-	display: inline;
-	margin-right: 10px;
-	margin-top: 12px;
-	margin-bottom: 12px;
-	}
-
-
-#brdmenu a:link, #brdmenu a:visited {
-	text-decoration: none;
-	text-shadow: #FFF 1px -1px 0.4em;
-	padding: 0.2em;
-	}
-
-#brdwelcome .conl {
-	float: left;
-	white-space: nowrap;
-	}
-
-#brdwelcome li {
-	float:left;
-	margin-right:8px;
-	white-space:nowrap;
-}
-
-#brdwelcome .conl li strong:after {
-	content: '.'
-	}
-
-#brdwelcome .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdwelcome .conr li {
-	float: right;
-	text-align: right;
-	}
-
-/* Breadcrumbs and Post Links
-----------------------------------------------------------------*/
-
-.pun .linkst {
-	padding: 8px 6px 3px 6px
-	}
-
-.pun .linksb, .pun .postlinksb {
-	padding: 3px 6px 8px 6px
-	}
-
-.pun .crumbs {
-	clear: both;
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .crumbs li {
-	display: inline;
-	white-space: nowrap;
-	font-weight: bold;
-	}
-
-.pun .linkst .crumbs {
-	font-size: 1.3em;
-	}
-
-.pun .pagelink {
-	float: left;
-	display: block;
-	white-space: normal;
-	}
-
-.pun .postlink {
-	font-size: 1.1em;
-	font-weight: bold;
-	white-space: wrap;
-	text-decoration: none;
-	}
-
-.pun .linkst .postlink {
-	position: relative;
-	margin-top: -0.2em;
-	margin-bottom: 0.5em;
-	}
-
-.pun .linksb .postlink, .pun .postlinksb .postlink {
-	position: relative;
-	margin-top: 0.5em;
-	margin-bottom: -0.5em;
-	}
-
-.pun .postlink, .pun .modbuttons {
-	float: right;
-	text-align: right;
-	}
-
-.pun .modbuttons {
-	padding: 1px 0;
-	white-space: nowrap;
-	}
-
-.pun .modbuttons input {
-	margin-left: 6px;
-	}
-
-#punindex .subscribelink {
-	margin-top: 6px;
-	}
-
-/* Board Footer
-----------------------------------------------------------------*/
-
-#brdfooter #modcontrols {
-	border-bottom-style: solid;
-	border-bottom-width: 1px;
-	text-align: center;
-	}
-
-#brdfooter #modcontrols dd {
-	display: inline;
-	margin-right: 10px;
-	}
-
-#brdfooter .conl {
-	float: left;
-	}
-
-#brdfooter .conr {
-	float: right;
-	text-align: right;
-	}
-
-#brdfooter #feedlinks span {
-	background:url("Technetium/feed.png") no-repeat scroll left center transparent;
-	padding-left:18px;
-	display: inline;
-}
-
-
-/* Board Stats
-----------------------------------------------------------------*/
-
-#brdstats .conl {
-	float: left;
-	}
-
-#brdstats .conr {
-	float: right;
-	text-align: right;
-	}
-
-#onlinelist dd, #onlinelist dt {
-	display: inline;
-	}
-
-
-/*****************************************************************
-5. MAIN TABLES
-*****************************************************************/
-
-.pun table {
-	width: 100%;
-	border-collapse: collapse;
-	border-spacing: 0;
-	empty-cells: show;
-	}
-
-.pun .blocktable table {
-	table-layout: fixed;
-	}
-
-.pun td, .pun th {
-	padding: 4px 6px;
-	line-height: 1.4em;
-	text-align: left;
-	font-weight: normal;
-	}
-
-.pun td {
-	border-style: solid none none solid;
-	border-width: 1px;
-	}
-
-.pun .tcl {
-	border-left: 0;
-	width: auto;
-	}
-
-.pun .tc2, .pun .tc3, .pun .tcmod {
-	width: 10%;
-	text-align: center;
-	padding: 4px 0;
-	}
-
-.pun .tcr {
-	width: 30%;
-	}
-
-.pun .tcl h3 {
-	font-size: 1.3em;
-	font-weight: bold;
-	}
-
-.pun .tcl span.newtext, .pun .tcl span.pagestext {
-	white-space: nowrap
-	}
-
-.pun .tcl p {
-	padding: 5px 0 0 0
-	}
-
-#punsearch #vf .tc2 {
-	width: 18%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#users1 .tcr {
-	width: 25%
-	}
-
-#users1 .tc2 {
-	width: 25%;
-	text-align: left;
-	padding: 4px 6px;
-	}
-
-#debug .tcl {
-	width: 10%
-	}
-
-#debug .tcr {
-	width: 90%;
-	white-space: normal
-	}
-
-#punindex .tcr .byuser {
-	display: block
-	}
-
-.pun .blocktable .tclcon {
-	padding: 0 11px 0 12px;
-	overflow: hidden;
-	height: 1%;
-	min-height: 1px;
-	position: relative;
-	}
-
-.pun .blocktable .tclcon div {
-	width: 100%;
-	overflow: hidden;
-	}
-
-.pun .icon {
-	height: 24px;
-	width: 24px;
-	overflow: hidden;
-	float: left;
-	}
-
-.pun .icon div {
-	position: absolute;
-	left: -9999em;
-	text-indent: -9999em;
-	height: 0;
-	}
-
-.pun .iposted .ipost {
-	position: absolute;
-	left: 0;
-	font-weight: bold;
-	width: 8px;
-	padding-left: 4px;
-	text-align: center;
-	top: 0;
-	}
-
-.pun .stickytext {
-	display: none;
-	}
-
-.pun .movedtext {
-	display: none;
-}
-
-.pun .closedtext {
-	font-weight: bold;
-	}
-/*****************************************************************
-6. MAIN FORMS
-*****************************************************************/
-
-
-.pun .forminfo {
-	margin-bottom: 12px;
-	padding: 9px 10px;
-	border-style: solid;
-	border-width: 1px;
-	}
-
-.pun .forminfo h3 {
-	font-weight: bold;
-	}
-
-
-
-.pun .inform {
-	padding: 0 18px;
-}
-
-.pun fieldset {
-	overflow: hidden;
-	width: 100%;
-	padding-bottom: 0.8em;
-}
-
-.pun legend {
-	font-size: 1.2em;
-	font-weight: bold;
-	margin-left: -7px;
-	padding: 10px 19px 7px 19px;
-}
-
-.pun div[class*="inform"] legend {
-	margin-left: 0;
-}
-
-.pun .infldset {
-	border-style: solid;
-	border-width: 1px;
-	display: inline-block;
-	overflow: hidden;
-	padding: 12px 18px;
-}
-
-.pun div[class*="infldset"] {
-	display: block;
-}
-
-#punregister #rules .infldset {
-	padding: 5px 18px;
-}
-
-.pun fieldset p {
-	clear: both;
-	padding: 0 0 7px 0;
-	width: 100%;
-}
-
-.pun fieldset .usercontent p {
-	padding: 7px 0;
-}
-
-.pun fieldset label {
-	clear: both;
-	display: block;
-	padding: 0 0 7px 0;
-}
-
-
-.pun label {
-	display: block;
-	padding: 3px 0
-	}
-
-.pun label.conl {
-	float: left;
-	overflow: visible;
-	margin-right: 10px
-	}
-
-.pun select {
-	padding-top: 1px;
-	padding-bottom: 1px;
-	}
-
-.pun fieldset .rbox {
-	}
-
-.pun fieldset .rbox br {
-	display: none;
-	}
-
-.pun fieldset .rbox label {
-	padding: 3px 0 3px 25px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun fieldset .rbox input {
-	margin: 0 9px 0 -25px;
-	padding: 0;
-	width: 16px;
-	position: relative;
-	vertical-align: middle;
-	}
-
-.pun .txtarea {
-	width: 90%
-	}
-
-.pun .txtarea textarea, .pun input.longinput {
-	width: 100%
-	}
-
-.pun .bblinks {
-	padding-bottom: 10px;
-	padding-left: 4px
-	}
-
-.pun .bblinks li {
-	display: inline;
-	padding-right: 20px
-	}
-
-.pun .blockform .buttons {
-	padding-left: 18px;
-	padding-bottom: 5px;
-	}
-
-.pun .blockform .buttons input {
-	margin-right: 8px;
-	}
-
-#posterror ul {
-	list-style: square;
-	padding: 3px 0 3px 24px;
-	}
-
-.pun .deletemsg {
-	border-style: solid;
-	border-width: 1px;
-	padding: 6px 15px;
-	}
-
-.pun .multiselect {
-	float: left;
-	padding-bottom: 7px;
-	}
-
-.pun .checklist {
-	border-width: 1px;
-	border-style: solid;
-	max-height: 9em;
-	width: 20em;
-	overflow: auto;
-	padding: 0.25em 0.5em;
-	margin: 0.25em 16px 0 0.15em;
-	}
-
-.pun .checklist legend {
-	padding: 0;
-	}
-
-.pun .checklist legend span {
-	width: auto;
-	max-width: 25em;
-	}
-
-.pun .checklist .checklist-item {
-	position: relative;
-	}
-
-.pun .checklist .checklist-item label {
-	padding: 0 0 0 1.75em;
-	}
-
-.pun .checklist .checklist-item .fld-input {
-	position: absolute;
-	left: 0;
-	top: 0;
-	padding: 0;
-	margin: 0;
-	}
-
-.pun .checklist .checklist-item input {
-	margin: 0;
-	height: 1.55em;
-	width: 1.55em;
-	}
-
-/*****************************************************************
-7. PROFILES AND ADMIN
-*****************************************************************/
-
-.pun .block2col {
-	padding-bottom: 1px
-	}
-
-.pun .block2col .blockform, .pun .block2col .block {
-	margin-left: 14em
-	}
-
-.pun .blockmenu {
-	float:left;
-	width: 13em
-	}
-
-.pun .blockmenu li {
-	padding: 3px 0;
-	font-weight: bold;
-	}
-
-.pun .blockmenu a:link, .pun .blockmenu a:visited {
-	text-decoration: none
-	}
-
-.pun .blockmenu a:hover, .pun .blockmenu a:active {
-	text-decoration: underline
-	}
-
-#viewprofile dl {
-	float: left;
-	width: 100%;
-	overflow: hidden
-	}
-
-#viewprofile dd {
-	margin-left: 14em;
-	padding: 3px;
-	}
-
-#viewprofile dt {
-	float: left;
-	width: 13em;
-	margin: 3px 0;
-	}
-
-#profileavatar img {
-	float: right;
-	margin-left: 1em
-	}
-
-/*****************************************************************
-8. MAIN POSTS
-*****************************************************************/
-
-.pun .blockpost h2 a:link, .pun .blockpost h2 a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost h2 a:hover, .pun .blockpost h2 a:active {
-	text-decoration: underline;
-	}
-
-.pun .blockpost h2 .conr {
-	float: right;
-	text-align: right;
-	}
-
-#punsearch .blockpost h2 span {
-	white-space: nowrap;
-	}
-
-.pun .blockpost .box {
-	overflow: hidden;
-	}
-
-.pun .postleft, .pun .postfootleft {
-	float:left;
-	width: 18em;
-	overflow: hidden;
-	position: relative;
-	overflow: hidden;
-	}
-
-.pun .postleft dl {
-	padding: 0.5em 6px;
-	}
-
-.pun .postleft .usercontacts, .pun .postleft .icon {
-	margin-top: 6px
-	}
-
-.pun .postleft .postavatar, .pun .postleft .usertitle {
-	margin-bottom: 6px;
-	display: block;
-	}
-
-.pun .blockpost dt {
-	font-size: 1.091em;
-	font-weight: bold;
-	}
-
-.pun .blockpost dt a:link, .pun .blockpost dt a:visited {
-	text-decoration: none;
-	}
-
-.pun .blockpost dt a:hover, .pun .blockpost dt a:active {
-	text-decoration: underline;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-width: 18em;
-	border-left-style: solid
-	}
-
-#postpreview .postright {
-	border-left: 0
-	}
-
-.pun .postright {
-	padding: 0 6px;
-	}
-
-.pun .postfootright, .pun .multidelete {
-	text-align: right
-	}
-
-.pun .postmsg {
-	width:98%;
-	overflow: hidden;
-	padding-bottom: 6px;
-	word-wrap: break-word;
-	}
-
-.pun .postfootright ul, .pun .postfootright div, .pun .postfootright p,
-.pun .postfootleft p {
-	padding: 6px 6px 6px 6px;
-	}
-
-.pun .postfootright li {
-	display: inline;
-	}
-
-.pun .postfootright li:before {
-	content: " | ";
-	}
-
-.pun .postfootright li:first-child:before {
-	content: "";
-	}
-
-.pun .postfootright a:link, .pun .postfootright a:visited {
-	text-decoration: none
-	}
-
-.pun .postfootright a:hover, .pun .postfootright a:active {
-	text-decoration: underline
-	}
-
-
-.pun .quotebox, .pun .codebox {
-	border-style: solid;
-	border-width: 2px;
-	border-left: 5px solid;
-	margin: 0.75em 1em;
-	padding: 0 0.75em;
-	}
-
-.pun .quotebox cite {
-	display: block;
-	padding: 0.75em 0 0 0;
-	}
-
-.pun .quotebox blockquote {
-	width: 100%;
-	overflow: hidden
-	}
-
-.pun .codebox pre {
-	overflow: auto;
-	width: 100%;
-	overflow-y:hidden
-	}
-
-* html .pun .codebox pre {
-	padding-bottom: 10px;
-	}
-
-*+html .pun .codebox pre {
-	padding-bottom: 10px
-	}
-
-.pun .codebox pre code {
-	display: block;
-	padding: 0.75em;
-	}
-
-.pun .codebox pre.vscroll {
-	height: 32em;
-	overflow: auto;
-	overflow-y: auto
-	}
-
-.pun .postmsg img.postimg, .pun .postmsg a img.postimg {
-	max-width: 100%;
-	vertical-align: middle;
-	}
-
-.pun .postmsg img {
-	vertical-align: bottom;
-	}
-
-.pun .postsignature hr {
-	margin-left: 0px;
-	width: 200px;
-	text-align: left;
-	height: 1px;
-	border:none
-	}
-
-.pun .blockpost label {
-	padding: 3px 6px;
-	border-style: solid;
-	border-width: 1px;
-	vertical-align: middle;
-	display: inline-block;
-	}
-
-.pun .blockpost label * {
-	vertical-align: middle;
-	margin: 0;
-	padding: 0;
-	}
-
-
-/****************************************************************/
-/* 9. HELP FILES AND MISC. */
-/****************************************************************/
-
-#punhelp h2 {
-	margin-top: 12px
-	}
-
-#punhelp div.box {
-	padding: 10px
-	}
-
-/*****************************************************************
-COLOUR SCHEME
-*****************************************************************/
-
-/* Background / Text
-----------------------------------------------------------------*/
-
-body {
-	background: #fff url("Technetium/bg.png") repeat-x top;
-	color: #122434
-	}
-
-.pun {
-	color: #122434
-	}
-
-.pun .box, #adminconsole fieldset th {
-	background-color: #FBFCFD;
-	background-image: url("Technetium/light-shade.png");
-	background-position: bottom;
-	background-repeat: repeat-x;
-	}
-
-.pun td.tc2, .pun td.tc3, .pun td.tcmod, #postpreview, #viewprofile dd, .pun .forminfo,
-#brdfooter #modcontrols, #adminconsole fieldset td, .pun .blockmenu .box, #adstats dd {
-	background-color: #F4F9FD;
-	background-image: url("Technetium/light-shade.png");
-	background-repeat: repeat-x;
-	background-position: bottom;
-	}
-
-.pun h2, #brdmenu {
-	background-color: #C5D8EB;
-	color: #122434;
-	background-image: url("Technetium/dark-shade.png");
-	background-repeat: repeat-x;
-	background-position: top;
-	}
-
-.pun h2  {
-	background-color: #C5D8EB;
-	background-image: url("Technetium/inv-shade.png");
-	background-repeat: repeat-x;
-	color: #122434;
-	text-shadow: #FFF 1px -1px 0.7em;
-	}
-
-.pun #announce h2  {
-	display: none;
-	}
-
-.box #announce-block {
-	background-color: #FDFCE3;
-}
-
-.pun th {
-	background-color: #EFF3F8;
-	background-image: url("Technetium/light-shade.png");
-	background-repeat: repeat-x;
-	}
-
-.pun td {
-	background-image: url("Technetium/light-shade.png");
-	background-color: #FBFCFD;
-	background-position: bottom;
-	background-repeat: repeat-x;
-	}
-
-.pun .isticky td {
-	background-color: #E4EBF1;
-	}
-
-.pun .iclosed td {
-	background-color: #ECEEF0
-	}
-
-.pun .iclosed.isticky td {
-	background-color: #CDD6E0;
-	}
-
-.pun legend {
-	color: #122434
-	}
-
-.pun .blockmenu li.isactive a, #posterror li strong {
-	color: #333
-	}
-
-.pun .usercontent * {
-	background: transparent;
-	color: #333
-	}
-
-#adminmenu .box {
-	background: #FBFCFD;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited, .pun .postlink a:active  {
-	background-color:#F0F5FA;
-	background-image:url(Technetium/inv-shade.png);
-	background-repeat:repeat-x;
-	border: 1px solid;
-	color:#2B3037;
-	text-shadow: #FFF 1px -1px 0.4em;
-	padding: 0.3em;
-	border-radius: 0.4em;
-	position: relative;
-	-moz-border-radius: 0.4em;
-	-webkit-border-top-left-radius: 0.4em;
-	-webkit-border-top-right-radius: 0.4em;
-	-webkit-border-bottom-left-radius: 0.4em;
-	-webkit-border-bottom-right-radius: 0.4em;
-
-	}
-
-.pun .postlink a:hover {
-	background-color: #C0D6E9;
-	color: #000;
-	}
-
-#brdheader .box {
-	background-color:#F0F5FA;
-	background-image:url(Technetium/light-shade.png);
-	background-repeat:repeat-x;
-	background-position: top;
-	color:#122434;
-	border-radius: 0.4em;
-	-moz-border-radius: 0.4em;
-	-webkit-border-top-left-radius: 0.4em;
-	-webkit-border-top-right-radius: 0.4em;
-	-webkit-border-bottom-left-radius: 0.4em;
-	-webkit-border-bottom-right-radius: 0.4em;
-	}
-
-.pun #brdtitle {
-	background-color: #D1E1EF;
-	background-image: url("Technetium/inv-shade.png");
-	background-repeat: repeat-x;
-	text-shadow: #FFF 1px -1px 0.4em;
-	}
-
-
-.pun .infldset, #pundelete .deletemsg, #adintro .inbox, #adstats .inbox {
-	background: #FBFCFD url(Technetium/light-shade.png) bottom repeat-x;
-	border-color: #C0CCD8;
-}
-
-#adintro ul {
-	list-style-type: disc;
-	margin-left: 8px;
-	padding-left: 16px;
-	}
-
-.pun .multiselect {
-	color: #122434;
-	}
-
-.pun .checklist {
-	background: white;
-	border-color: #A2B5CC;
-	}
-
-/* Posts
-----------------------------------------------------------------*/
-
-.pun .blockpost .box, .pun .postright, .pun .postfootright, .pun .deletemsg {
-	background-color: #F8FAFD;
-	}
-
-.pun .postright, .pun .postfootright {
-	border-left-color: #F0F5FA
-	}
-
-.pun .postleft, .pun .postfootleft, .pun .blockpost label, .pun .codebox, .pun .quotebox {
-	background-color: #F0F5FA
-	}
-
-#punhelp .codebox, #punhelp .quotebox {
-	background-color: #f9f9f9;
-	}
-
-.pun .blockpost h2 {
-	background-color: #F0F5FA;
-	}
-
-.pun .blockpost h2 span.conr {
-	color: #aabdcd
-	}
-
-.pun hr {
-	background-color: #333;
-	color: #333
-	}
-
-.pun .quotebox {
-	background-color: #FAFCFE;
-	}
-
-.pun .postmsg ins, #punhelp samp ins {
-	background-color: #ff0;
-	}
-
-/* Borders
-----------------------------------------------------------------*/
-
-.pun .box, .pun h2, #brdfooter #modcontrols {
-	border-color: #A2B5CC;
-}
-
-.blocktable #announce h2 {
-	border-color: #F6B620;
-}
-
-.pun td {
-	border-color: #A2B5CC;
-	}
-
-.pun th, .pun fieldset {
-	border-color: #A2B5CC;
-	}
-
-#adminconsole td, #adminconsole th {
-	border-style:solid;
-	border-width:1px 0px !important;
-}
-
-#adminconsole th {
-	border-width: 1px 0px 1px 1px !important;
-}
-
-#adminconsole td {
-	border-width: 1px 1px 1px 1px !important;
-}
-
-.pun .forminfo, .pun .blockpost label, .pun .deletemsg {
-	border-color: #aca899 #fff #fff #aca899;
-	}
-
-.pun .quotebox, .pun .codebox {
-	border-color: #BCD2E9;
-	}
-
-.pun .postlink a:link, .pun .postlink a:visited {
-	border-color: #C0D6E9
-	}
-
-
-/* Links
-----------------------------------------------------------------*/
-
-.pun a:link, .pun a:visited {
-	color: #1F537B;
-	text-decoration: none;
-	}
-
-.pun a:hover, .pun a:active, .pun a:focus {
-	color: #9E1D00
-	}
-
-#brdmenu li a:active, #brdmenu li a:link, #brdmenu li a:visited {
-	color: #1F2E3D;
-	}
-
-#brdmenu li a:hover {
-	color: #000;
-	text-shadow: #8895A2 1px -1px 0.4em;
-	}
-
-#vf a {
-	font-weight: bold;
-	}
-
-.pun .postreport a:link, .pun .postreport a:visited,
-.pun .iclosed td.tcl a:link, .pun .iclosed td.tcl a:visited {
-	color: #888
-	}
-
-.pun .isticky.iclosed td.tcl a:link, .pun .isticky.iclosed td.tcl a:visited {
-	color: #475F6B !important;
-	}
-
-.pun .isticky.iclosed td.tcl a:hover {
-	color: #577382 !important;
-	}
-
-
-.pun .postreport a:hover, .pun .postreport a:active,
-.pun .iclosed td.tcl a:hover, .pun .iclosed td.tcl a:active {
-	color: #aaa
-	}
-
-.pun .maintenancelink a:link, .pun .maintenancelink a:visited {
-	color: #b42000
-	}
-
-.pun .maintenancelink a:hover, .pun .maintenancelink a:active {
-	color: #b42000
-	}
-
-
-/* Status Indicators
-----------------------------------------------------------------*/
-
-.pun .icon {
-	background-image:url(Technetium/icon-nonew.png);
-	}
-
-.pun .iredirect .icon {
-	background-image:url(Technetium/icon-moved.png);
-	}
-
-.pun .inew .icon{
-	background-image:url(Technetium/icon-new.png);
-	}
-
-.pun .iclosed .icon  {
-	background-image:url(Technetium/icon-closed.png);
-	}
-
-.pun .isticky .icon {
-	background-image:url(Technetium/icon-nonew-sticky.png);
-	}
-
-.pun .isticky.inew .icon {
-	background-image:url(Technetium/icon-new-sticky.png);
-	}
-
-.pun .iclosed.isticky .icon {
-	background-image:url(Technetium/icon-closed-sticky.png);
-	}
-
-.pun .imoved .icon {
-	background-image:url(Technetium/icon-moved.png);
-	}
Index: trunk/web/punbb/style/imports/Mercury_cs.css
===================================================================
--- trunk/web/punbb/style/imports/Mercury_cs.css	(revision 10)
+++ trunk/web/punbb/style/imports/Mercury_cs.css	(revision 1)
@@ -5,5 +5,5 @@
 /* 1.1 Default background colour and text colour */
 
-BODY {BACKGROUND-COLOR: #1f1f1f}
+/*BODY {BACKGROUND-COLOR: #ffffff}*/
 
 .pun {COLOR: #D4D4D4}
@@ -115,3 +115,3 @@
 DIV.icon {BORDER-COLOR: #484848 #404040 #3C3C3C #444444}
 TR.iredirect DIV.icon {BORDER-COLOR: #383838 #383838 #383838 #383838}
-DIV.icon-new {BORDER-COLOR: #F6B620 #ECAE1F #D09A1B #E1A61D}
+DIV.inew {BORDER-COLOR: #F6B620 #ECAE1F #D09A1B #E1A61D}
Index: trunk/web/punbb/style/imports/base_admin.css
===================================================================
--- trunk/web/punbb/style/imports/base_admin.css	(revision 10)
+++ trunk/web/punbb/style/imports/base_admin.css	(revision 1)
@@ -4,5 +4,5 @@
 * HTML #adstats DD {HEIGHT: 1%}
 #adstats DD {MARGIN-LEFT: 14em; PADDING: 3px; MARGIN-BOTTOM: 5px; LINE-HEIGHT: 1.5em}
-#adstats DT {FLOAT: left; WIDTH: 13em; PADDING: 3px; LINE-HEIGHT: 1.5em}
+#adstats DT {FLOAT:left; WIDTH: 13em; PADDING: 3px; line-height: 1.5em}
 #adstats {PADDING: 15px 15px 5px 10px}
 #adintro {PADDING: 5px}
@@ -17,10 +17,10 @@
 #adminconsole TABLE.aligntop TH, #adminconsole TABLE.aligntop TD {VERTICAL-ALIGN: top}
 #adminconsole TABLE.aligntop TH {PADDING-TOP: 0.7em}
-#adminconsole TD, #adminconsole TH {BORDER-STYLE: solid; BORDER-WIDTH: 3px 0 3px 0}
+#adminconsole TD, #adminconsole TH {BORDER-STYLE: solid; BORDER-WIDTH: 3px 0px 3px 0px}
 #adminconsole P {PADDING-BOTTOM: 6px}
 #adminconsole .topspace {PADDING-TOP: 6px}
 #adminconsole P.submittop, #adminconsole P.submitend {TEXT-ALIGN: center}
 #adminconsole TH.hidehead {COLOR: #f1f1f1}
-#adminconsole THEAD TH {PADDING-BOTTOM: 0}
+#adminconsole THEAD TH {PADDING-BOTTOM: 0px}
 #adminconsole P.linkactions {FONT-WEIGHT: bold; PADDING-LEFT: 5px}
 #adminconsole TH INPUT, #adminconsole DIV.fsetsubmit {MARGIN-TOP: 6px}
@@ -29,24 +29,17 @@
 #categoryedit .tcl {WIDTH: 25%}
 #censoring .tcl, #censoring .tc2, #ranks .tcl, #ranks .tc2 {WIDTH: 20%}
-#edforum .tcl, #edforum .tc2 {WIDTH: 8%}
-#edforum .tc2 {WIDTH: 6%}
-
 TABLE#forumperms TH, TABLE#forumperms TD {WHITE-SPACE: normal; WIDTH: auto; TEXT-ALIGN: center}
 TABLE#forumperms .atcl {TEXT-ALIGN: left; WIDTH: 15em; WHITE-SPACE: nowrap}
 #adminconsole TD.nodefault {BACKGROUND-COLOR: #D59B9B}
 
-/*** User/Ban Search Result Tables ***/
-#users2 TH, #bans1 TH {TEXT-ALIGN: left}
-#users2 TH.tcmod {TEXT-ALIGN: center}
-#users2 .tcl, #bans1 .tcl {WIDTH: auto; TEXT-ALIGN: left; PADDING: 4px 6px}
-#users2 .tc2, #bans1 .tc2 {WIDTH: 18%; TEXT-ALIGN: left; PADDING: 4px 6px}
-#users2 .tc3, #users2 .tc5, #bans1 .tc3, #bans1 .tc5, #bans1 .tc6 {WIDTH: 12%; TEXT-ALIGN: left; PADDING: 4px 6px}
-#users2 .tc4, #bans1 .tc4 {WIDTH: 10%; TEXT-ALIGN: center}
-#users2 .tcr {WIDTH: 20%; WHITE-SPACE: nowrap}
-#bans1 .tcr {WIDTH: 15%; WHITE-SPACE: nowrap}
-#users2 .tcmod {WIDTH: 10%; TEXT-ALIGN: center}
+/*** User Search Result Tables ***/
+#users2 TH, #users2 TH {TEXT-ALIGN: left}
+#users2 .tcl, #users2 .tc3, #users2 .tc5 {WIDTH: 15%; TEXT-ALIGN: left}
+#users2 .tc2 {WIDTH: 22%; TEXT-ALIGN: left}
+#users2 .tc4 {WIDTH: 8%}
+#users2 .tc4 {TEXT-ALIGN: center}
+#users2 .tcr {WHITE-SPACE: nowrap}
 #adminconsole #linkst, #adminconsole #linksb A {FONT-WEIGHT: bold}
 
 /*** Plugins ***/
-.plugin .inbox {PADDING-BOTTOM: 10px}
-.plugin p {PADDING: 10px 10px 0}
+#exampleplugin .inbox {PADDING: 6px 6px 0px 6px}
Index: trunk/web/punbb/style/imports/index.html
===================================================================
--- trunk/web/punbb/style/imports/index.html	(revision 10)
+++ trunk/web/punbb/style/imports/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/style/index.html
===================================================================
--- trunk/web/punbb/style/index.html	(revision 10)
+++ trunk/web/punbb/style/index.html	(revision 1)
@@ -1,1 +1,8 @@
-<html><head><title>.</title></head><body>.</body></html>
+<html>
+<head>
+<title>.</title>
+</head>
+<body>
+.
+</body>
+</html>
Index: trunk/web/punbb/userlist.php
===================================================================
--- trunk/web/punbb/userlist.php	(revision 10)
+++ trunk/web/punbb/userlist.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
+/***********************************************************************
 
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
 
-define('PUN_ROOT', dirname(__FILE__).'/');
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -13,6 +30,5 @@
 if ($pun_user['g_read_board'] == '0')
 	message($lang_common['No view']);
-else if ($pun_user['g_view_users'] == '0')
-	message($lang_common['No permission']);
+
 
 // Load the userlist.php language file
@@ -24,40 +40,17 @@
 
 // Determine if we are allowed to view post counts
-$show_post_count = ($pun_config['o_show_post_count'] == '1' || $pun_user['is_admmod']) ? true : false;
+$show_post_count = ($pun_config['o_show_post_count'] == '1' || $pun_user['g_id'] < PUN_GUEST) ? true : false;
 
-$username = isset($_GET['username']) && $pun_user['g_search_users'] == '1' ? pun_trim($_GET['username']) : '';
-$show_group = isset($_GET['show_group']) ? intval($_GET['show_group']) : -1;
-$sort_by = isset($_GET['sort_by']) && (in_array($_GET['sort_by'], array('username', 'registered')) || ($_GET['sort_by'] == 'num_posts' && $show_post_count)) ? $_GET['sort_by'] : 'username';
-$sort_dir = isset($_GET['sort_dir']) && $_GET['sort_dir'] == 'DESC' ? 'DESC' : 'ASC';
+$username = (isset($_GET['username']) && $pun_user['g_search_users'] == '1') ? $_GET['username'] : '';
+$show_group = (!isset($_GET['show_group']) || intval($_GET['show_group']) < -1 && intval($_GET['show_group']) > 2) ? -1 : intval($_GET['show_group']);
+$sort_by = (!isset($_GET['sort_by']) || $_GET['sort_by'] != 'username' && $_GET['sort_by'] != 'registered' && ($_GET['sort_by'] != 'num_posts' || !$show_post_count)) ? 'username' : $_GET['sort_by'];
+$sort_dir = (!isset($_GET['sort_dir']) || $_GET['sort_dir'] != 'ASC' && $_GET['sort_dir'] != 'DESC') ? 'ASC' : strtoupper($_GET['sort_dir']);
 
-// Create any SQL for the WHERE clause
-$where_sql = array();
-$like_command = ($db_type == 'pgsql') ? 'ILIKE' : 'LIKE';
 
-if ($username != '')
-	$where_sql[] = 'u.username '.$like_command.' \''.$db->escape(str_replace('*', '%', $username)).'\'';
-if ($show_group > -1)
-	$where_sql[] = 'u.group_id='.$show_group;
-
-// Fetch user count
-$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'users AS u WHERE u.id>1 AND u.group_id!='.PUN_UNVERIFIED.(!empty($where_sql) ? ' AND '.implode(' AND ', $where_sql) : '')) or error('Unable to fetch user list count', __FILE__, __LINE__, $db->error());
-$num_users = $db->result($result);
-
-// Determine the user offset (based on $_GET['p'])
-$num_pages = ceil($num_users / 50);
-
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
-$start_from = 50 * ($p - 1);
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), $lang_common['User list']);
+$page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_common['User list'];
 if ($pun_user['g_search_users'] == '1')
 	$focus_element = array('userlist', 'username');
 
-// Generate paging links
-$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'userlist.php?username='.urlencode($username).'&amp;show_group='.$show_group.'&amp;sort_by='.$sort_by.'&amp;sort_dir='.$sort_dir);
-
-
 define('PUN_ALLOW_INDEX', 1);
-define('PUN_ACTIVE_PAGE', 'userlist');
 require PUN_ROOT.'header.php';
 
@@ -66,54 +59,80 @@
 	<h2><span><?php echo $lang_search['User search'] ?></span></h2>
 	<div class="box">
-		<form id="userlist" method="get" action="userlist.php">
-			<div class="inform">
-				<fieldset>
-					<legend><?php echo $lang_ul['User find legend'] ?></legend>
-					<div class="infldset">
-<?php if ($pun_user['g_search_users'] == '1'): ?>						<label class="conl"><?php echo $lang_common['Username'] ?><br /><input type="text" name="username" value="<?php echo pun_htmlspecialchars($username) ?>" size="25" maxlength="25" /><br /></label>
-<?php endif; ?>						<label class="conl"><?php echo $lang_ul['User group']."\n" ?>
-						<br /><select name="show_group">
-							<option value="-1"<?php if ($show_group == -1) echo ' selected="selected"' ?>><?php echo $lang_ul['All users'] ?></option>
+	<form id="userlist" method="get" action="userlist.php">
+		<div class="inform">
+			<fieldset>
+				<legend><?php echo $lang_ul['User find legend'] ?></legend>
+				<div class="infldset">
+<?php if ($pun_user['g_search_users'] == '1'): ?>					<label class="conl"><?php echo $lang_common['Username'] ?><br /><input type="text" name="username" value="<?php echo pun_htmlspecialchars($username) ?>" size="25" maxlength="25" /><br /></label>
+<?php endif; ?>					<label class="conl"><?php echo $lang_ul['User group']."\n" ?>
+					<br /><select name="show_group">
+						<option value="-1"<?php if ($show_group == -1) echo ' selected="selected"' ?>><?php echo $lang_ul['All users'] ?></option>
 <?php
 
-$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' ORDER BY g_id') or error('Unable to fetch user group list', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT g_id, g_title FROM '.$db->prefix.'groups WHERE g_id!='.PUN_GUEST.' ORDER BY g_id') or error('Impossible de retrouver la liste des groupes utilisateurs', __FILE__, __LINE__, $db->error());
 
 while ($cur_group = $db->fetch_assoc($result))
 {
 	if ($cur_group['g_id'] == $show_group)
-		echo "\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'" selected="selected">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
+		echo "\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'" selected="selected">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
 	else
-		echo "\t\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
+		echo "\t\t\t\t\t\t".'<option value="'.$cur_group['g_id'].'">'.pun_htmlspecialchars($cur_group['g_title']).'</option>'."\n";
 }
 
 ?>
-						</select>
-						<br /></label>
-						<label class="conl"><?php echo $lang_search['Sort by']."\n" ?>
-						<br /><select name="sort_by">
-							<option value="username"<?php if ($sort_by == 'username') echo ' selected="selected"' ?>><?php echo $lang_common['Username'] ?></option>
-							<option value="registered"<?php if ($sort_by == 'registered') echo ' selected="selected"' ?>><?php echo $lang_common['Registered'] ?></option>
-<?php if ($show_post_count): ?>							<option value="num_posts"<?php if ($sort_by == 'num_posts') echo ' selected="selected"' ?>><?php echo $lang_ul['No of posts'] ?></option>
-<?php endif; ?>						</select>
-						<br /></label>
-						<label class="conl"><?php echo $lang_search['Sort order']."\n" ?>
-						<br /><select name="sort_dir">
-							<option value="ASC"<?php if ($sort_dir == 'ASC') echo ' selected="selected"' ?>><?php echo $lang_search['Ascending'] ?></option>
-							<option value="DESC"<?php if ($sort_dir == 'DESC') echo ' selected="selected"' ?>><?php echo $lang_search['Descending'] ?></option>
-						</select>
-						<br /></label>
-						<p class="clearb"><?php echo ($pun_user['g_search_users'] == '1' ? $lang_ul['User search info'].' ' : '').$lang_ul['User sort info']; ?></p>
-					</div>
-				</fieldset>
-			</div>
-			<p class="buttons"><input type="submit" name="search" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /></p>
-		</form>
+					</select>
+					<br /></label>
+					<label class="conl"><?php echo $lang_search['Sort by']."\n" ?>
+					<br /><select name="sort_by">
+						<option value="username"<?php if ($sort_by == 'username') echo ' selected="selected"' ?>><?php echo $lang_common['Username'] ?></option>
+						<option value="registered"<?php if ($sort_by == 'registered') echo ' selected="selected"' ?>><?php echo $lang_common['Registered'] ?></option>
+<?php if ($show_post_count): ?>						<option value="num_posts"<?php if ($sort_by == 'num_posts') echo ' selected="selected"' ?>><?php echo $lang_ul['No of posts'] ?></option>
+<?php endif; ?>					</select>
+					<br /></label>
+					<label class="conl"><?php echo $lang_search['Sort order']."\n" ?>
+					<br /><select name="sort_dir">
+						<option value="ASC"<?php if ($sort_dir == 'ASC') echo ' selected="selected"' ?>><?php echo $lang_search['Ascending'] ?></option>
+						<option value="DESC"<?php if ($sort_dir == 'DESC') echo ' selected="selected"' ?>><?php echo $lang_search['Descending'] ?></option>
+					</select>
+					<br /></label>
+					<p class="clearb"><?php echo $lang_ul['User search info'] ?></p>
+				</div>
+			</fieldset>
+		</div>
+		<p><input type="submit" name="search" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /></p>
+	</form>
 	</div>
 </div>
+<?php
 
+
+// Create any SQL for the WHERE clause
+$where_sql = array();
+$like_command = ($db_type == 'pgsql') ? 'ILIKE' : 'LIKE';
+
+if ($pun_user['g_search_users'] == '1' && $username != '')
+	$where_sql[] = 'u.username '.$like_command.' \''.$db->escape(str_replace('*', '%', $username)).'\'';
+if ($show_group > -1)
+	$where_sql[] = 'u.group_id='.$show_group;
+
+// Fetch user count
+$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'users AS u'.(!empty($where_sql) ? ' WHERE u.id>1 AND '.implode(' AND ', $where_sql) : '')) or error('Impossible de retrouver le nombre total de membres', __FILE__, __LINE__, $db->error());
+$num_users = $db->result($result);
+
+
+// Determine the user offset (based on $_GET['p'])
+$num_pages = ceil($num_users / 50);
+
+$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
+$start_from = 50 * ($p - 1);
+
+// Generate paging links
+$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'userlist.php?username='.urlencode($username).'&amp;show_group='.$show_group.'&amp;sort_by='.$sort_by.'&amp;sort_dir='.strtoupper($sort_dir));
+
+
+?>
 <div class="linkst">
 	<div class="inbox">
 		<p class="pagelink"><?php echo $paging_links ?></p>
-		<div class="clearer"></div>
 	</div>
 </div>
@@ -123,28 +142,20 @@
 	<div class="box">
 		<div class="inbox">
-			<table cellspacing="0">
-			<thead>
-				<tr>
-					<th class="tcl" scope="col"><?php echo $lang_common['Username'] ?></th>
-					<th class="tc2" scope="col"><?php echo $lang_common['Title'] ?></th>
-<?php if ($show_post_count): ?>					<th class="tc3" scope="col"><?php echo $lang_common['Posts'] ?></th>
-<?php endif; ?>					<th class="tcr" scope="col"><?php echo $lang_common['Registered'] ?></th>
-				</tr>
-			</thead>
-			<tbody>
+		<table cellspacing="0">
+		<thead>
+			<tr>
+				<th class="tcl" scope="col"><?php echo $lang_common['Username'] ?></th>
+				<th class="tc2" scope="col"><?php echo $lang_common['Title'] ?></th>
+<?php if ($show_post_count): ?>				<th class="tc3" scope="col"><?php echo $lang_common['Posts'] ?></th>
+<?php endif; ?>				<th class="tcr" scope="col"><?php echo $lang_common['Registered'] ?></th>
+			</tr>
+		</thead>
+		<tbody>
 <?php
 
-// Retrieve a list of user IDs, LIMIT is (really) expensive so we only fetch the IDs here then later fetch the remaining data
-$result = $db->query('SELECT u.id FROM '.$db->prefix.'users AS u WHERE u.id>1 AND u.group_id!='.PUN_UNVERIFIED.(!empty($where_sql) ? ' AND '.implode(' AND ', $where_sql) : '').' ORDER BY '.$sort_by.' '.$sort_dir.', u.id ASC LIMIT '.$start_from.', 50') or error('Unable to fetch user IDs', __FILE__, __LINE__, $db->error());
-
+// Grab the users
+$result = $db->query('SELECT u.id, u.username, u.title, u.num_posts, u.registered, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id>1'.(!empty($where_sql) ? ' AND '.implode(' AND ', $where_sql) : '').' ORDER BY '.$sort_by.' '.$sort_dir.' LIMIT '.$start_from.', 50') or error('Impossible de retrouver la liste des membres', __FILE__, __LINE__, $db->error());
 if ($db->num_rows($result))
 {
-	$user_ids = array();
-	for ($i = 0;$cur_user_id = $db->result($result, $i);$i++)
-		$user_ids[] = $cur_user_id;
-
-	// Grab the users
-	$result = $db->query('SELECT u.id, u.username, u.title, u.num_posts, u.registered, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id IN('.implode(',', $user_ids).') ORDER BY '.$sort_by.' '.$sort_dir.', u.id ASC') or error('Unable to fetch user list', __FILE__, __LINE__, $db->error());
-
 	while ($user_data = $db->fetch_assoc($result))
 	{
@@ -155,5 +166,5 @@
 					<td class="tcl"><?php echo '<a href="profile.php?id='.$user_data['id'].'">'.pun_htmlspecialchars($user_data['username']).'</a>' ?></td>
 					<td class="tc2"><?php echo $user_title_field ?></td>
-<?php if ($show_post_count): ?>					<td class="tc3"><?php echo forum_number_format($user_data['num_posts']) ?></td>
+<?php if ($show_post_count): ?>					<td class="tc3"><?php echo $user_data['num_posts'] ?></td>
 <?php endif; ?>
 					<td class="tcr"><?php echo format_time($user_data['registered'], true) ?></td>
@@ -176,5 +187,4 @@
 	<div class="inbox">
 		<p class="pagelink"><?php echo $paging_links ?></p>
-		<div class="clearer"></div>
 	</div>
 </div>
Index: trunk/web/punbb/viewforum.php
===================================================================
--- trunk/web/punbb/viewforum.php	(revision 10)
+++ trunk/web/punbb/viewforum.php	(revision 1)
@@ -1,11 +1,28 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
 
@@ -23,9 +40,5 @@
 
 // Fetch some info about the forum
-if (!$pun_user['is_guest'])
-	$result = $db->query('SELECT f.forum_name, f.redirect_url, f.moderators, f.num_topics, f.sort_by, fp.post_topics, s.user_id AS is_subscribed FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_subscriptions AS s ON (f.id=s.forum_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
-else
-	$result = $db->query('SELECT f.forum_name, f.redirect_url, f.moderators, f.num_topics, f.sort_by, fp.post_topics, 0 AS is_subscribed FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$id) or error('Unable to fetch forum info', __FILE__, __LINE__, $db->error());
-
+$result = $db->query('SELECT f.forum_name, f.redirect_url, f.moderators, f.num_topics, f.sort_by, fp.post_topics FROM '.$db->prefix.'forums AS f LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND f.id='.$id) or error('Impossible de retrouver les informations du forum', __FILE__, __LINE__, $db->error());
 if (!$db->num_rows($result))
 	message($lang_common['Bad request']);
@@ -41,78 +54,37 @@
 
 // Sort out who the moderators are and if we are currently a moderator (or an admin)
-$mods_array = ($cur_forum['moderators'] != '') ? unserialize($cur_forum['moderators']) : array();
-$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
-
-switch ($cur_forum['sort_by'])
-{
-	case 0:
-		$sort_by = 'last_post DESC';
-		break;
-	case 1:
-		$sort_by = 'posted DESC';
-		break;
-	case 2:
-		$sort_by = 'subject ASC';
-		break;
-	default:
-		$sort_by = 'last_post DESC';
-		break;
-}
+$mods_array = array();
+if ($cur_forum['moderators'] != '')
+	$mods_array = unserialize($cur_forum['moderators']);
+
+$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
 
 // Can we or can we not post new topics?
 if (($cur_forum['post_topics'] == '' && $pun_user['g_post_topics'] == '1') || $cur_forum['post_topics'] == '1' || $is_admmod)
-	$post_link = "\t\t\t".'<p class="postlink conr"><a href="post.php?fid='.$id.'">'.$lang_forum['Post topic'].'</a></p>'."\n";
+	$post_link = "\t\t".'<p class="postlink conr"><a href="post.php?fid='.$id.'">'.$lang_forum['Post topic'].'</a></p>'."\n";
 else
 	$post_link = '';
 
-// Get topic/forum tracking data
-if (!$pun_user['is_guest'])
-	$tracked_topics = get_tracked_topics();
 
 // Determine the topic offset (based on $_GET['p'])
 $num_pages = ceil($cur_forum['num_topics'] / $pun_user['disp_topics']);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
+$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 $start_from = $pun_user['disp_topics'] * ($p - 1);
 
 // Generate paging links
-$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'viewforum.php?id='.$id);
-
-if ($pun_config['o_feed_type'] == '1')
-	$page_head = array('feed' => '<link rel="alternate" type="application/rss+xml" href="extern.php?action=feed&amp;fid='.$id.'&amp;type=rss" title="'.$lang_common['RSS forum feed'].'" />');
-else if ($pun_config['o_feed_type'] == '2')
-	$page_head = array('feed' => '<link rel="alternate" type="application/atom+xml" href="extern.php?action=feed&amp;fid='.$id.'&amp;type=atom" title="'.$lang_common['Atom forum feed'].'" />');
-
-$forum_actions = array();
-
-if (!$pun_user['is_guest'])
-{
-	if ($pun_config['o_forum_subscriptions'] == '1')
-	{
-		if ($cur_forum['is_subscribed'])
-			$forum_actions[] = '<span>'.$lang_forum['Is subscribed'].' - </span><a href="misc.php?action=unsubscribe&amp;fid='.$id.'">'.$lang_forum['Unsubscribe'].'</a>';
-		else
-			$forum_actions[] = '<a href="misc.php?action=subscribe&amp;fid='.$id.'">'.$lang_forum['Subscribe'].'</a>';
-	}
-
-	$forum_actions[] = '<a href="misc.php?action=markforumread&amp;fid='.$id.'">'.$lang_common['Mark forum read'].'</a>';
-}
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), pun_htmlspecialchars($cur_forum['forum_name']));
+$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'viewforum.php?id='.$id);
+
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title'].' / '.$cur_forum['forum_name']);
 define('PUN_ALLOW_INDEX', 1);
-define('PUN_ACTIVE_PAGE', 'index');
 require PUN_ROOT.'header.php';
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $id ?>"><strong><?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></strong></a></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
 <?php echo $post_link ?>
-		</div>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a>&#160;</li><li>&raquo;&#160;<?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></li></ul>
 		<div class="clearer"></div>
 	</div>
@@ -128,6 +100,6 @@
 					<th class="tcl" scope="col"><?php echo $lang_common['Topic'] ?></th>
 					<th class="tc2" scope="col"><?php echo $lang_common['Replies'] ?></th>
-<?php if ($pun_config['o_topic_views'] == '1'): ?>					<th class="tc3" scope="col"><?php echo $lang_forum['Views'] ?></th>
-<?php endif; ?>					<th class="tcr" scope="col"><?php echo $lang_common['Last post'] ?></th>
+					<th class="tc3" scope="col"><?php echo $lang_forum['Views'] ?></th>
+					<th class="tcr" scope="col"><?php echo $lang_common['Last post'] ?></th>
 				</tr>
 			</thead>
@@ -135,80 +107,71 @@
 <?php
 
-// Retrieve a list of topic IDs, LIMIT is (really) expensive so we only fetch the IDs here then later fetch the remaining data
-$result = $db->query('SELECT id FROM '.$db->prefix.'topics WHERE forum_id='.$id.' ORDER BY sticky DESC, '.$sort_by.', id DESC LIMIT '.$start_from.', '.$pun_user['disp_topics']) or error('Unable to fetch topic IDs', __FILE__, __LINE__, $db->error());
-
-// If there are topics in this forum
+// Fetch list of topics to display on this page
+if ($pun_user['is_guest'] || $pun_config['o_show_dot'] == '0')
+{
+	// Without "the dot"
+	$sql = 'SELECT id, poster, subject, posted, last_post, last_post_id, last_poster, num_views, num_replies, closed, sticky, moved_to FROM '.$db->prefix.'topics WHERE forum_id='.$id.' ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];
+}
+else
+{
+	// With "the dot"
+	switch ($db_type)
+	{
+		case 'mysql':
+		case 'mysqli':
+			$sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.forum_id='.$id.' GROUP BY t.id ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];
+			break;
+
+		case 'sqlite':
+			$sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.id IN(SELECT id FROM '.$db->prefix.'topics WHERE forum_id='.$id.' ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'].') GROUP BY t.id ORDER BY t.sticky DESC, t.last_post DESC';
+			break;
+
+		default:
+			$sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.forum_id='.$id.' GROUP BY t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, p.poster_id ORDER BY sticky DESC, '.(($cur_forum['sort_by'] == '1') ? 'posted' : 'last_post').' DESC LIMIT '.$start_from.', '.$pun_user['disp_topics'];
+			break;
+
+	}
+}
+
+$result = $db->query($sql) or error('Impossible de retrouver la liste des discussions', __FILE__, __LINE__, $db->error());
+
+// If there are topics in this forum.
 if ($db->num_rows($result))
 {
-	$topic_ids = array();
-	for ($i = 0;$cur_topic_id = $db->result($result, $i);$i++)
-		$topic_ids[] = $cur_topic_id;
-
-	if (empty($topic_ids))
-		error('The topic table and forum table seem to be out of sync!', __FILE__, __LINE__);
-
-	// Fetch list of topics to display on this page
-	if ($pun_user['is_guest'] || $pun_config['o_show_dot'] == '0')
-	{
-		// Without "the dot"
-		$sql = 'SELECT id, poster, subject, posted, last_post, last_post_id, last_poster, num_views, num_replies, closed, sticky, moved_to FROM '.$db->prefix.'topics WHERE id IN('.implode(',', $topic_ids).') ORDER BY sticky DESC, '.$sort_by.', id DESC';
-	}
-	else
-	{
-		// With "the dot"
-		$sql = 'SELECT p.poster_id AS has_posted, t.id, t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to FROM '.$db->prefix.'topics AS t LEFT JOIN '.$db->prefix.'posts AS p ON t.id=p.topic_id AND p.poster_id='.$pun_user['id'].' WHERE t.id IN('.implode(',', $topic_ids).') GROUP BY t.id'.($db_type == 'pgsql' ? ', t.subject, t.poster, t.posted, t.last_post, t.last_post_id, t.last_poster, t.num_views, t.num_replies, t.closed, t.sticky, t.moved_to, p.poster_id' : '').' ORDER BY t.sticky DESC, t.'.$sort_by.', t.id DESC';
-	}
-
-	$result = $db->query($sql) or error('Unable to fetch topic list', __FILE__, __LINE__, $db->error());
-
-	$topic_count = 0;
 	while ($cur_topic = $db->fetch_assoc($result))
 	{
-		++$topic_count;
-		$status_text = array();
-		$item_status = ($topic_count % 2 == 0) ? 'roweven' : 'rowodd';
+		$icon_text = $lang_common['Normal icon'];
+		$item_status = '';
 		$icon_type = 'icon';
 
 		if ($cur_topic['moved_to'] == null)
-			$last_post = '<a href="viewtopic.php?pid='.$cur_topic['last_post_id'].'#p'.$cur_topic['last_post_id'].'">'.format_time($cur_topic['last_post']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['last_poster']).'</span>';
-		else
-			$last_post = '- - -';
+			$last_post = '<a href="viewtopic.php?pid='.$cur_topic['last_post_id'].'#p'.$cur_topic['last_post_id'].'">'.format_time($cur_topic['last_post']).'</a> <span class="byuser">'.$lang_common['by'].'&#160;'.pun_htmlspecialchars($cur_topic['last_poster']).'</span>';
+		else
+			$last_post = '&#160;';
 
 		if ($pun_config['o_censoring'] == '1')
 			$cur_topic['subject'] = censor_words($cur_topic['subject']);
 
-		if ($cur_topic['sticky'] == '1')
-		{
-			$item_status .= ' isticky';
-			$status_text[] = '<span class="stickytext">'.$lang_forum['Sticky'].'</span>';
-		}
-
 		if ($cur_topic['moved_to'] != 0)
-		{
-			$subject = '<a href="viewtopic.php?id='.$cur_topic['moved_to'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
-			$status_text[] = '<span class="movedtext">'.$lang_forum['Moved'].'</span>';
-			$item_status .= ' imoved';
-		}
+			$subject = $lang_forum['Moved'].': <a href="viewtopic.php?id='.$cur_topic['moved_to'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].'&#160;'.pun_htmlspecialchars($cur_topic['poster']).'</span>';
 		else if ($cur_topic['closed'] == '0')
-			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
-		else
-		{
-			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].' '.pun_htmlspecialchars($cur_topic['poster']).'</span>';
-			$status_text[] = '<span class="closedtext">'.$lang_forum['Closed'].'</span>';
-			$item_status .= ' iclosed';
-		}
-
-		if (!$pun_user['is_guest'] && $cur_topic['last_post'] > $pun_user['last_visit'] && (!isset($tracked_topics['topics'][$cur_topic['id']]) || $tracked_topics['topics'][$cur_topic['id']] < $cur_topic['last_post']) && (!isset($tracked_topics['forums'][$id]) || $tracked_topics['forums'][$id] < $cur_topic['last_post']) && $cur_topic['moved_to'] == null)
-		{
+			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].'&#160;'.pun_htmlspecialchars($cur_topic['poster']).'</span>';
+		else
+		{
+			$subject = '<a href="viewtopic.php?id='.$cur_topic['id'].'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <span class="byuser">'.$lang_common['by'].'&#160;'.pun_htmlspecialchars($cur_topic['poster']).'</span>';
+			$icon_text = $lang_common['Closed icon'];
+			$item_status = 'iclosed';
+		}
+
+		if (!$pun_user['is_guest'] && $cur_topic['last_post'] > $pun_user['last_visit'] && $cur_topic['moved_to'] == null)
+		{
+			$icon_text .= ' '.$lang_common['New icon'];
 			$item_status .= ' inew';
-			$icon_type = 'icon icon-new';
+			$icon_type = 'icon inew';
 			$subject = '<strong>'.$subject.'</strong>';
-			$subject_new_posts = '<span class="newtext">[ <a href="viewtopic.php?id='.$cur_topic['id'].'&amp;action=new" title="'.$lang_common['New posts info'].'">'.$lang_common['New posts'].'</a> ]</span>';
+			$subject_new_posts = '<span class="newtext">[&#160;<a href="viewtopic.php?id='.$cur_topic['id'].'&amp;action=new" title="'.$lang_common['New posts info'].'">'.$lang_common['New posts'].'</a>&#160;]</span>';
 		}
 		else
 			$subject_new_posts = null;
-
-		// Insert the status text before the subject
-		$subject = implode(' ', $status_text).' '.$subject;
 
 		// Should we display the dot or not? :)
@@ -216,8 +179,14 @@
 		{
 			if ($cur_topic['has_posted'] == $pun_user['id'])
-			{
-				$subject = '<strong class="ipost">Â·&#160;</strong>'.$subject;
-				$item_status .= ' iposted';
-			}
+				$subject = '<strong>&middot;</strong>&#160;'.$subject;
+			else
+				$subject = '&#160;&#160;'.$subject;
+		}
+
+		if ($cur_topic['sticky'] == '1')
+		{
+			$subject = '<span class="stickytext">'.$lang_forum['Sticky'].': </span>'.$subject;
+			$item_status .= ' isticky';
+			$icon_text .= ' '.$lang_forum['Sticky'];
 		}
 
@@ -225,5 +194,5 @@
 
 		if ($num_pages_topic > 1)
-			$subject_multipage = '<span class="pagestext">[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$cur_topic['id']).' ]</span>';
+			$subject_multipage = '[ '.paginate($num_pages_topic, -1, 'viewtopic.php?id='.$cur_topic['id']).' ]';
 		else
 			$subject_multipage = null;
@@ -232,21 +201,21 @@
 		if (!empty($subject_new_posts) || !empty($subject_multipage))
 		{
-			$subject .= !empty($subject_new_posts) ? ' '.$subject_new_posts : '';
+			$subject .= '&#160; '.(!empty($subject_new_posts) ? $subject_new_posts : '');
 			$subject .= !empty($subject_multipage) ? ' '.$subject_multipage : '';
 		}
 
 ?>
-				<tr class="<?php echo $item_status ?>">
+				<tr<?php if ($item_status != '') echo ' class="'.trim($item_status).'"'; ?>>
 					<td class="tcl">
-						<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo forum_number_format($topic_count + $start_from) ?></div></div>
-						<div class="tclcon">
-							<div>
+						<div class="intd">
+							<div class="<?php echo $icon_type ?>"><div class="nosize"><?php echo trim($icon_text) ?></div></div>
+							<div class="tclcon">
 								<?php echo $subject."\n" ?>
 							</div>
 						</div>
 					</td>
-					<td class="tc2"><?php echo ($cur_topic['moved_to'] == null) ? forum_number_format($cur_topic['num_replies']) : '-' ?></td>
-<?php if ($pun_config['o_topic_views'] == '1'): ?>					<td class="tc3"><?php echo ($cur_topic['moved_to'] == null) ? forum_number_format($cur_topic['num_views']) : '-' ?></td>
-<?php endif; ?>					<td class="tcr"><?php echo $last_post ?></td>
+					<td class="tc2"><?php echo ($cur_topic['moved_to'] == null) ? $cur_topic['num_replies'] : '&#160;' ?></td>
+					<td class="tc3"><?php echo ($cur_topic['moved_to'] == null) ? $cur_topic['num_views'] : '&#160;' ?></td>
+					<td class="tcr"><?php echo $last_post ?></td>
 				</tr>
 <?php
@@ -256,16 +225,8 @@
 else
 {
-	$colspan = ($pun_config['o_topic_views'] == '1') ? 4 : 3;
-
-?>
-				<tr class="rowodd inone">
-					<td class="tcl" colspan="<?php echo $colspan ?>">
-						<div class="icon inone"><div class="nosize"><!-- --></div></div>
-						<div class="tclcon">
-							<div>
-								<strong><?php echo $lang_forum['Empty forum'] ?></strong>
-							</div>
-						</div>
-					</td>
+
+?>
+				<tr>
+					<td class="tcl" colspan="4"><?php echo $lang_forum['Empty forum'] ?></td>
 				</tr>
 <?php
@@ -281,14 +242,8 @@
 
 <div class="linksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
 <?php echo $post_link ?>
-		</div>
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $id ?>"><strong><?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></strong></a></li>
-		</ul>
-<?php echo (!empty($forum_actions) ? "\t\t".'<p class="subscribelink clearb">'.implode(' - ', $forum_actions).'</p>'."\n" : '') ?>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a>&#160;</li><li>&raquo;&#160;<?php echo pun_htmlspecialchars($cur_forum['forum_name']) ?></li></ul>
 		<div class="clearer"></div>
 	</div>
@@ -299,2 +254,3 @@
 $footer_style = 'viewforum';
 require PUN_ROOT.'footer.php';
+
Index: trunk/web/punbb/viewtopic.php
===================================================================
--- trunk/web/punbb/viewtopic.php	(revision 10)
+++ trunk/web/punbb/viewtopic.php	(revision 1)
@@ -1,13 +1,29 @@
 <?php
-
-/**
- * Copyright (C) 2008-2011 FluxBB
- * based on code by Rickard Andersson copyright (C) 2002-2008 PunBB
- * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher
- */
-
-define('PUN_ROOT', dirname(__FILE__).'/');
+/***********************************************************************
+
+  Copyright (C) 2002-2005  Rickard Andersson (rickard@punbb.org)
+
+  This file is part of PunBB.
+
+  PunBB is free software; you can redistribute it and/or modify it
+  under the terms of the GNU General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PunBB is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+  MA  02111-1307  USA
+
+************************************************************************/
+
+
+define('PUN_ROOT', './');
 require PUN_ROOT.'include/common.php';
-
 
 if ($pun_user['g_read_board'] == '0')
@@ -28,38 +44,36 @@
 if ($pid)
 {
-	$result = $db->query('SELECT topic_id, posted FROM '.$db->prefix.'posts WHERE id='.$pid) or error('Unable to fetch topic ID', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT topic_id FROM '.$db->prefix.'posts WHERE id='.$pid) or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
 	if (!$db->num_rows($result))
 		message($lang_common['Bad request']);
 
-	list($id, $posted) = $db->fetch_row($result);
-
-	// Determine on what page the post is located (depending on $forum_user['disp_posts'])
-	$result = $db->query('SELECT COUNT(id) FROM '.$db->prefix.'posts WHERE topic_id='.$id.' AND posted<'.$posted) or error('Unable to count previous posts', __FILE__, __LINE__, $db->error());
-	$num_posts = $db->result($result) + 1;
-
-	$_GET['p'] = ceil($num_posts / $pun_user['disp_posts']);
+	$id = $db->result($result);
+
+	// Determine on what page the post is located (depending on $pun_user['disp_posts'])
+	$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$id.' ORDER BY posted') or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
+	$num_posts = $db->num_rows($result);
+
+	for ($i = 0; $i < $num_posts; ++$i)
+	{
+		$cur_id = $db->result($result, $i);
+		if ($cur_id == $pid)
+			break;
+	}
+	++$i;	// we started at 0
+
+	$_GET['p'] = ceil($i / $pun_user['disp_posts']);
 }
 
 // If action=new, we redirect to the first new post (if any)
-else if ($action == 'new')
-{
-	if (!$pun_user['is_guest'])
-	{
-		// We need to check if this topic has been viewed recently by the user
-		$tracked_topics = get_tracked_topics();
-		$last_viewed = isset($tracked_topics['topics'][$id]) ? $tracked_topics['topics'][$id] : $pun_user['last_visit'];
-
-		$result = $db->query('SELECT MIN(id) FROM '.$db->prefix.'posts WHERE topic_id='.$id.' AND posted>'.$last_viewed) or error('Unable to fetch first new post info', __FILE__, __LINE__, $db->error());
-		$first_new_post_id = $db->result($result);
-
-		if ($first_new_post_id)
-		{
-			header('Location: viewtopic.php?pid='.$first_new_post_id.'#p'.$first_new_post_id);
-			exit;
-		}
-	}
-
-	// If there is no new post, we go to the last post
-	header('Location: viewtopic.php?id='.$id.'&action=last');
+else if ($action == 'new' && !$pun_user['is_guest'])
+{
+	$result = $db->query('SELECT MIN(id) FROM '.$db->prefix.'posts WHERE topic_id='.$id.' AND posted>'.$pun_user['last_visit']) or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
+	$first_new_post_id = $db->result($result);
+
+	if ($first_new_post_id)
+		header('Location: viewtopic.php?pid='.$first_new_post_id.'#p'.$first_new_post_id);
+	else	// If there is no new post, we go to the last post
+		header('Location: viewtopic.php?id='.$id.'&action=last');
+
 	exit;
 }
@@ -68,5 +82,5 @@
 else if ($action == 'last')
 {
-	$result = $db->query('SELECT MAX(id) FROM '.$db->prefix.'posts WHERE topic_id='.$id) or error('Unable to fetch last post info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT MAX(id) FROM '.$db->prefix.'posts WHERE topic_id='.$id) or error('Impossible de retrouver les informations du message', __FILE__, __LINE__, $db->error());
 	$last_post_id = $db->result($result);
 
@@ -81,7 +95,7 @@
 // Fetch some info about the topic
 if (!$pun_user['is_guest'])
-	$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, t.first_post_id, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'topic_subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, s.user_id AS is_subscribed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'subscriptions AS s ON (t.id=s.topic_id AND s.user_id='.$pun_user['id'].') LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Impossible de retrouver les informations de la discussion', __FILE__, __LINE__, $db->error());
 else
-	$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, t.first_post_id, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 AS is_subscribed FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
+	$result = $db->query('SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id='.$pun_user['g_id'].') WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id='.$id.' AND t.moved_to IS NULL') or error('Impossible de retrouver les informations de la discussion', __FILE__, __LINE__, $db->error());
 
 if (!$db->num_rows($result))
@@ -92,5 +106,5 @@
 // Sort out who the moderators are and if we are currently a moderator (or an admin)
 $mods_array = ($cur_topic['moderators'] != '') ? unserialize($cur_topic['moderators']) : array();
-$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_moderator'] == '1' && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
+$is_admmod = ($pun_user['g_id'] == PUN_ADMIN || ($pun_user['g_id'] == PUN_MOD && array_key_exists($pun_user['username'], $mods_array))) ? true : false;
 
 // Can we or can we not post replies?
@@ -98,7 +112,7 @@
 {
 	if (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') || $cur_topic['post_replies'] == '1' || $is_admmod)
-		$post_link = "\t\t\t".'<p class="postlink conr"><a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a></p>'."\n";
+		$post_link = '<a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a>';
 	else
-		$post_link = '';
+		$post_link = '&#160;';
 }
 else
@@ -108,15 +122,4 @@
 	if ($is_admmod)
 		$post_link .= ' / <a href="post.php?tid='.$id.'">'.$lang_topic['Post reply'].'</a>';
-
-	$post_link = "\t\t\t".'<p class="postlink conr">'.$post_link.'</p>'."\n";
-}
-
-
-// Add/update this topic in our list of tracked topics
-if (!$pun_user['is_guest'])
-{
-	$tracked_topics = get_tracked_topics();
-	$tracked_topics['topics'][$id] = time();
-	set_tracked_topics($tracked_topics);
 }
 
@@ -125,9 +128,9 @@
 $num_pages = ceil(($cur_topic['num_replies'] + 1) / $pun_user['disp_posts']);
 
-$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : intval($_GET['p']);
+$p = (!isset($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $num_pages) ? 1 : $_GET['p'];
 $start_from = $pun_user['disp_posts'] * ($p - 1);
 
 // Generate paging links
-$paging_links = '<span class="pages-label">'.$lang_common['Pages'].' </span>'.paginate($num_pages, $p, 'viewtopic.php?id='.$id);
+$paging_links = $lang_common['Pages'].': '.paginate($num_pages, $p, 'viewtopic.php?id='.$id);
 
 
@@ -138,53 +141,33 @@
 $quickpost = false;
 if ($pun_config['o_quickpost'] == '1' &&
+	!$pun_user['is_guest'] &&
 	($cur_topic['post_replies'] == '1' || ($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1')) &&
 	($cur_topic['closed'] == '0' || $is_admmod))
 {
-	// Load the post.php language file
-	require PUN_ROOT.'lang/'.$pun_user['language'].'/post.php';
-
 	$required_fields = array('req_message' => $lang_common['Message']);
-	if ($pun_user['is_guest'])
-	{
-		$required_fields['req_username'] = $lang_post['Guest name'];
-		if ($pun_config['p_force_guest_email'] == '1')
-			$required_fields['req_email'] = $lang_common['Email'];
-	}
 	$quickpost = true;
 }
 
-if (!$pun_user['is_guest'] && $pun_config['o_topic_subscriptions'] == '1')
+if (!$pun_user['is_guest'] && $pun_config['o_subscriptions'] == '1')
 {
 	if ($cur_topic['is_subscribed'])
 		// I apologize for the variable naming here. It's a mix of subscription and action I guess :-)
-		$subscraction = "\t\t".'<p class="subscribelink clearb"><span>'.$lang_topic['Is subscribed'].' - </span><a href="misc.php?action=unsubscribe&amp;tid='.$id.'">'.$lang_topic['Unsubscribe'].'</a></p>'."\n";
+		$subscraction = '<p class="subscribelink clearb">'.$lang_topic['Is subscribed'].' - <a href="misc.php?unsubscribe='.$id.'">'.$lang_topic['Unsubscribe'].'</a></p>'."\n";
 	else
-		$subscraction = "\t\t".'<p class="subscribelink clearb"><a href="misc.php?action=subscribe&amp;tid='.$id.'">'.$lang_topic['Subscribe'].'</a></p>'."\n";
+		$subscraction = '<p class="subscribelink clearb"><a href="misc.php?subscribe='.$id.'">'.$lang_topic['Subscribe'].'</a></p>'."\n";
 }
 else
-	$subscraction = '';
-
-if ($pun_config['o_feed_type'] == '1')
-	$page_head = array('feed' => '<link rel="alternate" type="application/rss+xml" href="extern.php?action=feed&amp;tid='.$id.'&amp;type=rss" title="'.$lang_common['RSS topic feed'].'" />');
-else if ($pun_config['o_feed_type'] == '2')
-	$page_head = array('feed' => '<link rel="alternate" type="application/atom+xml" href="extern.php?action=feed&amp;tid='.$id.'&amp;type=atom" title="'.$lang_common['Atom topic feed'].'" />');
-
-$page_title = array(pun_htmlspecialchars($pun_config['o_board_title']), pun_htmlspecialchars($cur_topic['forum_name']), pun_htmlspecialchars($cur_topic['subject']));
+	$subscraction = '<div class="clearer"></div>'."\n";
+
+$page_title = pun_htmlspecialchars($pun_config['o_board_title'].' / '.$cur_topic['subject']);
 define('PUN_ALLOW_INDEX', 1);
-define('PUN_ACTIVE_PAGE', 'index');
 require PUN_ROOT.'header.php';
 
 ?>
 <div class="linkst">
-	<div class="inbox crumbsplus">
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $cur_topic['forum_id'] ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?id=<?php echo $id ?>"><strong><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></strong></a></li>
-		</ul>
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
-<?php echo $post_link ?>
-		</div>
+	<div class="inbox">
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
+		<p class="postlink conr"><?php echo $post_link ?></p>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li><li>&#160;&raquo;&#160;<a href="viewforum.php?id=<?php echo $cur_topic['forum_id'] ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li><li>&#160;&raquo;&#160;<?php echo pun_htmlspecialchars($cur_topic['subject']) ?></li></ul>
 		<div class="clearer"></div>
 	</div>
@@ -196,18 +179,9 @@
 require PUN_ROOT.'include/parser.php';
 
-$post_count = 0; // Keep track of post numbers
-
-// Retrieve a list of post IDs, LIMIT is (really) expensive so we only fetch the IDs here then later fetch the remaining data
-$result = $db->query('SELECT id FROM '.$db->prefix.'posts WHERE topic_id='.$id.' ORDER BY id LIMIT '.$start_from.','.$pun_user['disp_posts']) or error('Unable to fetch post IDs', __FILE__, __LINE__, $db->error());
-
-$post_ids = array();
-for ($i = 0;$cur_post_id = $db->result($result, $i);$i++)
-	$post_ids[] = $cur_post_id;
-
-if (empty($post_ids))
-	error('The post table and topic table seem to be out of sync!', __FILE__, __LINE__);
+$bg_switch = true;	// Used for switching background color in posts
+$post_count = 0;	// Keep track of post numbers
 
 // Retrieve the posts (and their respective poster/online status)
-$result = $db->query('SELECT u.email, u.title, u.url, u.location, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id LEFT JOIN '.$db->prefix.'online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.id IN ('.implode(',', $post_ids).') ORDER BY p.id', true) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
+$result = $db->query('SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id INNER JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id LEFT JOIN '.$db->prefix.'online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id='.$id.' ORDER BY p.id LIMIT '.$start_from.','.$pun_user['disp_posts'], true) or error('Impossible de retrouver les informations des messages', __FILE__, __LINE__, $db->error());
 while ($cur_post = $db->fetch_assoc($result))
 {
@@ -220,12 +194,8 @@
 	$signature = '';
 
-	// If the poster is a registered user
+	// If the poster is a registered user.
 	if ($cur_post['poster_id'] > 1)
 	{
-		if ($pun_user['g_view_users'] == '1')
-			$username = '<a href="profile.php?id='.$cur_post['poster_id'].'">'.pun_htmlspecialchars($cur_post['username']).'</a>';
-		else
-			$username = pun_htmlspecialchars($cur_post['username']);
-
+		$username = '<a href="profile.php?id='.$cur_post['poster_id'].'">'.pun_htmlspecialchars($cur_post['username']).'</a>';
 		$user_title = get_title($cur_post);
 
@@ -234,13 +204,17 @@
 
 		// Format the online indicator
-		$is_online = ($cur_post['is_online'] == $cur_post['poster_id']) ? '<strong>'.$lang_topic['Online'].'</strong>' : '<span>'.$lang_topic['Offline'].'</span>';
-
-		if ($pun_config['o_avatars'] == '1' && $pun_user['show_avatars'] != '0')
+		$is_online = ($cur_post['is_online'] == $cur_post['poster_id']) ? '<strong>'.$lang_topic['Online'].'</strong>' : $lang_topic['Offline'];
+
+		if ($pun_config['o_avatars'] == '1' && $cur_post['use_avatar'] == '1' && $pun_user['show_avatars'] != '0')
 		{
-			if (isset($user_avatar_cache[$cur_post['poster_id']]))
-				$user_avatar = $user_avatar_cache[$cur_post['poster_id']];
-			else
-				$user_avatar = $user_avatar_cache[$cur_post['poster_id']] = generate_avatar_markup($cur_post['poster_id']);
+			if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif'))
+				$user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.gif" '.$img_size[3].' alt="" />';
+			else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg'))
+				$user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.jpg" '.$img_size[3].' alt="" />';
+			else if ($img_size = @getimagesize($pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png'))
+				$user_avatar = '<img src="'.$pun_config['o_avatars_dir'].'/'.$cur_post['poster_id'].'.png" '.$img_size[3].' alt="" />';
 		}
+		else
+			$user_avatar = '';
 
 		// We only show location, register date, post count and the contact links if "Show user info" is enabled
@@ -252,33 +226,28 @@
 					$cur_post['location'] = censor_words($cur_post['location']);
 
-				$user_info[] = '<dd><span>'.$lang_topic['From'].' '.pun_htmlspecialchars($cur_post['location']).'</span></dd>';
+				$user_info[] = '<dd>'.$lang_topic['From'].': '.pun_htmlspecialchars($cur_post['location']);
 			}
 
-			$user_info[] = '<dd><span>'.$lang_topic['Registered'].' '.format_time($cur_post['registered'], true).'</span></dd>';
-
-			if ($pun_config['o_show_post_count'] == '1' || $pun_user['is_admmod'])
-				$user_info[] = '<dd><span>'.$lang_topic['Posts'].' '.forum_number_format($cur_post['num_posts']).'</span></dd>';
-
-			// Now let's deal with the contact links (Email and URL)
-			if ((($cur_post['email_setting'] == '0' && !$pun_user['is_guest']) || $pun_user['is_admmod']) && $pun_user['g_send_email'] == '1')
-				$user_contacts[] = '<span class="email"><a href="mailto:'.$cur_post['email'].'">'.$lang_common['Email'].'</a></span>';
-			else if ($cur_post['email_setting'] == '1' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
-				$user_contacts[] = '<span class="email"><a href="misc.php?email='.$cur_post['poster_id'].'">'.$lang_common['Email'].'</a></span>';
+			$user_info[] = '<dd>'.$lang_common['Registered'].': '.date($pun_config['o_date_format'], $cur_post['registered']);
+
+			if ($pun_config['o_show_post_count'] == '1' || $pun_user['g_id'] < PUN_GUEST)
+				$user_info[] = '<dd>'.$lang_common['Posts'].': '.$cur_post['num_posts'];
+
+			// Now let's deal with the contact links (E-mail and URL)
+			if (($cur_post['email_setting'] == '0' && !$pun_user['is_guest']) || $pun_user['g_id'] < PUN_GUEST)
+				$user_contacts[] = '<a href="mailto:'.$cur_post['email'].'">'.$lang_common['E-mail'].'</a>';
+			else if ($cur_post['email_setting'] == '1' && !$pun_user['is_guest'])
+				$user_contacts[] = '<a href="misc.php?email='.$cur_post['poster_id'].'">'.$lang_common['E-mail'].'</a>';
 
 			if ($cur_post['url'] != '')
-			{
-				if ($pun_config['o_censoring'] == '1')
-					$cur_post['url'] = censor_words($cur_post['url']);
-
-				$user_contacts[] = '<span class="website"><a href="'.pun_htmlspecialchars($cur_post['url']).'">'.$lang_topic['Website'].'</a></span>';
-			}
+				$user_contacts[] = '<a href="'.pun_htmlspecialchars($cur_post['url']).'">'.$lang_topic['Website'].'</a>';
 		}
 
-		if ($pun_user['is_admmod'])
+		if ($pun_user['g_id'] < PUN_GUEST)
 		{
-			$user_info[] = '<dd><span><a href="moderate.php?get_host='.$cur_post['id'].'" title="'.$cur_post['poster_ip'].'">'.$lang_topic['IP address logged'].'</a></span></dd>';
+			$user_info[] = '<dd>IP: <a href="moderate.php?get_host='.$cur_post['id'].'">'.$cur_post['poster_ip'].'</a>';
 
 			if ($cur_post['admin_note'] != '')
-				$user_info[] = '<dd><span>'.$lang_topic['Note'].' <strong>'.pun_htmlspecialchars($cur_post['admin_note']).'</strong></span></dd>';
+				$user_info[] = '<dd>'.$lang_topic['Note'].': <strong>'.pun_htmlspecialchars($cur_post['admin_note']).'</strong>';
 		}
 	}
@@ -289,9 +258,9 @@
 		$user_title = get_title($cur_post);
 
-		if ($pun_user['is_admmod'])
-			$user_info[] = '<dd><span><a href="moderate.php?get_host='.$cur_post['id'].'" title="'.$cur_post['poster_ip'].'">'.$lang_topic['IP address logged'].'</a></span></dd>';
-
-		if ($pun_config['o_show_user_info'] == '1' && $cur_post['poster_email'] != '' && !$pun_user['is_guest'] && $pun_user['g_send_email'] == '1')
-			$user_contacts[] = '<span class="email"><a href="mailto:'.$cur_post['poster_email'].'">'.$lang_common['Email'].'</a></span>';
+		if ($pun_user['g_id'] < PUN_GUEST)
+			$user_info[] = '<dd>IP: <a href="moderate.php?get_host='.$cur_post['id'].'">'.$cur_post['poster_ip'].'</a>';
+
+		if ($pun_config['o_show_user_info'] == '1' && $cur_post['poster_email'] != '' && !$pun_user['is_guest'])
+			$user_contacts[] = '<a href="mailto:'.$cur_post['poster_email'].'">'.$lang_common['E-mail'].'</a>';
 	}
 
@@ -300,5 +269,5 @@
 	{
 		if (!$pun_user['is_guest'])
-			$post_actions[] = '<li class="postreport"><span><a href="misc.php?report='.$cur_post['id'].'">'.$lang_topic['Report'].'</a></span></li>';
+			$post_actions[] = '<li class="postreport"><a href="misc.php?report='.$cur_post['id'].'">'.$lang_topic['Report'].'</a>';
 
 		if ($cur_topic['closed'] == '0')
@@ -307,26 +276,42 @@
 			{
 				if ((($start_from + $post_count) == 1 && $pun_user['g_delete_topics'] == '1') || (($start_from + $post_count) > 1 && $pun_user['g_delete_posts'] == '1'))
-					$post_actions[] = '<li class="postdelete"><span><a href="delete.php?id='.$cur_post['id'].'">'.$lang_topic['Delete'].'</a></span></li>';
+					$post_actions[] = '<li class="postdelete"><a href="delete.php?id='.$cur_post['id'].'">'.$lang_topic['Delete'].'</a>';
 				if ($pun_user['g_edit_posts'] == '1')
-					$post_actions[] = '<li class="postedit"><span><a href="edit.php?id='.$cur_post['id'].'">'.$lang_topic['Edit'].'</a></span></li>';
+					$post_actions[] = '<li class="postedit"><a href="edit.php?id='.$cur_post['id'].'">'.$lang_topic['Edit'].'</a>';
 			}
 
 			if (($cur_topic['post_replies'] == '' && $pun_user['g_post_replies'] == '1') || $cur_topic['post_replies'] == '1')
-				$post_actions[] = '<li class="postquote"><span><a href="post.php?tid='.$id.'&amp;qid='.$cur_post['id'].'">'.$lang_topic['Quote'].'</a></span></li>';
+				$post_actions[] = '<li class="postquote"><a href="post.php?tid='.$id.'&amp;qid='.$cur_post['id'].'">'.$lang_topic['Quote'].'</a>';
 		}
 	}
 	else
-	{
-		$post_actions[] = '<li class="postreport"><span><a href="misc.php?report='.$cur_post['id'].'">'.$lang_topic['Report'].'</a></span></li>';
-		$post_actions[] = '<li class="postdelete"><span><a href="delete.php?id='.$cur_post['id'].'">'.$lang_topic['Delete'].'</a></span></li>';
-		$post_actions[] = '<li class="postedit"><span><a href="edit.php?id='.$cur_post['id'].'">'.$lang_topic['Edit'].'</a></span></li>';
-		$post_actions[] = '<li class="postquote"><span><a href="post.php?tid='.$id.'&amp;qid='.$cur_post['id'].'">'.$lang_topic['Quote'].'</a></span></li>';
-	}
+		$post_actions[] = '<li class="postreport"><a href="misc.php?report='.$cur_post['id'].'">'.$lang_topic['Report'].'</a>'.$lang_topic['Link separator'].'</li><li class="postdelete"><a href="delete.php?id='.$cur_post['id'].'">'.$lang_topic['Delete'].'</a>'.$lang_topic['Link separator'].'</li><li class="postedit"><a href="edit.php?id='.$cur_post['id'].'">'.$lang_topic['Edit'].'</a>'.$lang_topic['Link separator'].'</li><li class="postquote"><a href="post.php?tid='.$id.'&amp;qid='.$cur_post['id'].'">'.$lang_topic['Quote'].'</a>';
+
+
+	// Switch the background color for every message.
+	$bg_switch = ($bg_switch) ? $bg_switch = false : $bg_switch = true;
+	$vtbg = ($bg_switch) ? ' roweven' : ' rowodd';
+
 
 	// Perform the main parsing of the message (BBCode, smilies, censor words etc)
-	$cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies']);
+
+// ----------------------------------------------------
+// ajout dj3c1t 01/2008
+//
+// pour pouvoir poster des players dans les ÃÂ©ditos et les news, on autorise le code html
+// lorsque c'est la team RSR qui poste.
+//
+
+	if($cur_post['g_id'] == 1)
+        { $cur_post['message'] = str_replace
+          ( array("&gt;", "&lt;", "&quot;"),
+            array(">", "<", "\""),
+            parse_message($cur_post['message'], $cur_post['hide_smilies'])
+          );
+        }
+        else $cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies']);
 
 	// Do signature parsing/caching
-	if ($pun_config['o_signatures'] == '1' && $cur_post['signature'] != '' && $pun_user['show_sig'] != '0')
+	if ($cur_post['signature'] != '' && $pun_user['show_sig'] != '0')
 	{
 		if (isset($signature_cache[$cur_post['poster_id']]))
@@ -340,33 +325,28 @@
 
 ?>
-<div id="p<?php echo $cur_post['id'] ?>" class="blockpost<?php echo ($post_count % 2 == 0) ? ' roweven' : ' rowodd' ?><?php if ($cur_post['id'] == $cur_topic['first_post_id']) echo ' firstpost'; ?><?php if ($post_count == 1) echo ' blockpost1'; ?>">
-	<h2><span><span class="conr">#<?php echo ($start_from + $post_count) ?></span> <a href="viewtopic.php?pid=<?php echo $cur_post['id'].'#p'.$cur_post['id'] ?>"><?php echo format_time($cur_post['posted']) ?></a></span></h2>
+<div id="p<?php echo $cur_post['id'] ?>" class="blockpost<?php echo $vtbg ?><?php if (($post_count + $start_from) == 1) echo ' firstpost'; ?>">
+	<h2><span><span class="conr">#<?php echo ($start_from + $post_count) ?>&#160;</span><a href="viewtopic.php?pid=<?php echo $cur_post['id'].'#p'.$cur_post['id'] ?>"><?php echo format_time($cur_post['posted']) ?></a></span></h2>
 	<div class="box">
 		<div class="inbox">
-			<div class="postbody">
-				<div class="postleft">
-					<dl>
-						<dt><strong><?php echo $username ?></strong></dt>
-						<dd class="usertitle"><strong><?php echo $user_title ?></strong></dd>
-<?php if ($user_avatar != '') echo "\t\t\t\t\t\t".'<dd class="postavatar">'.$user_avatar.'</dd>'."\n"; ?>
-<?php if (count($user_info)) echo "\t\t\t\t\t\t".implode("\n\t\t\t\t\t\t", $user_info)."\n"; ?>
-<?php if (count($user_contacts)) echo "\t\t\t\t\t\t".'<dd class="usercontacts">'.implode(' ', $user_contacts).'</dd>'."\n"; ?>
-					</dl>
+			<div class="postleft">
+				<dl>
+					<dt><strong><?php echo $username ?></strong></dt>
+					<dd class="usertitle"><strong><?php echo $user_title ?></strong></dd>
+					<dd class="postavatar"><?php echo $user_avatar ?></dd>
+<?php if (count($user_info)) echo "\t\t\t\t\t".implode('</dd>'."\n\t\t\t\t\t", $user_info).'</dd>'."\n"; ?>
+<?php if (count($user_contacts)) echo "\t\t\t\t\t".'<dd class="usercontacts">'.implode('&#160;&#160;', $user_contacts).'</dd>'."\n"; ?>
+				</dl>
+			</div>
+			<div class="postright">
+				<h3><?php if (($post_count + $start_from) > 1) echo ' Re: '; ?><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></h3>
+				<div class="postmsg">
+					<?php echo $cur_post['message']."\n" ?>
+<?php if ($cur_post['edited'] != '') echo "\t\t\t\t\t".'<p class="postedit"><em>'.$lang_topic['Last edit'].' '.pun_htmlspecialchars($cur_post['edited_by']).' ('.format_time($cur_post['edited']).')</em></p>'."\n"; ?>
 				</div>
-				<div class="postright">
-					<h3><?php if ($cur_post['id'] != $cur_topic['first_post_id']) echo $lang_topic['Re'].' '; ?><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></h3>
-					<div class="postmsg">
-						<?php echo $cur_post['message']."\n" ?>
-<?php if ($cur_post['edited'] != '') echo "\t\t\t\t\t\t".'<p class="postedit"><em>'.$lang_topic['Last edit'].' '.pun_htmlspecialchars($cur_post['edited_by']).' ('.format_time($cur_post['edited']).')</em></p>'."\n"; ?>
-					</div>
-<?php if ($signature != '') echo "\t\t\t\t\t".'<div class="postsignature postmsg"><hr />'.$signature.'</div>'."\n"; ?>
-				</div>
+<?php if ($signature != '') echo "\t\t\t\t".'<div class="postsignature"><hr />'.$signature.'</div>'."\n"; ?>
 			</div>
-		</div>
-		<div class="inbox">
-			<div class="postfoot clearb">
-				<div class="postfootleft"><?php if ($cur_post['poster_id'] > 1) echo '<p>'.$is_online.'</p>'; ?></div>
-<?php if (count($post_actions)) echo "\t\t\t\t".'<div class="postfootright">'."\n\t\t\t\t\t".'<ul>'."\n\t\t\t\t\t\t".implode("\n\t\t\t\t\t\t", $post_actions)."\n\t\t\t\t\t".'</ul>'."\n\t\t\t\t".'</div>'."\n" ?>
-			</div>
+			<div class="clearer"></div>
+			<div class="postfootleft"><?php if ($cur_post['poster_id'] > 1) echo '<p>'.$is_online.'</p>'; ?></div>
+			<div class="postfootright"><?php echo (count($post_actions)) ? '<ul>'.implode($lang_topic['Link separator'].'</li>', $post_actions).'</li></ul></div>'."\n" : '<div>&#160;</div></div>'."\n" ?>
 		</div>
 	</div>
@@ -379,16 +359,9 @@
 ?>
 <div class="postlinksb">
-	<div class="inbox crumbsplus">
-		<div class="pagepost">
-			<p class="pagelink conl"><?php echo $paging_links ?></p>
-<?php echo $post_link ?>
-		</div>
-		<ul class="crumbs">
-			<li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewforum.php?id=<?php echo $cur_topic['forum_id'] ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li>
-			<li><span>Â»&#160;</span><a href="viewtopic.php?id=<?php echo $id ?>"><strong><?php echo pun_htmlspecialchars($cur_topic['subject']) ?></strong></a></li>
-		</ul>
-<?php echo $subscraction ?>
-		<div class="clearer"></div>
+	<div class="inbox">
+		<p class="postlink conr"><?php echo $post_link ?></p>
+		<p class="pagelink conl"><?php echo $paging_links ?></p>
+		<ul><li><a href="index.php"><?php echo $lang_common['Index'] ?></a></li><li>&#160;&raquo;&#160;<a href="viewforum.php?id=<?php echo $cur_topic['forum_id'] ?>"><?php echo pun_htmlspecialchars($cur_topic['forum_name']) ?></a></li><li>&#160;&raquo;&#160;<?php echo pun_htmlspecialchars($cur_topic['subject']) ?></li></ul>
+		<?php echo $subscraction ?>
 	</div>
 </div>
@@ -400,11 +373,10 @@
 {
 
-$cur_index = 1;
-
 ?>
-<div id="quickpost" class="blockform">
+<div class="blockform">
 	<h2><span><?php echo $lang_topic['Quick post'] ?></span></h2>
 	<div class="box">
-		<form id="quickpostform" method="post" action="post.php?tid=<?php echo $id ?>" onsubmit="this.submit.disabled=true;if(process_form(this)){return true;}else{this.submit.disabled=false;return false;}">
+		<form id="post" method="post" action="post.php?tid=<?php echo $id ?>" onsubmit="this.submit.disabled=true;if(process_form(this)){return true;}else{this.submit.disabled=false;return false;}">
+
 			<div class="inform">
 				<fieldset>
@@ -412,35 +384,16 @@
 					<div class="infldset txtarea">
 						<input type="hidden" name="form_sent" value="1" />
-<?php if ($pun_config['o_topic_subscriptions'] == '1' && ($pun_user['auto_notify'] == '1' || $cur_topic['is_subscribed'])): ?>						<input type="hidden" name="subscribe" value="1" />
-<?php endif; ?>
-<?php
-
-if ($pun_user['is_guest'])
-{
-	$email_label = ($pun_config['p_force_guest_email'] == '1') ? '<strong>'.$lang_common['Email'].' <span>'.$lang_common['Required'].'</span></strong>' : $lang_common['Email'];
-	$email_form_name = ($pun_config['p_force_guest_email'] == '1') ? 'req_email' : 'email';
-
-?>
-						<label class="conl required"><strong><?php echo $lang_post['Guest name'] ?> <span><?php echo $lang_common['Required'] ?></span></strong><br /><input type="text" name="req_username" value="<?php if (isset($_POST['req_username'])) echo pun_htmlspecialchars($username); ?>" size="25" maxlength="25" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
-						<label class="conl<?php echo ($pun_config['p_force_guest_email'] == '1') ? ' required' : '' ?>"><?php echo $email_label ?><br /><input type="text" name="<?php echo $email_form_name ?>" value="<?php if (isset($_POST[$email_form_name])) echo pun_htmlspecialchars($email); ?>" size="50" maxlength="80" tabindex="<?php echo $cur_index++ ?>" /><br /></label>
-						<div class="clearer"></div>
-<?php
-
-	echo "\t\t\t\t\t\t".'<label class="required"><strong>'.$lang_common['Message'].' <span>'.$lang_common['Required'].'</span></strong><br />';
-}
-else
-	echo "\t\t\t\t\t\t".'<label>';
-
-?>
-<textarea name="req_message" rows="7" cols="75" tabindex="<?php echo $cur_index++ ?>"></textarea></label>
+						<input type="hidden" name="form_user" value="<?php echo (!$pun_user['is_guest']) ? pun_htmlspecialchars($pun_user['username']) : 'Guest'; ?>" />
+						<?php require PUN_ROOT.'mod_easy_bbcode.php'; ?>
+						<label><textarea name="req_message" rows="7" cols="75" tabindex="1"></textarea></label>
 						<ul class="bblinks">
-							<li><span><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a> <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-							<li><span><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a> <?php echo ($pun_config['p_message_bbcode'] == '1' && $pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
-							<li><span><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a> <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></span></li>
+							<li><a href="help.php#bbcode" onclick="window.open(this.href); return false;"><?php echo $lang_common['BBCode'] ?></a>: <?php echo ($pun_config['p_message_bbcode'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+							<li><a href="help.php#img" onclick="window.open(this.href); return false;"><?php echo $lang_common['img tag'] ?></a>: <?php echo ($pun_config['p_message_img_tag'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
+							<li><a href="help.php#smilies" onclick="window.open(this.href); return false;"><?php echo $lang_common['Smilies'] ?></a>: <?php echo ($pun_config['o_smilies'] == '1') ? $lang_common['on'] : $lang_common['off']; ?></li>
 						</ul>
 					</div>
 				</fieldset>
 			</div>
-			<p class="buttons"><input type="submit" name="submit" tabindex="<?php echo $cur_index++ ?>" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /> <input type="submit" name="preview" value="<?php echo $lang_topic['Preview'] ?>" tabindex="<?php echo $cur_index++ ?>" accesskey="p" /></p>
+			<p><input type="submit" name="submit" tabindex="2" value="<?php echo $lang_common['Submit'] ?>" accesskey="s" /></p>
 		</form>
 	</div>
@@ -451,6 +404,6 @@
 
 // Increment "num_views" for topic
-if ($pun_config['o_topic_views'] == '1')
-	$db->query('UPDATE '.$db->prefix.'topics SET num_views=num_views+1 WHERE id='.$id) or error('Unable to update topic', __FILE__, __LINE__, $db->error());
+$low_prio = ($db_type == 'mysql') ? 'LOW_PRIORITY ' : '';
+$db->query('UPDATE '.$low_prio.$db->prefix.'topics SET num_views=num_views+1 WHERE id='.$id) or error('Impossible de modifier la discussion', __FILE__, __LINE__, $db->error());
 
 $forum_id = $cur_topic['forum_id'];
