Index: admin/_charte.php
===================================================================
--- admin/_charte.php	(revision 2111)
+++ admin/_charte.php	(revision 2152)
@@ -158,5 +158,5 @@
 						</div><!--
 						--><div class="two-boxes even">
-							<p><span class="step">2</span> S'il n'y a que deux boîtes, une autre class n'est pas nécessaire. S'il y en a plusieurs, il est conseillé de leur attribuer alternativement les class <code>"odd"</code> et <code>"even"</code> pour que les marges se placent correctement.</p>
+							<p><span class="step">2</span> On peut assortir une boîte des class <code>"odd"</code> (nothing left) et <code>"even"</code> pour que les marges se placent correctement.</p>
 						</div><!--
 						--><div class="two-boxes odd">
Index: admin/media.php
===================================================================
--- admin/media.php	(revision 2099)
+++ admin/media.php	(revision 2152)
@@ -409,5 +409,5 @@
 {
 	echo
-	'<div class="two-boxes fieldset">';	
+	'<div class="two-boxes fieldset even">';	
 	if ($user_ui_enhanceduploader) {
 		echo
Index: admin/plugins.php
===================================================================
--- admin/plugins.php	(revision 2150)
+++ admin/plugins.php	(revision 2007)
@@ -13,59 +13,155 @@
 require dirname(__FILE__).'/../inc/admin/prepend.php';
 
-dcPage::check('admin');
-
-# --------------------------------------------------
-# @todo Add settings to Dotclear update features
-if ($core->blog->settings->system->plugins_allow_multi_install === null) {
-	$core->blog->settings->system->put(
-		'plugins_allow_multi_install', false, 'boolean', 'Allow multi-installation for plugins', true, true
-	);
-}
-if ($core->blog->settings->system->repository_plugin_url === null) {
-	$core->blog->settings->system->put(
-		'repository_plugin_url', 'http://update.dotaddict.org/dc2/plugins.xml', 'string', 'Plugins XML feed location', true, true
-	);
-}
-# --------------------------------------------------
-
-# -- Repository helper --
-$repository = new dcRepository(
-	$core->plugins, 
-	$core->blog->settings->system->repository_plugin_url
-);
-$repository->check();
-
-# -- Page helper --
-$list = new adminModulesList(
-	$core, 
-	DC_PLUGINS_ROOT,
-	$core->blog->settings->system->plugins_allow_multi_install
-);
-
-# -- Execute actions --
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
+dcPage::checkSuper();
+
+$default_tab = !empty($_REQUEST['tab']) ? html::escapeHTML($_REQUEST['tab']) : 'plugins';
+
+$p_paths = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT);
+$p_path = array_pop($p_paths);
+unset($p_paths);
+
+$is_writable = false;
+if (is_dir($p_path) && is_writeable($p_path)) {
+	$is_writable = true;
+	$p_path_pat = preg_quote($p_path,'!');
+}
+
+$plugin_id = !empty($_POST['plugin_id']) ? $_POST['plugin_id'] : null;
+
+if ($is_writable)
+{
+	# Delete plugin
+	if ($plugin_id && !empty($_POST['delete']))
+	{
+		try
+		{
+			if (empty($_POST['deactivated']))
+			{
+				if (!$core->plugins->moduleExists($plugin_id)) {
+					throw new Exception(__('No such plugin.'));
+				}
+				
+				$plugin = $core->plugins->getModules($plugin_id);
+				$plugin['id'] = $plugin_id;
+				
+				if (!preg_match('!^'.$p_path_pat.'!', $plugin['root'])) {
+					throw new Exception(__('You don\'t have permissions to delete this plugin.'));
+				}
+				
+				# --BEHAVIOR-- pluginBeforeDelete
+				$core->callBehavior('pluginsBeforeDelete', $plugin);
+				
+				$core->plugins->deleteModule($plugin_id);
+				
+				# --BEHAVIOR-- pluginAfterDelete
+				$core->callBehavior('pluginsAfterDelete', $plugin);
+			}
+			else
+			{
+				$core->plugins->deleteModule($plugin_id,true);
+			}
+			
+			http::redirect('plugins.php?removed=1');
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+		}
+	}
+	# Deactivate plugin
+	elseif ($plugin_id && !empty($_POST['deactivate']))
+	{
+		try
+		{
+			if (!$core->plugins->moduleExists($plugin_id)) {
+				throw new Exception(__('No such plugin.'));
+			}
+			
+			$plugin = $core->plugins->getModules($plugin_id);
+			$plugin['id'] = $plugin_id;
+			
+			if (!$plugin['root_writable']) {
+				throw new Exception(__('You don\'t have permissions to deactivate this plugin.'));
+			}
+			
+			# --BEHAVIOR-- pluginBeforeDeactivate
+			$core->callBehavior('pluginsBeforeDeactivate', $plugin);
+				
+			$core->plugins->deactivateModule($plugin_id);
+
+			# --BEHAVIOR-- pluginAfterDeactivate
+			$core->callBehavior('pluginsAfterDeactivate', $plugin);
+				
+			http::redirect('plugins.php');
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+		}
+	}
+	# Activate plugin
+	elseif ($plugin_id && !empty($_POST['activate']))
+	{
+		try
+		{
+			$p = $core->plugins->getDisabledModules();
+			if (!isset($p[$plugin_id])) {
+				throw new Exception(__('No such plugin.'));
+			}
+
+			# --BEHAVIOR-- pluginBeforeActivate
+			$core->callBehavior('pluginsBeforeActivate', $plugin_id);
+			
+			$core->plugins->activateModule($plugin_id);
+
+			# --BEHAVIOR-- pluginAfterActivate
+			$core->callBehavior('pluginsAfterActivate', $plugin_id);
+			
+			http::redirect('plugins.php');
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+		}
+	}
 	# Plugin upload
-	if ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) ||
+	elseif ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) ||
 		(!empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url'])))
 	{
 		try
 		{
-			if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY, $_POST['your_pwd']))) {
+			if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) {
 				throw new Exception(__('Password verification failed'));
 			}
 			
-			if (!empty($_POST['upload_pkg'])) {
+			if (!empty($_POST['upload_pkg']))
+			{
 				files::uploadStatus($_FILES['pkg_file']);
 				
-				$dest = $list->getPath().'/'.$_FILES['pkg_file']['name'];
-				if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'], $dest)) {
+				$dest = $p_path.'/'.$_FILES['pkg_file']['name'];
+				if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'],$dest)) {
 					throw new Exception(__('Unable to move uploaded file.'));
 				}
 			}
