Index: .hgignore
===================================================================
--- .hgignore	(revision 14)
+++ .hgignore	(revision 304)
@@ -2,2 +2,5 @@
 inc/config.php
 \.htaccess
+public/filters
+themes/ductile/_work
+themes/ductile-work
Index: .hgsubstate
===================================================================
--- .hgsubstate	(revision 270)
+++ .hgsubstate	(revision 319)
@@ -1,1 +1,1 @@
-116601670d66e706e0759dfb3889efd4eb576f34 inc/libs/clearbricks
+1cc382ff3769ffada45081fb878a28ed6d2f5f9f inc/libs/clearbricks
Index: CHANGELOG
===================================================================
--- CHANGELOG	(revision 332)
+++ CHANGELOG	(revision 278)
@@ -1,9 +1,2 @@
-Dotclear 2.3.1 - ongoing dev
-===========================================================
-* Updated makefile for cleaner distrib.
-* Better localization handling for prefs and shortcuts.
-* Misc JS & CSS cleaning.
-* Import/Export preferences-related bugfix.
-
 Dotclear 2.3.0 - 2011-05-16
 ===========================================================
Index: Makefile
===================================================================
--- Makefile	(revision 290)
+++ Makefile	(revision 285)
@@ -50,8 +50,4 @@
 	find ./$(DIST)/ -type d -name '.svn' -print0 | xargs -0 rm -rf
 	
-	## Remove .hg* files and folders
-	find ./$(DIST)/ -type d -name '.hg*' | xargs rm -rf
-	find ./$(DIST)/ -type f -name '.hg*' | xargs rm -rf
-
 	## "Compile" .po files
 	./build-tools/make-l10n.php ./$(DC)/
Index: admin/auth.php
===================================================================
--- admin/auth.php	(revision 366)
+++ admin/auth.php	(revision 270)
@@ -22,6 +22,5 @@
 # That's a tricky hack but it works ;)
 $dlang = http::getAcceptLanguage();
-$dlang = ($dlang == '' ? 'en' : $dlang);
-if ($dlang != 'en' && preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$dlang))
+if ($dlang != 'en')
 {
 	l10n::set(dirname(__FILE__).'/../locales/'.$dlang.'/main');
@@ -90,5 +89,5 @@
 		$page_url.'?akey='.$recover_key;
 		
-		$headers[] = 'From: '.(defined('DC_ADMIN_MAILFROM') && DC_ADMIN_MAILFROM ? DC_ADMIN_MAILFROM : 'dotclear@local');
+		$headers[] = 'From: dotclear@'.$_SERVER['HTTP_HOST'];
 		$headers[] = 'Content-Type: text/plain; charset=UTF-8;';
 		
@@ -126,35 +125,22 @@
 }
 # Change password and retry to log
-elseif ($change_pwd)
-{
+elseif ($change_pwd and $data = unserialize(base64_decode($_POST['login_data'])))
+{
+	# Check login informations
+	$check_user = false;
+	if (isset($data['cookie_admin']) && strlen($data['cookie_admin']) == 104)
+	{
+		$user_id = substr($data['cookie_admin'],40);
+		$user_id = @unpack('a32',@pack('H*',$user_id));
+		if (is_array($user_id))
+		{
+			$user_id = $user_id[1];
+			$user_key = substr($data['cookie_admin'],0,40);
+			$check_user = $core->auth->checkUser($user_id,null,$user_key) === true;
+		}
+	}
+	
 	try
 	{
-		$tmp_data = explode('/',$_POST['login_data']);
-		if (count($tmp_data) != 3) {
-			throw new Exception();
-		}
-		$data = array(
-			'user_id'=>base64_decode($tmp_data[0]),
-			'cookie_admin'=>$tmp_data[1],
-			'user_remember'=>$tmp_data[2]=='1'
-		);
-		if ($data['user_id'] === false) {
-			throw new Exception();
-		}
-		
-		# Check login informations
-		$check_user = false;
-		if (isset($data['cookie_admin']) && strlen($data['cookie_admin']) == 104)
-		{
-			$user_id = substr($data['cookie_admin'],40);
-			$user_id = @unpack('a32',@pack('H*',$user_id));
-			if (is_array($user_id))
-			{
-				$user_id = $user_id[1];
-				$user_key = substr($data['cookie_admin'],0,40);
-				$check_user = $core->auth->checkUser($user_id,null,$user_key) === true;
-			}
-		}
-	
 		if (!$core->auth->allowPassChange() || !$check_user) {
 			$change_pwd = false;
@@ -179,5 +165,9 @@
 		$_SESSION['sess_browser_uid'] = http::browserUID(DC_MASTER_KEY);
 		
-		if ($data['user_remember'])
+		if (!empty($data['blog_id'])) {
+			$_SESSION['sess_blog_id'] = $data['blog_id'];
+		}
+		
+		if (!empty($data['user_remember']))
 		{
 			setcookie('dc_admin',$data['cookie_admin'],strtotime('+15 days'),'','',DC_ADMIN_SSL);
@@ -202,9 +192,10 @@
 	if ($check_user && $core->auth->mustChangePassword())
 	{
-		$login_data = join('/',array(
-			base64_encode($user_id),
-			$cookie_admin,
-			empty($_POST['user_remember'])?'0':'1'
-		));
+		$login_data = base64_encode(serialize(array(
+			'user_id'=>$user_id,
+			'cookie_admin'=>$cookie_admin,
+			'blog_id'=>(!empty($_POST['blog']) ? $_POST['blog'] : ''),
+			'user_remember'=>!empty($_POST['user_remember'])
+		)));
 		
 		if (!$core->auth->allowPassChange()) {
@@ -257,10 +248,10 @@
 <!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 $dlang; ?>" lang="<?php echo $dlang; ?>">
+xml:lang="en" lang="en">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
   <meta http-equiv="Content-Script-Type" content="text/javascript" />
   <meta http-equiv="Content-Style-Type" content="text/css" />
-  <meta http-equiv="Content-Language" content="<?php echo $dlang; ?>" />
+  <meta http-equiv="Content-Language" content="en" />
   <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />
   <meta name="GOOGLEBOT" content="NOSNIPPET" />
@@ -304,5 +295,5 @@
     if ($.cookie('dc_admin_test_cookie')) {
       $('#cookie_help').hide();
-      $.cookie('dc_admin_test_cookie', '', {'expires': -1});
+      $.cookie('dc_admin_test_cookie', '', {expires: -1});
     } else {
       $('#cookie_help').show();
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 320)
+++ admin/index.php	(revision 270)
@@ -84,5 +84,5 @@
 			$title = ($fav['name'] == 'posts' ? sprintf($str_entries,$post_count) : 
 				($fav['name'] == 'comments' ? sprintf($str_comments,$comment_count) : $fav['title']));
-			$__dashboard_icons[$fav['name']] = new ArrayObject(array(__($title),$fav['url'],$fav['large-icon']));
+			$__dashboard_icons[$fav['name']] = new ArrayObject(array($title,$fav['url'],$fav['large-icon']));
 
 			# Let plugins set their own title for favorite on dashboard
@@ -99,5 +99,5 @@
 			$title = ($fav['name'] == 'posts' ? sprintf($str_entries,$post_count) : 
 				($fav['name'] == 'comments' ? sprintf($str_comments,$comment_count) : $fav['title']));
-			$__dashboard_icons[$fav['name']] = new ArrayObject(array(__($title),$fav['url'],$fav['large-icon']));
+			$__dashboard_icons[$fav['name']] = new ArrayObject(array($title,$fav['url'],$fav['large-icon']));
 
 			# Let plugins set their own title for favorite on dashboard
Index: admin/install/wizard.php
===================================================================
--- admin/install/wizard.php	(revision 363)
+++ admin/install/wizard.php	(revision 270)
@@ -100,5 +100,4 @@
 		$admin_url = preg_replace('%install/wizard.php$%','',$_SERVER['REQUEST_URI']);
 		writeConfigValue('DC_ADMIN_URL',http::getHost().$admin_url,$full_conf);
-		writeConfigValue('DC_ADMIN_MAILFROM','dotclear@'.$_SERVER['HTTP_HOST'],$full_conf);
 		writeConfigValue('DC_MASTER_KEY',md5(uniqid()),$full_conf);
 		
Index: admin/js/_index.js
===================================================================
--- admin/js/_index.js	(revision 314)
+++ admin/js/_index.js	(revision 234)
@@ -65,5 +65,5 @@
 	// allow to hide quick entry div, and remember choice
 	$('#quick h3').toggleWithLegend($('#quick').children().not('h3'),{
-		cookie: 'dcx_quick_entry'
+		cookie: 'dcx_quick_entry',
 	}, positionFooter);
 });
Index: admin/js/common.js
===================================================================
--- admin/js/common.js	(revision 314)
+++ admin/js/common.js	(revision 234)
@@ -335,5 +335,5 @@
 			position: "static",
 			padding: ".75em 0",
-			width: "auto"
+			width: "auto",
 		});
 	}
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 324)
+++ admin/preferences.php	(revision 270)
@@ -499,5 +499,5 @@
 				form::field(array('order['.$k.']'),2,3,$count,'position','',false,'title="'.sprintf(__('position of %s'),$fav['title']).'"').
 				form::hidden(array('dynorder[]','dynorder-'.$k.''),$k).
-				'<label for="fuk-'.$k.'">'.form::checkbox(array('remove[]','fuk-'.$k),$k).__($fav['title']).'</label>'.
+				'<label for="fuk-'.$k.'">'.form::checkbox(array('remove[]','fuk-'.$k),$k).$fav['title'].'</label>'.
 				'</li>';
 		}
@@ -542,5 +542,5 @@
 			$count++;
 			echo '<li id="fd-'.$k.'">'.
-			'<img src="'.$fav['small-icon'].'" alt="" /> '.__($fav['title']).'</li>';
+			'<img src="'.$fav['small-icon'].'" alt="" /> '.$fav['title'].'</li>';
 		}
 	}
@@ -568,6 +568,6 @@
 		echo '<li id="fa-'.$fav[0].'">'.'<label for="fak-'.$fav[0].'">'.
 			form::checkbox(array('append[]','fak-'.$fav[0]),$k).
-			'<img src="'.$fav[3].'" alt="" /> '.'<span class="zoom"><img src="'.$fav[4].'" alt="" /></span>'.
-			__($fav[1]).'</label>'.'</li>';
+			'<img src="'.$fav[3].'" alt="" /> '.'<span class="zoom"><img src="'.$fav[4].'" alt="" /></span>'.$fav[1].
+			'</label>'.'</li>';
 	}
 }	
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 321)
+++ inc/admin/lib.dc.page.php	(revision 270)
@@ -270,7 +270,7 @@
 			} else {
 				$prof_url = http::getSelfURI();
-				$prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&';
+				$prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&amp;';
 				$prof_url .= 'XDEBUG_PROFILE';
-				$res .= '<p><a href="'.html::escapeURL($prof_url).'">Trigger profiler</a></p>';
+				$res .= '<p><a href="'.$prof_url.'">Trigger profiler</a></p>';
 			}
 			
Index: inc/admin/prepend.php
===================================================================
--- inc/admin/prepend.php	(revision 324)
+++ inc/admin/prepend.php	(revision 270)
@@ -185,43 +185,43 @@
 	# NB : '*' in permissions means any, null means super admin only
 	