-			else {
+			else
+			{
 				$url = urldecode($_POST['pkg_url']);
-				$dest = $list->getPath().'/'.basename($url);
-				$repository->download($url, $dest);
+				$dest = $p_path.'/'.basename($url);
+				
+				try
+				{
+					$client = netHttp::initClient($url,$path);
+					$client->setUserAgent('Dotclear - http://www.dotclear.org/');
+					$client->useGzip(false);
+					$client->setPersistReferers(false);
+					$client->setOutput($dest);
+					$client->get($path);
+				}
+				catch( Exception $e)
+				{
+					throw new Exception(__('An error occurred while downloading the file.'));
+				}
+				
+				unset($client);
 			}
 
@@ -73,36 +169,27 @@
 			$core->callBehavior('pluginsBeforeAdd', $plugin_id);
 						
-			$ret_code = $core->plugins->installPackage($dest, $core->plugins);
+			$ret_code = $core->plugins->installPackage($dest,$core->plugins);
 
 			# --BEHAVIOR-- pluginAfterAdd
 			$core->callBehavior('pluginsAfterAdd', $plugin_id);
 			
-			http::redirect('plugins.php?msg='.($ret_code == 2 ? 'update' : 'install').'#plugins');
-		}
-		catch (Exception $e) {
+			http::redirect('plugins.php?added='.$ret_code);
+		}
+		catch (Exception $e)
+		{
 			$core->error->add($e->getMessage());
-		}
-	}
-	elseif (!empty($_POST['module'])) {
-		try {
-			$list->executeAction('plugins', $core->plugins, $repository);
-		}
-		catch (Exception $e) {
-			$core->error->add($e->getMessage());
-		}
-	}
-}
-
-# -- Plugin install --
-$plugins_install = null;
-if (!$core->error->flag()) {
-	$plugins_install = $core->plugins->installModules();
-}
-
-# -- Page header --
+			$default_tab = 'addplugin';
+		}
+	}
+}
+
+# Plugin install
+$plugins_install = $core->plugins->installModules();
+
+/* DISPLAY Main page
+-------------------------------------------------------- */
 dcPage::open(__('Plugins management'),
 	dcPage::jsLoad('js/_plugins.js').
-	dcPage::jsPageTabs().
-	$core->callBehavior('pluginsToolsHeaders', $core),
+	dcPage::jsPageTabs($default_tab),
 	dcPage::breadcrumb(
 		array(
@@ -112,131 +199,157 @@
 );
 
-# -- Succes messages --
-if (!empty($_GET['msg'])) {
-	$list->displayMessage($_GET['msg'],__('Plugins'));
-}
-
-# -- Plugins install messages --
-if (!empty($plugins_install['success'])) {
-	echo 
-	'<div class="static-msg">'.__('Following plugins have been installed:').'<ul>';
+if (!empty($_GET['removed'])) {
+	dcPage::success(__('Plugin has been successfully deleted.'));
+}
+if (!empty($_GET['added'])) {
+	dcPage::success(($_GET['added'] == 2 ? __('Plugin has been successfully upgraded') : __('Plugin has been successfully installed.')));
+}
+
+# Plugins install messages
+if (!empty($plugins_install['success']))
+{
+	echo '<div class="static-msg">'.__('Following plugins have been installed:').'<ul>';
 	foreach ($plugins_install['success'] as $k => $v) {
-		echo 
-		'<li>'.$k.'</li>';
-	}
-	echo 
-	'</ul></div>';
-}
-if (!empty($plugins_install['failure'])) {
-	echo 
-	'<div class="error">'.__('Following plugins have not been installed:').'<ul>';
+		echo '<li>'.$k.'</li>';
+	}
+	echo '</ul></div>';
+}
+if (!empty($plugins_install['failure']))
+{
+	echo '<div class="error">'.__('Following plugins have not been installed:').'<ul>';
 	foreach ($plugins_install['failure'] as $k => $v) {
-		echo 
-		'<li>'.$k.' ('.$v.')</li>';
-	}
-	echo 
-	'</ul></div>';
-}
-
-# -- Display modules lists --
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
-	# Updated modules from repo
-	$modules = $repository->get(true);
-	if (!empty($modules)) {
-		echo 
-		'<div class="multi-part" id="update" title="'.html::escapeHTML(__('Update plugins')).'">'.
-		'<h3>'.html::escapeHTML(__('Update plugins')).'</h3>'.
-		'<p>'.sprintf(
-			__('There is one plugin to update available from %2$s.', 'There are %s plugins to update available from %s.', count($modules)),
-			count($modules),
-			'<a title="'.__('Visit Dotaddict').'" href="http://dotaddict.org/dc2/plugins">dotaddict.org</a>'
-		).'</p>';
-
-		$list
-			->setModules($modules)
-			->setPageTab('update')
-			->displayModulesList(
-				/*cols */	array('icon', 'name', 'version', 'current_version', 'desc'),
-				/* actions */	array('update')
-			);
-
+		echo '<li>'.$k.' ('.$v.')</li>';
+	}
+	echo '</ul></div>';
+}
+
+# List all active plugins
+echo '<p>'.__('Plugins add new functionalities to Dotclear. '.
+'Here you can activate or deactivate installed plugins.').'</p>';
+
+echo (!$core->plugins->moduleExists('daInstaller') ?
+	sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s.').'</strong></p>',
+		'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>') :
+	sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s or using the %s.').'</strong></p>',
+		'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>',
+		'<a href="plugin.php?p=daInstaller">'.__('DotAddict.org Installer').'</a>'));
+
+if ($is_writable) {
+	echo '<p>'.__('To install or upgrade a plugin you generally just need to upload it '.
+	'in "Install or upgrade a plugin" section.');
+} else {
+	echo '<p>'.__('To install or upgrade a plugin you just need to extract it in your plugins directory.');
+}
+echo '</p>';
+
+echo
+'<div class="multi-part" id="plugins" title="'.__('Plugins').'">';
+
+$p_available = $core->plugins->getModules();
+uasort($p_available,create_function('$a,$b','return strcasecmp($a["name"],$b["name"]);'));
+if (!empty($p_available)) 
+{
+	echo
+	'<h3>'.__('Activated plugins').'</h3>'.
+	'<div class="table-outer clear">'.
+	'<table class="plugins"><tr>'.
+	'<th>'.__('Plugin').'</th>'.
+	'<th class="nowrap">'.__('Version').'</th>'.
+	'<th class="nowrap">'.__('Details').'</th>'.
+	'<th class="nowrap">'.__('Action').'</th>'.
+	'</tr>';
+	
+	$distrib_plugins = array('aboutConfig','akismet','antispam','attachments','blogroll','blowupConfig','daInstaller',
+		'fairTrackbacks','importExport','maintenance','pages','pings','simpleMenu','tags','themeEditor','userPref','widgets');
+	$distrib_img = '<img src="images/dotclear_pw.png"'.
+		' alt="'.__('Plugin from official distribution').'" title="'.__('Plugin from official distribution').'" />';
+
+	foreach ($p_available as $k => $v)
+	{
+		$is_deletable = $is_writable && preg_match('!^'.$p_path_pat.'!',$v['root']);
+		$is_deactivable = $v['root_writable'];
+		$is_distrib = in_array($k, $distrib_plugins);
+		
 		echo
-		'</div>';
-	}
-}
-
-# List all active plugins
+		'<tr class="line wide">'.
+		'<td class="minimal nowrap"><strong>'.html::escapeHTML($k).'</strong></td>'.
+		'<td class="minimal">'.html::escapeHTML($v['version']).'</td>'.
+		'<td class="maximal'.($is_distrib ? ' distrib' : '').'"><strong>'.html::escapeHTML(__($v['name'])).'</strong> '.
+		'<br />'.html::escapeHTML(__($v['desc'])).($is_distrib ? ' '.$distrib_img : '').'</td>'.
+		'<td class="nowrap action">';
+		
+		if ($is_deletable || $is_deactivable)
+		{
+			echo
+			'<form action="plugins.php" method="post">'.
+			'<div>'.
+			$core->formNonce().
+			form::hidden(array('plugin_id'),html::escapeHTML($k)).
+			($is_deactivable ? '<input type="submit" name="deactivate" value="'.__('Deactivate').'" /> ' : '').
+			($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : '').
+			'</div>'.
+			'</form>';
+		}
+		
+		echo
+		'</td>'.
+		'</tr>';
+	}
+	echo
+	'</table></div>';
+}
+
+$p_disabled = $core->plugins->getDisabledModules();
+uksort($p_disabled,create_function('$a,$b','return strcasecmp($a,$b);'));
+if (!empty($p_disabled))
+{
+	echo
+	'<h3>'.__('Deactivated plugins').'</h3>'.
+	'<div class="clear table-outer">'.
+	'<table class="plugins"><tr>'.
+	'<th>'.__('Plugin').'</th>'.
+	'<th class="nowrap">'.__('Action').'</th>'.
+	'</tr>';
+	
+	foreach ($p_disabled as $k => $v)
+	{
+		$is_deletable = $is_writable && preg_match('!^'.$p_path_pat.'!',$v['root']);
+		$is_activable = $v['root_writable'];
+		
+		echo
+		'<tr class="line wide">'.
+		'<td class="maximal nowrap"><strong>'.html::escapeHTML($k).'</strong></td>'.
+		'<td class="nowrap action">';
+		
+		if ($is_deletable || $is_activable)
+		{
+			echo
+			'<form action="plugins.php" method="post">'.
+			'<div>'.
+			$core->formNonce().
+			form::hidden(array('plugin_id'),html::escapeHTML($k)).
+			form::hidden(array('deactivated'),1).
+			($is_activable ? '<input type="submit" name="activate" value="'.__('Activate').'" /> ' : '').
+			($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : '').
+			'</div>'.
+			'</form>';
+		}
+		
+		echo
+		'</td>'.
+		'</tr>';
+	}
+	echo
+	'</table></div>';
+}
+
+echo '</div>';
+
+# Add a new plugin
 echo
-'<div class="multi-part" id="plugins" title="'.__('Installed plugins').'">';
-
-$modules = $core->plugins->getModules();
-if (!empty($modules)) {
-
-	echo
-	'<h3>'.__('Activated plugins').'</h3>'.
-	'<p>'.__('You can manage installed plugins from this list.').'</p>';
-
-	$list
-		->setModules($modules)
-		->setPageTab('plugins')
-		->displayModulesList(
-			/* cols */		array('icon', 'name', 'config', 'version', 'desc', 'distrib'),
-			/* actions */	array('deactivate', 'delete')
-		);
-}
-
-# Deactivated modules
-$modules = $core->plugins->getDisabledModules();
-if (!empty($modules)) {
-
-	echo
-	'<h3>'.__('Deactivated plugins').'</h3>'.
-	'<p>'.__('Deactivated plugins are installed but not usable. You can activate them from here.').'</p>';
-
-	$list
-		->setModules($modules)
-		->setPageTab('plugins')
-		->displayModulesList(
-			/* cols */		array('icon', 'name', 'distrib'),
-			/* actions */	array('activate', 'delete')
-		);
-}
-
-echo 
-'</div>';
-
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
-	# New modules from repo
-	$search = $list->getSearchQuery();
-	$modules = $search ? $repository->search($search) : $repository->get();
-
-	echo
-	'<div class="multi-part" id="new" title="'.__('Add plugins').'">'.
-	'<h3>'.__('Add plugins').'</h3>'.
-	'<p>'.sprintf(
-		__("You can install plugins directly from %s repository."),
-		'<a title="'.__('Visit Dotaddict').'" href="http://dotaddict.org/dc2/plugins">dotaddict.org</a>'
-	).'</p>';
-
-	$list
-		->setModules($modules)
-		->setPageTab('new')
-		->displaySearchForm()
-		->displayNavMenu()
-		->displayModulesList(
-			/* cols */		array('name', 'version', 'desc'),
-			/* actions */	array('install'),
-			/* nav limit */	true
-		);
-
-	echo
-	'</div>';
-
-	# Add a new plugin
-	echo
-	'<div class="multi-part" id="addplugin" title="'.__('Install or upgrade a plugin').'">';
-
+'<div class="multi-part" id="addplugin" title="'.__('Install or upgrade a plugin').'">';
+
+if ($is_writable)
+{
 	echo '<p>'.__('You can install plugins by uploading or downloading zip files.').'</p>';
 	
@@ -244,5 +357,5 @@
 	echo
 	'<form method="post" action="plugins.php" id="uploadpkg" enctype="multipart/form-data" class="fieldset">'.
-	'<h4>'.__('Upload a zip file').'</h4>'.
+	'<h3>'.__('Upload a zip file').'</h3>'.
 	'<p class="field"><label for="pkg_file" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Plugin zip file:').'</label> '.
 	'<input type="file" id="pkg_file" name="pkg_file" /></p>'.
@@ -257,5 +370,5 @@
 	echo
 	'<form method="post" action="plugins.php" id="fetchpkg" class="fieldset">'.
-	'<h4>'.__('Download a zip file').'</h4>'.
+	'<h3>'.__('Download a zip file').'</h3>'.
 	'<p class="field"><label for="pkg_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Plugin zip file URL:').'</label> '.
 	form::field(array('pkg_url','pkg_url'),40,255).'</p>'.
@@ -265,17 +378,16 @@
 	$core->formNonce().'</p>'.
 	'</form>';
-
-	echo
-	'</div>';
-}
+}
+else
+{
+	echo
+	'<p class="static-msg">'.
+	__('To enable this function, please give write access to your plugins directory.').
+	'</p>';
+}
+echo '</div>';
 
 # --BEHAVIOR-- pluginsToolsTabs
-$core->callBehavior('pluginsToolsTabs', $core);
-
-# -- Notice for super admin --
-if ($core->auth->isSuperAdmin() && !$list->isPathWritable()) {
-	echo 
-	'<p class="warning">'.__('Some functions are disabled, please give write access to your plugins directory to enable them.').'</p>';
-}
+$core->callBehavior('pluginsToolsTabs',$core);
 
 dcPage::close();
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 2021)
+++ admin/preferences.php	(revision 2152)
@@ -543,5 +543,5 @@
 echo '<h3>'.__('My dashboard').'</h3>';
 
-echo '<form action="preferences.php" method="post" id="favs-form" class="two-boxes">';
+echo '<form action="preferences.php" method="post" id="favs-form" class="two-boxes odd">';
 
 echo '<div id="my-favs" class="fieldset"><h4>'.__('My favorites').'</h4>';
Index: admin/style/default.css
===================================================================
--- admin/style/default.css	(revision 2151)
+++ admin/style/default.css	(revision 2152)
@@ -149,51 +149,29 @@
 		}
 /* ------------------------------------------------- layout: optionnal one/two-boxes */
-.one-box, .two-boxes, .three-boxes, .box {
-	margin-bottom: 1em;
-	}
 .one-box {
 	text-align: justify;
 	}
+.two-boxes, .three-boxes, .box {
+	display: inline-block;
+	vertical-align: top;
+	margin: 0 1.5% 1em;
+	-moz-box-sizing: border-box; 
+	-webkit-box-sizing: border-box; 
+	box-sizing: border-box;	
+	}
 .two-boxes {
 	width: 47%;
-	display: inline-block;
-	vertical-align: top;
-	margin-right: 2%;
-	-moz-box-sizing: border-box; 
-	-webkit-box-sizing: border-box; 
-	box-sizing: border-box;
-	}
-	.two-boxes:first-child, .two-boxes.odd, .two-boxes.odd:last-child {
-		margin-right: 3%;
-		margin-left: 0;
-		}
-	.two-boxes.even:last-child, .two-boxes.even {
-		margin-left: 3%;
-		margin-right: 0;
-		}
+	}
 .three-boxes {
 	width: 30%;
-	display: inline-block;
-	vertical-align: top;
-	margin-left: 1.5%;
-	margin-right: 1.5%; 
-	-moz-box-sizing: border-box; 
-	-webkit-box-sizing: border-box; 
-	box-sizing: border-box;
-	}
-	.three-boxes:first-child, .three-boxes.first-child {
-		margin-left: 0;
-		}
-	.three-boxes:last-child, .three-boxes.last-child {
-		margin-right: 0;
-		}
-/* boîtes intérieures distribuées horizontalement */
+	}
 .box {
-	display: inline-block;
-	vertical-align: top;
-	margin-right: 3%; 
-	text-align: left;
-	}
-.box:last-child {
+	margin-left: 0;
+	margin-right: 0;
+	}
+.odd {
+	margin-left: 0;
+	}
+.even {
 	margin-right: 0;
 	}
@@ -448,4 +426,7 @@
 h1 a:link, h1 a:visited {
 	border:	none;
+	}
+.discrete a {
+	color: #333;
 	}
 /* ----------------------------------------------------------------------------
@@ -1474,8 +1455,8 @@
 		}
 		.box.small {
-			width: 300px;
+			width: 320px;
 			}
 		.box.medium {
-			width: 640px;
+			width: 660px;
 			}
 		.box.large {
@@ -1969,11 +1950,8 @@
 	vertical-align: middle;
 	}
-.icon img {
-	width: 16px;
-	height: 16px;
-	}
 .distrib img {
 	display: block;
 	float: right;
+	margin-top: -1em;
 	}
 /* ---------------------------------------------------------- post.php, page.php */
@@ -2397,4 +2375,44 @@
 	display: block;
 	}