-	$_fav['prefs'] = new ArrayObject(array('prefs','My preferences','preferences.php',
+	$_fav['prefs'] = new ArrayObject(array('prefs',__('My preferences'),'preferences.php',
 		'images/menu/user-pref.png','images/menu/user-pref-b.png',
 		'*',null,null));
 
-	$_fav['new_post'] = new ArrayObject(array('new_post','New entry','post.php',
+	$_fav['new_post'] = new ArrayObject(array('new_post',__('New entry'),'post.php',
 		'images/menu/edit.png','images/menu/edit-b.png',
 		'usage,contentadmin',null,'menu-new-post'));
-	$_fav['posts'] = new ArrayObject(array('posts','Entries','posts.php',
+	$_fav['posts'] = new ArrayObject(array('posts',__('Entries'),'posts.php',
 		'images/menu/entries.png','images/menu/entries-b.png',
 		'usage,contentadmin',null,null));
-	$_fav['comments'] = new ArrayObject(array('comments','Comments','comments.php',
+	$_fav['comments'] = new ArrayObject(array('comments',__('Comments'),'comments.php',
 		'images/menu/comments.png','images/menu/comments-b.png',
 		'usage,contentadmin',null,null));
-	$_fav['search'] = new ArrayObject(array('search','Search','search.php',
+	$_fav['search'] = new ArrayObject(array('search',__('Search'),'search.php',
 		'images/menu/search.png','images/menu/search-b.png',
 		'usage,contentadmin',null,null));
-	$_fav['categories'] = new ArrayObject(array('categories','Categories','categories.php',
+	$_fav['categories'] = new ArrayObject(array('categories',__('Categories'),'categories.php',
 		'images/menu/categories.png','images/menu/categories-b.png',
 		'categories',null,null));
-	$_fav['media'] = new ArrayObject(array('media','Media manager','media.php',
+	$_fav['media'] = new ArrayObject(array('media',__('Media manager'),'media.php',
 		'images/menu/media.png','images/menu/media-b.png',
 		'media,media_admin',null,null));
-	$_fav['blog_pref'] = new ArrayObject(array('blog_pref','Blog settings','blog_pref.php',
+	$_fav['blog_pref'] = new ArrayObject(array('blog_pref',__('Blog settings'),'blog_pref.php',
 		'images/menu/blog-pref.png','images/menu/blog-pref-b.png',
 		'admin',null,null));
-	$_fav['blog_theme'] = new ArrayObject(array('blog_theme','Blog appearance','blog_theme.php',
+	$_fav['blog_theme'] = new ArrayObject(array('blog_theme',__('Blog appearance'),'blog_theme.php',
 		'images/menu/themes.png','images/menu/blog-theme-b.png',
 		'admin',null,null));
 
-	$_fav['blogs'] = new ArrayObject(array('blogs','Blogs','blogs.php',
+	$_fav['blogs'] = new ArrayObject(array('blogs',__('Blogs'),'blogs.php',
 		'images/menu/blogs.png','images/menu/blogs-b.png',
 		'usage,contentadmin',null,null));
-	$_fav['users'] = new ArrayObject(array('users','Users','users.php',
+	$_fav['users'] = new ArrayObject(array('users',__('Users'),'users.php',
 		'images/menu/users.png','images/menu/users-b.png',
 		null,null,null));
-	$_fav['plugins'] = new ArrayObject(array('plugins','Plugins','plugins.php',
+	$_fav['plugins'] = new ArrayObject(array('plugins',__('Plugins'),'plugins.php',
 		'images/menu/plugins.png','images/menu/plugins-b.png',
 		null,null,null));
-	$_fav['langs'] = new ArrayObject(array('langs','Languages','langs.php',
+	$_fav['langs'] = new ArrayObject(array('langs',__('Languages'),'langs.php',
 		'images/menu/langs.png','images/menu/langs-b.png',
 		null,null,null));
@@ -311,5 +311,5 @@
 			$count++;
 			$fav = unserialize($v['value']);
-			$_menu['Favorites']->addItem(__($fav['title']),$fav['url'],$fav['small-icon'],
+			$_menu['Favorites']->addItem($fav['title'],$fav['url'],$fav['small-icon'],
 				preg_match(dc_prepare_url($fav['url']),$_SERVER['REQUEST_URI']),
 				(($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)),$fav['id'],$fav['class']);
@@ -321,5 +321,5 @@
 			$count++;
 			$fav = unserialize($v['value']);
-			$_menu['Favorites']->addItem(__($fav['title']),$fav['url'],$fav['small-icon'],
+			$_menu['Favorites']->addItem($fav['title'],$fav['url'],$fav['small-icon'],
 				preg_match(dc_prepare_url($fav['url']),$_SERVER['REQUEST_URI']),
 				(($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)),$fav['id'],$fav['class']);
Index: inc/config.php.in
===================================================================
--- inc/config.php.in	(revision 362)
+++ inc/config.php.in	(revision 270)
@@ -40,7 +40,4 @@
 define('DC_ADMIN_URL','');
 
-// Admin mail from address. For password recovery and such.
-define('DC_ADMIN_MAILFROM','');
-
 // Cookie's name
 define('DC_SESSION_NAME','dcxd');
Index: inc/dbschema/upgrade.php
===================================================================
--- inc/dbschema/upgrade.php	(revision 324)
+++ inc/dbschema/upgrade.php	(revision 270)
@@ -149,27 +149,27 @@
 				$init_fav = array();
 
-				$init_fav['new_post'] = array('new_post','New entry','post.php',
+				$init_fav['new_post'] = array('new_post',__('New entry'),'post.php',
 					'images/menu/edit.png','images/menu/edit-b.png',
 					'usage,contentadmin',null,'menu-new-post');
-				$init_fav['posts'] = array('posts','Entries','posts.php',
+				$init_fav['posts'] = array('posts',__('Entries'),'posts.php',
 					'images/menu/entries.png','images/menu/entries-b.png',
 					'usage,contentadmin',null,null);
-				$init_fav['comments'] = array('comments','Comments','comments.php',
+				$init_fav['comments'] = array('comments',__('Comments'),'comments.php',
 					'images/menu/comments.png','images/menu/comments-b.png',
 					'usage,contentadmin',null,null);
-				$init_fav['prefs'] = array('prefs','My preferences','preferences.php',
+				$init_fav['prefs'] = array('prefs',__('My preferences'),'preferences.php',
 					'images/menu/user-pref.png','images/menu/user-pref-b.png',
 					'*',null,null);
-				$init_fav['blog_pref'] = array('blog_pref','Blog settings','blog_pref.php',
+				$init_fav['blog_pref'] = array('blog_pref',__('Blog settings'),'blog_pref.php',
 					'images/menu/blog-pref.png','images/menu/blog-pref-b.png',
 					'admin',null,null);
-				$init_fav['blog_theme'] = array('blog_theme','Blog appearance','blog_theme.php',
+				$init_fav['blog_theme'] = array('blog_theme',__('Blog appearance'),'blog_theme.php',
 					'images/menu/themes.png','images/menu/blog-theme-b.png',
 					'admin',null,null);
 
-				$init_fav['pages'] = array('pages','Pages','plugin.php?p=pages',
+				$init_fav['pages'] = array('pages',__('Pages'),'plugin.php?p=pages',
 					'index.php?pf=pages/icon.png','index.php?pf=pages/icon-big.png',
 					'contentadmin,pages',null,null);
-				$init_fav['blogroll'] = array('blogroll','Blogroll','plugin.php?p=blogroll',
+				$init_fav['blogroll'] = array('blogroll',__('Blogroll'),'plugin.php?p=blogroll',
 					'index.php?pf=blogroll/icon-small.png','index.php?pf=blogroll/icon.png',
 					'usage,contentadmin',null,null);
@@ -290,11 +290,4 @@
 			}
 			
-			if (version_compare($version,'2.3.1','<'))
-			{
-				# Remove unecessary file
-				@unlink(DC_ROOT.'/'.'inc/libs/clearbricks/.hgignore');
-			}
-			
-			
 			$core->setVersion('core',DC_VERSION);
 			$core->blogDefaults();
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 332)
+++ inc/prepend.php	(revision 286)
@@ -118,5 +118,5 @@
 # Constants
 define('DC_ROOT',path::real(dirname(__FILE__).'/..'));
-define('DC_VERSION','2.3.1-dev');
+define('DC_VERSION','2.4.0-dev');
 define('DC_DIGESTS',dirname(__FILE__).'/digests');
 define('DC_L10N_ROOT',dirname(__FILE__).'/../locales');
Index: inc/public/class.dc.template.php
===================================================================
--- inc/public/class.dc.template.php	(revision 341)
+++ inc/public/class.dc.template.php	(revision 270)
@@ -563,5 +563,5 @@
 		}
 		
-		if (empty($attr['no_context']) && !isset($attr['category']))
+		if (empty($attr['no_context']))
 		{
 			$p .=
@@ -1324,19 +1324,13 @@
 		if (empty($attr['no_context']))
 		{
-			if (!isset($attr['author']))
-			{
-				$p .=
-				'if ($_ctx->exists("users")) { '.
-					"\$params['user_id'] = \$_ctx->users->user_id; ".
-				"}\n";
-			}
+			$p .=
+			'if ($_ctx->exists("users")) { '.
+				"\$params['user_id'] = \$_ctx->users->user_id; ".
+			"}\n";
 			
-			if (!isset($attr['category']) && (!isset($attr['no_category']) || !$attr['no_category']))
-			{
-				$p .=
-				'if ($_ctx->exists("categories")) { '.
-					"\$params['cat_id'] = \$_ctx->categories->cat_id; ".
-				"}\n";
-			}
+			$p .=
+			'if ($_ctx->exists("categories")) { '.
+				"\$params['cat_id'] = \$_ctx->categories->cat_id; ".
+			"}\n";
 			
 			$p .=
Index: plugins/antispam/_admin.php
===================================================================
--- plugins/antispam/_admin.php	(revision 324)
+++ plugins/antispam/_admin.php	(revision 270)
@@ -29,5 +29,5 @@
 function antispamDashboardFavs($core,$favs)
 {
-	$favs['antispam'] = new ArrayObject(array('antispam','Antispam','plugin.php?p=antispam',
+	$favs['antispam'] = new ArrayObject(array('antispam',__('Antispam'),'plugin.php?p=antispam',
 		'index.php?pf=antispam/icon.png','index.php?pf=antispam/icon-big.png',
 		'admin',null,null));
Index: plugins/blogroll/_admin.php
===================================================================
--- plugins/blogroll/_admin.php	(revision 324)
+++ plugins/blogroll/_admin.php	(revision 270)
@@ -20,5 +20,5 @@
 function blogroll_dashboard_favs($core,$favs)
 {
-	$favs['blogroll'] = new ArrayObject(array('blogroll','Blogroll','plugin.php?p=blogroll',
+	$favs['blogroll'] = new ArrayObject(array('blogroll',__('Blogroll'),'plugin.php?p=blogroll',
 		'index.php?pf=blogroll/icon-small.png','index.php?pf=blogroll/icon.png',
 		'usage,contentadmin',null,null));
Index: plugins/blowupConfig/_public.php
===================================================================
--- plugins/blowupConfig/_public.php	(revision 270)
+++ plugins/blowupConfig/_public.php	(revision 295)
@@ -25,20 +25,20 @@
 		echo '<style type="text/css">'."\n".self::blowUpStyleHelper()."\n</style>\n";
 	}
-	
+
 	public static function blowUpStyleHelper()
 	{
 		$s = $GLOBALS['core']->blog->settings->themes->blowup_style;
-		
+
 		if ($s === null) {
 			return;
 		}
-		
+
 		$s = @unserialize($s);
 		if (!is_array($s)) {
 			return;
 		}
-		
+
 		$css = array();
-		
+
 		/* Sidebar position
 		---------------------------------------------- */
@@ -48,16 +48,16 @@
 			$css['#sidebar']['float'] = 'left';
 		}
-		
+
 		/* Properties
 		---------------------------------------------- */
 		self::prop($css,'body','background-color',$s['body_bg_c']);
-		
+
 		self::prop($css,'body','color',$s['body_txt_c']);
 		self::prop($css,'.post-tags li a:link, .post-tags li a:visited, .post-info-co a:link, .post-info-co a:visited','color',$s['body_txt_c']);
 		self::prop($css,'#page','font-size',$s['body_txt_s']);
 		self::prop($css,'body','font-family',blowupConfig::fontDef($s['body_txt_f']));
-		
+
 		self::prop($css,'.post-content, .post-excerpt, #comments dd, #pings dd, dd.comment-preview','line-height',$s['body_line_height']);
-		
+
 		if (!$s['blog_title_hide'])
 		{
@@ -65,10 +65,10 @@
 			self::prop($css,'#top h1','font-size',$s['blog_title_s']);
 			self::prop($css,'#top h1','font-family',blowupConfig::fontDef($s['blog_title_f']));
-			
+
 			if ($s['blog_title_a'] == 'right' || $s['blog_title_a'] == 'left') {
 				$css['#top h1'][$s['blog_title_a']] = '0px';
 				$css['#top h1']['width'] = 'auto';
 			}
-			
+
 			if ($s['blog_title_p'])
 			{
@@ -92,13 +92,13 @@
 		}
 		self::prop($css,'#top','height',$s['top_height']);
-		
+
 		self::prop($css,'.day-date','color',$s['date_title_c']);
 		self::prop($css,'.day-date','font-family',blowupConfig::fontDef($s['date_title_f']));
 		self::prop($css,'.day-date','font-size',$s['date_title_s']);
-		
+
 		self::prop($css,'a','color',$s['body_link_c']);
 		self::prop($css,'a:visited','color',$s['body_link_v_c']);
 		self::prop($css,'a:hover, a:focus, a:active','color',$s['body_link_f_c']);
-		
+
 		self::prop($css,'#comment-form input, #comment-form textarea','color',$s['body_link_c']);
 		self::prop($css,'#comment-form input.preview','color',$s['body_link_c']);
@@ -108,21 +108,21 @@
 		self::prop($css,'#comment-form input.submit:hover','background',$s['body_link_f_c']);
 		self::prop($css,'#comment-form input.submit:hover','border-color',$s['body_link_f_c']);
-		
+
 		self::prop($css,'#sidebar','font-family',blowupConfig::fontDef($s['sidebar_text_f']));
 		self::prop($css,'#sidebar','font-size',$s['sidebar_text_s']);
 		self::prop($css,'#sidebar','color',$s['sidebar_text_c']);
-		
+
 		self::prop($css,'#sidebar h2','font-family',blowupConfig::fontDef($s['sidebar_title_f']));
 		self::prop($css,'#sidebar h2','font-size',$s['sidebar_title_s']);
 		self::prop($css,'#sidebar h2','color',$s['sidebar_title_c']);
-		
+
 		self::prop($css,'#sidebar h3','font-family',blowupConfig::fontDef($s['sidebar_title2_f']));
 		self::prop($css,'#sidebar h3','font-size',$s['sidebar_title2_s']);
 		self::prop($css,'#sidebar h3','color',$s['sidebar_title2_c']);
-		
+
 		self::prop($css,'#sidebar ul','border-top-color',$s['sidebar_line_c']);
 		self::prop($css,'#sidebar li','border-bottom-color',$s['sidebar_line_c']);
 		self::prop($css,'#topnav ul','border-bottom-color',$s['sidebar_line_c']);
-		
+
 		self::prop($css,'#sidebar li a','color',$s['sidebar_link_c']);
 		self::prop($css,'#sidebar li a:visited','color',$s['sidebar_link_v_c']);
@@ -132,17 +132,17 @@
 		self::prop($css,'#search .submit:hover','background',$s['sidebar_link_f_c']);
 		self::prop($css,'#search .submit:hover','border-color',$s['sidebar_link_f_c']);
-		
+
 		self::prop($css,'.post-title','color',$s['post_title_c']);
 		self::prop($css,'.post-title a, .post-title a:visited','color',$s['post_title_c']);
 		self::prop($css,'.post-title','font-family',blowupConfig::fontDef($s['post_title_f']));
 		self::prop($css,'.post-title','font-size',$s['post_title_s']);
-		
+
 		self::prop($css,'#comments dd','background-color',$s['post_comment_bg_c']);
 		self::prop($css,'#comments dd','color',$s['post_comment_c']);
 		self::prop($css,'#comments dd.me','background-color',$s['post_commentmy_bg_c']);
 		self::prop($css,'#comments dd.me','color',$s['post_commentmy_c']);
-		
+
 		self::prop($css,'#prelude, #prelude a','color',$s['prelude_c']);
-		
+
 		self::prop($css,'#footer p','background-color',$s['footer_bg_c']);
 		self::prop($css,'#footer p','color',$s['footer_c']);
@@ -150,5 +150,5 @@
 		self::prop($css,'#footer p','font-family',blowupConfig::fontDef($s['footer_f']));
 		self::prop($css,'#footer p a','color',$s['footer_l_c']);
-		
+
 		/* Images
 		------------------------------------------------------ */
@@ -164,5 +164,5 @@
 		self::backgroundImg($css,'#comments dt.me',$s['post_commentmy_bg_c'],'commentmy-t.png');
 		self::backgroundImg($css,'#comments dd.me',$s['post_commentmy_bg_c'],'commentmy-b.png');
-		
+
 		$res = '';
 		foreach ($css as $selector => $values) {
@@ -173,7 +173,10 @@
 			$res .= "}\n";
 		}
+
+		$res .= $s['extra_css'];
+
 		return $res;
 	}
-	
+
 	protected static function prop(&$css,$selector,$prop,$value)
 	{
@@ -182,5 +185,5 @@
 		}
 	}
-	
+
 	protected static function backgroundImg(&$css,$selector,$value,$image)
 	{
Index: plugins/blowupConfig/index.php
===================================================================
--- plugins/blowupConfig/index.php	(revision 270)
+++ plugins/blowupConfig/index.php	(revision 295)
@@ -24,14 +24,14 @@
 	'body_bg_c' => null,
 	'body_bg_g' => 'light',
-	
+
 	'body_txt_f' => null,
 	'body_txt_s' => null,
 	'body_txt_c' => null,
 	'body_line_height' => null,
-	
+
 	'top_image' => 'default',
 	'top_height' => null,
 	'uploaded' => null,
-	
+
 	'blog_title_hide' => null,
 	'blog_title_f' => null,
@@ -40,9 +40,9 @@
 	'blog_title_a' => null,
 	'blog_title_p' => null,
-	
+
 	'body_link_c' => null,
 	'body_link_f_c' => null,
 	'body_link_v_c' => null,
-	
+
 	'sidebar_position' => null,
 	'sidebar_text_f' => null,
@@ -59,9 +59,9 @@
 	'sidebar_link_f_c' => null,
 	'sidebar_link_v_c' => null,
-	
+
 	'date_title_f' => null,
 	'date_title_s' => null,
 	'date_title_c' => null,
-	
+
 	'post_title_f' => null,
 	'post_title_s' => null,
@@ -71,5 +71,5 @@
 	'post_commentmy_bg_c' => null,
 	'post_commentmy_c' => null,
-	
+
 	'prelude_c' => null,
 	'footer_f' => null,
@@ -78,4 +78,6 @@
 	'footer_l_c' => null,
 	'footer_bg_c' => null,
+
+	'extra_css' => null
 );
 
@@ -108,5 +110,5 @@
 		$blowup_user['body_txt_c'] = blowupConfig::adjustColor($_POST['body_txt_c']);
 		$blowup_user['body_line_height'] = blowupConfig::adjustFontSize($_POST['body_line_height']);
-		
+
 		$blowup_user['blog_title_hide'] = (integer) !empty($_POST['blog_title_hide']);
 		$update_blog_title = !$blowup_user['blog_title_hide'] && (
@@ -115,5 +117,5 @@
 			!empty($_POST['blog_title_p'])
 		);
-		
+
 		if ($update_blog_title)
 		{
@@ -124,9 +126,9 @@
 			$blowup_user['blog_title_p'] = blowupConfig::adjustPosition($_POST['blog_title_p']);
 		}
-		
+
 		$blowup_user['body_link_c'] = blowupConfig::adjustColor($_POST['body_link_c']);
 		$blowup_user['body_link_f_c'] = blowupConfig::adjustColor($_POST['body_link_f_c']);
 		$blowup_user['body_link_v_c'] = blowupConfig::adjustColor($_POST['body_link_v_c']);
-		
+
 		$blowup_user['sidebar_text_f'] = $_POST['sidebar_text_f'];
 		$blowup_user['sidebar_text_s'] = blowupConfig::adjustFontSize($_POST['sidebar_text_s']);
@@ -142,11 +144,11 @@
 		$blowup_user['sidebar_link_f_c'] = blowupConfig::adjustColor($_POST['sidebar_link_f_c']);
 		$blowup_user['sidebar_link_v_c'] = blowupConfig::adjustColor($_POST['sidebar_link_v_c']);
-		
+
 		$blowup_user['sidebar_position'] = ($_POST['sidebar_position'] == 'left') ? 'left' : null;
-		
+
 		$blowup_user['date_title_f'] = $_POST['date_title_f'];
 		$blowup_user['date_title_s'] = blowupConfig::adjustFontSize($_POST['date_title_s']);
 		$blowup_user['date_title_c'] = blowupConfig::adjustColor($_POST['date_title_c']);
-		
+
 		$blowup_user['post_title_f'] = $_POST['post_title_f'];
 		$blowup_user['post_title_s'] = blowupConfig::adjustFontSize($_POST['post_title_s']);
@@ -154,6 +156,6 @@
 		$blowup_user['post_comment_c'] = blowupConfig::adjustColor($_POST['post_comment_c']);
 		$blowup_user['post_commentmy_c'] = blowupConfig::adjustColor($_POST['post_commentmy_c']);
-		
-		
+
+
 		$blowup_user['footer_f'] = $_POST['footer_f'];
 		$blowup_user['footer_s'] = blowupConfig::adjustFontSize($_POST['footer_s']);
@@ -161,5 +163,8 @@
 		$blowup_user['footer_l_c'] = blowupConfig::adjustColor($_POST['footer_l_c']);
 		$blowup_user['footer_bg_c'] = blowupConfig::adjustColor($_POST['footer_bg_c']);
-		
+
+
+		$blowup_user['extra_css'] = blowupConfig::cleanCSS($_POST['extra_css']);
+
 		if ($can_write_images)
 		{
@@ -168,5 +173,5 @@
 				$uploaded = blowupConfig::imagesPath().'/'.$blowup_user['uploaded'];
 			}
-			
+
 			if (!empty($_FILES['upfile']) && !empty($_FILES['upfile']['name'])) {
 				files::uploadStatus($_FILES['upfile']);
@@ -174,7 +179,7 @@
 				$blowup_user['uploaded'] = basename($uploaded);
 			}
-			
+
 			$blowup_user['top_image'] = in_array($_POST['top_image'],$top_images) ? $_POST['top_image'] : 'default';
-			
+
 			$blowup_user['body_bg_c'] = blowupConfig::adjustColor($_POST['body_bg_c']);
 			$blowup_user['body_bg_g'] = in_array($_POST['body_bg_g'],$gradient_types) ? $_POST['body_bg_g'] : '';
@@ -184,9 +189,9 @@
 			blowupConfig::createImages($blowup_user,$uploaded);
 		}
-		
+
 		$core->blog->settings->addNamespace('themes');
 		$core->blog->settings->themes->put('blowup_style',serialize($blowup_user));
 		$core->blog->triggerBlog();
-		
+
 		http::redirect($p_url.'&upd=1');
 	}
@@ -233,5 +238,5 @@
 
 echo '<form id="theme_config" action="'.$p_url.'" method="post" enctype="multipart/form-data">';
-		
+
 echo '<fieldset><legend>'.__('General').'</legend>';
 
@@ -240,5 +245,5 @@
 	'<p class="field"><label for="body_bg_c">'.__('Background color:').' '.
 	form::field('body_bg_c',7,7,$blowup_user['body_bg_c'],'colorpicker').'</label></p>'.
-	
+
 	'<p class="field"><label for="body_bg_g">'.__('Background color fill:').' '.
 	form::combo('body_bg_g',$gradient_types,$blowup_user['body_bg_g']).'</label></p>';
@@ -304,5 +309,5 @@
 		$preview_image = 'index.php?pf=blowupConfig/alpha-img/page-t/'.$blowup_user['top_image'].'.png';
 	}
-	
+
 	echo
 	'<fieldset><legend>'.__('Top image').'</legend>'.
@@ -310,10 +315,10 @@
 	form::combo('top_image',$top_images,($blowup_user['top_image'] ? $blowup_user['top_image'] : 'default')).'</label></p>'.
 	'<p>'.__('Choose "Custom..." to upload your own image.').'</p>'.
-	
+
 	'<p id="uploader"><label for="upfile">'.__('Add your image:').
 	' ('.sprintf(__('JPEG or PNG file, 800 pixels wide, maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.
 	'<input type="file" name="upfile" id="upfile" size="35" />'.
 	'</label></p>'.
-	
+
 	'<h3>'.__('Preview').'</h3>'.
 	'<div class="grid" style="width:800px;border:1px solid #ccc;">'.
@@ -425,4 +430,11 @@
 '</fieldset>';
 
+echo
+'<fieldset><legend>'.__('Additional CSS').'</legend>'.
+'<p>'.form::textarea('extra_css',72,5,html::escapeHTML($blowup_user['extra_css']),'maximal','',false,'title="'.__('Additional CSS').'"').'</p>'.
+'</fieldset>';
+
+
+
 // Import / Export configuration
 $tmp_array = array();
Index: plugins/blowupConfig/lib/class.blowup.config.php
===================================================================
--- plugins/blowupConfig/lib/class.blowup.config.php	(revision 270)
+++ plugins/blowupConfig/lib/class.blowup.config.php	(revision 295)
@@ -22,5 +22,5 @@
 			'ss5' => 'Impact, Charcoal, sans-serif'
 		),
-		
+
 		'serif' => array(
 			's1' => 'Times, "Times New Roman", serif',
@@ -28,5 +28,5 @@
 			's3' => 'Baskerville, "Palatino Linotype", serif'
 		),
-		
+
 		'monospace' => array(
 			'm1' => '"Andale Mono", "Courier New", monospace',
@@ -34,8 +34,8 @@
 		)
 	);
-	
+
 	protected static $fonts_combo = array();
 	protected static $fonts_list = array();
-	
+
 	public static $top_images = array(
 		'default' => 'Default',
@@ -55,5 +55,5 @@
 		'typo' => 'Typo',
 	);
-	
+
 	public static function fontsList()
 	{
@@ -70,8 +70,8 @@
 			}
 		}
-		
+
 		return self::$fonts_combo;
 	}
-	
+
 	public static function fontDef($c)
 	{
@@ -85,8 +85,8 @@
 			}
 		}
-		
+
 		return isset(self::$fonts_list[$c]) ? self::$fonts_list[$c] : null;
 	}
-	
+
 	public static function adjustFontSize($s)
 	{
@@ -97,8 +97,8 @@
 			return $m[1].$m[2];
 		}
-		
+
 		return null;
 	}
-	
+
 	public static function adjustPosition($p)
 	{
@@ -106,10 +106,10 @@
 			return null;
 		}
-		
+
 		$p = explode(':',$p);
-		
+
 		return $p[0].(count($p) == 1 ? ':0' : ':'.$p[1]);
 	}
-	
+
 	public static function adjustColor($c)
 	{
@@ -117,22 +117,28 @@
 			return '';
 		}
-		
+
 		$c = strtoupper($c);
-		
+
 		if (preg_match('/^[A-F0-9]{3,6}$/',$c)) {
 			$c = '#'.$c;
 		}
-		
+
 		if (preg_match('/^#[A-F0-9]{6}$/',$c)) {
 			return $c;
 		}
-		
+
 		if (preg_match('/^#[A-F0-9]{3,}$/',$c)) {
 			return '#'.substr($c,1,1).substr($c,1,1).substr($c,2,1).substr($c,2,1).substr($c,3,1).substr($c,3,1);
 		}
-		
+
 		return '';
 	}
-	
+
+	public static function cleanCSS($css)
+	{
+		// TODO ?
+		return $css;
+	}
+
 	public static function imagesPath()
 	{
@@ -140,5 +146,5 @@
 		return path::real($core->blog->public_path).'/blowup-images';
 	}
-	
+
 	public static function imagesURL()
 	{
@@ -146,12 +152,12 @@
 		return $core->blog->settings->system->public_url.'/blowup-images';
 	}
-	
+
 	public static function canWriteImages($create=false)
 	{
 		global $core;
-		
+
 		$public = path::real($core->blog->public_path);
 		$imgs = self::imagesPath();
-		
+
 		if (!function_exists('imagecreatetruecolor') || !function_exists('imagepng') || !function_exists('imagecreatefrompng')) {
 			$core->error->add(__('At least one of the following functions is not available: '.
@@ -159,10 +165,10 @@
 			return false;
 		}
-		
+
 		if (!is_dir($public)) {
 			$core->error->add(__('The \'public\' directory does not exist.'));
 			return false;
 		}
-		
+
 		if (!is_dir($imgs)) {
 			if (!is_writable($public)) {
@@ -175,13 +181,13 @@
 			return true;
 		}
-		
+
 		if (!is_writable($imgs)) {
 			$core->error->add(sprintf(__('The \'%s\' directory cannot be modified.'),'public/blowup-images'));
 			return false;
 		}
-		
+
 		return true;
 	}
-	
+
 	public static function uploadImage($f)
 	{
@@ -189,26 +195,26 @@
 			throw new Exception(__('Unable to create images.'));
 		}
-		
+
 		$name = $f['name'];
 		$type = files::getMimeType($name);
-		
+
 		if ($type != 'image/jpeg' && $type != 'image/png') {
 			throw new Exception(__('Invalid file type.'));
 		}
-		
+
 		$dest = self::imagesPath().'/uploaded'.($type == 'image/png' ? '.png' : '.jpg');
-		
+
 		if (@move_uploaded_file($f['tmp_name'],$dest) === false) {
 			throw new Exception(__('An error occurred while writing the file.'));
 		}
-		
+
 		$s = getimagesize($dest);
 		if ($s[0] != 800) {
 			throw new Exception(__('Uploaded image is not 800 pixels wide.'));
 		}
-		
+
 		return $dest;
 	}
-	
+
 	public static function createImages(&$config,$uploaded)
 	{
@@ -219,7 +225,7 @@
 		$comment_color_my = $config['post_commentmy_bg_c'];
 		$top_image = $config['top_image'];
-		
+
 		$config['top_height'] = null;
-		
+
 		if ($top_image != 'custom' && !isset(self::$top_images[$top_image])) {
 			$top_image = 'default';
@@ -228,9 +234,9 @@
 			$uploaded = null;
 		}
-		
+
 		if (!self::canWriteImages(true)) {
 			throw new Exception(__('Unable to create images.'));
 		}
-		
+
 		$body_fill = array(
 			'light' => dirname(__FILE__).'/../alpha-img/gradient-l.png',
@@ -238,7 +244,7 @@
 			'dark' => dirname(__FILE__).'/../alpha-img/gradient-d.png'
 		);
-		
+
 		$body_g = isset($body_fill[$gradient]) ? $body_fill[$gradient] : false;
-		
+
 		if ($top_image == 'custom' && $uploaded) {
 			$page_t = $uploaded;
@@ -246,5 +252,5 @@
 			$page_t = dirname(__FILE__).'/../alpha-img/page-t/'.$top_image.'.png';
 		}
-		
+
 		$body_bg = dirname(__FILE__).'/../alpha-img/body-bg.png';
 		$page_t_mask = dirname(__FILE__).'/../alpha-img/page-t/image-mask.png';
@@ -254,5 +260,5 @@
 		$default_bg = '#e0e0e0';
 		$default_prelude = '#ededed';
-		
+
 		self::dropImage(basename($body_bg));
 		self::dropImage('page-t.png');
@@ -260,9 +266,9 @@
 		self::dropImage(basename($comment_t));
 		self::dropImage(basename($comment_b));
-		
+
 		$body_color = self::adjustColor($body_color);
 		$prelude_color = self::adjustColor($prelude_color);
 		$comment_color = self::adjustColor($comment_color);
-		
+
 		if ($top_image || $body_color || $gradient != 'light' || $prelude_color || $uploaded)
 		{
@@ -271,10 +277,10 @@
 			}
 			$body_color = sscanf($body_color,'#%2X%2X%2X');
-			
+
 			# Create body gradient with color
 			$d_body_bg = imagecreatetruecolor(50,180);
 			$fill = imagecolorallocate($d_body_bg,$body_color[0],$body_color[1],$body_color[2]);
 			imagefill($d_body_bg,0,0,$fill);
-			
+
 			# User choosed a gradient
 			if ($body_g) {
@@ -284,18 +290,18 @@
 				imagedestroy($s_body_bg);
 			}
-			
+
 			if (!$prelude_color) {
 				$prelude_color = $default_prelude;
 			}
 			$prelude_color = sscanf($prelude_color,'#%2X%2X%2X');
-			
+
 			$s_prelude = imagecreatetruecolor(50,30);
 			$fill = imagecolorallocate($s_prelude,$prelude_color[0],$prelude_color[1],$prelude_color[2]);
 			imagefill($s_prelude,0,0,$fill);
 			imagecopy($d_body_bg,$s_prelude,0,0,0,0,50,30);
-			
+
 			imagepng($d_body_bg,self::imagesPath().'/'.basename($body_bg));
 		}
-		
+
 		if ($top_image || $body_color || $gradient != 'light')
 		{
@@ -304,7 +310,7 @@
 			$size = $size[1];
 			$type = files::getMimeType($page_t);
-			
+
 			$d_page_t = imagecreatetruecolor(800,$size);
-			
+
 			if ($type == 'image/png') {
 				$s_page_t = @imagecreatefrompng($page_t);
@@ -312,12 +318,12 @@
 				$s_page_t = @imagecreatefromjpeg($page_t);
 			}
-			
+
 			if (!$s_page_t) {
 				throw new exception(__('Unable to open image.'));
 			}
-			
+
 			$fill = imagecolorallocate($d_page_t,$body_color[0],$body_color[1],$body_color[2]);
 			imagefill($d_page_t,0,0,$fill);
-			
+
 			if ($type == 'image/png')
 			{
@@ -331,15 +337,15 @@
 				# JPEG, we add image and a frame with rounded corners
 				imagecopy($d_page_t,$s_page_t,0,0,0,0,800,$size);
-				
+
 				imagecopy($d_page_t,$d_body_bg,0,0,0,50,8,4);
 				imagecopy($d_page_t,$d_body_bg,0,4,0,54,4,4);
 				imagecopy($d_page_t,$d_body_bg,792,0,0,50,8,4);
 				imagecopy($d_page_t,$d_body_bg,796,4,0,54,4,4);
-				
+
 				$mask = imagecreatefrompng($page_t_mask);
 				imagealphablending($mask,true);
 				imagecopy($d_page_t,$mask,0,0,0,0,800,11);
 				imagedestroy($mask);
-				
+
 				$fill = imagecolorallocate($d_page_t,255,255,255);
 				imagefilledrectangle($d_page_t,0,11,3,$size-1,$fill);
@@ -347,28 +353,28 @@
 				imagefilledrectangle($d_page_t,0,$size-9,799,$size-1,$fill);
 			}
-			
+
 			$config['top_height'] = ($size).'px';
-			
+
 			imagepng($d_page_t,self::imagesPath().'/page-t.png');
-			
+
 			imagedestroy($d_body_bg);
 			imagedestroy($d_page_t);
 			imagedestroy($s_page_t);
-			
+
 			# Create bottom image with color
 			$d_page_b = imagecreatetruecolor(800,8);
 			$fill = imagecolorallocate($d_page_b,$body_color[0],$body_color[1],$body_color[2]);
 			imagefill($d_page_b,0,0,$fill);
-			
+
 			$s_page_b = imagecreatefrompng($page_b);
 			imagealphablending($s_page_b,true);
 			imagecopy($d_page_b,$s_page_b,0,0,0,0,800,160);
-			
+
 			imagepng($d_page_b,self::imagesPath().'/'.basename($page_b));
-			
+
 			imagedestroy($d_page_b);
 			imagedestroy($s_page_b);
 		}
-		
+
 		if ($comment_color) {
 			self::commentImages($comment_color,$comment_t,$comment_b,basename($comment_t),basename($comment_b));
@@ -378,34 +384,34 @@
 		}
 	}
-	
+
 	protected static function commentImages($comment_color,$comment_t,$comment_b,$dest_t,$dest_b)
 	{
 		$comment_color = sscanf($comment_color,'#%2X%2X%2X');
-			
+
 		$d_comment_t = imagecreatetruecolor(500,25);
 		$fill = imagecolorallocate($d_comment_t,$comment_color[0],$comment_color[1],$comment_color[2]);
 		imagefill($d_comment_t,0,0,$fill);
-		
+
 		$s_comment_t = imagecreatefrompng($comment_t);
 		imagealphablending($s_comment_t,true);
 		imagecopy($d_comment_t,$s_comment_t,0,0,0,0,500,25);
-		
+
 		imagepng($d_comment_t,self::imagesPath().'/'.$dest_t);
 		imagedestroy($d_comment_t);
 		imagedestroy($s_comment_t);
-		
+
 		$d_comment_b = imagecreatetruecolor(500,7);
 		$fill = imagecolorallocate($d_comment_b,$comment_color[0],$comment_color[1],$comment_color[2]);
 		imagefill($d_comment_b,0,0,$fill);
-		
+
 		$s_comment_b = imagecreatefrompng($comment_b);
 		imagealphablending($s_comment_b,true);
 		imagecopy($d_comment_b,$s_comment_b,0,0,0,0,500,7);
-		
+
 		imagepng($d_comment_b,self::imagesPath().'/'.$dest_b);
 		imagedestroy($d_comment_b);
 		imagedestroy($s_comment_b);
 	}
-	
+
 	public static function dropImage($img)
 	{
Index: plugins/importExport/_admin.php
===================================================================
--- plugins/importExport/_admin.php	(revision 324)
+++ plugins/importExport/_admin.php	(revision 270)
@@ -25,5 +25,5 @@
 function importExportDashboardFavs($core,$favs)
 {
-	$favs['importExport'] = new ArrayObject(array('importExport','Import/Export','plugin.php?p=importExport',
+	$favs['importExport'] = new ArrayObject(array('importExport',__('Import/Export'),'plugin.php?p=importExport',
 		'index.php?pf=importExport/icon.png','index.php?pf=importExport/icon-big.png',
 		'admin',null,null));
Index: plugins/importExport/inc/flat/class.dc.import.php
===================================================================
--- plugins/importExport/inc/flat/class.dc.import.php	(revision 298)
+++ plugins/importExport/inc/flat/class.dc.import.php	(revision 270)
@@ -371,8 +371,4 @@
 	private function insertPref($pref)
 	{
-		if ($this->prefExists($pref->pref_ws,$pref->pref_id,$pref->user_id)) {
-			return;
-		}
-		
 		$this->cur_pref->clean();
 		
@@ -755,21 +751,4 @@
 		$this->stack['users'][$user_id] = !$rs->isEmpty();
 		return $this->stack['users'][$user_id];
-	}
-	
-	private function prefExists($pref_ws,$pref_id,$user_id)
-	{
-		$strReq = 'SELECT pref_id,pref_ws,user_id '.
-				'FROM '.$this->prefix.'pref '.
-				"WHERE pref_id = '".$this->con->escape($pref_id)."' ".
-				"AND pref_ws = '".$this->con->escape($pref_ws)."' ";
-		if (!$user_id) {
-			$strReq .= "AND user_id IS NULL ";
-		} else {
-			$strReq .= "AND user_id = '".$this->con->escape($user_id)."' ";
-		}
-		
-		$rs = $this->con->select($strReq);
-		
-		return !$rs->isEmpty();
 	}
 	
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 324)
+++ plugins/maintenance/_admin.php	(revision 270)
@@ -20,5 +20,5 @@
 function maintenanceDashboardFavs($core,$favs)
 {
-	$favs['maintenance'] = new ArrayObject(array('maintenance','Maintenance','plugin.php?p=maintenance',
+	$favs['maintenance'] = new ArrayObject(array('maintenance',__('Maintenance'),'plugin.php?p=maintenance',
 		'index.php?pf=maintenance/icon.png','index.php?pf=maintenance/icon-big.png',
 		null,null,null));
Index: plugins/pages/_admin.php
===================================================================
--- plugins/pages/_admin.php	(revision 324)
+++ plugins/pages/_admin.php	(revision 270)
@@ -21,8 +21,8 @@
 function pages_dashboard_favs($core,$favs)
 {
-	$favs['pages'] = new ArrayObject(array('pages','Pages','plugin.php?p=pages',
+	$favs['pages'] = new ArrayObject(array('pages',__('Pages'),'plugin.php?p=pages',
 		'index.php?pf=pages/icon.png','index.php?pf=pages/icon-big.png',
 		'contentadmin,pages',null,null));
-	$favs['newpage'] = new ArrayObject(array('newpage','New page','plugin.php?p=pages&amp;act=page',
+	$favs['newpage'] = new ArrayObject(array('newpage',__('New page'),'plugin.php?p=pages&amp;act=page',
 		'index.php?pf=pages/icon-np.png','index.php?pf=pages/icon-np-big.png',
 		'contentadmin,pages',null,null));
Index: plugins/pings/_admin.php
===================================================================
--- plugins/pings/_admin.php	(revision 324)
+++ plugins/pings/_admin.php	(revision 270)
@@ -41,5 +41,5 @@
 function pingDashboardFavs($core,$favs)
 {
-	$favs['pings'] = new ArrayObject(array('pings','Pings','plugin.php?p=pings',
+	$favs['pings'] = new ArrayObject(array('pings',__('Pings'),'plugin.php?p=pings',
 		'index.php?pf=pings/icon.png','index.php?pf=pings/icon-big.png',
 		null,null,null));
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 324)
+++ plugins/tags/_admin.php	(revision 270)
@@ -45,5 +45,5 @@
 	public static function dashboardFavs($core,$favs)
 	{
-		$favs['tags'] = new ArrayObject(array('tags','Tags','plugin.php?p=tags&amp;m=tags',
+		$favs['tags'] = new ArrayObject(array('tags',__('Tags'),'plugin.php?p=tags&amp;m=tags',
 			'index.php?pf=tags/icon.png','index.php?pf=tags/icon-big.png',
 			'usage,contentadmin',null,null));
Index: plugins/widgets/_admin.php
===================================================================
--- plugins/widgets/_admin.php	(revision 324)
+++ plugins/widgets/_admin.php	(revision 270)
@@ -16,5 +16,5 @@
 function widgets_dashboard_favs($core,$favs)
 {
-	$favs['widgets'] = new ArrayObject(array('widgets','Presentation widgets','plugin.php?p=widgets',
+	$favs['widgets'] = new ArrayObject(array('widgets',__('Presentation widgets'),'plugin.php?p=widgets',
 		'index.php?pf=widgets/icon.png','index.php?pf=widgets/icon-big.png',
 		'admin',null,null));
Index: themes/ductile/_config.php
===================================================================
--- themes/ductile/_config.php	(revision 357)
+++ themes/ductile/_config.php	(revision 357)
@@ -0,0 +1,87 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2011 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_CONTEXT_ADMIN')) { return; }
+
+l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');
+
+function adjustColor($c)
+{
+	if ($c === '') {
+		return '';
+	}
+
+	$c = strtoupper($c);
+
+	if (preg_match('/^[A-F0-9]{3,6}$/',$c)) {
+		$c = '#'.$c;
+	}
+
+	if (preg_match('/^#[A-F0-9]{6}$/',$c)) {
+		return $c;
+	}
+
+	if (preg_match('/^#[A-F0-9]{3,}$/',$c)) {
+		return '#'.substr($c,1,1).substr($c,1,1).substr($c,2,1).substr($c,2,1).substr($c,3,1).substr($c,3,1);
+	}
+
+	return '';
+}
+
+$ductile_base = array(
+	'body_link_c' => null,
+	'body_link_v_c' => null,
+	'body_link_f_c' => null
+);
+
+$ductile_user = $core->blog->settings->themes->ductile_style;
+$ductile_user = @unserialize($ductile_user);
+if (!is_array($ductile_user)) {
+	$ductile_user = array();
+}
+
+$ductile_user = array_merge($ductile_base,$ductile_user);
+
+if (!empty($_POST))
+{
+	try
+	{
+		$ductile_user['body_link_c'] = adjustColor($_POST['body_link_c']);
+		$ductile_user['body_link_f_c'] = adjustColor($_POST['body_link_f_c']);
+		$ductile_user['body_link_v_c'] = adjustColor($_POST['body_link_v_c']);
+		
+		$core->blog->settings->addNamespace('themes');
+		$core->blog->settings->themes->put('ductile_style',serialize($ductile_user));
+		$core->blog->triggerBlog();
+
+		echo
+		'<div class="message"><p>'.
+		__('Style sheet upgraded.').
+		'</p></div>';
+	}
+	catch (Exception $e)
+	{
+		$core->error->add($e->getMessage());
+	}
+}
+
+echo '<fieldset><legend>'.__('Links').'</legend>'.
+'<p class="field"><label for="body_link_c">'.__('Links color:').' '.
+form::field('body_link_c',7,7,$ductile_user['body_link_c'],'colorpicker').'</label></p>'.
+
+'<p class="field"><label for="body_link_v_c">'.__('Visited links color:').' '.
+form::field('body_link_v_c',7,7,$ductile_user['body_link_v_c'],'colorpicker').'</label></p>'.
+
+'<p class="field"><label for="body_link_f_c">'.__('Focus links color:').' '.
+form::field('body_link_f_c',7,7,$ductile_user['body_link_f_c'],'colorpicker').'</label></p>'.
+'</fieldset>';
+
+?>
Index: themes/ductile/_define.php
===================================================================
--- themes/ductile/_define.php	(revision 361)
+++ themes/ductile/_define.php	(revision 361)
@@ -0,0 +1,18 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# Copyright (c) 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; }
+
+$this->registerModule(
+	/* Name */			"Ductile",
+	/* Description*/		"Chantier pour un nouveau theme",
+	/* Author */			"Dotclear Team",
+	/* Version */			'0.4'
+);
+?>
Index: themes/ductile/_public.php
===================================================================
--- themes/ductile/_public.php	(revision 357)
+++ themes/ductile/_public.php	(revision 357)
@@ -0,0 +1,68 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2011 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; }
+
+$core->addBehavior('publicHeadContent',array('tplDuctileTheme','publicHeadContent'));
+
+class tplDuctileTheme
+{
+	public static function publicHeadContent($core)
+	{
+		echo 
+			'<style type="text/css">'."\n".
+			'/* Additionnal style directives */'."\n".
+			self::ductileStyleHelper().
+			"</style>\n";
+	}
+	
+	public static function ductileStyleHelper()
+	{
+		$s = $GLOBALS['core']->blog->settings->themes->ductile_style;
+
+		if ($s === null) {
+			return;
+		}
+
+		$s = @unserialize($s);
+		if (!is_array($s)) {
+			return;
+		}
+
+		$css = array();
+
+		# Properties
+
+		self::prop($css,'a','color',$s['body_link_c']);
+		self::prop($css,'a:visited','color',$s['body_link_v_c']);
+		self::prop($css,'a:hover, a:focus, a:active','color',$s['body_link_f_c']);
+
+		$res = '';
+		foreach ($css as $selector => $values) {
+			$res .= $selector." {\n";
+			foreach ($values as $k => $v) {
+				$res .= $k.':'.$v.";\n";
+			}
+			$res .= "}\n";
+		}
+
+		return $res;
+	}
+
+	protected static function prop(&$css,$selector,$prop,$value)
+	{
+		if ($value) {
+			$css[$selector][$prop] = $value;
+		}
+	}
+}
+?>
Index: themes/ductile/locales/fr/main.po
===================================================================
--- themes/ductile/locales/fr/main.po	(revision 357)
+++ themes/ductile/locales/fr/main.po	(revision 357)
@@ -0,0 +1,2 @@
+msgid "Style sheet upgraded."
+msgstr "Feuille de style mise à jour."
Index: themes/ductile/mediaqueries.css
===================================================================
--- themes/ductile/mediaqueries.css	(revision 367)
+++ themes/ductile/mediaqueries.css	(revision 367)
@@ -0,0 +1,237 @@
+@charset "UTF-8";
+
+/* seuils retenus :
+480px
+640px
+1024px
+1280px
+----------------- */
+
+@media only screen and (max-width:480px) {
+	#prelude, #blogdesc, #supranav span {
+		display: none !important;
+		}
+
+	h1 {
+		font-size: 1.8em;
+		}
+	h1 a {
+		display: block;
+		padding: 6px 8px;
+		background: #f4f4f5;
+		background: -webkit-gradient(linear, left top, left bottom, from(#f4f4f5), to(#d7d7dC));
+		background: -moz-linear-gradient(top,  #f4f4f5,  #d7d7dC);
+		border-right: 1px solid #aaa;
+		border-bottom: 1px solid #ccc;
+		}
+
+	#supranav {
+		border:none;
+		margin: 8px 0 0;
+		}
+	#supranav li a {
+		border-right: 0;
+		display: block;
+		padding: 4px 8px;
+		border-bottom: 1px solid #ccc;
+		}
+
+	h2.post-title {
+		font-size: 2.5em;
+		}
+
+	#stickers {
+		margin: 0;
+		padding: 0;
+		border-bottom: 8px solid #fff;
+		}
+	#stickers li {
+		position: relative;
+		line-height: 2.5em;
+		margin-left: 0;
+		padding-left: 0;
+		border: 2px solid #fff;
+		border-left: 8px solid #fff;
+		border-right: 8px solid #fff;
+		}
+	#stickers img {
+		display: block;
+		position: absolute;
+		clip: rect(0px,32px,32px,0px);
+		}
+	#stickers span {
+		margin-left: 40px;
+		}
+	#stickers a {
+		text-decoration: none;
+		}
+}
+
+@media only screen and (min-width: 481px) {
+	#top {
+		padding-top: 24px;
+		}
+	h1 {
+		font-size: 2em;
+		padding-right: 240px;
+		padding-bottom: 4px;
+		margin-left: 32px;
+		}
+
+	#supranav {
+		margin: 36px 0 0;
+		border-bottom: 1px solid #ccc;
+		}
+	#supranav li {
+		display: inline;
+		padding: 8px 0;
+		}
+	#supranav li a {
+		display: inline-block;
+		padding: 8px 32px 8px 28px;
+		border-right: 1px solid #ccc;
+	 	}
+	#supranav li a span {
+		display: block;
+		}
+
+	#stickers {
+		position: absolute;
+		top: 0;
+		right: 0;
+		padding-right: 3%;
+		}
+	#stickers li {
+		display: inline;
+		padding: 0 4px;
+		}
+	#stickers li.last {
+		padding-right: 0;
+		}
+	#stickers li span {
+		display: none;
+		}
+	h2.post-title {
+		font-size: 2.8em;
+		}
+	#stickers li a:hover,
+	#stickers li a:active,
+	#stickers li a:focus {
+		background-color: #fff;
+		border-bottom: 4px solid #ad3f4c;
+		}
+}
+
+@media only screen and (max-width:639px) {
+	html {
+		-webkit-text-size-adjust: none;
+		}
+	#wrapper {
+		padding: 0 2%;
+		}
+	img {
+		max-width: 100%;
+		height: auto;
+		width: auto\9; /* pour ie8 */
+		}
+}
+
+@media only screen and (min-width: 640px) and (max-width: 1023px) {
+	#wrapper {
+		padding: 0 10%;
+		}
+	#blognav, #blogextra { 
+		width: 48%; float:left;
+		}
+	#blognav {
+		margin-right: 4%;
+		}
+	#stickers {
+		padding-right: 10%;
+		}
+}
+
+@media only screen and (min-width: 840px) and (max-width: 1023px) {
+	#wrapper {
+		padding: 0 13%;
+		}
+	#stickers {
+		padding-right: 13%;
+		}	
+}
+
+@media only screen and (min-width: 1024px) {
+	#wrapper {
+		padding: 0 7%;
+		}
+	#main {
+		width : 100%;
+		margin : 0 -22% 0 0;
+		float : left;
+		display: inline;
+		}
+	#content {
+		margin : 0 30% 0 0;
+		padding : 0 0 2em 0;
+		}
+	#sidebar {
+		width : 22%;
+		float : right;
+		}
+	#blognav, #blogextra {
+		margin : 0;
+		}
+	#stickers {
+		padding-right: 7%;
+		}
+
+	#sidebar #blognav div:first-child {
+		margin-top: 4.66em;
+		}
+	#sidebar div#search:first-child { 
+		background: none;
+		margin-top: 0;
+		margin-bottom: 2em;
+		padding-bottom: 2px;
+		font-size: 1em;
+		border: 1px solid #ddd;
+		border-top: none 0;
+		}
+	#sidebar div#search:first-child h2 {
+		font-size: 1em;
+		text-transform: uppercase;
+		text-shadow: 0 1px 1px rgba(0,0,0,.2);
+		vertical-align: top;
+		color: #666;
+		}
+	#sidebar div#search p {
+		margin: .33em 0;
+		}
+}
+
+@media only screen and (min-width: 1280px) {
+	#content {
+		margin : 0 30% 0 200px;
+		}
+	p.post-info { 
+		margin-left: -200px; 
+		float: left; 
+		width: 150px; 
+		text-align: right;
+		}
+	.dc-archive-month p.post-info {
+		margin-left: 0;
+		float:none;
+		width: auto;
+		text-align: left;
+		}
+}
+
+@media only screen and (min-width: 1600px) {
+	#wrapper {
+		padding: 0 12%;
+		}
+	#stickers {
+		padding-right: 12%;
+		}
+}
Index: themes/ductile/rebase.css
===================================================================
--- themes/ductile/rebase.css	(revision 308)
+++ themes/ductile/rebase.css	(revision 308)
@@ -0,0 +1,99 @@
+@charset "UTF-8";
+
+html, 
+body {
+	margin: 0;
+	padding: 0;
+	font-size: 100.1%;
+	line-height: 1.5;
+	}
+div, form, fieldset {
+	margin: 0;
+	padding: 0;
+	border: none;
+	}
+h2, h3, h4, h5, h6 {
+	line-height: 1.2;
+	font-weight: bold;
+	margin: 1em 0 .5em 0;
+	}
+h1 {
+	margin: 0;
+	font-weight: normal;
+	}
+h2 {
+	font-size: 1.6em;
+	}
+h3 {
+	font-size: 1.33em;
+	}
+h4 {
+	font-size: 1.2em;
+	}
+h5 {
+	font-size: 1.1em;
+	}
+h6 {
+	font-size: 1.5em;
+	}
+p {
+	margin: 1em 0 .5em 0;
+	}
+img a {
+	border: none;
+	}
+sup, sub {
+	font-size: .7em;
+	line-height: .7em;
+	}
+abbr, acronym {
+	border-bottom: 1px dotted;
+	cursor: help;
+	}
+strong {
+	font-size: .94em;
+	}
+blockquote, q {
+	font-style: italic;
+	}
+blockquote em, q em {
+	font-style: normal;
+	}
+cite {
+	font-size: .9em;
+	}
+ul, ol, dd {
+	margin: 1em 0 .5em 1.5em;
+	}
+ul ul, ol ol {
+	margin-top: .5em;
+	}
+code, pre {
+	font-family: "Andale mono","Courier New", Courier, mono;
+	font-size: .875em;
+	}
+code {
+	padding: 0 2px;
+	}
+pre {
+	margin: 1em;
+	overflow: auto;
+	padding: 1px .5em;
+	line-height: 1.2;
+	}
+hr {
+	height: 1px;
+	border: 0;
+	border-top: 1px solid #aaa;
+	width: 60%;
+	height: 1px;
+	}
+input, button, select {
+	vertical-align: middle;
+	}
+em, i {
+	font-style: italic;
+	}
+strong, b {
+	font-weight: bold;
+	}
Index: themes/ductile/style.css
===================================================================
--- themes/ductile/style.css	(revision 360)
+++ themes/ductile/style.css	(revision 360)
@@ -0,0 +1,726 @@
+@charset "UTF-8";
+
+/* Ductile
+	Dotclear theme by Dotclear Team
+	Version de chantier
+*/
+
+/* Infos
+Plan de cette feuille :
+1. Structure, imports
+2. Liens, html
+3. Page
+4. Haut de page
+5. Wrapper, main, content
+6. Billets
+7. Commentaires et rétroliens
+8. Sidebar
+9. Footer
+10. Classes communes
+11. Pages spécifiques
+12. Clearers
+
+Couleurs :
+Typo: #222 courant, #4c4c85 commentaires
+Liens: #666 courant, #ad3f4c titre billet et Lire la suite
+Fond formulaire comm: #eef
+
+Thanks to:
+Colorzilla wysiwyg gradient editor http://www.colorzilla.com/gradient-editor/
+*/
+
+/* -----------------------------------------------------------------
+	1. STRUCTURE - IMPORTS
+------------------------------------------------------------------ */
+
+@import url(rebase.css);
+@import url(mediaqueries.css);
+
+/* ------------------------------------------------------- body */
+body {
+	background: #fff;
+	font-family: "Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	color: #222;
+	}
+
+/* ------------------------------------------------------------
+	2. LIENS & Complément balises HTML
+------------------------------------------------------------- */
+del {
+	color: #800000;
+	}
+blockquote {
+	border: 2px solid #eef;
+	padding: 1px 1em .5em;
+	}
+code, pre {
+	background: #efefef;
+	border-right: 1px solid #aaa;
+	border-bottom: 1px solid #aaa;
+	font-size: .81em;
+	}
+
+a {
+	color: #666;
+	}
+a:hover, a:focus {
+	background-color: #ebebee;
+	text-decoration: none;
+	}
+
+/* ------------------------------------------------------------
+	3. PAGE
+------------------------------------------------------------- */
+
+#page {
+	position: relative;
+	}
+
+/* ------------------------------------------------------------
+	4. HAUT DE PAGE
+------------------------------------------------------------- */
+#header {
+	text-shadow: 0 1px 1px rgba(0,0,0,.2);
+	line-height: 1;
+	}
+h1 {
+	font-variant: small-caps;
+	}
+h1 a {
+	text-decoration: none;
+	}
+#prelude {
+	position: absolute;
+	margin: 0;
+	top: 0;
+	left: 3px;
+	color: #fff;
+	font-size: .875em;
+	list-style-type: none;
+	}
+#prelude li {
+	display: inline;
+	}
+#prelude a, #prelude a:hover, #prelude a:visited {
+	position:absolute;
+	left:0px;
+	top:-500px;
+	width:1px;
+	height:1px;
+	overflow:hidden;
+	}
+#prelude a:active, #prelude a:focus {
+	position:static;
+	width:auto;
+	height:auto;
+	}
+#blogdesc {
+	margin: 0 0 0 32px;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	font-style: italic;
+	color: #909090;
+	text-shadow: none;
+	}
+#supranav {
+	padding: 0 0 0 4px;
+	list-style-type: none;
+	line-height: 1.25;
+	font-size: .875em;
+	}
+#supranav li {
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	text-transform: uppercase;
+	vertical-align: top;
+	}
+#supranav li a {
+	text-decoration: none;
+	white-space: nowrap;
+	margin-bottom: 4px;
+	-webkit-border-bottom-left-radius: 7px;
+	-moz-border-radius-bottomleft: 7px;
+	border-bottom-left-radius: 7px;	
+	background: transparent url(img/menu.png) no-repeat right top;
+ }
+#supranav li a:hover, #supranav li a:active, #supranav li a:focus {
+	background-color: #ebebee;
+	background-position: right -150px;
+	}
+#supranav li.active a {
+	background-position: right -150px;
+	}
+#supranav li a span {
+	display: block;
+	text-transform: none;
+	text-shadow: none;
+	font-family: georgia;
+	font-style:italic;
+	}
+
+/* ------------------------------------------------------------
+	5. WRAPPER MAIN CONTENT
+------------------------------------------------------------- */
+
+#wrapper { }
+#main { }
+#content { 
+	padding-bottom: 2em; 
+	}
+
+/* ------------------------------------------------------- content-info */
+#content-info {
+	margin-top: 4em;
+	font-size: .875em;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	}
+#content-info h2 { 
+	font-size: 1.2em;
+	}
+#subcategories {
+	font-size: .875em;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	}
+#subcategories h3 { 
+	font-size: 1.1em;
+	font-variant: small-caps;
+	}
+#content-info p, 
+#content-info ul, 
+#subcategories ul { 
+	margin: .5em 0;
+	}
+
+/* ------------------------------------------------------- pagination, navlinks */
+#navlinks, 
+.pagination {
+	margin-bottom: 1em;
+	padding: 4px 8px;
+	text-align: center;
+	font-size: .875em;
+	color: #000;
+	background: rgb(244,244,245);
+	background: -moz-linear-gradient(top, rgba(244,244,245,1) 0%, rgba(215,215,220,1) 100%);
+	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(244,244,245,1)), color-stop(100%,rgba(215,215,220,1)));
+	background: -webkit-linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%);
+	background: -o-linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%);
+	background: -ms-linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f5', endColorstr='#d7d7dc',GradientType=0 );
+	background: linear-gradient(top, rgba(244,244,245,1) 0%,rgba(215,215,220,1) 100%);
+	-moz-border-radius: 4px;
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+	border-right: 1px solid #aaa;
+	border-bottom: 1px solid #ccc;
+	}
+#navlinks {
+	margin-top: 4em;
+	}
+#navlinks a, 
+.pagination a {
+	padding: 0 1em;
+	white-space: nowrap;
+	}
+
+/* ------------------------------------------------------------
+	6. BILLETS
+------------------------------------------------------------- */
+
+.post {
+	background: transparent url(img/filet.png) repeat-x left bottom;
+	}
+.day-date {
+	display: none;
+	}
+h2.post-title {
+	font-weight: normal;
+	margin-bottom: .33em;
+	color: #000;
+	line-height: 1.17;
+	}
+h2.post-title a {
+	font-weight: normal;
+	font-style: italic;
+	text-decoration: none;
+	color: #ad3f4c;
+	}
+.post h3, 
+.post h4, 
+.post h5
+.post h6 {
+	font-variant: small-caps;
+	font-weight: normal;
+	color: #666;
+	}
+.post-info, 
+.post-tags, 
+.post-info-co, 
+.read-it, 
+.page-info {
+	line-height: 1.2;	
+	margin: .33em 0;
+	}
+.post-info, 
+.post-tags {
+	font-size: .875em;
+	padding: 0;
+	}
+.post-info a, 
+.post-tags a, 
+.post-info-co a {
+	white-space: nowrap;
+	}
+.post-tags a {
+	padding-right: 1em;
+	padding-left: 14px;
+	background: #fff no-repeat left center url(img/tag.png);
+	}
+.post-tags li {
+	display: inline;
+	}
+.post-content {
+	padding-bottom: 9px;
+	}
+.post ul {
+	list-style-type: square;
+	}
+.footnotes {
+	font-size: .875em;
+	}
+.read-it {
+	text-align: right;
+	margin: 0 0 .25em 0;
+	}
+.read-it a {
+	color: #ad3f4c;
+	}
+.post-info-co, 
+.page-info {
+	margin: 0;
+	background: #fff;
+	display: inline;
+	font-size: 0.875em;
+	font-style: italic;
+	padding-right: .5em;
+	}
+.post-info-co a {
+	text-decoration: none;
+	padding-right: 1em;
+	padding-left: 28px;
+	background-color: #fff;
+	background-repeat: no-repeat;
+	background-position: left center;
+	}
+.post-info-co a.comment_count {
+	background-image: url(img/comment.png);
+	}
+.post-info-co a.ping_count {
+	background-image: url(img/ping.png);
+	}
+.post-info-co a.attach_count {
+	background-image: url(img/attach.png);	
+	}
+#attachments {
+	font-size: .875em;
+	border-bottom: 1px solid #999;
+	margin: 0 0 2em;
+	}
+#attachments h3 {
+	font-variant: small-caps;
+	font-weight: normal;
+	color: #666;
+	}
+#attachments ul {
+	list-style-type: none;
+	margin: 0 0 1em;
+	padding: 0;
+	}
+#attachments ul li {
+	padding-left: 24px;
+	background: #fff url(img/download.png) no-repeat;
+	}
+
+/* ------------------------------------------------------------
+	7. COMMENTAIRES, PINGS
+------------------------------------------------------------- */
+
+/* ------------------------------------------------------- commentaires et rétroliens */
+#comments, 
+#pings, 
+#comment-form,
+#comments-feed { 
+	color: #4c4c85;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	font-size: .875em;
+	}
+#comment-form {
+	padding: 1em;
+	background: #eef;
+	margin-top: 1em;
+	color: #333;
+	border: 1px solid #ddf;
+	}
+#pr {
+	padding: 1em;
+	border: 1px dashed #4c4c85;
+	margin-bottom: 1em;
+	}
+#comments h3, 
+#pings h3, 
+#pr h3, 
+#comment-form h3 { 
+	margin-top: 2em;
+	color: #666;
+	}
+#comment-form h3 {
+	margin-top: 0;
+	}
+#comments dl { }
+#comments dt { 
+	padding-bottom: .2em;
+	border-bottom: 1px solid #ccc;
+	margin-top: 1.5em;
+	line-height: 1.1;
+	}
+#comments dd { }
+#comments .first { }
+#comments .odd { }
+#comments .me { 
+	font-family: "Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	color: #333;
+	font-size: 1.14em;
+	}
+a.comment-number {
+	font-size: 2em;
+	font-weight: normal;
+	font-style: italic;
+	text-decoration: none;
+	font-family: "Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	color: #909090;
+	}
+
+#pings dl { }
+#pings dt { 
+	border-bottom: 1px solid #ccc;
+	margin-top: 1.5em;
+	line-height: 1.1;
+	padding-bottom: .2em;
+	}
+#pings dd { }
+#pings .first { }
+#pings .odd { }
+
+#pr dl { }
+#pr dd { }
+
+/* ------------------------------------------------------- formulaire des commentaires */
+#comment-form fieldset { }
+.field { 
+	margin-bottom: 1em;
+	}
+.field label { 
+	display: block;
+	font-size: .875em;
+	color: #666;
+	text-indent: 6px;
+	}
+.field input, 
+.field textarea {
+	display: block;
+	font-size: 100%;
+	border: 1px solid #ccc;
+	text-indent: 4px;
+	background: #fff;
+	-webkit-border-radius: 3px; 
+	-moz-border-radius: 3px;
+	border-radius: 3px;
+	}
+.field textarea { 
+	font-family: sans-serif;
+	padding: .5em 1em;	
+	}
+.field input:focus, 
+.field textarea:focus {
+	background: #fff;
+	}
+#comment-form input[type=submit], 
+#comment-form input[type=reset] {
+	font-size: .875em;
+	display: inline-block;
+	text-transform: capitalize;
+	font-weight: bold;
+	text-align: center;
+	padding: .33em .66em;
+	text-shadow: 0 1px 1px rgba(0,0,0,.3);
+	-webkit-border-radius: 5px; 
+	-moz-border-radius: 5px;
+	border-radius: 5px;
+	border: solid 1px #777;
+	-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	-moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	background: rgb(119,119,119);
+	background: -moz-linear-gradient(top, rgba(119,119,119,1) 0%, rgba(85,85,85,1) 100%);
+	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(119,119,119,1)), color-stop(100%,rgba(85,85,85,1)));
+	background: -webkit-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%);
+	background: -o-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%);
+	background: -ms-linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#777777', endColorstr='#555555',GradientType=0 );
+	color: #eee;
+	}
+#comment-form input[type=submit]:hover, #comment-form input[type=submit]:focus,
+#comment-form input[type=reset]:hover, #comment-form input[type=reset]:focus {
+	background: linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%);
+	background: rgb(85,85,85);
+	background: -moz-linear-gradient(top, rgba(85,85,85,1) 0%, rgba(119,119,119,1) 100%);
+	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(85,85,85,1)), color-stop(100%,rgba(119,119,119,1)));
+	background: -webkit-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%);
+	background: -o-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%);
+	background: -ms-linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%);
+	filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#555555', endColorstr='#777777',GradientType=0 );
+	background: linear-gradient(top, rgba(85,85,85,1) 0%,rgba(119,119,119,1) 100%);
+	text-decoration: none;
+	}
+#c_content {
+	width: 95%;
+	padding: 4px;
+	}
+
+.form-help { 
+	margin-top: 0;
+	font-size: .875em;
+	font-style: italic;
+	}
+
+#ping-url { 
+	background: #efefef;
+	border-right: 1px solid #aaa;
+	border-bottom: 1px solid #aaa;
+	font-size: .81em;
+	padding-left: .5em;
+	}
+#comments-feed { 
+	margin-top: 2em; 
+	}
+
+/* ------------------------------------------------------------
+	8. SIDEBAR
+------------------------------------------------------------- */
+
+#sidebar {
+	font-size: 0.875em;
+	}
+#sidebar h2 {
+	font-size: 1.1em;
+	margin: 0;
+	font-weight: normal;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	color: #333;
+	}
+#sidebar h3 {
+	font-size: 1em;
+	margin-bottom: 0;
+	font-weight: normal;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	color: #333;
+	}
+#sidebar ul {
+	margin: .75em 0 .5em 4px;
+	list-style-type: none;
+	padding: 0;
+	}
+#sidebar ul li ul {
+	margin-top: .5em;
+	}
+#sidebar ul li {
+	padding-left: 16px;
+	background: transparent url(img/square.png) no-repeat 0 .5em;
+	}
+#sidebar ul li ul li {
+	background-image: url(img/square2.png);
+	}
+#sidebar ul li ul li ul li {
+	background-image: url(img/square3.png);
+	}
+#sidebar .syndicate ul li {
+	background-image: none;
+	padding-left: 0;
+}
+#blognav > div, 
+#blogextra > div {
+	background: #f3f2e9;
+	margin-bottom: 1em;
+	padding: 4px 8px;
+	-webkit-box-shadow: 2px 2px 4px rgba(0,0,0,.2);
+	-moz-box-shadow: 2px 2px 4px rgba(0,0,0,.2);
+	-o-box-shadow: 2px 2px 4px rgba(0,0,0,.2);
+	box-shadow: 2px 2px 4px rgba(0,0,0,.2);
+	}
+	
+/* ------------------------------------------------------- recherche */
+#search p {
+	background: #fff; 
+	text-align: right;
+	border: 1px solid #ddd;
+	vertical-align: middle;
+	padding: 0;
+	}
+#search input { 
+	margin: 0;
+	border: none;
+	background: transparent;
+	height: auto;
+	line-height: 2em;
+	}
+#search #q {
+	float: left;
+	width: 78%;
+	font-size: 100%;
+	padding-left: 2px;
+	}
+#search #q:focus {
+	background: #fcfcf9;
+	}
+#search .submit {
+	background: #706F6F;
+	color: #fff;
+	vertical-align: top;
+	width: 20%;
+	font-variant: small-caps;
+	height: 2em;
+	}
+#search .submit:hover, 
+#search .submit:focus {
+	background: #333;
+	}
+	
+/* ------------------------------------------------------------
+	9. FOOTER
+------------------------------------------------------------- */
+
+#footer {
+	clear: both;
+	background: #686867;
+	color: #fff;
+	}
+#footer p {
+	padding: .66em 2em;
+	margin: 0;
+	text-align: right;
+	font-size: .875em;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	}
+#footer a {
+	color: #fff;
+	}
+#footer a:hover, 
+#footer a:focus {
+	background: #686867;
+	}
+#stickers {
+	list-style-type: none;
+	margin: 0;
+	}
+	
+/* ------------------------------------------------------------
+	10. CLASSES COMMUNES
+------------------------------------------------------------- */
+
+/* ------------------------------------------------------- RSS */
+.feed { 
+	padding-left: 20px;
+	background : transparent url(img/feed.png) no-repeat left center;
+	}
+
+/* ------------------------------------------------------- tags */	
+.dc-tags .content-inner, 
+.dc-tags .content-inner ul {
+	font-size: 1.25em;
+	margin: 0;
+	padding: 0;
+	}
+.dc-tags #content ul li, 
+.dc-tags #content ul li a, 
+#sidebar .tags ul li, 
+#sidebar .tags ul li a {
+	display : inline;
+	width : auto;
+	padding-left : 0;
+	padding-right : .5em;
+	background-color : transparent;
+	background-image: none;
+	text-decoration: none;
+	line-height : 1.5em;
+	}
+.tags ul li a:hover {
+	background-image :none;
+	}
+.dc-tags .tag0, .tags .tag0 { font-size: 85%; }
+.dc-tags .tag10, .tags .tag10 { font-size: 90%; }
+.dc-tags .tag20, .tags .tag20 { font-size: 95%; }
+.dc-tags .tag30, .tags .tag30 { font-size: 100%; }
+.dc-tags .tag40, .tags .tag40 { font-size: 105%; }
+.dc-tags .tag50, .tags .tag50 { font-size: 110%; }
+.dc-tags .tag60, .tags .tag60 { font-size: 115%; }
+.dc-tags .tag70, .tags .tag70 { font-size: 120%; }
+.dc-tags .tag80, .tags .tag80 { font-size: 125%; }
+.dc-tags .tag90, .tags .tag90 { font-size: 130%; }
+.dc-tags .tag100, .tags .tag100 { font-size: 135%; }
+
+/* ------------------------------------------------------- messages d'erreur */
+.error {
+	border : 1px solid #c44;
+	background : #df0;
+	padding : 0.5em;
+	}
+.error ul {
+	padding-left : 20px;
+	}
+.error li {
+	list-style : square;
+	}
+
+/* ------------------------------------------------------- class à dispo pour billets */
+.left { float: left; margin-right : 1em; }
+.right { float: right; margin-left : 1em; }
+.center { margin-left : auto; margin-right : auto; }
+.left-text { text-align : left; }
+.right-text { text-align : right; }
+.center-text { text-align : center; }
+.little-text { font-size : .875em;}
+.little-upper-text { font-size : .875em; text-transform : uppercase; }
+
+
+/* ------------------------------------------------------------
+	11. PAGES SPECIFIQUES
+------------------------------------------------------------- */
+
+.dc-home { }
+.dc-post { }
+.dc-category { }
+.dc-archive { }
+.dc-archive-month h2.post-title {
+	font-size: 1.3em;
+	}
+.dc-archive { }
+.dc-tags { }
+.dc-tag { }
+.dc-404 { }
+.dc-search { }
+
+
+/* ---------------------------------------------------
+  12. ET POUR FINIR NE PAS OUBLIER LES CLEARERS
+--------------------------------------------------- */
+.post, 
+.footnotes, 
+#attachments, 
+.post-info-co, 
+#comments, #footer {
+	clear:both;
+	}
+
+/* ================================================ 
+	personnalisations blog chantier
+================================================ */
+.post-content img, .post-excerpt img {
+	border: 1px solid #ccc;
+	}
Index: themes/ductile/tpl/_footer.html
===================================================================
--- themes/ductile/tpl/_footer.html	(revision 359)
+++ themes/ductile/tpl/_footer.html	(revision 359)
@@ -0,0 +1,16 @@
+<div id="footer">
+
+<!-- Pour Franck: 
+Bien penser à appliquer une classe "last" au dernier item
+-->
+
+	<ul id="stickers">
+		<li id="sticker1"><a href="{{tpl:BlogURL}}pages/Contact"><img src="{{tpl:BlogThemeURL}}/img/sticker-contact.png" alt="Contact" /><span>Contact</span></a></li>
+		<li id="sticker2"><a href="{{tpl:BlogURL}}feed/atom"><img src="{{tpl:BlogThemeURL}}/img/sticker-feed.png" alt="S'abonner aux billets" /><span>Abonnement</span></a></li>
+		<li id="sticker3" class="last"><a href="{{tpl:BlogURL}}pages/About"><img src="{{tpl:BlogThemeURL}}/img/sticker-about.png" alt="À propos" /><span>À propos</span></a></li>
+	</ul>
+
+  <p>{{tpl:SysPoweredBy}}</p>
+</div>
+
+{{tpl:SysBehavior behavior="publicFooterContent"}}
Index: themes/ductile/tpl/_head.html
===================================================================
--- themes/ductile/tpl/_head.html	(revision 354)
+++ themes/ductile/tpl/_head.html	(revision 354)
@@ -0,0 +1,18 @@
+<!-- media queries -->
+	<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />
+<!--[if lt IE 9]>
+	<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
+<![endif]-->
+
+<style type="text/css" media="screen">
+@import url({{tpl:BlogThemeURL}}/style.css);
+</style>
+<style type="text/css" media="print">
+@import url({{tpl:BlogThemeURL}}/../default/print.css);
+</style>
+
+<script type="text/javascript" src="{{tpl:BlogThemeURL}}/../default/js/jquery.js"></script>
+<script type="text/javascript" src="{{tpl:BlogThemeURL}}/../default/js/jquery.cookie.js"></script>
+
+{{tpl:include src="user_head.html"}}
+{{tpl:SysBehavior behavior="publicHeadContent"}}
Index: themes/ductile/tpl/_top.html
===================================================================
--- themes/ductile/tpl/_top.html	(revision 367)
+++ themes/ductile/tpl/_top.html	(revision 367)
@@ -0,0 +1,33 @@
+<div id="header">
+
+	<ul id="prelude">
+		<li><a href="#main">{{tpl:lang To content}}</a></li>
+		<li><a href="#blognav">{{tpl:lang To menu}}</a></li>
+		<li><a href="#search">{{tpl:lang To search}}</a></li>
+	</ul>
+
+	<div id="top">
+  	<h1><span><a href="{{tpl:BlogURL}}">{{tpl:BlogName encode_html="1"}}</a></span></h1>
+
+		<!-- Pour Franck: 
+		Il faudrait trouver un moyen pour que 
+		1. la balise <p /> ne soit présente que si la description est non vide
+		2. que l'utilisateur puisse indiquer si oui ou non il souhaite afficher la description (?)
+		-->
+		<p id="blogdesc">{{tpl:BlogDescription}}</p>
+
+	<!-- # --BEHAVIOR-- publicTopAfterContent -->
+	{{tpl:SysBehavior behavior="publicTopAfterContent"}}
+	</div>
+
+	<!-- Pour Franck: 
+	Ajouter un id incrémental
+	Par défaut : accueil, archives (rien dans le span)
+	-->
+	<ul id="supranav">
+		<li id="li1" class="active"><a href="{{tpl:BlogURL}}">Accueil<span> articles récents</span></a></li>
+		<li id="li2"><a href="#">Construire un thème<span> tutoriels</span></a></li>
+		<li id="li3"><a href="#">Maquettes<span> projets graphiques</span></a></li>
+		<li id="li4"><a href="{{tpl:BlogURL}}archive">Archives<span> 2005-2011</span></a></li>
+	</ul>
+</div>