+/* ---------------------------------------------- Couleurs ajoutées via javascript	
+/* color-picker.js */
+.color-color-picker {
+	border: 1px solid #000;
+	width: 195px;
+	background: #fff;
+	}
+/* _blog_theme.js */
+.select-button {
+	font-weight: bold;
+	}
+/* _media_item.js */
+.color-div {
+	border: 1px solid #ccc;
+	}
+/* fadings ('color' est utilisé comme variable, pas comme text color) */
+.colorBeginPassword, .colorBeginValidatorErr, .colorBeginUserMail {
+	color: #fff;
+	}
+.colorEndPassword, .colorEndError, .colorEndValidatorErr, .colorEndUserMail {
+	color: #ffbaba;
+	}
+.colorBeginMessage {
+	color: #ccc;
+	}
+.colorEndMessage, .colorBeginValidatorMsg {
+	color: #676e78;
+	}
+.colorBeginError {
+	color: #ffdec8;
+	}
+.colorBeginSuccess {
+	color: #9BCA1C;
+	}
+.colorEndSuccess {
+	color: #bee74b;
+	}
+ .colorEndValidatorMsg {
+	color: #ffcc00;
+	}
 /* ------------------------------------------------------------------------------------
 															UN POIL DE MEDIA QUERIES
@@ -2436,8 +2454,11 @@
 	#top-info-user a.active {
 		padding: 2px 8px;
+		background: #999;
+		color: #FFF;
+		border-width: 0;
+		-webkit-border-radius: 6px;
+		        border-radius: 6px;
 		} 
 	.three-boxes, .three-boxes .box,
-	.three-boxes:first-child, .three-boxes.first-child,
-	.three-boxes:last-child, .three-boxes.last-child,
 	.two-cols .col70, .two-cols .col30 {
 		width: 100%;
@@ -2460,8 +2481,5 @@
 		top: 77px;
 		}
-	.one-box, .two-boxes,
-	.one-box .box, .two-boxes .box, .two-boxes.odd, .two-boxes.even,
-	.two-boxes:first-child, .two-boxes.odd, .two-boxes.odd:last-child,
-	.two-boxes.even:last-child, .two-boxes.even,
+	.one-box, .two-boxes, .two-boxes.odd, .two-boxes.even, .box,
 	.two-cols .col {
 		width: 100%;
@@ -2496,5 +2514,5 @@
 		display: inline;
 		}
-	#content {
+	#content, .hide-mm #content {
 		margin: 0;
 		padding: 0 .5em !important;
@@ -2505,14 +2523,14 @@
 	#main #content > h2 {
 		margin: 0;
-		padding: 6px 0;
+		padding: 6px 30px 6px 0;
 		}
 	#dashboard-boxes .box.medium,
 	#dashboard-boxes .box.small,
 	#dashboard-boxes .box.large {
-		width: 90%;
+		width: 100%;
 		margin: 10px auto;
 		}
 	}
-@media screen and (max-width: 500px) {
+@media screen and (max-width: 420px) {
 	h1, h1 a {
 		padding: 0;
@@ -2522,10 +2540,10 @@
 		display: none;
 		}
+	#top-info-blog {
+		margin-bottom: .5em;
+		max-width: 75%;
+		}
 	#top-info-blog select {
 		margin-bottom: .5em;
-		margin-right: 0 !important;
-		}
-	#top-info-blog p {
-		display: block;
 		}
 	#icons p {
@@ -2536,42 +2554,2 @@
 		}
 	}
-/* ---------------------------------------------- Couleurs ajoutées via javascript	
-/* color-picker.js */
-.color-color-picker {
-	border: 1px solid #000;
-	width: 195px;
-	background: #fff;
-	}
-/* _blog_theme.js */
-.select-button {
-	font-weight: bold;
-	}
-/* _media_item.js */
-.color-div {
-	border: 1px solid #ccc;
-	}
-/* fadings ('color' est utilisé comme variable, pas comme text color) */
-.colorBeginPassword, .colorBeginValidatorErr, .colorBeginUserMail {
-	color: #fff;
-	}
-.colorEndPassword, .colorEndError, .colorEndValidatorErr, .colorEndUserMail {
-	color: #ffbaba;
-	}
-.colorBeginMessage {
-	color: #ccc;
-	}
-.colorEndMessage, .colorBeginValidatorMsg {
-	color: #676e78;
-	}
-.colorBeginError {
-	color: #ffdec8;
-	}
-.colorBeginSuccess {
-	color: #9BCA1C;
-	}
-.colorEndSuccess {
-	color: #bee74b;
-	}
- .colorEndValidatorMsg {
-	color: #ffcc00;
-	}
Index: nc/admin/lib.moduleslist.php
===================================================================
--- inc/admin/lib.moduleslist.php	(revision 2149)
+++ 	(revision )
@@ -1,644 +1,0 @@
-<?php
-
-class adminModulesList
-{
-	public $core;
-	public $modules;
-
-	public static  $allow_multi_install;
-
-	protected $path = false;
-	protected $path_writable = false;
-	protected $path_pattern = false;
-
-	protected $page_url = 'plugins.php';
-	protected $page_qs = '?';
-	protected $page_tab = '';
-
-	public static $nav_indexes = 'abcdefghijklmnopqrstuvwxyz0123456789';
-	protected $nav_list = array();
-	protected $nav_special = 'other';
-
-	protected $sort_field = 'sname';
-	protected $sort_asc = true;
-
-	public function __construct($core, $root, $allow_multi_install=false)
-	{
-		$this->core = $core;
-		self::$allow_multi_install = (boolean) $allow_multi_install;
-		$this->setPathInfo($root);
-		$this->setNavSpecial(__('other'));
-
-		$this->init();
-	}
-
-	protected function init()
-	{
-		return null;
-	}
-
-	protected function setPathInfo($root)
-	{
-		$paths = explode(PATH_SEPARATOR, $root);
-		$path = array_pop($paths);
-		unset($paths);
-
-		$this->path = $path;
-		if (is_dir($path) && is_writeable($path)) {
-			$this->path_writable = true;
-			$this->path_pattern = preg_quote($path,'!');
-		}
-
-		return $this;
-	}
-
-	public function getPath()
-	{
-		return $this->path;
-	}
-
-	public function isPathWritable()
-	{
-		return $this->path_writable;
-	}
-
-	public function isPathDeletable($root)
-	{
-		return $this->path_writable 
-			&& preg_match('!^'.$this->path_pattern.'!', $root) 
-			&& $this->core->auth->isSuperAdmin();
-	}
-
-	public function setPageURL($url)
-	{
-		$this->page_qs = strpos('?', $url) ? '&' : '?';
-		$this->page_url = $url;
-
-		return $this;
-	}
-
-	public function getPageURL($queries='', $with_tab=true)
-	{
-		return $this->page_url.
-			(!empty($queries) ? $this->page_qs : '').
-			(is_array($queries) ? http_build_query($queries) : $queries).
-			($with_tab && !empty($this->page_tab) ? '#'.$this->page_tab : '');
-	}
-
-	public function setPageTab($tab)
-	{
-		$this->page_tab = $tab;
-
-		return $this;
-	}
-
-	public function getPageTab()
-	{
-		return $this->page_tab;
-	}
-
-	public function getSearchQuery()
-	{
-		$query = !empty($_REQUEST['m_search']) ? trim($_REQUEST['m_search']) : null;
-		return strlen($query) > 1 ? $query : null;
-	}
-
-	public function displaySearchForm()
-	{
-		if (empty($this->modules)) {
-			return $this;
-		}
-
-		$query = $this->getSearchQuery();
-
-		echo 
-		'<div class="box">'.
-		'<form action="'.$this->getPageURL().'" method="get">'.
-		'<p><label for="m_search" class="classic">'.__('Search:').'&nbsp;</label><br />'.
-		form::field(array('m_search'), 30, 255, html::escapeHTML($query)).
-		'<input type="submit" value="'.__('Search').'" /> '.
-		'</p>';
-
-		if ($query) {
-			echo 
-			'<p class="info">'.sprintf(
-				__('Found %d result for search "%s".', 'Found %d results for search "%s".', count($this->modules)), 
-				count($this->modules), html::escapeHTML($query)
-			).' <a href="'.$this->getPageURL().'">'.__('Reset search').'</a>'.
-			'</p>';
-		}
-
-		echo 
-		'</form>'.
-		'</div>';
-
-		return $this;
-	}
-
-	public function setNavSpecial($str)
-	{
-		$this->nav_special = (string) $str;
-		$this->nav_list = array_merge(str_split(self::$nav_indexes), array($this->nav_special));
-
-		return $this;
-	}
-
-	public function getNavQuery()
-	{
-		return isset($_REQUEST['m_nav']) && in_array($_REQUEST['m_nav'], $this->nav_list) ? $_REQUEST['m_nav'] : $this->nav_list[0];
-	}
-
-	public function displayNavMenu()
-	{
-		if (empty($this->modules) || $this->getSearchQuery() !== null) {
-			return $this;
-		}
-
-		# Fetch modules required field
-		$indexes = array();
-		foreach ($this->modules as $id => $module) {
-			if (!isset($module[$this->sort_field])) {
-				continue;
-			}
-			$char = substr($module[$this->sort_field], 0, 1);
-			if (!in_array($char, $this->nav_list)) {
-				$char = $this->nav_special;
-			}
-			if (!isset($indexes[$char])) {
-				$indexes[$char] = 0;
-			}
-			$indexes[$char]++;
-		}
-
-		$buttons = array();
-		foreach($this->nav_list as $char) {
-			# Selected letter
-			if ($this->getNavQuery() == $char) {
-				$buttons[] = '<li class="active" title="'.__('current selection').'"><strong> '.$char.' </strong></li>';
-			}
-			# Letter having modules
-			elseif (!empty($indexes[$char])) {
-				$title = sprintf(__('%d module', '%d modules', $indexes[$char]), $indexes[$char]);
-				$buttons[] = '<li class="btn" title="'.$title.'"><a href="'.$this->getPageURL('m_nav='.$char).'" title="'.$title.'"> '.$char.' </a></li>';
-			}
-			# Letter without modules
-			else {
-				$buttons[] = '<li class="btn no-link" title="'.__('no module').'"> '.$char.' </li>';
-			}
-		}
-		# Parse navigation menu
-		echo '<div class="pager">'.__('Index:').' <ul>'.implode('',$buttons).'</ul></div>';
-
-		return $this;
-	}
-
-	public function setSortField($field, $asc=true)
-	{
-		$this->sort_field = $field;
-		$this->sort_asc = (boolean) $asc;
-
-		return $this;
-	}
-
-	public function getSortQuery()
-	{
-		return !empty($_REQUEST['m_sort']) ? $_REQUEST['m_sort'] : $this->sort_field;
-	}
-
-	public function displaySortForm()
-	{
-		//not yet implemented
-	}
-
-	public function displayMessage($action)
-	{
-		switch($action) {
-			case 'activate': 
-				$str = __('Module successfully activated.'); break;
-			case 'deactivate': 
-				$str = __('Module successfully deactivated.'); break;
-			case 'delete': 
-				$str = __('Module successfully deleted.'); break;
-			case 'install': 
-				$str = __('Module successfully installed.'); break;
-			case 'update': 
-				$str = __('Module successfully updated.'); break;
-			default:
-				$str = ''; break;
-		}
-		if (!empty($str)) {
-			dcPage::success($str);
-		}
-	}
-
-	public function setModules($modules)
-	{
-		$this->modules = array();
-		foreach($modules as $id => $module) {
-			$this->modules[$id] = $this->setModuleInfo($id, $module);
-		}
-
-		return $this;
-	}
-
-	public function getModules()
-	{
-		return $this->modules;
-	}
-
-	protected function setModuleInfo($id, $module)
-	{
-		$label = empty($module['label']) ? $id : $module['label'];
-		$name = __(empty($module['name']) ? $label : $module['name']);
-		
-		return array_merge(
-			# Default values
-			array(
-				'desc' 				=> '',
-				'author' 			=> '',
-				'version' 			=> 0,
-				'current_version' 	=> 0,
-				'root' 				=> '',
-				'root_writable' 	=> false,
-				'permissions' 		=> null,
-				'parent' 			=> null,
-				'priority' 			=> 1000,
-				'standalone_config' => false
-			),
-			# Module's values
-			$module,
-			# Clean up values
-			array(
-				'id' 				=> $id,
-				'sid' 				=> self::sanitizeString($id),
-				'label' 			=> $label,
-				'name' 				=> $name,
-				'sname' 			=> self::sanitizeString($name)
-			)
-		);
-	}
-
-	public static function isDistributedModule($module)
-	{
-		return in_array($module, array(
-			'aboutConfig',
-			'akismet',
-			'antispam',
-			'attachments',
-			'blogroll',
-			'blowupConfig',
-			'daInstaller',
-			'fairTrackbacks',
-			'importExport',
-			'maintenance',
-			'pages',
-			'pings',
-			'simpleMenu',
-			'tags',
-			'themeEditor',
-			'userPref',
-			'widgets'
-		));
-	}
-
-	public static function sortModules($modules, $field, $asc=true)
-	{
-		$sorter = array();
-		foreach($modules as $id => $module) {
-			$sorter[$id] = isset($module[$field]) ? $module[$field] : $field;
-		}
-		array_multisort($sorter, $asc ? SORT_ASC : SORT_DESC, $modules);
-
-		return $modules;
-	}
-
-	public function displayModulesList($cols=array('name', 'config', 'version', 'desc'), $actions=array(), $nav_limit=false)
-	{
-		echo 
-		'<div class="table-outer">'.
-		'<table class="modules"><caption class="hidden">'.html::escapeHTML(__('Modules list')).'</caption><tr>';
-/*
-		if ($this->getSearchQuery() !== null) {
-			echo 
-			'<th class="nowrap">'.__('Accuracy').'</th>';
-		}
-//*/
-		if (in_array('name', $cols)) {
-			echo 
-			'<th class="first nowrap"'.(in_array('icon', $cols) ? ' colspan="2"' : '').'>'.__('Name').'</th>';
-		}
-
-		if (in_array('version', $cols)) {
-			echo 
-			'<th class="nowrap count" scope="col">'.__('Version').'</th>';
-		}
-
-		if (in_array('current_version', $cols)) {
-			echo 
-			'<th class="nowrap count" scope="col">'.__('Current version').'</th>';
-		}
-
-		if (in_array('desc', $cols)) {
-			echo 
-			'<th class="nowrap" scope="col">'.__('Details').'</th>';
-		}
-
-		if (in_array('distrib', $cols)) {
-			echo '<th'.(in_array('desc', $cols) ? '' : ' class="maximal"').'></th>';
-		}
-
-		if (!empty($actions) && $this->core->auth->isSuperAdmin()) {
-			echo 
-			'<th class="minimal nowrap">'.__('Action').'</th>';
-		}
-
-		echo 
-		'</tr>';
-
-		$sort_field = $this->getSortQuery();
-
-		# Sort modules by id
-		$modules = $this->getSearchQuery() === null ?
-			self::sortModules($this->modules, $sort_field, $this->sort_asc) :
-			$this->modules;
-
-		$count = 0;
-		foreach ($modules as $id => $module)
-		{
-			# Show only requested modules
-			if ($nav_limit && $this->getSearchQuery() === null) {
-				$char = substr($module[$sort_field], 0, 1);
-				if (!in_array($char, $this->nav_list)) {
-					$char = $this->nav_special;
-				}
-				if ($this->getNavQuery() != $char) {
-					continue;
-				}
-			}
-
-			echo 
-			'<tr class="line" id="'.$this->getPageTab().'_p_'.html::escapeHTML($id).'">';
-
-			if (in_array('icon', $cols)) {
-				echo 
-				'<td class="nowrap icon">'.sprintf(
-					'<img alt="%1$s" title="%1$s" src="%2$s" />', 
-					html::escapeHTML($id), file_exists($module['root'].'/icon.png') ? 'index.php?pf='.$id.'/icon.png' : 'images/favicon.png'
-				).'</td>';
-			}
-/*
-			if ($this->getSearchQuery() !== null) {
-				echo 
-				'<td class="nowrap count">'.$module['accuracy'].'</td>';
-			}
-//*/
-			# Link to config file
-			$config = in_array('config', $cols) && !empty($module['root']) && file_exists(path::real($module['root'].'/_config.php'));
-
-			echo 
-			'<td class="nowrap" scope="row">'.($config ? 
-				'<a href="'.$this->getPageURL('module='.$id.'&conf=1').'">'.html::escapeHTML($module['name']).'</a>' : 
-				html::escapeHTML($module['name'])
-			).'</td>';
-
-			if (in_array('version', $cols)) {
-				echo 
-				'<td class="nowrap count">'.html::escapeHTML($module['version']).'</td>';
-			}
-
-			if (in_array('current_version', $cols)) {
-				echo 
-				'<td class="nowrap count">'.html::escapeHTML($module['current_version']).'</td>';
-			}
-
-			if (in_array('desc', $cols)) {
-				echo 
-				'<td class="maximal">'.html::escapeHTML($module['desc']).'</td>';
-			}
-
-			if (in_array('distrib', $cols)) {
-				echo 
-				'<td class="distrib">'.(self::isDistributedModule($id) ? 
-					'<img src="images/dotclear_pw.png" alt="'.
-					__('Module from official distribution').'" title="'.
-					__('module from official distribution').'" />' 
-				: '').'</td>';
-			}
-
-			if (!empty($actions) && $this->core->auth->isSuperAdmin()) {
-				echo 
-				'<td class="nowrap">';
-
-				$this->displayInlineActions($id, $module, $actions);
-
-				echo
-				'</td>';
-			}
-
-			echo 
-			'</tr>';
-
-			$count++;
-		}
-		echo 
-		'</table></div>';
-
-		if(!$count) {
-			echo 
-			'<p>'.__('There is no module.').'</p>';
-		}
-	}
-
-	protected function displayInlineActions($id, $module, $actions)
-	{
-		$submits = array();
-
-		# Activate
-		if (in_array('deactivate', $actions) && $module['root_writable']) {
-			$submits[] = '<input type="submit" name="deactivate" value="'.__('Deactivate').'" />';
-		}
-
-		# Deactivate
-		if (in_array('activate', $actions) && $module['root_writable']) {
-			$submits[] = '<input type="submit" name="activate" value="'.__('Activate').'" />';
-		}
-
-		# Delete
-		if (in_array('delete', $actions) && $this->isPathDeletable($module['root'])) {
-			$submits[] = '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" />';
-		}
-
-		# Install (form repository)
-		if (in_array('install', $actions) && $this->path_writable) {
-			$submits[] = '<input type="submit" name="install" value="'.__('Install').'" />';
-		}
-
-		# Update (from repository)
-		if (in_array('update', $actions) && $this->path_writable) {
-			$submits[] = '<input type="submit" name="update" value="'.__('Update').'" />';
-		}
-
-		# Parse form
-		if (!empty($submits)) {
-			echo 
-			'<form action="'.$this->getPageURL().'" method="post">'.
-			'<div>'.
-			$this->core->formNonce().
-			form::hidden(array('module'), html::escapeHTML($id)).
-			form::hidden(array('tab'), $this->page_tab).
-			implode(' ', $submits).
-			'</div>'.
-			'</form>';
-		}
-	}
-
-	public function executeAction($prefix, dcModules $modules, dcRepository $repository)
-	{
-		if (empty($_POST['module'])	|| !$this->core->auth->isSuperAdmin() || !$this->isPathWritable()) {
-			return null;
-		}
-
-		$id = $_POST['module'];
-
-		if (!empty($_POST['activate'])) {
-
-			$enabled = $modules->getDisabledModules();
-			if (!isset($enabled[$id])) {
-				throw new Exception(__('No such module.'));
-			}
-
-			# --BEHAVIOR-- moduleBeforeActivate
-			$this->core->callBehavior($type.'BeforeActivate', $id);
-
-			$modules->activateModule($id);
-
-			# --BEHAVIOR-- moduleAfterActivate
-			$this->core->callBehavior($type.'AfterActivate', $id);
-
-			http::redirect($this->getPageURL('msg=activate'));
-		}
-
-		if (!empty($_POST['deactivate'])) {
-
-			if (!$modules->moduleExists($id)) {
-				throw new Exception(__('No such module.'));
-			}
-
-			$module = $modules->getModules($id);
-			$module['id'] = $id;
-
-			if (!$module['root_writable']) {
-				throw new Exception(__('You don\'t have permissions to deactivate this module.'));
-			}
-
-			# --BEHAVIOR-- moduleBeforeDeactivate
-			$this->core->callBehavior($prefix.'BeforeDeactivate', $module);
-
-			$modules->deactivateModule($id);
-
-			# --BEHAVIOR-- moduleAfterDeactivate
-			$this->core->callBehavior($prefix.'AfterDeactivate', $module);
-
-			http::redirect($this->getPageURL('msg=deactivate'));
-		}
-
-		if (!empty($_POST['delete'])) {
-
-			$disabled = $modules->getDisabledModules();
-			if (!isset($disabled[$id])) {
-
-				if (!$modules->moduleExists($id)) {
-					throw new Exception(__('No such module.'));
-				}
-
-				$module = $modules->getModules($id);
-				$module['id'] = $id;
-
-				if (!$this->isPathDeletable($module['root'])) {
-					throw new Exception(__("You don't have permissions to delete this module."));
-				}
-
-				# --BEHAVIOR-- moduleBeforeDelete
-				$this->core->callBehavior($prefix.'BeforeDelete', $module);
-
-				$modules->deleteModule($id);
-
-				# --BEHAVIOR-- moduleAfterDelete
-				$this->core->callBehavior($prefix.'AfterDelete', $module);
-			}
-			else {
-				$modules->deleteModule($id, true);
-			}
-
-			http::redirect($this->getPageURL('msg=delete'));
-		}
-
-		if (!empty($_POST['update'])) {
-
-			$updated = $repository->get();
-			if (!isset($updated[$id])) {
-				throw new Exception(__('No such module.'));
-			}
-
-			if (!$modules->moduleExists($id)) {
-				throw new Exception(__('No such module.'));
-			}
-
-			$module = $updated[$id];
-			$module['id'] = $id;
-		
-			if (!self::$allow_multi_install) {
-				$dest = $module['root'].'/../'.basename($module['file']);
-			}
-			else {
-				$dest = $this->getPath().'/'.basename($module['file']);
-				if ($module['root'] != $dest) {
-					@file_put_contents($module['root'].'/_disabled', '');
-				}
-			}
-
-			# --BEHAVIOR-- moduleBeforeUpdate
-			$this->core->callBehavior($type.'BeforeUpdate', $module);
-
-			$repository->process($module['file'], $dest);
-
-			# --BEHAVIOR-- moduleAfterUpdate
-			$this->core->callBehavior($type.'AfterUpdate', $module);
-
-			http::redirect($this->getPageURL('msg=upadte'));
-		}
-
-		if (!empty($_POST['install'])) {
-
-			$updated = $repository->get();
-			if (!isset($updated[$id])) {
-				throw new Exception(__('No such module.'));
-			}
-
-			$module = $updated[$id];
-			$module['id'] = $id;
-
-			$dest = $this->getPath().'/'.basename($module['file']);
-
-			# --BEHAVIOR-- moduleBeforeAdd
-			$this->core->callBehavior($type.'BeforeAdd', $module);
-
-			$ret_code = $repository->process($module['file'], $dest);
-
-			# --BEHAVIOR-- moduleAfterAdd
-			$this->core->callBehavior($type.'AfterAdd', $module);
-
-			http::redirect($this->getPageURL('msg='.($ret_code == 2 ? 'update' : 'install')));
-		}
-	}
-
-	public static function sanitizeString($str)
-	{
-		return preg_replace('/[^A-Za-z0-9\@\#+_-]/', '', strtolower($str));
-	}
-}
-
-class adminThemesList extends adminModulesList
-{
-
-}
Index: inc/admin/lib.pager.php
===================================================================
--- inc/admin/lib.pager.php	(revision 2138)
+++ inc/admin/lib.pager.php	(revision 2152)
@@ -409,5 +409,5 @@
 			'<th scope="col">'.__('Date').'</th>'.
 			'<th scope="col" class="txt-center">'.__('Status').'</th>'.
-			'<th scope="col" abbr="entry">'.__('Entry title').'</th>'.
+			'<th scope="col" abbr="entry">'.__('Entry').'</th>'.
 			'</tr>%s</table></div>';
 
@@ -469,6 +469,6 @@
 		
 		$post_title = html::escapeHTML($this->rs->post_title);
-		if (mb_strlen($post_title) > 60) {
-			$post_title = mb_strcut($post_title,0,57).'...';
+		if (mb_strlen($post_title) > 70) {
+			$post_title = mb_strcut($post_title,0,67).'...';
 		}
 		$comment_title = sprintf(__('Edit the %1$s from %2$s'),
@@ -489,5 +489,5 @@
 		'<td class="nowrap count">'.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->comment_dt).'</td>'.
 		'<td class="nowrap status txt-center">'.$img_status.'</td>'.
-		'<td class="nowrap"><a href="'.$post_url.'">'.
+		'<td class="nowrap discrete"><a href="'.$post_url.'">'.
 		html::escapeHTML($post_title).'</a>'.
 		($this->rs->post_type != 'post' ? ' ('.html::escapeHTML($this->rs->post_type).')' : '').'</td>';
Index: nc/core/class.dc.repository.parser.php
===================================================================
--- inc/core/class.dc.repository.parser.php	(revision 2146)
+++ 	(revision )
@@ -1,91 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-if (!defined('DC_RC_PATH')) { return; }
-
-/**
-@ingroup DC_CORE
-@brief Rpeository modules feed parser
-
-Provides an object to parse feed of modules from repository.
-*/
-class dcRepositoryParser
-{
-	protected $xml;
-	protected $items;
-	protected static $bloc = 'http://dotaddict.org/da/';
-
-	public function __construct($data)
-	{
-		if (!is_string($data)) {
-			throw new Exception(__('Failed to read data feed'));
-		}
-
-		$this->xml = simplexml_load_string($data);
-		$this->items = array();
-
-		if ($this->xml === false) {
-			throw new Exception(__('Wrong data feed'));
-		}
-
-		$this->_parse();
-
-		unset($data);
-		unset($this->xml);
-	}
-
-	protected function _parse()
-	{
-		if (empty($this->xml->module)) {
-			return;
-		}
-
-		foreach ($this->xml->module as $i)
-		{
-			$attrs = $i->attributes();
-
-			$item = array();
-
-			# DC/DA shared markers
-			$item['id']		= (string) $attrs['id'];
-			$item['file']		= (string) $i->file;
-			$item['label']		= (string) $i->name; // deprecated
-			$item['name']		= (string) $i->name;
-			$item['version']	= (string) $i->version;
-			$item['author']	= (string) $i->author;
-			$item['desc']		= (string) $i->desc;
-
-			# DA specific markers
-			$item['dc_min'] 	= (string) $i->children(self::$bloc)->dcmin;
-			$item['details'] 	= (string) $i->children(self::$bloc)->details;
-			$item['section'] 	= (string) $i->children(self::$bloc)->section;
-			$item['support'] 	= (string) $i->children(self::$bloc)->support;
-			$item['sshot']		= (string) $i->children(self::$bloc)->sshot;
-			
-			$tags = array();
-			foreach($i->children(self::$bloc)->tags as $t)
-			{
-				$tags[] = (string) $t->tag;
-			}
-			$item['tags']		= implode(', ',$tags);
-			
-			# First filter right now
-			if (defined('DC_DEV') && DC_DEV === true || version_compare(DC_VERSION,$item['dc_min'],'>=')) {
-				$this->items[$item['id']] = $item;
-			}
-		}
-	}
-
-	public function getModules()
-	{
-		return $this->items;
-	}
-}
Index: nc/core/class.dc.repository.php
===================================================================
--- inc/core/class.dc.repository.php	(revision 2149)
+++ 	(revision )
@@ -1,156 +1,0 @@
-<?php
-
-class dcRepository
-{
-	public $core;
-	public $modules;
-
-	protected $xml_url;
-	protected $data;
-
-	public function __construct(dcModules $modules, $xml_url)
-	{
-		$this->core = $modules->core;
-		$this->modules = $modules;
-		$this->xml_url = $xml_url;
-	}
-
-	public function check($force=false)
-	{
-		if (!$this->xml_url) {
-			return false;
-		}
-		if (($parser = dcRepositoryReader::quickParse($this->xml_url, DC_TPL_CACHE, $force)) === false) {
-			return false;
-		}
-
-		$raw_datas = $parser->getModules();
-
-		uasort($raw_datas, array('self','sort'));
-
-		$skipped = array_keys($this->modules->getDisabledModules());
-		foreach ($skipped as $p_id) {
-			if (isset($raw_datas[$p_id])) {
-				unset($raw_datas[$p_id]);
-			}
-		}
-
-		$updates = array();
-		$current = $this->modules->getModules();
-		foreach ($current as $p_id => $p_infos) {
-			if (isset($raw_datas[$p_id])) {
-				if (self::compare($raw_datas[$p_id]['version'],$p_infos['version'],'>')) {
-					$updates[$p_id] = $raw_datas[$p_id];
-					$updates[$p_id]['root'] = $p_infos['root'];
-					$updates[$p_id]['root_writable'] = $p_infos['root_writable'];
-					$updates[$p_id]['current_version'] = $p_infos['version'];
-				}
-				unset($raw_datas[$p_id]);
-			}
-		}
-
-		$this->data = array(
-			'new'	=> $raw_datas,
-			'update'	=> $updates
-		);
-
-		return true;
-	}
-
-	public function get($update=false)
-	{
-		return $this->data[$update ? 'update' : 'new'];
-	}
-
-	public function search($pattern)
-	{
-		$result = array();
-
-		# Split query into small clean words
-		$patterns = explode(' ', $pattern);
-		array_walk($patterns, array('dcRepository','sanitize'));
-
-		# For each modules
-		foreach ($this->data['new'] as $id => $module) {
-
-			# Split modules infos into small clean word
-			$subjects = explode(' ', $id.' '.$module['name'].' '.$module['desc']);
-			array_walk($subjects, array('dcRepository','sanitize'));
-
-			# Check contents
-			if (!($nb = preg_match_all('/('.implode('|', $patterns).')/', implode(' ', $subjects)))) {
-				continue;
-			}
-
-			# Add module to result
-			if (!isset($sorter[$id])) {
-				$sorter[$id] = 0;
-				$result[$id] = $module;
-			}
-
-			# Increment matches count
-			$sorter[$id] += $nb;
-			$result[$id]['accuracy'] = $sorter[$id];
-		}
-		# Sort response by matches count
-		if (!empty($result)) {
-			array_multisort($sorter, SORT_DESC, $result);
-		}
-		return $result;
-	}
-
-	public function process($url, $dest)
-	{
-		$this->download($url, $dest);
-		return $this->install($dest);
-	}
-
-	public function download($url, $dest)
-	{
-		try {
-			$client = netHttp::initClient($url, $path);
-			$client->setUserAgent(self::agent());
-			$client->useGzip(false);
-			$client->setPersistReferers(false);
-			$client->setOutput($dest);
-			$client->get($path);
-			unset($client);
-		}
-		catch (Exception $e) {
-			unset($client);
-			throw new Exception(__('An error occurred while downloading the file.'));
-		}
-	}
-
-	public function install($path)
-	{
-		return dcModules::installPackage($path, $this->modules);
-	}
-
-	public static function agent()
-	{
-		return sprintf('Dotclear/%s)', DC_VERSION);
-	}
-
-	public static function sanitize(&$str, $_)
-	{
-		$str = strtolower(preg_replace('/[^A-Za-z0-9]/', '', $str));
-	}
-
-	private static function compare($v1,$v2,$op)
-	{
-		$v1 = preg_replace('!-r(\d+)$!','-p$1',$v1);
-		$v2 = preg_replace('!-r(\d+)$!','-p$1',$v2);
-		return version_compare($v1,$v2,$op);
-	}
-
-	private static function sort($a,$b)
-	{
-		$c = strtolower($a['id']); 
-		$d = strtolower($b['id']); 
-		if ($c == $d) { 
-			return 0; 
-		} 
-		return ($c < $d) ? -1 : 1; 
-	}
-}
Index: nc/core/class.dc.repository.reader.php
===================================================================
--- inc/core/class.dc.repository.reader.php	(revision 2146)
+++ 	(revision )
@@ -1,209 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-if (!defined('DC_RC_PATH')) { return; }
-
-/**
-@ingroup DC_CORE
-@brief Repository modules feed reader
-
-Provides an object to parse feed of modules from repository.
-*/
-class dcRepositoryReader extends netHttp
-{
-	protected $user_agent 		= 'DotClear.org RepoBrowser/0.1';
-	protected $timeout 			= 5;
-	protected $validators 		= null;				///< <b>array</b>	HTTP Cache validators
-	protected $cache_dir 		= null;				///< <b>string</b>	Cache temporary directory
-	protected $cache_file_prefix 	= 'dcrepo';			///< <b>string</b>	Cache file prefix
-	protected $cache_ttl 		= '-30 minutes';		///< <b>string</b>	Cache TTL
-	protected $cache_touch_on_fail = true;
-	protected $force			= false;
-
-	public function __construct()
-	{
-		parent::__construct('');
-		$this->setUserAgent(sprintf('Dotclear/%s)', DC_VERSION));
-	}
-
-	public function parse($url)
-	{
-		$this->validators = array();
-		if ($this->cache_dir)
-		{
-			return $this->withCache($url);
-		}
-		else
-		{
-			if (!$this->getModulesXML($url)) {
-				return false;
-			}
-
-			if ($this->getStatus() != '200') {
-				return false;
-			}
-
-			return new dcRepositoryParser($this->getContent());
-		}
-	}
-
-	public static function quickParse($url, $cache_dir=null, $force=false)
-	{
-		$parser = new self();
-		if ($cache_dir) {
-			$parser->setCacheDir($cache_dir);
-		}
-		if ($force) {
-			$parser->setForce($force);
-		}
-
-		return $parser->parse($url);
-	}
-
-	public function setCacheDir($dir)
-	{
-		$this->cache_dir = null;
-
-		if (!empty($dir) && is_dir($dir) && is_writeable($dir))
-		{
-			$this->cache_dir = $dir;
-			return true;
-		}
-
-		return false;
-	}
-
-	public function setCacheTTL($str)
-	{
-		$str = trim($str);
-		if (!empty($str))
-		{
-			if (substr($str, 0, 1) != '-') {
-				$str = '-'.$str;
-			}
-			$this->cache_ttl = $str;
-		}
-	}
-
-	public function setForce($force)
-	{
-		$this->force = $force;
-	}
-
-	protected function getModulesXML($url)
-	{
-		if (!self::readURL($url, $ssl, $host, $port, $path, $user, $pass)) {
-			return false;
-		}
-		$this->setHost($host, $port);
-		$this->useSSL($ssl);
-		$this->setAuthorization($user, $pass);
-
-		return $this->get($path);
-	}
-
-	protected function withCache($url)
-	{
-		$url_md5 = md5($url);
-		$cached_file = sprintf('%s/%s/%s/%s/%s.ser',
-			$this->cache_dir,
-			$this->cache_file_prefix,
-			substr($url_md5,0,2),
-			substr($url_md5,2,2),
-			$url_md5
-		);
-
-		$may_use_cached = false;
-
-		if (@file_exists($cached_file) && !$this->force)
-		{
-			$may_use_cached = true;
-			$ts = @filemtime($cached_file);
-			if ($ts > strtotime($this->cache_ttl))
-			{
-				# Direct cache
-				return unserialize(file_get_contents($cached_file));
-			}
-			$this->setValidator('IfModifiedSince', $ts);
-		}
-
-		if (!$this->getModulesXML($url))
-		{
-			if ($may_use_cached)
-			{
-				if ($this->cache_touch_on_fail) {
-					@files::touch($cached_file);
-				}
-				# connection failed - fetched from cache
-				return unserialize(file_get_contents($cached_file));
-			}
-			return false;
-		}
-
-		switch ($this->getStatus())
-		{
-			case '304':
-				@files::touch($cached_file);
-				return unserialize(file_get_contents($cached_file));
-			case '200':
-				if ($modules = new dcRepositoryParser($this->getContent()))
-				{
-					try {
-						files::makeDir(dirname($cached_file), true);
-					} catch (Exception $e) {
-						return $modules;
-					}
-
-					if (($fp = @fopen($cached_file, 'wb')))
-					{
-						fwrite($fp, serialize($modules));
-						fclose($fp);
-						files::inheritChmod($cached_file);
-					}
-					return $modules;
-				}
-		}
-
-		return false;
-	}
-
-	protected function buildRequest()
-	{
-		$headers = parent::buildRequest();
-
-		# Cache validators
-		if (!empty($this->validators))
-		{
-			if (isset($this->validators['IfModifiedSince'])) {
-				$headers[] = 'If-Modified-Since: '.$this->validators['IfModifiedSince'];
-			}
-			if (isset($this->validators['IfNoneMatch'])) {
-				if (is_array($this->validators['IfNoneMatch'])) {
-					$etags = implode(',', $this->validators['IfNoneMatch']);
-				} else {
-					$etags = $this->validators['IfNoneMatch'];
-				}
-				$headers[] = '';
-			}
-		}
-
-		return $headers;
-	}
-
-	private function setValidator($key, $value)
-	{
-		if ($key == 'IfModifiedSince') {
-			$value = gmdate('D, d M Y H:i:s', $value).' GMT';
-		}
-
-		$this->validators[$key] = $value;
-	}
-}
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 2147)
+++ inc/prepend.php	(revision 1999)
@@ -46,7 +46,4 @@
 $__autoload['dcWorkspace']			= dirname(__FILE__).'/core/class.dc.workspace.php';
 $__autoload['dcPrefs']				= dirname(__FILE__).'/core/class.dc.prefs.php';
-$__autoload['dcRepository']			= dirname(__FILE__).'/core/class.dc.repository.php';
-$__autoload['dcRepositoryReader']		= dirname(__FILE__).'/core/class.dc.repository.reader.php';
-$__autoload['dcRepositoryParser']		= dirname(__FILE__).'/core/class.dc.repository.parser.php';
 
 $__autoload['rsExtPost']				= dirname(__FILE__).'/core/class.dc.rs.extensions.php';
@@ -64,6 +61,4 @@
 $__autoload['dcPager']		= dirname(__FILE__).'/admin/lib.pager.php';
 $__autoload['dcAdminCombos']			= dirname(__FILE__).'/admin/lib.admincombos.php';
-$__autoload['adminModulesList']			= dirname(__FILE__).'/admin/lib.moduleslist.php';
-$__autoload['adminThemesList']			= dirname(__FILE__).'/admin/lib.moduleslist.php';
 
 $__autoload['dcTemplate']			= dirname(__FILE__).'/public/class.dc.template.php';
Index: plugins/tags/style.css
===================================================================
--- plugins/tags/style.css	(revision 2079)
+++ plugins/tags/style.css	(revision 2152)
@@ -10,10 +10,7 @@
 .tag90 { font-size: 220%; }
 .tag100 { font-size: 230%; }
-
 table.tags {
 	margin-left: 3em;
-}
-
-
+	}
 tr.tagLetter span {
 	font-size : 250%;
@@ -24,10 +21,9 @@
 	top: 0.80em;
 	left: -2ex;
-}
-
+	}
 ul.metaList {
 	margin: 0 0 1em 0;
 	padding: 0;
-}
+	}
 ul.metaList li {
 	margin: 0;
@@ -35,24 +31,22 @@
 	list-style: square;
 	list-style-position: inside;
-}
-
+	}
 a.metaRemove {
 	color : #999 !important;
 	border: none;
-}
+	}
 a.metaRemove:hover, a.metaRemove:focus {
 	color : #06c !important;
-}
-
+	}
 .addMeta a {
 	border: none;
-}
+	}
 .addMeta a:hover, .addMeta a:focus {
 	background: #fc0;
 	color: #000;
-}
+	}
 .addMeta a.metaGetMore {
 	font-weight: bold;
-}
+	}
 /* Auto Complete */
 .ac_results {
@@ -62,5 +56,5 @@
 	overflow: hidden;
 	z-index: 99999;
-}
+	}
 .ac_results ul {
 	width: 100%;
@@ -69,5 +63,5 @@
 	padding: 0;
 	margin: 0;
-}
+	}
 .ac_results li {
 	margin: 0px;
@@ -88,27 +82,23 @@
 	line-height: 16px;
 	overflow: hidden;
-}
+	}
 .ac_loading {
 	background: transparent url('index.php?pf=tags/img/loader.gif') right center no-repeat;
-}
+	}
 .ac_odd {
 	background-color: #eee;
-}
+	}
 .ac_over {
 	background-color: #06c;
 	color: white;
-}
-#post_meta_input {
-    margin: 0 0.5em 0 0;
-    width: 13em;
-}
+	}
 #post_meta_input:focus {
 	-moz-box-sizing: content-box;
-}
-#tags-edit input[type=button] {
-	width: 3.5em;
-}
+	}
+#tags-edit input[type=text] {
+	width: 11.5em;
+	}
 .tag-actions form {
 	display: inline-block;
 	margin-right: 1.5em;
-}
+	}
