Index: .hgignore
===================================================================
--- .hgignore	(revision 14)
+++ .hgignore	(revision 683)
@@ -2,2 +2,8 @@
 inc/config.php
 \.htaccess
+public/filters
+themes/ductile/_work
+themes/ductile-work
+themes/ductile/default-templates
+themes/ductileMag
+themes/ductileFocus
Index: .hgsubstate
===================================================================
--- .hgsubstate	(revision 721)
+++ .hgsubstate	(revision 705)
@@ -1,1 +1,1 @@
-7678a853f5010e67dabd34a793f990bf688f287d inc/libs/clearbricks
+d2607553bf3fadbe711012ee39c30a7d55b45d59 inc/libs/clearbricks
Index: .hgtags
===================================================================
--- .hgtags	(revision 279)
+++ .hgtags	(revision 369)
@@ -1,1 +1,2 @@
 ec077f3c6b20bc6f7f40a113acaff0220457a2c4 2.3.0
+4e0137ddb12474d62b88c4966d5895a391b6d382 2.3.1
Index: CHANGELOG
===================================================================
--- CHANGELOG	(revision 331)
+++ CHANGELOG	(revision 372)
@@ -2,4 +2,13 @@
 ===========================================================
 * handling of postgres non default schemas (db_prefix = 'schema.prefix')
+
+Dotclear 2.3.1 - 2001-06-14
+===========================================================
+* Updated makefile for cleaner distrib.
+* Better localization handling for prefs and shortcuts.
+* Misc JS & CSS cleaning.
+* Import/Export preferences-related bugfix.
+* Administrative mail address is now configurable.
+* Security: one minor fix and changes for two potential problems. Thanks to Jeremie Boutoille
 
 Dotclear 2.3.0 - 2011-05-16
Index: Makefile
===================================================================
--- Makefile	(revision 288)
+++ Makefile	(revision 707)
@@ -38,4 +38,5 @@
 	./plugins/akismet \
 	./plugins/antispam \
+	./plugins/attachments \
 	./plugins/blogroll \
 	./plugins/blowupConfig \
@@ -46,4 +47,5 @@
 	./plugins/pages \
 	./plugins/pings \
+	./plugins/simpleMenu \
 	./plugins/themeEditor \
 	./plugins/userPref \
@@ -54,4 +56,8 @@
 	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)/
@@ -59,4 +65,5 @@
 	## Pack javascript files
 	find $(DC)/admin/js/*.js -exec ./build-tools/min-js.php \{\} \;
+	find $(DC)/admin/js/ie7/*.js -exec ./build-tools/min-js.php \{\} \;
 	find $(DC)/admin/js/jquery/*.js -exec ./build-tools/min-js.php \{\} \;
 	find $(DC)/admin/js/jsToolBar/*.js -exec ./build-tools/min-js.php \{\} \;
Index: admin/auth.php
===================================================================
--- admin/auth.php	(revision 270)
+++ admin/auth.php	(revision 550)
@@ -22,5 +22,6 @@
 # That's a tricky hack but it works ;)
 $dlang = http::getAcceptLanguage();
-if ($dlang != 'en')
+$dlang = ($dlang == '' ? 'en' : $dlang);
+if ($dlang != 'en' && preg_match('/^[a-z]{2}(-[a-z]{2})?$/',$dlang))
 {
 	l10n::set(dirname(__FILE__).'/../locales/'.$dlang.'/main');
@@ -89,5 +90,5 @@
 		$page_url.'?akey='.$recover_key;
 		
-		$headers[] = 'From: dotclear@'.$_SERVER['HTTP_HOST'];
+		$headers[] = 'From: '.(defined('DC_ADMIN_MAILFROM') && DC_ADMIN_MAILFROM ? DC_ADMIN_MAILFROM : 'dotclear@local');
 		$headers[] = 'Content-Type: text/plain; charset=UTF-8;';
 		
@@ -125,6 +126,21 @@
 }
 # Change password and retry to log
-elseif ($change_pwd and $data = unserialize(base64_decode($_POST['login_data'])))
-{
+elseif ($change_pwd)
+{
+	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;
@@ -141,6 +157,4 @@
 	}
 	
-	try
-	{
 		if (!$core->auth->allowPassChange() || !$check_user) {
 			$change_pwd = false;
@@ -165,9 +179,5 @@
 		$_SESSION['sess_browser_uid'] = http::browserUID(DC_MASTER_KEY);
 		
-		if (!empty($data['blog_id'])) {
-			$_SESSION['sess_blog_id'] = $data['blog_id'];
-		}
-		
-		if (!empty($data['user_remember']))
+		if ($data['user_remember'])
 		{
 			setcookie('dc_admin',$data['cookie_admin'],strtotime('+15 days'),'','',DC_ADMIN_SSL);
@@ -192,10 +202,9 @@
 	if ($check_user && $core->auth->mustChangePassword())
 	{
-		$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'])
-		)));
+		$login_data = join('/',array(
+			base64_encode($user_id),
+			$cookie_admin,
+			empty($_POST['user_remember'])?'0':'1'
+		));
 		
 		if (!$core->auth->allowPassChange()) {
@@ -248,10 +257,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="en" lang="en">
+xml:lang="<?php echo $dlang; ?>" lang="<?php echo $dlang; ?>">
 <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="en" />
+  <meta http-equiv="Content-Language" content="<?php echo $dlang; ?>" />
   <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />
   <meta name="GOOGLEBOT" content="NOSNIPPET" />
@@ -263,7 +272,6 @@
 ?>
   
-  <style type="text/css">
-  @import url(style/default.css); 
-  </style>
+	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />
+	 
   <?php
   # --BEHAVIOR-- loginPageHTMLHead
@@ -295,5 +303,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();
@@ -326,11 +334,11 @@
 	echo
 	'<fieldset><legend>'.__('Request a new password').'</legend>'.
-	'<p><label for="user_id">'.__('Username:').' '.
-	form::field(array('user_id','user_id'),20,32,html::escapeHTML($user_id),'',1).'</label></p>'.
-	
-	'<p><label for="user_email">'.__('Email:').' '.
-	form::field(array('user_email','user_email'),20,255,html::escapeHTML($user_email),'',2).'</label></p>'.
-	
-	'<p><input type="submit" value="'.__('recover').'" tabindex="3" />'.
+	'<p><label for="user_id">'.__('Username:').'</label> '.
+	form::field(array('user_id','user_id'),20,32,html::escapeHTML($user_id)).'</p>'.
+	
+	'<p><label for="user_email">'.__('Email:').'</label> '.
+	form::field(array('user_email','user_email'),20,255,html::escapeHTML($user_email)).'</p>'.
+	
+	'<p><input type="submit" value="'.__('recover').'" />'.
 	form::hidden(array('recover'),1).'</p>'.
 	'</fieldset>'.
@@ -343,9 +351,9 @@
 	echo
 	'<fieldset><legend>'.__('Change your password').'</legend>'.
-	'<p><label for="new_pwd">'.__('New password:').' '.
-	form::password(array('new_pwd','new_pwd'),20,255,'','',1).'</label></p>'.
-	
-	'<p><label for="new_pwd_c">'.__('Confirm password:').' '.
-	form::password(array('new_pwd_c','new_pwd_c'),20,255,'','',2).'</label></p>'.
+	'<p><label for="new_pwd">'.__('New password:').'</label> '.
+	form::password(array('new_pwd','new_pwd'),20,255).'</p>'.
+	
+	'<p><label for="new_pwd_c">'.__('Confirm password:').'</label> '.
+	form::password(array('new_pwd_c','new_pwd_c'),20,255).'</p>'.
 	'</fielset>'.
 	
@@ -361,7 +369,6 @@
 	else
 	{
-		echo
-		'<fieldset>';
 		if ($safe_mode) {
+			echo '<fieldset>';
 			echo '<legend>'.__('Safe mode login').'</legend>';
 			echo 
@@ -371,16 +378,21 @@
 				'</p>';
 		}
+		else {
+			echo '<div class="fieldset">';
+		}
+
 		echo
-		'<p><label for="user_id">'.__('Username:').' '.
-		form::field(array('user_id','user_id'),20,32,html::escapeHTML($user_id),'',1).'</label></p>'.
-		
-		'<p><label for="user_pwd">'.__('Password:').' '.
-		form::password(array('user_pwd','user_pwd'),20,255,'','',2).'</label></p>'.
-		
-		'<p><label for="user_remember" class="classic">'.
-		form::checkbox(array('user_remember','user_remember'),1,'','',3).' '.
+		'<p><label for="user_id">'.__('Username:').'</label> '.
+		form::field(array('user_id','user_id'),20,32,html::escapeHTML($user_id)).'</p>'.
+		
+		'<p><label for="user_pwd">'.__('Password:').'</label> '.
+		form::password(array('user_pwd','user_pwd'),20,255).'</p>'.
+		
+		'<p>'.
+		form::checkbox(array('user_remember','user_remember'),1).
+		'<label for="user_remember" class="classic">'.
 		__('Remember my ID on this computer').'</label></p>'.
 		
-		'<p><input type="submit" value="'.__('log in').'" tabindex="4" /></p>';
+		'<p><input type="submit" value="'.__('log in').'" /></p>';
 		
 		if (!empty($_REQUEST['blog'])) {
@@ -388,9 +400,12 @@
 		}
 		if($safe_mode) {
-			echo form::hidden('safe_mode',1);
-		}
-		
+			echo 
+			form::hidden('safe_mode',1).
+			'</fieldset>';
+		}
+		else {
+			echo '</div>';
+		}
 		echo
-		'</fieldset>'.
 		'<p id="cookie_help" class="error">'.__('You must accept cookies in order to use the private area.').'</p>';
 
Index: admin/blog.php
===================================================================
--- admin/blog.php	(revision 270)
+++ admin/blog.php	(revision 565)
@@ -70,9 +70,8 @@
 	
 	echo
-	'<h2><a href="blogs.php">'.__('Blogs').'</a> &rsaquo; '.__('New blog').'</h2>'.
+	'<h2><a href="blogs.php">'.__('Blogs').'</a> &rsaquo; <span class="page-title">'.__('New blog').'</span></h2>'.
 	
-	'<form action="blog.php" method="post" id="blog-form">'.
+	'<form action="blog.php" method="post" id="blog-form" class="fieldset">'.
 	
-	'<fieldset><legend>'.__('Blog details').'</legend>'.
 	$core->formNonce().
 	'<p><label class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Blog ID:').' '.
@@ -89,7 +88,6 @@
 	'<p class="area"><label for="blog_desc">'.__('Blog description:').'</label> '.
 	form::textarea('blog_desc',60,5,html::escapeHTML($blog_desc)).'</p>'.
-	'</fieldset>'.
 	
-	'<p><input type="submit" accesskey="s" value="'.__('Save').'" /></p>'.
+	'<p><input type="submit" accesskey="s" value="'.__('Create').'" /></p>'.
 	'</form>';
 
Index: admin/blog_del.php
===================================================================
--- admin/blog_del.php	(revision 270)
+++ admin/blog_del.php	(revision 500)
@@ -16,4 +16,5 @@
 
 $blog_id = '';
+$blog_name = '';
 
 if (!empty($_POST['blog_id']))
@@ -29,4 +30,5 @@
 	} else {
 		$blog_id = $rs->blog_id;
+		$blog_name = $rs->blog_name;
 	}
 }
@@ -52,8 +54,8 @@
 {
 	echo
-	'<h2>'.__('Delete a blog').'</h2>'.
+	'<h2 class="page-title">'.__('Delete a blog').'</h2>'.
 	'<p class="message">'.__('Warning').'</p>'.
 	'<p>'.sprintf(__('You are about to delete the blog %s. Every entry, comment and category will be deleted.'),
-	'<strong>'.$blog_id.'</strong>').'</p>'.
+	'<strong>'.$blog_id.' ('.$blog_name.')</strong>').'</p>'.
 	'<p>'.__('Please give your password to confirm the blog deletion.').'</p>';
 	
Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 270)
+++ admin/blog_pref.php	(revision 557)
@@ -243,6 +243,6 @@
 {
 	echo '<h2>'.(!$standalone ? '<a href="blogs.php">'.__('Blogs').'</a> &rsaquo; ' : '').
-	html::escapeHTML($blog_name).' &rsaquo; '.
-	__('Blog settings').'</h2>';
+	html::escapeHTML($blog_name).' &rsaquo; <span class="page-title">'.
+	__('Blog settings').'</span></h2>';
 	
 	if (!empty($_GET['add'])) {
@@ -528,5 +528,5 @@
 					echo
 					' - <a href="permissions.php?blog_id[]='.$blog_id.'&amp;user_id[]='.$k.'">'
-					.__('change permissions').'</a>';
+					.__('Change permissions').'</a>';
 				}
 				
Index: admin/blog_theme.php
===================================================================
--- admin/blog_theme.php	(revision 270)
+++ admin/blog_theme.php	(revision 719)
@@ -156,5 +156,9 @@
 	
 	$radio_id = 'theme_'.html::escapeHTML($id);
-	$theme_url = http::concatURL($core->blog->url,$core->blog->settings->system->themes_url.'/'.$id);
+	if (preg_match('#^http(s)?://#',$core->blog->settings->system->themes_url)) {
+		$theme_url = http::concatURL($core->blog->settings->system->themes_url,'/'.$id);
+	} else {
+		$theme_url = http::concatURL($core->blog->url,$core->blog->settings->system->themes_url.'/'.$id);
+	}
 	$has_conf = file_exists(path::real($core->blog->themes_path.'/'.$id).'/_config.php');
 	$has_css = file_exists(path::real($core->blog->themes_path.'/'.$id).'/style.css');
@@ -190,5 +194,5 @@
 	'<div class="theme-actions">';
 		if ($current && $has_conf) {
-			$res .= '<p><a href="blog_theme.php?conf=1" class="button">'.__('Theme configuration').'</a></p>';
+			$res .= '<p><a href="blog_theme.php?conf=1" class="button">'.__('Configure theme').'</a></p>';
 		}
 		if ($current) {
@@ -203,5 +207,5 @@
 }
 
-dcPage::open(__('Blog themes'),
+dcPage::open(__('Blog appearance'),
 	(!$theme_conf_mode ? dcPage::jsLoad('js/_blog_theme.js') : '').
 	dcPage::jsPageTabs($default_tab).
@@ -212,5 +216,5 @@
 {
 	echo
-	'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Blog appearance').'</h2>';
+	'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Blog appearance').'</span></h2>';
 	
 	if (!empty($_GET['upd'])) {
@@ -265,8 +269,8 @@
 	'<div class="two-cols clear" id="themes-actions">'.
 	$core->formNonce().
-	'<p class="col"><input type="submit" name="select" value="'.__('use selected theme').'" /></p>';
+	'<p class="col"><input type="submit" name="select" value="'.__('Use selected theme').'" /></p>';
 	
 	if ($can_install) {
-		echo '<p class="col right"><input type="submit" class="delete" name="remove" value="'.__('delete selected theme').'" /></p>';
+		echo '<p class="col right"><input type="submit" class="delete" name="remove" value="'.__('Delete selected theme').'" /></p>';
 	}
 	
@@ -327,19 +331,26 @@
 {
 	$theme_name = $core->themes->moduleInfo($core->blog->settings->system->theme,'name');
+	$core->themes->loadModuleL10Nresources($core->blog->settings->system->theme,$_lang);
 	echo
 	'<h2>'.html::escapeHTML($core->blog->name).
-	' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; '.__('Theme configuration').'</h2>'.
+	' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Theme configuration').'<span class="page-title"></h2>'.
 	'<p><a class="back" href="blog_theme.php">'.__('back').'</a></p>';
 	
 	try
 	{
-		echo '<form id="theme_config" action="blog_theme.php?conf=1" method="post" enctype="multipart/form-data">';
-		
+		# Let theme configuration set their own form(s) if required
+		$standalone_config = (boolean) $core->themes->moduleInfo($core->blog->settings->system->theme,'standalone_config');
+
+		if (!$standalone_config)
+			echo '<form id="theme_config" action="blog_theme.php?conf=1" method="post" enctype="multipart/form-data">';
+
 		include $theme_conf_file;
-		
-		echo
-		'<p class="clear"><input type="submit" value="'.__('Save').'" />'.
-		$core->formNonce().'</p>'.
-		'</form>';
+
+		if (!$standalone_config)
+			echo
+			'<p class="clear"><input type="submit" value="'.__('Save').'" />'.
+			$core->formNonce().'</p>'.
+			'</form>';
+
 	}
 	catch (Exception $e)
Index: admin/blogs.php
===================================================================
--- admin/blogs.php	(revision 270)
+++ admin/blogs.php	(revision 500)
@@ -79,5 +79,5 @@
 }
 
-echo '<h2>'.__('List of blogs').'</h2>';
+echo '<h2 class="page-title">'.__('List of blogs').'</h2>';
 
 if (!$core->error->flag())
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 270)
+++ admin/categories.php	(revision 560)
@@ -68,5 +68,5 @@
 }
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Categories').'</h2>';
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Categories').'</span></h2>';
 
 $rs = $core->blog->getCategories(array('post_type'=>'post'));
@@ -131,10 +131,10 @@
 while ($rs->fetch()) {
 	echo '<option value="'.$rs->cat_id.'">'.
-		str_repeat('&nbsp;&nbsp;',$rs->level-1).($categories->level-1 == 0 ? '' : '&bull; ').
+		str_repeat('&nbsp;&nbsp;',$rs->level-1).($rs->level-1 == 0 ? '' : '&bull; ').
 		html::escapeHTML($rs->cat_title).'</option>';
 }
 echo
 '</select></label></p>'.
-'<p><input type="submit" value="'.__('Save').'" /></p>'.
+'<p><input type="submit" value="'.__('Create').'" /></p>'.
 $core->formNonce().
 '</fieldset>'.
@@ -167,5 +167,5 @@
 		'<p><label for="del_cat">'.__('Choose a category to remove:').' '.
 		form::combo('del_cat',$deletable).'</label></p> '.
-		'<p><input type="submit" value="'.__('ok').'" /></p>'.
+		'<p><input type="submit" value="'.__('Delete').'" class="delete" /></p>'.
 		$core->formNonce().
 		'</fieldset>'.
Index: admin/category.php
===================================================================
--- admin/category.php	(revision 270)
+++ admin/category.php	(revision 500)
@@ -179,5 +179,5 @@
 }
 
-echo $title.'</h2>';
+echo '<span class="page-title">'.$title.'</span></h2>';
 
 echo
@@ -185,5 +185,5 @@
 '<fieldset><legend>'.__('Category information').'</legend>'.
 '<p><label class="required" for="cat_title"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').' '.
-form::field('cat_title',40,255,html::escapeHTML($cat_title),'',2).
+form::field('cat_title',40,255,html::escapeHTML($cat_title)).
 '</label></p>';
 if (!$cat_id)
@@ -192,5 +192,5 @@
 	echo
 	'<p><label for="new_cat_parent">'.__('Parent:').' '.
-	'<select id="new_cat_parent" name="new_cat_parent" tabindex="3">'.
+	'<select id="new_cat_parent" name="new_cat_parent" >'.
 	'<option value="0">'.__('Top level').'</option>';
 	while ($rs->fetch()) {
@@ -204,5 +204,5 @@
 echo
 '<div class="lockable">'.
-'<p><label for="cat_url">'.__('URL:').' '.form::field('cat_url',40,255,html::escapeHTML($cat_url),'',4).
+'<p><label for="cat_url">'.__('URL:').' '.form::field('cat_url',40,255,html::escapeHTML($cat_url)).
 '</label></p>'.
 '<p class="form-note warn" id="note-cat-url">'.
@@ -211,8 +211,8 @@
 
 '<p class="area"><label for="cat_desc">'.__('Description:').'</label> '.
-form::textarea('cat_desc',50,8,html::escapeHTML($cat_desc),'',5).
+form::textarea('cat_desc',50,8,html::escapeHTML($cat_desc)).
 '</p>'.
 
-'<p><input type="submit" accesskey="s" value="'.__('Save').'" tabindex="5" />'.
+'<p><input type="submit" accesskey="s" value="'.__('Save').'" />'.
 ($cat_id ? form::hidden('id',$cat_id) : '').
 $core->formNonce().
@@ -232,5 +232,5 @@
 	'<p><label for="cat_parent" class="classic">'.__('Parent:').' '.
 	form::combo('cat_parent',$allowed_parents,$cat_parent).'</label></p>'.
-	'<p><input type="submit" accesskey="s" value="'.__('Save').'" tabindex="5" />'.
+	'<p><input type="submit" accesskey="s" value="'.__('Save').'" />'.
 	form::hidden(array('id'),$cat_id).$core->formNonce().'</p>'.
 	'</fieldset>'.
@@ -246,5 +246,5 @@
 		form::combo('cat_move',array(__('before')=>'before',__('after')=>'after'),'','','',false,'title="'.__('position: ').'"').' '.
 		form::combo('cat_sibling',$siblings).'</p>'.
-		'<p><input type="submit" accesskey="s" value="'.__('Save').'" tabindex="5" />'.
+		'<p><input type="submit" accesskey="s" value="'.__('Save').'" />'.
 		form::hidden(array('id'),$cat_id).$core->formNonce().'</p>'.
 		'</fieldset>'.
Index: admin/comment.php
===================================================================
--- admin/comment.php	(revision 270)
+++ admin/comment.php	(revision 500)
@@ -184,9 +184,8 @@
 	}
 	
-	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Edit comment').'</h2>';
-	
-	echo '<p><a class="back" href="'.$core->getPostAdminURL($post_type,$post_id).'&amp;co=1#c'.$comment_id.'"> '.
-		sprintf(__('Back to "%s"'),$post_title).'</a></p>';
-	
+	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <a href="'.
+		$core->getPostAdminURL($post_type,$post_id).'&amp;co=1#c'.$comment_id.'"> '.
+		$post_title.'</a> &rsaquo; <span class="page-title">'.__('Edit comment').'</span></h2>';
+		
 	echo
 	'<form action="comment.php" method="post" id="comment-form">'.
Index: admin/comments.php
===================================================================
--- admin/comments.php	(revision 270)
+++ admin/comments.php	(revision 500)
@@ -108,4 +108,5 @@
 # Actions combo box
 $combo_action = array();
+$default = '';
 if ($core->auth->check('publish,contentadmin',$core->blog->id))
 {
@@ -118,4 +119,7 @@
 {
 	$combo_action[__('delete')] = 'delete';
+	if ($status == -2) {
+		$default = 'delete';
+	}
 }
 
@@ -144,5 +148,5 @@
 dcPage::open(__('Comments and trackbacks'),$starting_script);
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Comments and trackbacks').'</h2>';
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Comments and trackbacks').'</span></h2>';
 
 if (!$core->error->flag())
@@ -214,5 +218,5 @@
 	
 	'<p class="col right"><label for="action" class="classic">'.__('Selected comments action:').'</label> '.
-	form::combo('action',$combo_action,'','','','','title="'.__('action: ').'"').
+	form::combo('action',$combo_action,$default,'','','','title="'.__('action: ').'"').
 	$core->formNonce().
 	'<input type="submit" value="'.__('ok').'" /></p>'.
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 270)
+++ admin/index.php	(revision 691)
@@ -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
@@ -177,4 +177,9 @@
 $core->callBehavior('adminDashboardItems', $core, $__dashboard_items);
 
+# Dashboard content
+$dashboardContents = '';
+$__dashboard_contents = new ArrayObject(array(new ArrayObject,new ArrayObject));
+$core->callBehavior('adminDashboardContents', $core, $__dashboard_contents);
+
 /* DISPLAY
 -------------------------------------------------------- */
@@ -186,12 +191,10 @@
 );
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Dashboard');
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Dashboard').'</span></h2>';
 
 if ($core->auth->getInfo('user_default_blog') != $core->blog->id && $core->auth->blog_count > 1) {
 	echo
-	' - <a href="index.php?default_blog=1" class="button">'.__('Make this blog my default blog').'</a>';
-}
-
-echo '</h2>';
+	'<p><a href="index.php?default_blog=1" class="button">'.__('Make this blog my default blog').'</a></p>';
+}
 
 if ($core->blog->status == 0) {
@@ -201,8 +204,15 @@
 }
 
-if (!DC_ADMIN_URL) {
+if (!defined('DC_ADMIN_URL') || !DC_ADMIN_URL) {
 	echo
 	'<p class="static-msg">'.
-	__('DC_ADMIN_URL is not defined, you should edit your configuration file.').
+	'DC_ADMIN_URL '.__('is not defined, you should edit your configuration file.').
+	'</p>';
+}
+
+if (!defined('DC_ADMIN_MAILFROM') || !DC_ADMIN_MAILFROM) {
+	echo
+	'<p class="static-msg">'.
+	'DC_ADMIN_MAILFROM '.__('is not defined, you should edit your configuration file.').
 	'</p>';
 }
@@ -279,6 +289,6 @@
 {
 	echo
-	'<p><a href="'.$i[1].'"><img src="'.$i[2].'" alt="" /></a>'.
-	'<span><a href="'.$i[1].'">'.$i[0].'</a></span></p>';
+	'<p><a href="'.$i[1].'"><img src="'.dc_admin_icon_url($i[2]).'" alt="" />'.
+	'<br /><span>'.$i[0].'</span></a></p>';
 }
 echo '</div>';
@@ -303,17 +313,17 @@
 		'<h3>'.__('Quick entry').'</h3>'.
 		'<form id="quick-entry" action="post.php" method="post">'.
-		'<fieldset>'.
+		'<fieldset><legend>'.__('New entry').'</legend>'.
 		'<p class="col"><label for="post_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
-		form::field('post_title',20,255,'','maximal',2).
+		form::field('post_title',20,255,'','maximal').
 		'</label></p>'.
 		'<p class="area"><label class="required" '.
 		'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
-		form::textarea('post_content',50,7,'','',2).
+		form::textarea('post_content',50,7).
 		'</p>'.
 		'<p><label for="cat_id" class="classic">'.__('Category:').' '.
-		form::combo('cat_id',$categories_combo,'','',2).'</label></p>'.
-		'<p><input type="submit" value="'.__('Save').'" name="save" tabindex="3" /> '.
+		form::combo('cat_id',$categories_combo).'</label></p>'.
+		'<p><input type="submit" value="'.__('Save').'" name="save" /> '.
 		($core->auth->check('publish',$core->blog->id)
-			? '<input type="hidden" value="'.__('save and publish').'" name="save-publish" />'
+			? '<input type="hidden" value="'.__('Save and publish').'" name="save-publish" />'
 			: '').
 		$core->formNonce().
@@ -330,4 +340,17 @@
 }
 
+foreach ($__dashboard_contents as $i)
+{	
+	if ($i->count() > 0)
+	{
+		$dashboardContents .= '<div>';
+		foreach ($i as $v) {
+			$dashboardContents .= $v;
+		}
+		$dashboardContents .= '</div>';
+	}
+}
+echo ($dashboardContents ? '<div id="dashboard-contents">'.$dashboardContents.'</div>' : '');
+
 echo '</div>';
 
Index: admin/install/index.php
===================================================================
--- admin/install/index.php	(revision 270)
+++ admin/install/index.php	(revision 557)
@@ -205,27 +205,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);
@@ -264,7 +264,6 @@
   <title><?php echo __('Dotclear Install'); ?></title>
   
-  <style type="text/css">
-  @import url(../style/install.css); 
-  </style>
+	<link rel="stylesheet" href="../style/install.css" type="text/css" media="screen" /> 
+
   <script type="text/javascript" src="../js/jquery/jquery.js"></script>
   <script type="text/javascript">
@@ -338,5 +337,5 @@
 	'</fieldset>'.
 	
-	'<p><input type="submit" value="'.__('save').'" /></p>'.
+	'<p><input type="submit" value="'.__('Save').'" /></p>'.
 	'</form>';
 }
Index: admin/install/wizard.php
===================================================================
--- admin/install/wizard.php	(revision 270)
+++ admin/install/wizard.php	(revision 557)
@@ -100,4 +100,5 @@
 		$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);
 		
@@ -138,8 +139,5 @@
   <meta name="GOOGLEBOT" content="NOSNIPPET" />
   <title><?php echo __('Dotclear installation wizard'); ?></title>
-  
-  <style type="text/css">
-  @import url(../style/install.css); 
-  </style>
+	<link rel="stylesheet" href="../style/install.css" type="text/css" media="screen" /> 
 </head>
 
@@ -184,5 +182,5 @@
 form::field('DBPREFIX',30,255,html::escapeHTML($DBPREFIX)).'</label></p>'.
 
-'<p><input type="submit" value="'.__('Save').'" /></p>'.
+'<p><input type="submit" value="'.__('Continue').'" /></p>'.
 '</form>';
 ?>
Index: admin/js/_index.js
===================================================================
--- admin/js/_index.js	(revision 297)
+++ admin/js/_index.js	(revision 454)
@@ -11,5 +11,5 @@
 
 		if ($('input[name=save-publish]',f).length > 0) {
-			var btn = $('<input type="submit" value="' + $('input[name=save-publish]',f).val() + '" tabindex="3" />');
+			var btn = $('<input type="submit" value="' + $('input[name=save-publish]',f).val() + '" />');
 			$('input[name=save-publish]',f).remove();
 			$('input[name=save]',f).after(btn).after(' ');
@@ -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/_users.js
===================================================================
--- admin/js/_users.js	(revision 0)
+++ admin/js/_users.js	(revision 548)
@@ -20,6 +20,8 @@
 			for (i=0; i<user_ids.length; i++) {
 				if (nb_posts[i] > 0) {
-					user_ids[i].checked = false;
-					msg_cannot_delete = true;
+					if (user_ids[i].checked == true) {
+						msg_cannot_delete = true;
+						user_ids[i].checked = false;
+					}
 				}
 			}
Index: admin/js/color-picker.js
===================================================================
--- admin/js/color-picker.js	(revision 0)
+++ admin/js/color-picker.js	(revision 503)
@@ -36,5 +36,7 @@
 		span.css('display','block');
 		
-		span.css('width',($(this).width()+12)+'px');
+		/*ligne supprimée car elle ne fait pas le calcul
+		du width de l'input et ça fout la merde */
+		//span.css('width',($(this).width()+12)+'px');
 		span.css('padding','0 5px 0 0');
 		$(this).wrap(span);
@@ -45,5 +47,7 @@
 			position: 'absolute',
 			top: 3,
-			right: 0
+			/* la largeur du span n'étant pas calculée
+			right: 0 crée un affichage pourri. On vire. */
+			//right: 0
 		});
 		
Index: admin/js/common.js
===================================================================
--- admin/js/common.js	(revision 299)
+++ admin/js/common.js	(revision 343)
@@ -335,5 +335,5 @@
 			position: "static",
 			padding: ".75em 0",
-			width: "auto",
+			width: "auto"
 		});
 	}
Index: admin/js/ie7/IE7.js
===================================================================
--- admin/js/ie7/IE7.js	(revision 175)
+++ admin/js/ie7/IE7.js	(revision 703)
@@ -1,2 +1,2205 @@
-/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */
-(function(){IE7={toString:function(){return"IE7 version 2.0 (beta2)"}};var k=IE7.appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(top.location.search)||k<5)return;var Q=bG();var C=document.compatMode!="CSS1Compat";var bm=document.documentElement,v,s;var bA="!";var G=":link{ie7-link:link}:visited{ie7-link:visited}";var cj=/^[\w\.]+[^:]*$/;function W(a,b){if(cj.test(a))a=(b||"")+a;return a};function bn(a,b){a=W(a,b);return a.slice(0,a.lastIndexOf("/")+1)};var bB=document.scripts[document.scripts.length-1];var ck=bn(bB.src);try{var H=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}var X={};function cl(a,b){try{a=W(a,b);if(!X[a]){H.open("GET",a,false);H.send();if(H.status==0||H.status==200){X[a]=H.responseText}}}catch(e){}finally{return X[a]||""}};if(k<5.5){undefined=Q();bA="HTML:!";var cm=/(g|gi)$/;var cn=String.prototype.replace;String.prototype.replace=function(a,b){if(typeof b=="function"){if(a&&a.constructor==RegExp){var c=a;var d=c.global;if(d==null)d=cm.test(c);if(d)c=new RegExp(c.source)}else{c=new RegExp(bb(a))}var f,g=this,h="";while(g&&(f=c.exec(g))){h+=g.slice(0,f.index)+b.apply(this,f);g=g.slice(f.index+f[0].length);if(!d)break}return h+g}return cn.apply(this,arguments)};Array.prototype.pop=function(){if(this.length){var a=this[this.length-1];this.length--;return a}return undefined};Array.prototype.push=function(){for(var a=0;a<arguments.length;a++){this[this.length]=arguments[a]}return this.length};var co=this;Function.prototype.apply=function(a,b){if(a===undefined)a=co;else if(a==null)a=window;else if(typeof a=="string")a=new String(a);else if(typeof a=="number")a=new Number(a);else if(typeof a=="boolean")a=new Boolean(a);if(arguments.length==1)b=[];else if(b[0]&&b[0].writeln)b[0]=b[0].documentElement.document||b[0];var c="#ie7_apply",d;a[c]=this;switch(b.length){case 0:d=a[c]();break;case 1:d=a[c](b[0]);break;case 2:d=a[c](b[0],b[1]);break;case 3:d=a[c](b[0],b[1],b[2]);break;case 4:d=a[c](b[0],b[1],b[2],b[3]);break;case 5:d=a[c](b[0],b[1],b[2],b[3],b[4]);break;default:var f=[],g=b.length-1;do f[g]="a["+g+"]";while(g--);eval("r=o[$]("+f+")")}if(typeof a.valueOf=="function"){delete a[c]}else{a[c]=undefined;if(d&&d.writeln)d=d.documentElement.document||d}return d};Function.prototype.call=function(a){return this.apply(a,bC.apply(arguments,[1]))};G+="address,blockquote,body,dd,div,dt,fieldset,form,"+"frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+"hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}"}var bC=Array.prototype.slice;var cJ=/%([1-9])/g;var cp=/^\s\s*/;var cq=/\s\s*$/;var cr=/([\/()[\]{}|*+-.,^$?\\])/g;var bD=/\bbase\b/;var bE=["constructor","toString"];var Y;function z(){};z.extend=function(a,b){Y=true;var c=new this;ba(c,a);Y=false;var d=c.constructor;function f(){if(!Y)d.apply(this,arguments)};c.constructor=f;f.extend=arguments.callee;ba(f,b);f.prototype=c;return f};z.prototype.extend=function(a){return ba(this,a)};var bo="#";var Z="~";var cs=/\\./g;var ct=/\(\?[:=!]|\[[^\]]+\]/g;var cu=/\(/g;var D=z.extend({constructor:function(a){this[Z]=[];this.merge(a)},exec:function(g){var h=this,p=this[Z];return String(g).replace(new RegExp(this,this.ignoreCase?"gi":"g"),function(){var a,b=1,c=0;while((a=h[bo+p[c++]])){var d=b+a.length+1;if(arguments[b]){var f=a.replacement;switch(typeof f){case"function":return f.apply(h,bC.call(arguments,b,d));case"number":return arguments[b+f];default:return f}}b=d}})},add:function(a,b){if(a instanceof RegExp){a=a.source}if(!this[bo+a])this[Z].push(String(a));this[bo+a]=new D.Item(a,b)},merge:function(a){for(var b in a)this.add(b,a[b])},toString:function(){return"("+this[Z].join(")|(")+")"}},{IGNORE:"$0",Item:z.extend({constructor:function(a,b){a=a instanceof RegExp?a.source:String(a);if(typeof b=="number")b=String(b);else if(b==null)b="";if(typeof b=="string"&&/\$(\d+)/.test(b)){if(/^\$\d+$/.test(b)){b=parseInt(b.slice(1))}else{var c=/'/.test(b.replace(/\\./g,""))?'"':"'";b=b.replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\$(\d+)/g,c+"+(arguments[$1]||"+c+c+")+"+c);b=new Function("return "+c+b.replace(/(['"])\1\+(.*)\+\1\1$/,"$1")+c)}}this.length=D.count(a);this.replacement=b;this.toString=bG(a)}}),count:function(a){a=String(a).replace(cs,"").replace(ct,"");return I(a,cu).length}});function ba(a,b){if(a&&b){var c=(typeof b=="function"?Function:Object).prototype;var d=bE.length,f;if(Y)while(f=bE[--d]){var g=b[f];if(g!=c[f]){if(bD.test(g)){bF(a,f,g)}else{a[f]=g}}}for(f in b)if(c[f]===undefined){var g=b[f];if(a[f]&&typeof g=="function"&&bD.test(g)){bF(a,f,g)}else{a[f]=g}}}return a};function bF(c,d,f){var g=c[d];c[d]=function(){var a=this.base;this.base=g;var b=f.apply(this,arguments);this.base=a;return b}};function cv(a,b){if(!b)b=a;var c={};for(var d in a)c[d]=b[d];return c};function i(c){var d=arguments;var f=new RegExp("%([1-"+arguments.length+"])","g");return String(c).replace(f,function(a,b){return b<d.length?d[b]:a})};function I(a,b){return String(a).match(b)||[]};function bb(a){return String(a).replace(cr,"\\$1")};function cK(a){return String(a).replace(cp,"").replace(cq,"")};function bG(a){return function(){return a}};var bH=D.extend({ignoreCase:true});var cw=/\x01(\d+)/g,cx=/'/g,cy=/^\x01/,cz=/\\([\da-fA-F]{1,4})/g;var bp=[];var cA=new bH({"<!\\-\\-|\\-\\->":"","\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/":"","@(namespace|import)[^;\\n]+[;\\n]":"","'(\\\\.|[^'\\\\])*'":bJ,'"(\\\\.|[^"\\\\])*"':bJ,"\\s+":" "});function cB(a){return cA.exec(a)};function bI(c){return c.replace(cw,function(a,b){return bp[b-1]})};function bJ(c){return"\x01"+bp.push(c.replace(cz,function(a,b){return eval("'\\u"+"0000".slice(b.length)+b+"'")}).slice(1,-1).replace(cx,"\\'"))};function cC(a){return cy.test(a)?bp[a.slice(1)-1]:a};var cD=new D({Width:"Height",width:"height",Left:"Top",left:"top",Right:"Bottom",right:"bottom",onX:"onY"});function A(a){return cD.exec(a)};var bK=[];function bq(a){cF(a);w(window,"onresize",a)};function w(a,b,c){a.attachEvent(b,c);bK.push(arguments)};function cE(a,b,c){try{a.detachEvent(b,c)}catch(ignore){}};w(window,"onunload",function(){var a;while(a=bK.pop()){cE(a[0],a[1],a[2])}});function R(a,b,c){if(!a.elements)a.elements={};if(c)a.elements[b.uniqueID]=b;else delete a.elements[b.uniqueID];return c};w(window,"onbeforeprint",function(){if(!IE7.CSS.print)new bw("print");IE7.CSS.print.recalc()});var bL=/^\d+(px)?$/i;var J=/^\d+%$/;var E=function(a,b){if(bL.test(b))return parseInt(b);var c=a.style.left;var d=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;a.style.left=b||0;b=a.style.pixelLeft;a.style.left=c;a.runtimeStyle.left=d;return b};var br="ie7-";var bM=z.extend({constructor:function(){this.fixes=[];this.recalcs=[]},init:Q});var bs=[];function cF(a){bs.push(a)};IE7.recalc=function(){IE7.HTML.recalc();IE7.CSS.recalc();for(var a=0;a<bs.length;a++)bs[a]()};function bc(a){return a.currentStyle["ie7-position"]=="fixed"};function bt(a,b){return a.currentStyle[br+b]||a.currentStyle[b]};function K(a,b,c){if(a.currentStyle[br+b]==null){a.runtimeStyle[br+b]=a.currentStyle[b]}a.runtimeStyle[b]=c};function bN(a){var b=document.createElement(a||"object");b.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";b.ie7_anon=true;return b};function B(a,b,c){if(!be[a]){F=[];var d="";var f=T.escape(a).split(",");for(var g=0;g<f.length;g++){o=m=x=0;S=f.length>1?2:0;var h=T.exec(f[g])||"if(0){";if(o){h+=i("if(e%1.nodeName!='!'){",m)}var p=S>1?bV:"";h+=i(p+bW,m);h+=Array(I(h,/\{/g).length+1).join("}");d+=h}eval(i(bX,F)+T.unescape(d)+"return s?null:r}");be[a]=_h}return be[a](b||document,c)};var bd=k<6;var bO=/^(href|src)$/;var bu={"class":"className","for":"htmlFor"};IE7._5=1;IE7._e=function(a,b){var c=a.all[b]||null;if(!c||c.id==b)return c;for(var d=0;d<c.length;d++){if(c[d].id==b)return c[d]}return null};IE7._f=function(a,b){if(b=="src"&&a.pngSrc)return a.pngSrc;var c=bd?(a.attributes[b]||a.attributes[bu[b.toLowerCase()]]):a.getAttributeNode(b);if(c&&(c.specified||b=="value")){if(bO.test(b)){return a.getAttribute(b,2)}else if(b=="class"){return a.className.replace(/\sie7_\w+/g,"")}else if(b=="style"){return a.style.cssText}else{return c.nodeValue}}return null};var bP="colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";ba(bu,cv(bP.toLowerCase().split(","),bP.split(",")));IE7._a=function(a){while(a&&(a=a.nextSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};IE7._b=function(a){while(a&&(a=a.previousSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};var cG=/([\s>+~,]|[^(]\+|^)([#.:\[])/g,cH=/(^|,)([^\s>+~])/g,cI=/\s*([\s>+~(),]|^|$)\s*/g,bQ=/\s\*\s/g;var bR=D.extend({constructor:function(a){this.base(a);this.sorter=new D;this.sorter.add(/:not\([^)]*\)/,D.IGNORE);this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/,"$1$3$6$4")},ignoreCase:true,escape:function(a){return this.optimise(this.format(a))},format:function(a){return a.replace(cI,"$1").replace(cH,"$1 $2").replace(cG,"$1*$2")},optimise:function(a){return this.sorter.exec(a.replace(bQ,">* "))},unescape:function(a){return bI(a)}});var bS={"":"%1!=null","=":"%1=='%2'","~=":/(^| )%1( |$)/,"|=":/^%1(-|$)/,"^=":/^%1/,"$=":/%1$/,"*=":/%1/};var bT={"first-child":"!IE7._b(e%1)","link":"e%1.currentStyle['ie7-link']=='link'","visited":"e%1.currentStyle['ie7-link']=='visited'"};var bv="var p%2=0,i%2,e%2,n%2=e%1.";var bU="e%1.sourceIndex";var bV="var g="+bU+";if(!p[g]){p[g]=1;";var bW="r[r.length]=e%1;if(s)return e%1;";var bX="var _h=function(e0,s){IE7._5++;var r=[],p={},reg=[%1],d=document;";var F;var m;var o;var x;var S;var be={};var T=new bR({" (\\*|[\\w-]+)#([\\w-]+)":function(a,b,c){o=false;var d="var e%2=IE7._e(d,'%4');if(e%2&&";if(b!="*")d+="e%2.nodeName=='%3'&&";d+="(e%1==d||e%1.contains(e%2))){";if(x)d+=i("i%1=n%1.length;",x);return i(d,m++,m,b.toUpperCase(),c)}," (\\*|[\\w-]+)":function(a,b){S++;o=b=="*";var c=bv;c+=(o&&bd)?"all":"getElementsByTagName('%3')";c+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";return i(c,m++,x=m,b.toUpperCase())},">(\\*|[\\w-]+)":function(a,b){var c=x;o=b=="*";var d=bv;d+=c?"children":"childNodes";if(!o&&c)d+=".tags('%3')";d+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";if(o){d+="if(e%2.nodeType==1){";o=bd}else{if(!c)d+="if(e%2.nodeName=='%3'){"}return i(d,m++,x=m,b.toUpperCase())},"\\+(\\*|[\\w-]+)":function(a,b){var c="";if(o)c+="if(e%1.nodeName!='!'){";o=false;c+="e%1=IE7._a(e%1);if(e%1";if(b!="*")c+="&&e%1.nodeName=='%2'";c+="){";return i(c,m,b.toUpperCase())},"~(\\*|[\\w-]+)":function(a,b){var c="";if(o)c+="if(e%1.nodeName!='!'){";o=false;S=2;c+="while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._5)break;if(";if(b=="*"){c+="e%1.nodeType==1";if(bd)c+="&&e%1.nodeName!='!'"}else c+="e%1.nodeName=='%2'";c+="){e%1.ie7_adjacent=IE7._5;";return i(c,m,b.toUpperCase())},"#([\\w-]+)":function(a,b){o=false;var c="if(e%1.id=='%2'){";if(x)c+=i("i%1=n%1.length;",x);return i(c,m,b)},"\\.([\\w-]+)":function(a,b){o=false;F.push(new RegExp("(^|\\s)"+bb(b)+"(\\s|$)"));return i("if(e%1.className&&reg[%2].test(e%1.className)){",m,F.length-1)},"\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]":function(a,b,c,d){var f=bu[b]||b;if(c){var g="e%1.getAttribute('%2',2)";if(!bO.test(b)){g="e%1.%3||"+g}b=i("("+g+")",m,b,f)}else{b=i("IE7._f(e%1,'%2')",m,b)}var h=bS[c||""]||"0";if(h&&h.source){F.push(new RegExp(i(h.source,bb(T.unescape(d)))));h="reg[%2].test(%1)";d=F.length-1}return"if("+i(h,b,d)+"){"},":+([\\w-]+)(\\(([^)]+)\\))?":function(a,b,c,d){b=bT[b];return"if("+(b?i(b,m,d||""):"0")+"){"}});var bY=/a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;var bZ=/\s*\{\s*/,ca=/\s*\}\s*/,cb=/\s*\,\s*/;var cc=/(.*)(:first-(line|letter))/;var y=document.styleSheets;IE7.CSS=new(bM.extend({parser:new bH,screen:"",print:"",styles:[],rules:[],pseudoClasses:k<7?"first\\-child":"",dynamicPseudoClasses:{toString:function(){var a=[];for(var b in this)a.push(b);return a.join("|")}},init:function(){var a="^\x01$";var b="\\[class=?[^\\]]*\\]";var c=[];if(this.pseudoClasses)c.push(this.pseudoClasses);var d=this.dynamicPseudoClasses.toString();if(d)c.push(d);c=c.join("|");var f=k<7?["[>+~[(]|([:.])\\w+\\1"]:[b];if(c)f.push(":("+c+")");this.UNKNOWN=new RegExp(f.join("|")||a,"i");var g=k<7?["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"]:[b];var h=g.concat();if(c)h.push(":("+c+")");n.COMPLEX=new RegExp(h.join("|")||a,"ig");if(this.pseudoClasses)g.push(":("+this.pseudoClasses+")");L.COMPLEX=new RegExp(g.join("|")||a,"i");L.MATCH=new RegExp(d?"(.*):("+d+")(.*)":a,"i");this.createStyleSheet();this.refresh()},addEventHandler:function(){w.apply(null,arguments)},addFix:function(a,b){this.parser.add(a,b)},addRecalc:function(c,d,f,g){d=new RegExp("([{;\\s])"+c+"\\s*:\\s*"+d+"[^;}]*");var h=this.recalcs.length;if(g)g=c+":"+g;this.addFix(d,function(a,b){return(g?b+g:a)+";ie7-"+a.slice(1)+";ie7_recalc"+h+":1"});this.recalcs.push(arguments);return h},apply:function(){this.getInlineStyles();new bw("screen");this.trash()},createStyleSheet:function(){this.styleSheet=document.createStyleSheet();this.styleSheet.ie7=true;this.styleSheet.owningElement.ie7=true;this.styleSheet.cssText=G},getInlineStyles:function(){var a=document.getElementsByTagName("style"),b;for(var c=a.length-1;(b=a[c]);c--){if(!b.disabled&&!b.ie7){this.styles.push(b.innerHTML)}}},getText:function(a,b){try{var c=a.cssText}catch(e){c=""}if(H)c=cl(a.href,b)||c;return c},recalc:function(){this.screen.recalc();var a=/ie7_recalc\d+/g;var b=G.match(/[{,]/g).length;var c=b+(this.screen.cssText.match(/\{/g)||"").length;var d=this.styleSheet.rules,f;var g,h,p,t,q,j,u,l;for(q=b;q<c;q++){f=d[q];var r=f.style.cssText;if(f&&(g=r.match(a))){p=B(f.selectorText);if(p.length)for(j=0;j<g.length;j++){l=g[j];h=IE7.CSS.recalcs[l.slice(10)][2];for(u=0;(t=p[u]);u++){if(t.currentStyle[l])h(t,r)}}}}},refresh:function(){this.styleSheet.cssText=G+this.screen+this.print},trash:function(){for(var a=0;a<y.length;a++){if(!y[a].ie7){try{var b=y[a].cssText}catch(e){b=""}if(b)y[a].cssText=""}}}}));var bw=z.extend({constructor:function(a){this.media=a;this.load();IE7.CSS[a]=this;IE7.CSS.refresh()},createRule:function(a,b){if(IE7.CSS.UNKNOWN.test(a)){var c;if(bf&&(c=a.match(bf.MATCH))){return new bf(c[1],c[2],b)}else if(c=a.match(L.MATCH)){if(!bY.test(c[0])||L.COMPLEX.test(c[0])){return new L(a,c[1],c[2],c[3],b)}}else return new n(a,b)}return a+" {"+b+"}"},getText:function(){var h=[].concat(IE7.CSS.styles);var p=/@media\s+([^{]*)\{([^@]+\})\s*\}/gi;var t=/\ball\b|^$/i,q=/\bscreen\b/i,j=/\bprint\b/i;function u(a,b){l.value=b;return a.replace(p,l)};function l(a,b,c){b=r(b);switch(b){case"screen":case"print":if(b!=l.value)return"";case"all":return c}return""};function r(a){if(t.test(a))return"all";else if(q.test(a))return(j.test(a))?"all":"screen";else if(j.test(a))return"print"};var N=this;function O(a,b,c,d){var f="";if(!d){c=r(a.media);d=0}if(c=="all"||c==N.media){if(d<3){for(var g=0;g<a.imports.length;g++){f+=O(a.imports[g],bn(a.href,b),c,d+1)}}f+=cB(a.href?cg(a,b):h.pop()||"");f=u(f,N.media)}return f};var bl={};function cg(a,b){var c=W(a.href,b);if(bl[c])return"";bl[c]=(a.disabled)?"":ci(IE7.CSS.getText(a,b),bn(a.href,b));return bl[c]};var ch=/(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function ci(a,b){return a.replace(ch,"$1"+b.slice(0,b.lastIndexOf("/")+1)+"$2")};for(var P=0;P<y.length;P++){if(!y[P].disabled&&!y[P].ie7){this.cssText+=O(y[P])}}},load:function(){this.cssText="";this.getText();this.parse();this.cssText=bI(this.cssText);X={}},parse:function(){this.cssText=IE7.CSS.parser.exec(this.cssText);var a=IE7.CSS.rules.length;var b=this.cssText.split(ca),c;var d,f,g,h;for(g=0;g<b.length;g++){c=b[g].split(bZ);d=c[0].split(cb);f=c[1];for(h=0;h<d.length;h++){d[h]=f?this.createRule(d[h],f):""}b[g]=d.join("\n")}this.cssText=b.join("\n");this.rules=IE7.CSS.rules.slice(a)},recalc:function(){var a,b;for(b=0;(a=this.rules[b]);b++)a.recalc()},toString:function(){return"@media "+this.media+"{"+this.cssText+"}"}});var bf;var n=IE7.Rule=z.extend({constructor:function(a,b){this.id=IE7.CSS.rules.length;this.className=n.PREFIX+this.id;a=a.match(cc)||a||"*";this.selector=a[1]||a;this.selectorText=this.parse(this.selector)+(a[2]||"");this.cssText=b;this.MATCH=new RegExp("\\s"+this.className+"(\\s|$)","g");IE7.CSS.rules.push(this);this.init()},init:Q,add:function(a){a.className+=" "+this.className},recalc:function(){var a=B(this.selector);for(var b=0;b<a.length;b++)this.add(a[b])},parse:function(a){var b=a.replace(n.CHILD," ").replace(n.COMPLEX,"");if(k<7)b=b.replace(n.MULTI,"");var c=I(b,n.TAGS).length-I(a,n.TAGS).length;var d=I(b,n.CLASSES).length-I(a,n.CLASSES).length+1;while(d>0&&n.CLASS.test(b)){b=b.replace(n.CLASS,"");d--}while(c>0&&n.TAG.test(b)){b=b.replace(n.TAG,"$1*");c--}b+="."+this.className;d=Math.min(d,2);c=Math.min(c,2);var f=-10*d-c;if(f>0){b=b+","+n.MAP[f]+" "+b}return b},remove:function(a){a.className=a.className.replace(this.MATCH,"$1")},toString:function(){return i("%1 {%2}",this.selectorText,this.cssText)}},{CHILD:/>/g,CLASS:/\.[\w-]+/,CLASSES:/[.:\[]/g,MULTI:/(\.[\w-]+)+/g,PREFIX:"ie7_class",TAG:/^\w+|([\s>+~])\w+/,TAGS:/^\w|[\s>+~]\w/g,MAP:{1:"html",2:"html body",10:".ie7_html",11:"html.ie7_html",12:"html.ie7_html body",20:".ie7_html .ie7_body",21:"html.ie7_html .ie7_body",22:"html.ie7_html body.ie7_body"}});var L=n.extend({constructor:function(a,b,c,d,f){this.attach=b||"*";this.dynamicPseudoClass=IE7.CSS.dynamicPseudoClasses[c];this.target=d;this.base(a,f)},recalc:function(){var a=B(this.attach),b;for(var c=0;b=a[c];c++){var d=this.target?B(this.target,b):[b];if(d.length)this.dynamicPseudoClass.apply(b,d,this)}}});var cd=z.extend({constructor:function(a,b){this.name=a;this.apply=b;this.instances={};IE7.CSS.dynamicPseudoClasses[a]=this},register:function(a){var b=a[2];a.id=b.id+a[0].uniqueID;if(!this.instances[a.id]){var c=a[1],d;for(d=0;d<c.length;d++)b.add(c[d]);this.instances[a.id]=a}},unregister:function(a){if(this.instances[a.id]){var b=a[2];var c=a[1],d;for(d=0;d<c.length;d++)b.remove(c[d]);delete this.instances[a.id]}}});if(k<7){var U=new cd("hover",function(a){var b=arguments;IE7.CSS.addEventHandler(a,k<5.5?"onmouseover":"onmouseenter",function(){U.register(b)});IE7.CSS.addEventHandler(a,k<5.5?"onmouseout":"onmouseleave",function(){U.unregister(b)})});w(document,"onmouseup",function(){var a=U.instances;for(var b in a)if(!a[b][0].contains(event.srcElement))U.unregister(a[b])})}IE7.CSS.addRecalc("[\\w-]+","inherit",function(c,d){var f=d.match(/[\w-]+\s*:\s*inherit/g);for(var g=0;g<f.length;g++){var h=f[g].replace(/ie7\-|\s*:\s*inherit/g,"").replace(/\-([a-z])/g,function(a,b){return b.toUpperCase()});c.runtimeStyle[h]=c.parentElement.currentStyle[h]}});IE7.HTML=new(bM.extend({fixed:{},init:Q,addFix:function(){this.fixes.push(arguments)},apply:function(){for(var a=0;a<this.fixes.length;a++){var b=B(this.fixes[a][0]);var c=this.fixes[a][1];for(var d=0;d<b.length;d++)c(b[d])}},addRecalc:function(){this.recalcs.push(arguments)},recalc:function(){for(var a=0;a<this.recalcs.length;a++){var b=B(this.recalcs[a][0]);var c=this.recalcs[a][1],d;var f=Math.pow(2,a);for(var g=0;(d=b[g]);g++){var h=d.uniqueID;if((this.fixed[h]&f)==0){d=c(d)||d;this.fixed[h]|=f}}}}}));if(k<7){document.createElement("abbr");IE7.HTML.addRecalc("label",function(a){if(!a.htmlFor){var b=B("input,textarea",a,true);if(b){w(a,"onclick",function(){b.click()})}}})}var V="[.\\d]";new function(_){var layout=IE7.Layout=this;G+="*{boxSizing:content-box}";IE7.hasLayout=k<5.5?function(a){return a.clientWidth}:function(a){return a.currentStyle.hasLayout};layout.boxSizing=function(a){if(!IE7.hasLayout(a)){a.style.height="0cm";if(a.currentStyle.verticalAlign=="auto")a.runtimeStyle.verticalAlign="top";collapseMargins(a)}};function collapseMargins(a){if(a!=s&&a.currentStyle.position!="absolute"){collapseMargin(a,"marginTop");collapseMargin(a,"marginBottom")}};function collapseMargin(a,b){if(!a.runtimeStyle[b]){var c=a.parentElement;if(c&&IE7.hasLayout(c)&&!IE7[b=="marginTop"?"_b":"_a"](a))return;var d=B(">*:"+(b=="marginTop"?"first":"last")+"-child",a,true);if(d&&d.currentStyle.styleFloat=="none"&&IE7.hasLayout(d)){collapseMargin(d,b);margin=_9(a,a.currentStyle[b]);childMargin=_9(d,d.currentStyle[b]);if(margin<0||childMargin<0){a.runtimeStyle[b]=margin+childMargin}else{a.runtimeStyle[b]=Math.max(childMargin,margin)}d.runtimeStyle[b]="0px"}}};function _9(a,b){return b=="auto"?0:E(a,b)};var UNIT=/^[.\d][\w%]*$/,AUTO=/^(auto|0cm)$/;var applyWidth,applyHeight;IE7.Layout.borderBox=function(a){applyWidth(a);applyHeight(a)};var fixWidth=function(g){applyWidth=function(a){if(!J.test(a.currentStyle.width))h(a);collapseMargins(a)};function h(a,b){if(!a.runtimeStyle.fixedWidth){if(!b)b=a.currentStyle.width;a.runtimeStyle.fixedWidth=(UNIT.test(b))?Math.max(0,q(a,b)):b;K(a,"width",a.runtimeStyle.fixedWidth)}};function p(a){if(!bc(a)){var b=a.offsetParent;while(b&&!IE7.hasLayout(b))b=b.offsetParent}return(b||s).clientWidth};function t(a,b){if(J.test(b))return parseInt(parseFloat(b)/100*p(a));return E(a,b)};var q=function(a,b){var c=a.currentStyle["box-sizing"]=="border-box";var d=0;if(C&&!c)d+=j(a)+u(a,"padding");else if(!C&&c)d-=j(a)+u(a,"padding");return t(a,b)+d};function j(a){return a.offsetWidth-a.clientWidth};function u(a,b){return t(a,a.currentStyle[b+"Left"])+t(a,a.currentStyle[b+"Right"])};G+="*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";layout.minWidth=function(a){if(a.currentStyle["min-width"]!=null){a.style.minWidth=a.currentStyle["min-width"]}if(R(arguments.callee,a,a.currentStyle.minWidth!="none")){layout.boxSizing(a);h(a);l(a)}};eval("IE7.Layout.maxWidth="+String(layout.minWidth).replace(/min/g,"max"));function l(a){var b=a.getBoundingClientRect();var c=b.right-b.left;if(a.currentStyle.minWidth!="none"&&c<=q(a,a.currentStyle.minWidth)){a.runtimeStyle.width=a.currentStyle.minWidth}else if(a.currentStyle.maxWidth!="none"&&c>=q(a,a.currentStyle.maxWidth)){a.runtimeStyle.width=a.currentStyle.maxWidth}else{a.runtimeStyle.width=a.runtimeStyle.fixedWidth}};function r(a){if(R(r,a,/^(fixed|absolute)$/.test(a.currentStyle.position)&&bt(a,"left")!="auto"&&bt(a,"right")!="auto"&&AUTO.test(bt(a,"width")))){N(a);IE7.Layout.boxSizing(a)}};IE7.Layout.fixRight=r;function N(a){var b=t(a,a.runtimeStyle._c||a.currentStyle.left);var c=p(a)-t(a,a.currentStyle.right)-b-u(a,"margin");if(parseInt(a.runtimeStyle.width)==c)return;a.runtimeStyle.width="";if(bc(a)||g||a.offsetWidth<c){if(!C)c-=j(a)+u(a,"padding");if(c<0)c=0;a.runtimeStyle.fixedWidth=c;K(a,"width",c)}};var O=0;bq(function(){if(!s)return;var a,b=(O<s.clientWidth);O=s.clientWidth;var c=layout.minWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==q(d,d.currentStyle.minWidth));if(b&&f)d.runtimeStyle.width="";if(b==f)l(d)}var c=layout.maxWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==q(d,d.currentStyle.maxWidth));if(!b&&f)d.runtimeStyle.width="";if(b!=f)l(d)}for(a in r.elements)N(r.elements[a])});if(C){IE7.CSS.addRecalc("width",V,applyWidth)}if(k<7){IE7.CSS.addRecalc("min-width",V,layout.minWidth);IE7.CSS.addRecalc("max-width",V,layout.maxWidth);IE7.CSS.addRecalc("right",V,r)}};eval("var fixHeight="+A(fixWidth));fixWidth();fixHeight(true)};var bg=W("blank.gif",ck);var bh="DXImageTransform.Microsoft.AlphaImageLoader";var bx="progid:"+bh+"(src='%1',sizingMethod='%2')";var bi;var M=[];function by(a){if(bi.test(a.src)){var b=new Image(a.width,a.height);b.onload=function(){a.width=b.width;a.height=b.height;b=null};b.src=a.src;a.pngSrc=a.src;bz(a)}};if(k>=5.5&&k<7){IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/,function(a,b,c,d,f){d=cC(d);return bi.test(d)?"filter:"+i(bx,d,"crop")+";zoom:1;background"+(b||"")+":"+(c||"")+"none"+(f||""):a});IE7.HTML.addRecalc("img,input",function(a){if(a.tagName=="INPUT"&&a.type!="image")return;by(a);w(a,"onpropertychange",function(){if(!bj&&event.propertyName=="src"&&a.src.indexOf(bg)==-1)by(a)})});var bj=false;w(window,"onbeforeprint",function(){bj=true;for(var a=0;a<M.length;a++)ce(M[a])});w(window,"onafterprint",function(){for(var a=0;a<M.length;a++)bz(M[a]);bj=false})}function bz(a,b){var c=a.filters[bh];if(c){c.src=a.src;c.enabled=true}else{a.runtimeStyle.filter=i(bx,a.src,b||"scale");M.push(a)}a.src=bg};function ce(a){a.src=a.pngSrc;a.filters[bh].enabled=false};new function(_){if(k>=7)return;IE7.CSS.addRecalc("position","fixed",_6,"absolute");IE7.CSS.addRecalc("background(-attachment)?","[^};]*fixed",_2);var $viewport=C?"body":"documentElement";function _3(){if(v.currentStyle.backgroundAttachment!="fixed"){if(v.currentStyle.backgroundImage=="none"){v.runtimeStyle.backgroundRepeat="no-repeat";v.runtimeStyle.backgroundImage="url("+bg+")"}v.runtimeStyle.backgroundAttachment="fixed"}_3=Q};var _0=bN("img");function _1(a){return a?bc(a)||_1(a.parentElement):false};function _d(a,b,c){setTimeout("document.all."+a.uniqueID+".runtimeStyle.setExpression('"+b+"','"+c+"')",0)};function _2(a){if(R(_2,a,a.currentStyle.backgroundAttachment=="fixed"&&!a.contains(v))){_3();bgLeft(a);bgTop(a);_8(a)}};function _8(a){_0.src=a.currentStyle.backgroundImage.slice(5,-2);var b=a.canHaveChildren?a:a.parentElement;b.appendChild(_0);setOffsetLeft(a);setOffsetTop(a);b.removeChild(_0)};function bgLeft(a){a.style.backgroundPositionX=a.currentStyle.backgroundPositionX;if(!_1(a)){_d(a,"backgroundPositionX","(parseInt(runtimeStyle.offsetLeft)+document."+$viewport+".scrollLeft)||0")}};eval(A(bgLeft));function setOffsetLeft(a){var b=_1(a)?"backgroundPositionX":"offsetLeft";a.runtimeStyle[b]=getOffsetLeft(a,a.style.backgroundPositionX)-a.getBoundingClientRect().left-a.clientLeft+2};eval(A(setOffsetLeft));function getOffsetLeft(a,b){switch(b){case"left":case"top":return 0;case"right":case"bottom":return s.clientWidth-_0.offsetWidth;case"center":return(s.clientWidth-_0.offsetWidth)/2;default:if(J.test(b)){return parseInt((s.clientWidth-_0.offsetWidth)*parseFloat(b)/100)}_0.style.left=b;return _0.offsetLeft}};eval(A(getOffsetLeft));function _6(a){if(R(_6,a,bc(a))){K(a,"position","absolute");K(a,"left",a.currentStyle.left);K(a,"top",a.currentStyle.top);_3();IE7.Layout.fixRight(a);_4(a)}};function _4(a,b){positionTop(a,b);positionLeft(a,b,true);if(!a.runtimeStyle.autoLeft&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.right!="auto"){var c=s.clientWidth-getPixelWidth(a,a.currentStyle.right)-getPixelWidth(a,a.runtimeStyle._c)-a.clientWidth;if(a.currentStyle.marginRight=="auto")c=parseInt(c/2);if(_1(a.offsetParent))a.runtimeStyle.pixelLeft+=c;else a.runtimeStyle.shiftLeft=c}clipWidth(a);clipHeight(a)};function clipWidth(a){var b=a.runtimeStyle.fixWidth;a.runtimeStyle.borderRightWidth="";a.runtimeStyle.width=b?getPixelWidth(a,b):"";if(a.currentStyle.width!="auto"){var c=a.getBoundingClientRect();var d=a.offsetWidth-s.clientWidth+c.left-2;if(d>=0){a.runtimeStyle.borderRightWidth="0px";d=Math.max(E(a,a.currentStyle.width)-d,0);K(a,"width",d);return d}}};eval(A(clipWidth));function positionLeft(a,b){if(!b&&J.test(a.currentStyle.width)){a.runtimeStyle.fixWidth=a.currentStyle.width}if(a.runtimeStyle.fixWidth){a.runtimeStyle.width=getPixelWidth(a,a.runtimeStyle.fixWidth)}a.runtimeStyle.shiftLeft=0;a.runtimeStyle._c=a.currentStyle.left;a.runtimeStyle.autoLeft=a.currentStyle.right!="auto"&&a.currentStyle.left=="auto";a.runtimeStyle.left="";a.runtimeStyle.screenLeft=getScreenLeft(a);a.runtimeStyle.pixelLeft=a.runtimeStyle.screenLeft;if(!b&&!_1(a.offsetParent)){_d(a,"pixelLeft","runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document."+$viewport+".scrollLeft")}};eval(A(positionLeft));function getScreenLeft(a){var b=a.offsetLeft,c=1;if(a.runtimeStyle.autoLeft){b=s.clientWidth-a.offsetWidth-getPixelWidth(a,a.currentStyle.right)}if(a.currentStyle.marginLeft!="auto"){b-=getPixelWidth(a,a.currentStyle.marginLeft)}while(a=a.offsetParent){if(a.currentStyle.position!="static")c=-1;b+=a.offsetLeft*c}return b};eval(A(getScreenLeft));function getPixelWidth(a,b){return J.test(b)?parseInt(parseFloat(b)/100*s.clientWidth):E(a,b)};eval(A(getPixelWidth));function _g(){var a=_2.elements;for(var b in a)_8(a[b]);a=_6.elements;for(b in a){_4(a[b],true);_4(a[b],true)}_7=0};var _7;bq(function(){if(!_7)_7=setTimeout(_g,0)})};var bk={backgroundColor:"transparent",backgroundImage:"none",backgroundPositionX:null,backgroundPositionY:null,backgroundRepeat:null,borderTopWidth:0,borderRightWidth:0,borderBottomWidth:0,borderLeftStyle:"none",borderTopStyle:"none",borderRightStyle:"none",borderBottomStyle:"none",borderLeftWidth:0,height:null,marginTop:0,marginBottom:0,marginRight:0,marginLeft:0,width:"100%"};IE7.CSS.addRecalc("overflow","visible",function(a){if(a.parentNode.ie7_wrapped)return;if(IE7.Layout&&a.currentStyle["max-height"]!="auto"){IE7.Layout.maxHeight(a)}if(a.currentStyle.marginLeft=="auto")a.style.marginLeft=0;if(a.currentStyle.marginRight=="auto")a.style.marginRight=0;var b=document.createElement(bA);b.ie7_wrapped=a;for(var c in bk){b.style[c]=a.currentStyle[c];if(bk[c]!=null){a.runtimeStyle[c]=bk[c]}}b.style.display="block";b.style.position="relative";a.runtimeStyle.position="absolute";a.parentNode.insertBefore(b,a);b.appendChild(a)});function cf(){var f="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var g=0;g<f.length;g++){f[f[g]]=f[g-1]||"0.67em"}IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/,function(a,b,c,d){return b+(f[d]||d)});if(k<6){var h=/^\-/,p=/(em|ex)$/i;var t=/em$/i,q=/ex$/i;E=function(a,b){if(bL.test(b))return parseInt(b)||0;var c=h.test(b)?-1:1;if(p.test(b))c*=u(a);j.style.width=(c<0)?b.slice(1):b;v.appendChild(j);b=c*j.offsetWidth;j.removeNode();return parseInt(b)};var j=bN();function u(a){var b=1;j.style.fontFamily=a.currentStyle.fontFamily;j.style.lineHeight=a.currentStyle.lineHeight;while(a!=v){var c=a.currentStyle["ie7-font-size"];if(c){if(t.test(c))b*=parseFloat(c);else if(J.test(c))b*=(parseFloat(c)/100);else if(q.test(c))b*=(parseFloat(c)/2);else{j.style.fontSize=c;return 1}}a=a.parentElement}return b};IE7.CSS.addFix(/cursor\s*:\s*pointer/,"cursor:hand");IE7.CSS.addFix(/display\s*:\s*list-item/,"display:block")}function l(a){if(k<5.5)IE7.Layout.boxSizing(a.parentElement);var b=a.parentElement;var c=b.offsetWidth-a.offsetWidth-r(b);var d=(a.currentStyle["ie7-margin"]&&a.currentStyle.marginRight=="auto")||a.currentStyle["ie7-margin-right"]=="auto";switch(b.currentStyle.textAlign){case"right":c=d?parseInt(c/2):0;a.runtimeStyle.marginRight=c+"px";break;case"center":if(d)c=0;default:if(d)c/=2;a.runtimeStyle.marginLeft=parseInt(c)+"px"}};function r(a){return E(a,a.currentStyle.paddingLeft)+E(a,a.currentStyle.paddingRight)};IE7.CSS.addRecalc("margin(-left|-right)?","[^};]*auto",function(a){if(R(l,a,a.parentElement&&a.currentStyle.display=="block"&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.position!="absolute")){l(a)}});bq(function(){for(var a in l.elements){var b=l.elements[a];b.runtimeStyle.marginLeft=b.runtimeStyle.marginRight="";l(b)}})};IE7.loaded=true;(function(){try{bm.doScroll("left")}catch(e){setTimeout(arguments.callee,1);return}try{eval(bB.innerHTML)}catch(e){}bi=new RegExp(bb(typeof IE7_PNG_SUFFIX=="string"?IE7_PNG_SUFFIX:"-trans.png")+"$","i");v=document.body;s=C?v:bm;v.className+=" ie7_body";bm.className+=" ie7_html";if(C)cf();IE7.CSS.init();IE7.HTML.init();IE7.HTML.apply();IE7.CSS.apply();IE7.recalc()})()})();
+// timestamp: Sun, 03 Feb 2008 19:26:22
+/*
+  IE7/IE8.js - copyright 2004-2008, Dean Edwards
+  http://dean.edwards.name/IE7/
+  http://www.opensource.org/licenses/mit-license.php
+*/
+
+/* W3C compliance for Microsoft Internet Explorer */
+
+/* credits/thanks:
+  Shaggy, Martijn Wargers, Jimmy Cerra, Mark D Anderson,
+  Lars Dieckow, Erik Arvidsson, Gellért Gyuris, James Denny,
+  Unknown W Brackets, Benjamin Westfarer, Rob Eberhardt,
+  Bill Edney, Kevin Newman, James Crompton, Matthew Mastracci,
+  Doug Wright, Richard York, Kenneth Kolano, MegaZone,
+  Thomas Verelst, Mark 'Tarquin' Wilton-Jones, Rainer Åhlfors,
+  David Zulaica, Ken Kolano, Kevin Newman
+*/
+
+// =======================================================================
+// TO DO
+// =======================================================================
+
+// PNG - unclickable content
+
+// =======================================================================
+// TEST/BUGGY
+// =======================================================================
+
+// hr{margin:1em auto} (doesn't look right in IE5)
+
+(function() {
+
+IE7 = {
+  toString: function(){return "IE7 version 2.0 (beta2)"}
+};
+var appVersion = IE7.appVersion = navigator.appVersion.match(/MSIE (\d\.\d)/)[1];
+
+if (/ie7_off/.test(top.location.search) || appVersion < 5) return;
+
+var Undefined = K();
+var quirksMode = document.compatMode != "CSS1Compat";
+var documentElement = document.documentElement, body, viewport;
+var ANON = "!";
+var HEADER = ":link{ie7-link:link}:visited{ie7-link:visited}";
+
+// -----------------------------------------------------------------------
+// external
+// -----------------------------------------------------------------------
+
+var RELATIVE = /^[\w\.]+[^:]*$/;
+function makePath(href, path) {
+  if (RELATIVE.test(href)) href = (path || "") + href;
+  return href;
+};
+
+function getPath(href, path) {
+  href = makePath(href, path);
+  return href.slice(0, href.lastIndexOf("/") + 1);
+};
+
+// get the path to this script
+var script = document.scripts[document.scripts.length - 1];
+var path = getPath(script.src);
+
+// we'll use microsoft's http request object to load external files
+try {
+  var httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+} catch (e) {
+  // ActiveX disabled
+}
+
+var fileCache = {};
+function loadFile(href, path) {
+try {
+  href = makePath(href, path);
+  if (!fileCache[href]) {
+    // easy to load a file huh?
+    httpRequest.open("GET", href, false);
+    httpRequest.send();
+    if (httpRequest.status == 0 || httpRequest.status == 200) {
+      fileCache[href] = httpRequest.responseText;
+    }
+  }
+} catch (e) {
+  // ignore errors
+} finally {
+  return fileCache[href] || "";
+}};
+
+// -----------------------------------------------------------------------
+// IE5.0 compatibility
+// -----------------------------------------------------------------------
+
+
+if (appVersion < 5.5) {
+  undefined = Undefined();
+
+  ANON = "HTML:!"; // for anonymous content
+  
+  // Fix String.replace (Safari1.x/IE5.0).
+  var GLOBAL = /(g|gi)$/;
+  var _String_replace = String.prototype.replace; 
+  String.prototype.replace = function(expression, replacement) {
+    if (typeof replacement == "function") { // Safari doesn't like functions
+      if (expression && expression.constructor == RegExp) {
+        var regexp = expression;
+        var global = regexp.global;
+        if (global == null) global = GLOBAL.test(regexp);
+        // we have to convert global RexpExps for exec() to work consistently
+        if (global) regexp = new RegExp(regexp.source); // non-global
+      } else {
+        regexp = new RegExp(rescape(expression));
+      }
+      var match, string = this, result = "";
+      while (string && (match = regexp.exec(string))) {
+        result += string.slice(0, match.index) + replacement.apply(this, match);
+        string = string.slice(match.index + match[0].length);
+        if (!global) break;
+      }
+      return result + string;
+    }
+    return _String_replace.apply(this, arguments);
+  };
+  
+  Array.prototype.pop = function() {
+    if (this.length) {
+      var i = this[this.length - 1];
+      this.length--;
+      return i;
+    }
+    return undefined;
+  };
+  
+  Array.prototype.push = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      this[this.length] = arguments[i];
+    }
+    return this.length;
+  };
+  
+  var ns = this;
+  Function.prototype.apply = function(o, a) {
+    if (o === undefined) o = ns;
+    else if (o == null) o = window;
+    else if (typeof o == "string") o = new String(o);
+    else if (typeof o == "number") o = new Number(o);
+    else if (typeof o == "boolean") o = new Boolean(o);
+    if (arguments.length == 1) a = [];
+    else if (a[0] && a[0].writeln) a[0] = a[0].documentElement.document || a[0];
+    var $ = "#ie7_apply", r;
+    o[$] = this;
+    switch (a.length) { // unroll for speed
+      case 0: r = o[$](); break;
+      case 1: r = o[$](a[0]); break;
+      case 2: r = o[$](a[0],a[1]); break;
+      case 3: r = o[$](a[0],a[1],a[2]); break;
+      case 4: r = o[$](a[0],a[1],a[2],a[3]); break;
+      case 5: r = o[$](a[0],a[1],a[2],a[3],a[4]); break;
+      default:
+        var b = [], i = a.length - 1;
+        do b[i] = "a[" + i + "]"; while (i--);
+        eval("r=o[$](" + b + ")");
+    }
+    if (typeof o.valueOf == "function") { // not a COM object
+      delete o[$];
+    } else {
+      o[$] = undefined;
+      if (r && r.writeln) r = r.documentElement.document || r;
+    }
+    return r;
+  };
+  
+  Function.prototype.call = function(o) {
+    return this.apply(o, _slice.apply(arguments, [1]));
+  };
+
+  // block elements are "inline" according to IE5.0 so we'll fix it
+  HEADER += "address,blockquote,body,dd,div,dt,fieldset,form,"+
+    "frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+
+    "hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}";
+}
+
+// -----------------------------------------------------------------------
+// OO support
+// -----------------------------------------------------------------------
+
+
+// This is a cut-down version of base2 (http://code.google.com/p/base2/)
+
+var _slice = Array.prototype.slice;
+
+// private
+var _FORMAT = /%([1-9])/g;
+var _LTRIM = /^\s\s*/;
+var _RTRIM = /\s\s*$/;
+var _RESCAPE = /([\/()[\]{}|*+-.,^$?\\])/g;           // safe regular expressions
+var _BASE = /\bbase\b/;
+var _HIDDEN = ["constructor", "toString"];            // only override these when prototyping
+
+var prototyping;
+
+function Base(){};
+Base.extend = function(_instance, _static) {
+  // Build the prototype.
+  prototyping = true;
+  var _prototype = new this;
+  extend(_prototype, _instance);
+  prototyping = false;
+
+  // Create the wrapper for the constructor function.
+  var _constructor = _prototype.constructor;
+  function klass() {
+    // Don't call the constructor function when prototyping.
+    if (!prototyping) _constructor.apply(this, arguments);
+  };
+  _prototype.constructor = klass;
+
+  // Build the static interface.
+  klass.extend = arguments.callee;
+  extend(klass, _static);
+  klass.prototype = _prototype;
+  return klass;
+};
+Base.prototype.extend = function(source) {
+  return extend(this, source);
+};
+
+// A collection of regular expressions and their associated replacement values.
+// A Base class for creating parsers.
+
+var _HASH   = "#";
+var _KEYS   = "~";
+
+var _RG_ESCAPE_CHARS    = /\\./g;
+var _RG_ESCAPE_BRACKETS = /\(\?[:=!]|\[[^\]]+\]/g;
+var _RG_BRACKETS        = /\(/g;
+
+var RegGrp = Base.extend({
+  constructor: function(values) {
+    this[_KEYS] = [];
+    this.merge(values);
+  },
+
+  exec: function(string) {
+    var items = this, keys = this[_KEYS];    
+    return String(string).replace(new RegExp(this, this.ignoreCase ? "gi" : "g"), function() {
+      var item, offset = 1, i = 0;
+      // Loop through the RegGrp items.
+      while ((item = items[_HASH + keys[i++]])) {
+        var next = offset + item.length + 1;
+        if (arguments[offset]) { // do we have a result?
+          var replacement = item.replacement;
+          switch (typeof replacement) {
+            case "function":
+              return replacement.apply(items, _slice.call(arguments, offset, next));
+            case "number":
+              return arguments[offset + replacement];
+            default:
+              return replacement;
+          }
+        }
+        offset = next;
+      }
+    });
+  },
+
+  add: function(expression, replacement) {
+    if (expression instanceof RegExp) {
+      expression = expression.source;
+    }
+    if (!this[_HASH + expression]) this[_KEYS].push(String(expression));
+    this[_HASH + expression] = new RegGrp.Item(expression, replacement);
+  },
+
+  merge: function(values) {
+    for (var i in values) this.add(i, values[i]);
+  },
+
+  toString: function() {
+    // back references not supported in simple RegGrp
+    return "(" + this[_KEYS].join(")|(") + ")";
+  }
+}, {
+  IGNORE: "$0",
+
+  Item: Base.extend({
+    constructor: function(expression, replacement) {
+      expression = expression instanceof RegExp ? expression.source : String(expression);
+
+      if (typeof replacement == "number") replacement = String(replacement);
+      else if (replacement == null) replacement = "";
+
+      // does the pattern use sub-expressions?
+      if (typeof replacement == "string" && /\$(\d+)/.test(replacement)) {
+        // a simple lookup? (e.g. "$2")
+        if (/^\$\d+$/.test(replacement)) {
+          // store the index (used for fast retrieval of matched strings)
+          replacement = parseInt(replacement.slice(1));
+        } else { // a complicated lookup (e.g. "Hello $2 $1")
+          // build a function to do the lookup
+          var Q = /'/.test(replacement.replace(/\\./g, "")) ? '"' : "'";
+          replacement = replacement.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\$(\d+)/g, Q +
+            "+(arguments[$1]||" + Q+Q + ")+" + Q);
+          replacement = new Function("return " + Q + replacement.replace(/(['"])\1\+(.*)\+\1\1$/, "$1") + Q);
+        }
+      }
+
+      this.length = RegGrp.count(expression);
+      this.replacement = replacement;
+      this.toString = K(expression);
+    }
+  }),
+
+  count: function(expression) {
+    // Count the number of sub-expressions in a RegExp/RegGrp.Item.
+    expression = String(expression).replace(_RG_ESCAPE_CHARS, "").replace(_RG_ESCAPE_BRACKETS, "");
+    return match(expression, _RG_BRACKETS).length;
+  }
+});
+
+// =========================================================================
+// lang/extend.js
+// =========================================================================
+
+function extend(object, source) { // or extend(object, key, value)
+  if (object && source) {
+    var proto = (typeof source == "function" ? Function : Object).prototype;
+    // Add constructor, toString etc
+    var i = _HIDDEN.length, key;
+    if (prototyping) while (key = _HIDDEN[--i]) {
+      var value = source[key];
+      if (value != proto[key]) {
+        if (_BASE.test(value)) {
+          _override(object, key, value)
+        } else {
+          object[key] = value;
+        }
+      }
+    }
+    // Copy each of the source object's properties to the target object.
+    for (key in source) if (proto[key] === undefined) {
+      var value = source[key];
+      // Check for method overriding.
+      if (object[key] && typeof value == "function" && _BASE.test(value)) {
+        _override(object, key, value);
+      } else {
+        object[key] = value;
+      }
+    }
+  }
+  return object;
+};
+
+function _override(object, name, method) {
+  // Override an existing method.
+  var ancestor = object[name];
+  object[name] = function() {
+    var previous = this.base;
+    this.base = ancestor;
+    var returnValue = method.apply(this, arguments);
+    this.base = previous;
+    return returnValue;
+  };
+};
+
+function combine(keys, values) {
+  // Combine two arrays to make a hash.
+  if (!values) values = keys;
+  var hash = {};
+  for (var i in keys) hash[i] = values[i];
+  return hash;
+};
+
+function format(string) {
+  // Replace %n with arguments[n].
+  // e.g. format("%1 %2%3 %2a %1%3", "she", "se", "lls");
+  // ==> "she sells sea shells"
+  // Only %1 - %9 supported.
+  var args = arguments;
+  var _FORMAT = new RegExp("%([1-" + arguments.length + "])", "g");
+  return String(string).replace(_FORMAT, function(match, index) {
+    return index < args.length ? args[index] : match;
+  });
+};
+
+function match(string, expression) {
+  // Same as String.match() except that this function will return an empty
+  // array if there is no match.
+  return String(string).match(expression) || [];
+};
+
+function rescape(string) {
+  // Make a string safe for creating a RegExp.
+  return String(string).replace(_RESCAPE, "\\$1");
+};
+
+// http://blog.stevenlevithan.com/archives/faster-trim-javascript
+function trim(string) {
+  return String(string).replace(_LTRIM, "").replace(_RTRIM, "");
+};
+
+function K(k) {
+  return function() {
+    return k;
+  };
+};
+
+// -----------------------------------------------------------------------
+// parsing
+// -----------------------------------------------------------------------
+
+var Parser = RegGrp.extend({ignoreCase: true});
+
+var ENCODED = /\x01(\d+)/g,
+    QUOTES  = /'/g, 
+    STRING = /^\x01/,
+    UNICODE = /\\([\da-fA-F]{1,4})/g;
+
+var _strings = [];
+
+var encoder = new Parser({
+  // comments
+  "<!\\-\\-|\\-\\->": "",
+  "\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/": "",
+  // get rid
+  "@(namespace|import)[^;\\n]+[;\\n]": "",
+  // strings
+  "'(\\\\.|[^'\\\\])*'": encodeString,
+  '"(\\\\.|[^"\\\\])*"': encodeString,
+  // white space
+  "\\s+": " "
+});
+
+function encode(cssText) {
+  return encoder.exec(cssText);
+};
+
+function decode(cssText) {
+  return cssText.replace(ENCODED, function(match, index) {
+    return _strings[index - 1];
+  });
+};
+
+function encodeString(string) {
+  return "\x01" + _strings.push(string.replace(UNICODE, function(match, chr) {
+    return eval("'\\u" + "0000".slice(chr.length) + chr + "'");
+  }).slice(1, -1).replace(QUOTES, "\\'"));
+};
+
+function getString(value) {
+  return STRING.test(value) ? _strings[value.slice(1) - 1] : value;
+};
+
+// clone a "width" function to create a "height" function
+var rotater = new RegGrp({
+  Width: "Height",
+  width: "height",
+  Left:  "Top",
+  left:  "top",
+  Right: "Bottom",
+  right: "bottom",
+  onX:   "onY"
+});
+
+function rotate(fn) {
+  return rotater.exec(fn);
+};
+
+// -----------------------------------------------------------------------
+// event handling
+// -----------------------------------------------------------------------
+
+var eventHandlers = [];
+
+function addResize(handler) {
+  addRecalc(handler);
+  addEventHandler(window, "onresize", handler);
+};
+
+// add an event handler (function) to an element
+function addEventHandler(element, type, handler) {
+  element.attachEvent(type, handler);
+  // store the handler so it can be detached later
+  eventHandlers.push(arguments);
+};
+
+// remove an event handler assigned to an element by IE7
+function removeEventHandler(element, type, handler) {
+try {
+  element.detachEvent(type, handler);
+} catch (ignore) {
+  // write a letter of complaint to microsoft..
+}};
+
+// remove event handlers (they eat memory)
+addEventHandler(window, "onunload", function() {
+  var handler;
+  while (handler = eventHandlers.pop()) {
+    removeEventHandler(handler[0], handler[1], handler[2]);
+  }
+});
+
+function register(handler, element, condition) { // -@DRE
+  //var set = handler[element.uniqueID];
+  if (!handler.elements) handler.elements = {};
+  if (condition) handler.elements[element.uniqueID] = element;
+  else delete handler.elements[element.uniqueID];
+  //return !set && condition;
+  return condition;
+};
+
+addEventHandler(window, "onbeforeprint", function() {
+  if (!IE7.CSS.print) new StyleSheet("print");
+  IE7.CSS.print.recalc();
+});
+
+// -----------------------------------------------------------------------
+// pixel conversion
+// -----------------------------------------------------------------------
+
+// this is handy because it means that web developers can mix and match
+//  measurement units in their style sheets. it is not uncommon to
+//  express something like padding in "em" units whilst border thickness
+//  is most often expressed in pixels.
+
+var PIXEL = /^\d+(px)?$/i;
+var PERCENT = /^\d+%$/;
+var getPixelValue = function(element, value) {
+  if (PIXEL.test(value)) return parseInt(value);
+  var style = element.style.left;
+  var runtimeStyle = element.runtimeStyle.left;
+  element.runtimeStyle.left = element.currentStyle.left;
+  element.style.left = value || 0;
+  value = element.style.pixelLeft;
+  element.style.left = style;
+  element.runtimeStyle.left = runtimeStyle;
+  return value;
+};
+
+// -----------------------------------------------------------------------
+// generic
+// -----------------------------------------------------------------------
+
+var $IE7 = "ie7-";
+
+var Fix = Base.extend({
+  constructor: function() {
+    this.fixes = [];
+    this.recalcs = [];
+  },
+  init: Undefined
+});
+
+// a store for functions that will be called when refreshing IE7
+var recalcs = [];
+function addRecalc(recalc) {
+  recalcs.push(recalc);
+};
+
+IE7.recalc = function() {
+  IE7.HTML.recalc();
+  // re-apply style sheet rules (re-calculate ie7 classes)
+  IE7.CSS.recalc();
+  // apply global fixes to the document
+  for (var i = 0; i < recalcs.length; i++) recalcs[i]();
+};
+
+function isFixed(element) {
+  return element.currentStyle["ie7-position"] == "fixed";
+};
+
+// original style
+function getDefinedStyle(element, propertyName) {
+  return element.currentStyle[$IE7 + propertyName] || element.currentStyle[propertyName];
+};
+
+function setOverrideStyle(element, propertyName, value) {
+  if (element.currentStyle[$IE7 + propertyName] == null) {
+    element.runtimeStyle[$IE7 + propertyName] = element.currentStyle[propertyName];
+  }
+  element.runtimeStyle[propertyName] = value;
+};
+
+// create a temporary element which is used to inherit styles
+//  from the target element. the temporary element can be resized
+//  to determine pixel widths/heights
+function createTempElement(tagName) {
+  var element = document.createElement(tagName || "object");
+  element.style.cssText = "position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";
+  element.ie7_anon = true;
+  return element;
+};
+
+
+// =========================================================================
+// ie7-cssQuery.js
+// =========================================================================
+
+function cssQuery(selector, context, single) {
+  if (!_cache[selector]) {
+    reg = []; // store for RegExp objects
+    var fn = "";
+    var selectors = cssParser.escape(selector).split(",");
+    for (var i = 0; i < selectors.length; i++) {
+      _wild = _index = _list = 0; // reset
+      _duplicate = selectors.length > 1 ? 2 : 0; // reset
+      var block = cssParser.exec(selectors[i]) || "if(0){";
+      if (_wild) { // IE's pesky comment nodes
+        block += format("if(e%1.nodeName!='!'){", _index);
+      }
+      // check for duplicates before storing results
+      var store = _duplicate > 1 ? _TEST : "";
+      block += format(store + _STORE, _index);
+      // add closing braces
+      block += Array(match(block, /\{/g).length + 1).join("}");
+      fn += block;
+    }
+    eval(format(_FN, reg) + cssParser.unescape(fn) + "return s?null:r}");
+    _cache[selector] = _selectorFunction;
+  }
+  return _cache[selector](context || document, single);
+};
+
+var _MSIE5 = appVersion < 6;
+
+var _EVALUATED = /^(href|src)$/;
+var _ATTRIBUTES = {
+  "class": "className",
+  "for": "htmlFor"
+};
+
+IE7._indexed = 1;
+
+IE7._byId = function(document, id) {
+  var result = document.all[id] || null;
+  // returns a single element or a collection
+  if (!result || result.id == id) return result;
+  // document.all has returned a collection of elements with name/id
+  for (var i = 0; i < result.length; i++) {
+    if (result[i].id == id) return result[i];
+  }
+  return null;
+};
+
+IE7._getAttribute = function(element, name) {
+  if (name == "src" && element.pngSrc) return element.pngSrc;
+  
+  var attribute = _MSIE5 ? (element.attributes[name] || element.attributes[_ATTRIBUTES[name.toLowerCase()]]) : element.getAttributeNode(name);
+  if (attribute && (attribute.specified || name == "value")) {
+    if (_EVALUATED.test(name)) {
+      return element.getAttribute(name, 2);
+    } else if (name == "class") {
+     return element.className.replace(/\sie7_\w+/g, "");
+    } else if (name == "style") {
+     return element.style.cssText;
+    } else {
+     return attribute.nodeValue;
+    }
+  }
+  return null;
+};
+
+var names = "colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";
+// Convert the list of strings to a hash, mapping the lowercase name to the camelCase name.
+extend(_ATTRIBUTES, combine(names.toLowerCase().split(","), names.split(",")));
+
+IE7._getNextElementSibling = function(node) {
+  // return the next element to the supplied element
+  //  nextSibling is not good enough as it might return a text or comment node
+  while (node && (node = node.nextSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+IE7._getPreviousElementSibling = function(node) {
+  // return the previous element to the supplied element
+  while (node && (node = node.previousSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+// =========================================================================
+// CSSParser
+// =========================================================================
+
+var IMPLIED_ASTERISK = /([\s>+~,]|[^(]\+|^)([#.:\[])/g,
+    IMPLIED_SPACE =    /(^|,)([^\s>+~])/g,
+    WHITESPACE =       /\s*([\s>+~(),]|^|$)\s*/g,
+    WILD_CARD =        /\s\*\s/g;;
+
+var CSSParser = RegGrp.extend({
+  constructor: function(items) {
+    this.base(items);
+    this.sorter = new RegGrp;
+    this.sorter.add(/:not\([^)]*\)/, RegGrp.IGNORE);
+    this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/, "$1$3$6$4");
+  },
+  
+  ignoreCase: true,
+
+  escape: function(selector) {
+    return this.optimise(this.format(selector));
+  },
+
+  format: function(selector) {
+    return selector
+      .replace(WHITESPACE, "$1")
+      .replace(IMPLIED_SPACE, "$1 $2")
+      .replace(IMPLIED_ASTERISK, "$1*$2");
+  },
+
+  optimise: function(selector) {
+    // optimise wild card descendant selectors
+    return this.sorter.exec(selector.replace(WILD_CARD, ">* "));
+  },
+
+  unescape: function(selector) {
+    return decode(selector);
+  }
+});
+
+// some constants
+var _OPERATORS = {
+  "":   "%1!=null",
+  "=":  "%1=='%2'",
+  "~=": /(^| )%1( |$)/,
+  "|=": /^%1(-|$)/,
+  "^=": /^%1/,
+  "$=": /%1$/,
+  "*=": /%1/
+};
+
+var _PSEUDO_CLASSES = {
+  "first-child": "!IE7._getPreviousElementSibling(e%1)",
+  "link":        "e%1.currentStyle['ie7-link']=='link'",
+  "visited":     "e%1.currentStyle['ie7-link']=='visited'"
+};
+
+var _VAR = "var p%2=0,i%2,e%2,n%2=e%1.";
+var _ID = "e%1.sourceIndex";
+var _TEST = "var g=" + _ID + ";if(!p[g]){p[g]=1;";
+var _STORE = "r[r.length]=e%1;if(s)return e%1;";
+var _FN = "var _selectorFunction=function(e0,s){IE7._indexed++;var r=[],p={},reg=[%1],d=document;";
+var reg; // a store for RexExp objects
+var _index;
+var _wild; // need to flag certain _wild card selectors as MSIE includes comment nodes
+var _list; // are we processing a node _list?
+var _duplicate; // possible duplicates?
+var _cache = {}; // store parsed selectors
+
+// a hideous parser
+var cssParser = new CSSParser({
+  " (\\*|[\\w-]+)#([\\w-]+)": function(match, tagName, id) { // descendant selector followed by ID
+    _wild = false;
+    var replacement = "var e%2=IE7._byId(d,'%4');if(e%2&&";
+    if (tagName != "*") replacement += "e%2.nodeName=='%3'&&";
+    replacement += "(e%1==d||e%1.contains(e%2))){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index++, _index, tagName.toUpperCase(), id);
+  },
+  
+  " (\\*|[\\w-]+)": function(match, tagName) { // descendant selector
+    _duplicate++; // this selector may produce duplicates
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // IE5.x does not support getElementsByTagName("*");
+    replacement += (_wild && _MSIE5) ? "all" : "getElementsByTagName('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  ">(\\*|[\\w-]+)": function(match, tagName) { // child selector
+    var children = _list;
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // use the children property for MSIE as it does not contain text nodes
+    //  (but the children collection still includes comments).
+    // the document object does not have a children collection
+    replacement += children ? "children": "childNodes";
+    if (!_wild && children) replacement += ".tags('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    if (_wild) {
+      replacement += "if(e%2.nodeType==1){";
+      _wild = _MSIE5;
+    } else {
+      if (!children) replacement += "if(e%2.nodeName=='%3'){";
+    }
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  "\\+(\\*|[\\w-]+)": function(match, tagName) { // direct adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    replacement += "e%1=IE7._getNextElementSibling(e%1);if(e%1";
+    if (tagName != "*") replacement += "&&e%1.nodeName=='%2'";
+    replacement += "){";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "~(\\*|[\\w-]+)": function(match, tagName) { // indirect adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    _duplicate = 2; // this selector may produce duplicates
+    replacement += "while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._indexed)break;if(";
+    if (tagName == "*") {
+      replacement += "e%1.nodeType==1";
+      if (_MSIE5) replacement += "&&e%1.nodeName!='!'";
+    } else replacement += "e%1.nodeName=='%2'";
+    replacement += "){e%1.ie7_adjacent=IE7._indexed;";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "#([\\w-]+)": function(match, id) { // ID selector
+    _wild = false;
+    var replacement = "if(e%1.id=='%2'){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index, id);
+  },
+  
+  "\\.([\\w-]+)": function(match, className) { // class selector
+    _wild = false;
+    // store RegExp objects - slightly faster on IE
+    reg.push(new RegExp("(^|\\s)" + rescape(className) + "(\\s|$)"));
+    return format("if(e%1.className&&reg[%2].test(e%1.className)){", _index, reg.length - 1);
+  },
+  
+  "\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]": function(match, attr, operator, value) { // attribute selectors
+    var alias = _ATTRIBUTES[attr] || attr;
+    if (operator) {
+      var getAttribute = "e%1.getAttribute('%2',2)";
+      if (!_EVALUATED.test(attr)) {
+        getAttribute = "e%1.%3||" + getAttribute;
+      }
+      attr = format("(" + getAttribute + ")", _index, attr, alias);
+    } else {
+      attr = format("IE7._getAttribute(e%1,'%2')", _index, attr);
+    }
+    var replacement = _OPERATORS[operator || ""] || "0";
+    if (replacement && replacement.source) {
+      reg.push(new RegExp(format(replacement.source, rescape(cssParser.unescape(value)))));
+      replacement = "reg[%2].test(%1)";
+      value = reg.length - 1;
+    }
+    return "if(" + format(replacement, attr, value) + "){";
+  },
+  
+  ":+([\\w-]+)(\\(([^)]+)\\))?": function(match, pseudoClass, $2, args) { // pseudo class selectors
+    pseudoClass = _PSEUDO_CLASSES[pseudoClass];
+    return "if(" + (pseudoClass ? format(pseudoClass, _index, args || "")  : "0") + "){";
+  }
+});
+
+// =========================================================================
+// ie7-css.js
+// =========================================================================
+
+var HYPERLINK = /a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;
+var BRACE1 = /\s*\{\s*/, BRACE2 = /\s*\}\s*/, COMMA = /\s*\,\s*/;
+var FIRST_LINE_LETTER = /(.*)(:first-(line|letter))/;
+
+//var UNKNOWN = /UNKNOWN|([:.])\w+\1/i;
+
+var styleSheets = document.styleSheets;
+
+IE7.CSS = new (Fix.extend({ // single instance
+  parser: new Parser,
+  screen: "",
+  print: "",
+  styles: [],
+  rules: [],
+  pseudoClasses: appVersion < 7 ? "first\\-child" : "",
+  dynamicPseudoClasses: {
+    toString: function() {
+      var strings = [];
+      for (var pseudoClass in this) strings.push(pseudoClass);
+      return strings.join("|");
+    }
+  },
+  
+  init: function() {
+    var NONE = "^\x01$";
+    var CLASS = "\\[class=?[^\\]]*\\]";
+    var pseudoClasses = [];
+    if (this.pseudoClasses) pseudoClasses.push(this.pseudoClasses);
+    var dynamicPseudoClasses = this.dynamicPseudoClasses.toString(); 
+    if (dynamicPseudoClasses) pseudoClasses.push(dynamicPseudoClasses);
+    pseudoClasses = pseudoClasses.join("|");
+    var unknown = appVersion < 7 ? ["[>+~[(]|([:.])\\w+\\1"] : [CLASS];
+    if (pseudoClasses) unknown.push(":(" + pseudoClasses + ")");
+    this.UNKNOWN = new RegExp(unknown.join("|") || NONE, "i");
+    var complex = appVersion < 7 ? ["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"] : [CLASS];
+    var complexRule = complex.concat();
+    if (pseudoClasses) complexRule.push(":(" + pseudoClasses + ")");
+    Rule.COMPLEX = new RegExp(complexRule.join("|") || NONE, "ig");
+    if (this.pseudoClasses) complex.push(":(" + this.pseudoClasses + ")");
+    DynamicRule.COMPLEX = new RegExp(complex.join("|") || NONE, "i");
+    DynamicRule.MATCH = new RegExp(dynamicPseudoClasses ? "(.*):(" + dynamicPseudoClasses + ")(.*)" : NONE, "i");
+    
+    this.createStyleSheet();
+    this.refresh();
+  },
+  
+	addEventHandler: function() {
+		addEventHandler.apply(null, arguments);
+	},
+  
+  addFix: function(expression, replacement) {
+    this.parser.add(expression, replacement);
+  },
+  
+  addRecalc: function(propertyName, test, handler, replacement) {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    test = new RegExp("([{;\\s])" + propertyName + "\\s*:\\s*" + test + "[^;}]*");
+    var id = this.recalcs.length;
+    if (replacement) replacement = propertyName + ":" + replacement;
+    this.addFix(test, function(match, $1) {
+      return (replacement ? $1 + replacement : match) + ";ie7-" + match.slice(1) + ";ie7_recalc" + id + ":1";
+    });
+    this.recalcs.push(arguments);
+    return id;
+  },
+  
+  apply: function() {
+    this.getInlineStyles();
+    new StyleSheet("screen");
+    this.trash();
+  },
+  
+  createStyleSheet: function() {
+    // create the IE7 style sheet
+    this.styleSheet = document.createStyleSheet();
+    // flag it so we can ignore it during parsing
+    this.styleSheet.ie7 = true;
+    this.styleSheet.owningElement.ie7 = true;
+    this.styleSheet.cssText = HEADER;
+  },
+  
+  getInlineStyles: function() {
+    // load inline styles
+    var styleSheets = document.getElementsByTagName("style"), styleSheet;
+    for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) {
+      if (!styleSheet.disabled && !styleSheet.ie7) {
+        this.styles.push(styleSheet.innerHTML);
+      }
+    }
+  },
+  
+  getText: function(styleSheet, path) {
+    // explorer will trash unknown selectors (it converts them to "UNKNOWN").
+    // so we must reload external style sheets (internal style sheets can have their text
+    //  extracted through the innerHTML property).
+      // load the style sheet text from an external file
+    try {
+      var cssText = styleSheet.cssText;
+    } catch (e) {
+      cssText = "";
+    }
+    if (httpRequest) cssText = loadFile(styleSheet.href, path) || cssText;
+    return cssText;
+  },
+  
+  recalc: function() {
+    this.screen.recalc();
+    // we're going to read through all style rules.
+    //  certain rules have had ie7 properties added to them.
+    //   e.g. p{top:0; ie7_recalc2:1; left:0}
+    //  this flags a property in the rule as needing a fix.
+    //  the selector text is then used to query the document.
+    //  we can then loop through the results of the query
+    //  and fix the elements.
+    // we ignore the IE7 rules - so count them in the header
+    var RECALCS = /ie7_recalc\d+/g;
+    var start = HEADER.match(/[{,]/g).length;
+    // only calculate screen fixes. print fixes don't show up anyway
+    var stop = start + (this.screen.cssText.match(/\{/g)||"").length;
+    var rules = this.styleSheet.rules, rule;
+    var calcs, calc, elements, element, i, j, k, id;
+    // loop through all rules
+    for (i = start; i < stop; i++) {
+      rule = rules[i];
+      var cssText = rule.style.cssText;
+      // search for the "ie7_recalc" flag (there may be more than one)
+      if (rule && (calcs = cssText.match(RECALCS))) {
+        // use the selector text to query the document
+        elements = cssQuery(rule.selectorText);
+        // if there are matching elements then loop
+        //  through the recalc functions and apply them
+        //  to each element
+        if (elements.length) for (j = 0; j < calcs.length; j++) {
+          // get the matching flag (e.g. ie7_recalc3)
+          id = calcs[j];
+          // extract the numeric id from the end of the flag
+          //  and use it to index the collection of recalc
+          //  functions
+          calc = IE7.CSS.recalcs[id.slice(10)][2];
+          for (k = 0; (element = elements[k]); k++) {
+            // apply the fix
+            if (element.currentStyle[id]) calc(element, cssText);
+          }
+        }
+      }
+    }
+  },
+  
+  refresh: function() {
+    this.styleSheet.cssText = HEADER + this.screen + this.print;
+  },
+  
+  trash: function() {
+    // trash the old style sheets
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].ie7) {
+        try {
+          var cssText = styleSheets[i].cssText;
+        } catch (e) {
+          cssText = "";
+        }
+        if (cssText) styleSheets[i].cssText = "";
+      }
+    }
+  }
+}));
+
+// -----------------------------------------------------------------------
+//  IE7 StyleSheet class
+// -----------------------------------------------------------------------
+
+var StyleSheet = Base.extend({
+  constructor: function(media) {
+    this.media = media;
+    this.load();
+    IE7.CSS[media] = this;
+    IE7.CSS.refresh();
+  },
+  
+  createRule: function(selector, cssText) {
+    if (IE7.CSS.UNKNOWN.test(selector)) {
+      var match;
+      if (PseudoElement && (match = selector.match(PseudoElement.MATCH))) {
+        return new PseudoElement(match[1], match[2], cssText);
+      } else if (match = selector.match(DynamicRule.MATCH)) {
+        if (!HYPERLINK.test(match[0]) || DynamicRule.COMPLEX.test(match[0])) {
+          return new DynamicRule(selector, match[1], match[2], match[3], cssText);
+        }
+      } else return new Rule(selector, cssText);
+    }
+    return selector + " {" + cssText + "}";
+  },
+  
+  getText: function() {
+    // store for style sheet text
+    var _inlineStyles = [].concat(IE7.CSS.styles);
+    // parse media decalarations
+    var MEDIA = /@media\s+([^{]*)\{([^@]+\})\s*\}/gi;
+    var ALL = /\ball\b|^$/i, SCREEN = /\bscreen\b/i, PRINT = /\bprint\b/i;
+    function _parseMedia(cssText, media) {
+      _filterMedia.value = media;
+      return cssText.replace(MEDIA, _filterMedia);
+    };
+    function _filterMedia(match, media, cssText) {
+      media = _simpleMedia(media);
+      switch (media) {
+        case "screen":
+        case "print":
+          if (media != _filterMedia.value) return "";
+        case "all":
+          return cssText;
+      }
+      return "";
+    };
+    function _simpleMedia(media) {
+      if (ALL.test(media)) return "all";
+      else if (SCREEN.test(media)) return (PRINT.test(media)) ? "all" : "screen";
+      else if (PRINT.test(media)) return "print";
+    };
+    var self = this;
+    function _getCSSText(styleSheet, path, media, level) {
+      var cssText = "";
+      if (!level) {
+        media = _simpleMedia(styleSheet.media);
+        level = 0;
+      }
+      if (media == "all" || media == self.media) {
+        // IE only allows importing style sheets three levels deep.
+        // it will crash if you try to access a level below this
+        if (level < 3) {
+          // loop through imported style sheets
+          for (var i = 0; i < styleSheet.imports.length; i++) {
+            // call this function recursively to get all imported style sheets
+            cssText += _getCSSText(styleSheet.imports[i], getPath(styleSheet.href, path), media, level + 1);
+          }
+        }
+        // retrieve inline style or load an external style sheet
+        cssText += encode(styleSheet.href ? _loadStyleSheet(styleSheet, path) : _inlineStyles.pop() || "");
+        cssText = _parseMedia(cssText, self.media);
+      }
+      return cssText;
+    };
+    // store loaded cssText URLs
+    var fileCache = {};
+    // load an external style sheet
+    function _loadStyleSheet(styleSheet, path) {
+      var url = makePath(styleSheet.href, path);
+      // if the style sheet has already loaded then don't duplicate it
+      if (fileCache[url]) return "";
+      // load from source
+      fileCache[url] = (styleSheet.disabled) ? "" :
+        _fixUrls(IE7.CSS.getText(styleSheet, path), getPath(styleSheet.href, path));
+      return fileCache[url];
+    };
+    // fix css paths
+    // we're lumping all css text into one big style sheet so relative
+    //  paths have to be fixed. this is necessary anyway because of other
+    //  explorer bugs.
+    var URL = /(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;
+    function _fixUrls(cssText, pathname) {
+      // hack & slash
+      return cssText.replace(URL, "$1" + pathname.slice(0, pathname.lastIndexOf("/") + 1) + "$2");
+    };
+
+    // load all style sheets in the document
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].disabled && !styleSheets[i].ie7) {
+        this.cssText += _getCSSText(styleSheets[i]);
+      }
+    }
+  },
+  
+  load: function() {
+    this.cssText = "";
+    this.getText();
+    this.parse();
+    this.cssText = decode(this.cssText);
+    fileCache = {};
+  },
+  
+  parse: function() {
+    this.cssText = IE7.CSS.parser.exec(this.cssText);
+    
+    // parse the style sheet
+    var offset = IE7.CSS.rules.length;
+    var rules = this.cssText.split(BRACE2), rule;
+    var selectors, cssText, i, j;
+    for (i = 0; i < rules.length; i++) {
+      rule = rules[i].split(BRACE1);
+      selectors = rule[0].split(COMMA);
+      cssText = rule[1];
+      for (j = 0; j < selectors.length; j++) {
+        selectors[j] = cssText ? this.createRule(selectors[j], cssText) : "";
+      }
+      rules[i] = selectors.join("\n");
+    }
+    this.cssText = rules.join("\n");
+    this.rules = IE7.CSS.rules.slice(offset);
+  },
+  
+  recalc: function() {
+    var rule, i;
+    for (i = 0; (rule = this.rules[i]); i++) rule.recalc();
+  },
+  
+  toString: function() {
+    return "@media " + this.media + "{" + this.cssText + "}";
+  }
+});
+
+var PseudoElement;
+
+// -----------------------------------------------------------------------
+// IE7 style rules
+// -----------------------------------------------------------------------
+
+var Rule = IE7.Rule = Base.extend({
+  // properties
+  constructor: function(selector, cssText) {
+    this.id = IE7.CSS.rules.length;
+    this.className = Rule.PREFIX + this.id;
+    selector = selector.match(FIRST_LINE_LETTER) || selector || "*";
+    this.selector = selector[1] || selector;
+    this.selectorText = this.parse(this.selector) + (selector[2] || "");
+    this.cssText = cssText;
+    this.MATCH = new RegExp("\\s" + this.className + "(\\s|$)", "g");
+    IE7.CSS.rules.push(this);
+    this.init();
+  },
+  
+  init: Undefined,
+  
+  add: function(element) {
+    // allocate this class
+    element.className += " " + this.className;
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var match = cssQuery(this.selector);
+    // add the class name for all matching elements
+    for (var i = 0; i < match.length; i++) this.add(match[i]);
+  },
+
+  parse: function(selector) {
+    // attempt to preserve specificity for "loose" parsing by
+    //  removing unknown tokens from a css selector but keep as
+    //  much as we can..
+    var simple = selector.replace(Rule.CHILD, " ").replace(Rule.COMPLEX, "");
+    if (appVersion < 7) simple = simple.replace(Rule.MULTI, "");
+    var tags = match(simple, Rule.TAGS).length - match(selector, Rule.TAGS).length;
+    var classes = match(simple, Rule.CLASSES).length - match(selector, Rule.CLASSES).length + 1;
+    while (classes > 0 && Rule.CLASS.test(simple)) {
+      simple = simple.replace(Rule.CLASS, "");
+      classes--;
+    }
+    while (tags > 0 && Rule.TAG.test(simple)) {
+      simple = simple.replace(Rule.TAG, "$1*");
+      tags--;
+    }
+    simple += "." + this.className;
+    classes = Math.min(classes, 2);
+    tags = Math.min(tags, 2);
+    var score = -10 * classes - tags;
+    if (score > 0) {
+      simple = simple + "," + Rule.MAP[score] + " " + simple;
+    }
+    return simple;
+  },
+  
+  remove: function(element) {
+    // deallocate this class
+    element.className = element.className.replace(this.MATCH, "$1");
+  },
+  
+  toString: function() {
+    return format("%1 {%2}", this.selectorText, this.cssText);
+  }
+}, {
+  CHILD: />/g,
+  CLASS: /\.[\w-]+/,
+  CLASSES: /[.:\[]/g,
+  MULTI: /(\.[\w-]+)+/g,
+  PREFIX: "ie7_class",
+  TAG: /^\w+|([\s>+~])\w+/,
+  TAGS: /^\w|[\s>+~]\w/g,
+  MAP: {
+    1:  "html",
+    2:  "html body",
+    10: ".ie7_html",
+    11: "html.ie7_html",
+    12: "html.ie7_html body",
+    20: ".ie7_html .ie7_body",
+    21: "html.ie7_html .ie7_body",
+    22: "html.ie7_html body.ie7_body"
+  }
+});
+
+// -----------------------------------------------------------------------
+// IE7 dynamic style
+// -----------------------------------------------------------------------
+
+// object properties:
+// attach: the element that an event handler will be attached to
+// target: the element that will have the IE7 class applied
+
+var DynamicRule = Rule.extend({
+  // properties
+  constructor: function(selector, attach, dynamicPseudoClass, target, cssText) {
+    // initialise object properties
+    this.attach = attach || "*";
+    this.dynamicPseudoClass = IE7.CSS.dynamicPseudoClasses[dynamicPseudoClass];
+    this.target = target;
+    this.base(selector, cssText);
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var attaches = cssQuery(this.attach), attach;
+    // process results
+    for (var i = 0; attach = attaches[i]; i++) {
+      // retrieve the event handler's target element(s)
+      var target = this.target ? cssQuery(this.target, attach) : [attach];
+      // attach event handlers for dynamic pseudo-classes
+      if (target.length) this.dynamicPseudoClass.apply(attach, target, this);
+    }
+  }
+});
+
+// -----------------------------------------------------------------------
+//  IE7 dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+var DynamicPseudoClass = Base.extend({
+  constructor: function(name, apply) {
+    this.name = name;
+    this.apply = apply;
+    this.instances = {};
+    IE7.CSS.dynamicPseudoClasses[name] = this;
+  },
+  
+  register: function(instance) {
+    // an "instance" is actually an Arguments object
+    var _class = instance[2];
+    instance.id = _class.id + instance[0].uniqueID;
+    if (!this.instances[instance.id]) {
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.add(target[j]);
+      this.instances[instance.id] = instance;
+    }
+  },
+  
+  unregister: function(instance) {
+    if (this.instances[instance.id]) {
+      var _class = instance[2];
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.remove(target[j]);
+      delete this.instances[instance.id];
+    }
+  }
+});
+  
+// -----------------------------------------------------------------------
+// dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+if (appVersion < 7) {
+  var Hover = new DynamicPseudoClass("hover", function(element) {
+    var instance = arguments;
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseover" : "onmouseenter", function() {
+      Hover.register(instance);
+    });
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseout" : "onmouseleave", function() {
+      Hover.unregister(instance);
+    });
+  });
+  
+  // globally trap the mouseup event (thanks Martijn!)
+  addEventHandler(document, "onmouseup", function() {
+    var instances = Hover.instances;
+    for (var i in instances)
+      if (!instances[i][0].contains(event.srcElement))
+        Hover.unregister(instances[i]);
+  });
+}
+
+// -----------------------------------------------------------------------
+// propertyName: inherit;
+// -----------------------------------------------------------------------
+
+IE7.CSS.addRecalc("[\\w-]+", "inherit", function(element, cssText) {
+  var inherited = cssText.match(/[\w-]+\s*:\s*inherit/g);
+  for (var i = 0; i < inherited.length; i++) {
+    var propertyName = inherited[i].replace(/ie7\-|\s*:\s*inherit/g, "").replace(/\-([a-z])/g, function(match, chr) {
+      return chr.toUpperCase()
+    });
+    element.runtimeStyle[propertyName] = element.parentElement.currentStyle[propertyName];
+  }
+});
+
+// =========================================================================
+// ie7-html.js
+// =========================================================================
+
+// default font-sizes
+//HEADER += "h1{font-size:2em}h2{font-size:1.5em;}h3{font-size:1.17em;}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.67em}";
+
+IE7.HTML = new (Fix.extend({ // single instance  
+  fixed: {},
+  
+  init: Undefined,
+  
+  addFix: function() {
+    // fixes are a one-off, they are applied when the document is loaded
+    this.fixes.push(arguments);
+  },
+  
+  apply: function() {
+    for (var i = 0; i < this.fixes.length; i++) {
+      var match = cssQuery(this.fixes[i][0]);
+      var fix = this.fixes[i][1];
+      for (var j = 0; j < match.length; j++) fix(match[j]);
+    }
+  },
+  
+  addRecalc: function() {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    this.recalcs.push(arguments);
+  },
+  
+  recalc: function() {
+    // loop through the fixes
+    for (var i = 0; i < this.recalcs.length; i++) {
+      var match = cssQuery(this.recalcs[i][0]);
+      var recalc = this.recalcs[i][1], element;
+      var key = Math.pow(2, i);
+      for (var j = 0; (element = match[j]); j++) {
+        var uniqueID = element.uniqueID;
+        if ((this.fixed[uniqueID] & key) == 0) {
+          element = recalc(element) || element;
+          this.fixed[uniqueID] |= key;
+        }
+      }
+    }
+  }
+}));
+
+if (appVersion < 7) {  
+  // provide support for the <abbr> tag.
+  //  this is a proper fix, it preserves the DOM structure and
+  //  <abbr> elements report the correct tagName & namespace prefix
+  document.createElement("abbr");
+  
+  // bind to the first child control
+  IE7.HTML.addRecalc("label", function(label) {
+    if (!label.htmlFor) {
+      var firstChildControl = cssQuery("input,textarea", label, true);
+      if (firstChildControl) {
+        addEventHandler(label, "onclick", function() {
+          firstChildControl.click();
+        });
+      }
+    }
+  });
+}
+
+// =========================================================================
+// ie7-layout.js
+// =========================================================================
+
+var NUMERIC = "[.\\d]";
+
+new function(_) {
+var layout = IE7.Layout = this;
+
+  // big, ugly box-model hack + min/max stuff
+  
+  // #tantek > #erik > #dean { voice-family: hacker; }
+  
+  // -----------------------------------------------------------------------
+  // "layout"
+  // -----------------------------------------------------------------------
+  
+  HEADER += "*{boxSizing:content-box}";
+  
+  // does an element have "layout" ?
+  IE7.hasLayout = appVersion < 5.5 ? function(element) {
+    // element.currentStyle.hasLayout doesn't work for IE5.0
+    return element.clientWidth;
+  } : function(element) {
+    return element.currentStyle.hasLayout;
+  };
+  
+  // give an element "layout"
+  layout.boxSizing = function(element) {
+    if (!IE7.hasLayout(element)) {
+    //#  element.runtimeStyle.fixedHeight =
+      element.style.height = "0cm";
+      if (element.currentStyle.verticalAlign == "auto")
+        element.runtimeStyle.verticalAlign = "top";
+      // when an element acquires "layout", margins no longer collapse correctly
+      collapseMargins(element);
+    }
+  };
+  
+  // -----------------------------------------------------------------------
+  // Margin Collapse
+  // -----------------------------------------------------------------------
+  
+  function collapseMargins(element) {
+    if (element != viewport && element.currentStyle.position != "absolute") {
+      collapseMargin(element, "marginTop");
+      collapseMargin(element, "marginBottom");
+    }
+  };
+  
+  function collapseMargin(element, type) {
+    if (!element.runtimeStyle[type]) {
+      var parentElement = element.parentElement;
+      if (parentElement && IE7.hasLayout(parentElement) && !IE7[type == "marginTop" ? "_getPreviousElementSibling" : "_getNextElementSibling"](element)) return;
+      var child = cssQuery(">*:" + (type == "marginTop" ? "first" : "last") + "-child", element, true);
+      if (child && child.currentStyle.styleFloat == "none" && IE7.hasLayout(child)) {
+        collapseMargin(child, type);
+        margin = _getMargin(element, element.currentStyle[type]);
+        childMargin = _getMargin(child, child.currentStyle[type]);
+        if (margin < 0 || childMargin < 0) {
+          element.runtimeStyle[type] = margin + childMargin;
+        } else {
+          element.runtimeStyle[type] = Math.max(childMargin, margin);
+        }
+        child.runtimeStyle[type] = "0px";
+      }
+    }
+  };
+  
+  function _getMargin(element, value) {
+    return value == "auto" ? 0 : getPixelValue(element, value);
+  };
+  
+  // -----------------------------------------------------------------------
+  // box-model
+  // -----------------------------------------------------------------------
+  
+  // constants
+  var UNIT = /^[.\d][\w%]*$/, AUTO = /^(auto|0cm)$/;
+  
+  var applyWidth, applyHeight;
+  IE7.Layout.borderBox = function(element){
+    applyWidth(element);
+    applyHeight(element);
+  };
+  
+  var fixWidth = function(HEIGHT) {
+    applyWidth = function(element) {
+      if (!PERCENT.test(element.currentStyle.width)) fixWidth(element);
+      collapseMargins(element);
+    };
+  
+    function fixWidth(element, value) {
+      if (!element.runtimeStyle.fixedWidth) {
+        if (!value) value = element.currentStyle.width;
+        element.runtimeStyle.fixedWidth = (UNIT.test(value)) ? Math.max(0, getFixedWidth(element, value)) : value;
+        setOverrideStyle(element, "width", element.runtimeStyle.fixedWidth);
+      }
+    };
+  
+    function layoutWidth(element) {
+      if (!isFixed(element)) {
+        var layoutParent = element.offsetParent;
+        while (layoutParent && !IE7.hasLayout(layoutParent)) layoutParent = layoutParent.offsetParent;
+      }
+      return (layoutParent || viewport).clientWidth;
+    };
+  
+    function getPixelWidth(element, value) {
+      if (PERCENT.test(value)) return parseInt(parseFloat(value) / 100 * layoutWidth(element));
+      return getPixelValue(element, value);
+    };
+  
+    var getFixedWidth = function(element, value) {
+      var borderBox = element.currentStyle["box-sizing"] == "border-box";
+      var adjustment = 0;
+      if (quirksMode && !borderBox)
+        adjustment += getBorderWidth(element) + getWidth(element, "padding");
+      else if (!quirksMode && borderBox)
+        adjustment -= getBorderWidth(element) + getWidth(element, "padding");
+      return getPixelWidth(element, value) + adjustment;
+    };
+  
+    // easy way to get border thickness for elements with "layout"
+    function getBorderWidth(element) {
+      return element.offsetWidth - element.clientWidth;
+    };
+  
+    // have to do some pixel conversion to get padding/margin thickness :-(
+    function getWidth(element, type) {
+      return getPixelWidth(element, element.currentStyle[type + "Left"]) + getPixelWidth(element, element.currentStyle[type + "Right"]);
+    };
+  
+    // -----------------------------------------------------------------------
+    // min/max
+    // -----------------------------------------------------------------------
+  
+    HEADER += "*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";
+  
+    // handle min-width property
+    layout.minWidth = function(element) {
+      // IE6 supports min-height so we frig it here
+      //#if (element.currentStyle.minHeight == "auto") element.runtimeStyle.minHeight = 0;
+      if (element.currentStyle["min-width"] != null) {
+        element.style.minWidth = element.currentStyle["min-width"];
+      }
+      if (register(arguments.callee, element, element.currentStyle.minWidth != "none")) {
+        layout.boxSizing(element);
+        fixWidth(element);
+        resizeWidth(element);
+      }
+    };
+    
+    // clone the minWidth function to make a maxWidth function
+    eval("IE7.Layout.maxWidth=" + String(layout.minWidth).replace(/min/g, "max"));
+    
+    // apply min/max restrictions
+    function resizeWidth(element) {
+      // check boundaries
+      var rect = element.getBoundingClientRect();
+      var width = rect.right - rect.left;
+  
+      if (element.currentStyle.minWidth != "none" && width <= getFixedWidth(element, element.currentStyle.minWidth)) {
+        element.runtimeStyle.width = element.currentStyle.minWidth;
+      } else if (element.currentStyle.maxWidth != "none" && width >= getFixedWidth(element, element.currentStyle.maxWidth)) {
+        element.runtimeStyle.width = element.currentStyle.maxWidth;
+      } else {
+        element.runtimeStyle.width = element.runtimeStyle.fixedWidth; // || "auto";
+      }
+    };
+  
+    // -----------------------------------------------------------------------
+    // right/bottom
+    // -----------------------------------------------------------------------
+  
+    function fixRight(element) {
+      if (register(fixRight, element, /^(fixed|absolute)$/.test(element.currentStyle.position) &&
+        getDefinedStyle(element, "left") != "auto" &&
+        getDefinedStyle(element, "right") != "auto" &&
+        AUTO.test(getDefinedStyle(element, "width")))) {
+          resizeRight(element);
+          IE7.Layout.boxSizing(element);
+      }
+    };
+    IE7.Layout.fixRight = fixRight;
+  
+    function resizeRight(element) {
+      var left = getPixelWidth(element, element.runtimeStyle._left || element.currentStyle.left);
+      var width = layoutWidth(element) - getPixelWidth(element, element.currentStyle.right) -  left - getWidth(element, "margin");
+      if (parseInt(element.runtimeStyle.width) == width) return;
+      element.runtimeStyle.width = "";
+      if (isFixed(element) || HEIGHT || element.offsetWidth < width) {
+        if (!quirksMode) width -= getBorderWidth(element) + getWidth(element, "padding");
+        if (width < 0) width = 0;
+        element.runtimeStyle.fixedWidth = width;
+        setOverrideStyle(element, "width", width);
+      }
+    };
+  
+  // -----------------------------------------------------------------------
+  // window.onresize
+  // -----------------------------------------------------------------------
+  
+    // handle window resize
+    var clientWidth = 0;
+    addResize(function() {
+      if (!viewport) return;
+      var i, wider = (clientWidth < viewport.clientWidth);
+      clientWidth = viewport.clientWidth;
+      // resize elements with "min-width" set
+      var elements = layout.minWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.minWidth));
+        if (wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider == fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "max-width" set
+      var elements = layout.maxWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.maxWidth));
+        if (!wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider != fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "right" set
+      for (i in fixRight.elements) resizeRight(fixRight.elements[i]);
+    });
+  
+  // -----------------------------------------------------------------------
+  // fix CSS
+  // -----------------------------------------------------------------------
+    if (quirksMode) {
+      IE7.CSS.addRecalc("width", NUMERIC, applyWidth);
+    }
+    if (appVersion < 7) {
+      IE7.CSS.addRecalc("min-width", NUMERIC, layout.minWidth);
+      IE7.CSS.addRecalc("max-width", NUMERIC, layout.maxWidth);
+      IE7.CSS.addRecalc("right", NUMERIC, fixRight);
+    }
+  };
+  
+  eval("var fixHeight=" + rotate(fixWidth));
+  
+  // apply box-model + min/max fixes
+  fixWidth();
+  fixHeight(true);
+};
+
+// =========================================================================
+// ie7-graphics.js
+// =========================================================================
+
+// a small transparent image used as a placeholder
+var BLANK_GIF = makePath("blank.gif", path);
+
+var ALPHA_IMAGE_LOADER = "DXImageTransform.Microsoft.AlphaImageLoader";
+var PNG_FILTER = "progid:" + ALPHA_IMAGE_LOADER + "(src='%1',sizingMethod='%2')";
+  
+// regular expression version of the above
+var PNG;
+
+var filtered = [];
+
+function fixImage(element) {
+  if (PNG.test(element.src)) {
+    // we have to preserve width and height
+    var image = new Image(element.width, element.height);
+    image.onload = function() {
+      element.width = image.width;
+      element.height = image.height;
+      image = null;
+    };
+    image.src = element.src;
+    // store the original url (we'll put it back when it's printed)
+    element.pngSrc = element.src;
+    // add the AlphaImageLoader thingy
+    addFilter(element);
+  }
+};
+
+if (appVersion >= 5.5 && appVersion < 7) {
+  // ** IE7 VARIABLE
+  // e.g. only apply the hack to files ending in ".png"
+  // IE7_PNG_SUFFIX = ".png";
+
+  // replace background(-image): url(..) ..  with background(-image): .. ;filter: ..;
+  IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/, function(match, $1, $2, url, $4) {
+    url = getString(url);
+    return PNG.test(url) ? "filter:" + format(PNG_FILTER, url, "crop") +
+      ";zoom:1;background" + ($1||"") + ":" + ($2||"") + "none" + ($4||"") : match;
+  });
+  
+  // -----------------------------------------------------------------------
+  //  fix PNG transparency (HTML images)
+  // -----------------------------------------------------------------------
+
+  IE7.HTML.addRecalc("img,input", function(element) {
+    if (element.tagName == "INPUT" && element.type != "image") return;
+    fixImage(element);
+    addEventHandler(element, "onpropertychange", function() {
+      if (!printing && event.propertyName == "src" &&
+        element.src.indexOf(BLANK_GIF) == -1) fixImage(element);
+    });
+  });
+
+  // assume that background images should not be printed
+  //  (if they are not transparent then they'll just obscure content)
+  // but we'll put foreground images back...
+  var printing = false;
+  addEventHandler(window, "onbeforeprint", function() {
+    printing = true;
+    for (var i = 0; i < filtered.length; i++) removeFilter(filtered[i]);
+  });
+  addEventHandler(window, "onafterprint", function() {
+    for (var i = 0; i < filtered.length; i++) addFilter(filtered[i]);
+    printing = false;
+  });
+}
+
+// apply a filter
+function addFilter(element, sizingMethod) {
+  var filter = element.filters[ALPHA_IMAGE_LOADER];
+  if (filter) {
+    filter.src = element.src;
+    filter.enabled = true;
+  } else {
+    element.runtimeStyle.filter = format(PNG_FILTER, element.src, sizingMethod || "scale");
+    filtered.push(element);
+  }
+  // remove the real image
+  element.src = BLANK_GIF;
+};
+
+function removeFilter(element) {
+  element.src = element.pngSrc;
+  element.filters[ALPHA_IMAGE_LOADER].enabled = false;
+};
+
+// =========================================================================
+// ie7-fixed.js
+// =========================================================================
+
+new function(_) {
+  if (appVersion >= 7) return;
+  
+  // some things to consider for this hack.
+  // the document body requires a fixed background. even if
+  //  it is just a blank image.
+  // you have to use setExpression instead of onscroll, this
+  //  together with a fixed body background helps avoid the
+  //  annoying screen flicker of other solutions.
+  
+  IE7.CSS.addRecalc("position", "fixed", _positionFixed, "absolute");
+  IE7.CSS.addRecalc("background(-attachment)?", "[^};]*fixed", _backgroundFixed);
+  
+  // scrolling is relative to the documentElement (HTML tag) when in
+  //  standards mode, otherwise it's relative to the document body
+  var $viewport = quirksMode ? "body" : "documentElement";
+  
+  function _fixBackground() {
+    // this is required by both position:fixed and background-attachment:fixed.
+    // it is necessary for the document to also have a fixed background image.
+    // we can fake this with a blank image if necessary
+    if (body.currentStyle.backgroundAttachment != "fixed") {
+      if (body.currentStyle.backgroundImage == "none") {
+        body.runtimeStyle.backgroundRepeat = "no-repeat";
+        body.runtimeStyle.backgroundImage = "url(" + BLANK_GIF + ")"; // dummy
+      }
+      body.runtimeStyle.backgroundAttachment = "fixed";
+    }
+    _fixBackground = Undefined;
+  };
+  
+  var _tmp = createTempElement("img");
+  
+  function _isFixed(element) {
+    return element ? isFixed(element) || _isFixed(element.parentElement) : false;
+  };
+  
+  function _setExpression(element, propertyName, expression) {
+    setTimeout("document.all." + element.uniqueID + ".runtimeStyle.setExpression('" + propertyName + "','" + expression + "')", 0);
+  };
+  
+  // -----------------------------------------------------------------------
+  //  backgroundAttachment: fixed
+  // -----------------------------------------------------------------------
+  
+  function _backgroundFixed(element) {
+    if (register(_backgroundFixed, element, element.currentStyle.backgroundAttachment == "fixed" && !element.contains(body))) {
+      _fixBackground();
+      bgLeft(element);
+      bgTop(element);
+      _backgroundPosition(element);
+    }
+  };
+  
+  function _backgroundPosition(element) {
+    _tmp.src = element.currentStyle.backgroundImage.slice(5, -2);
+    var parentElement = element.canHaveChildren ? element : element.parentElement;
+    parentElement.appendChild(_tmp);
+    setOffsetLeft(element);
+    setOffsetTop(element);
+    parentElement.removeChild(_tmp);
+  };
+  
+  function bgLeft(element) {
+    element.style.backgroundPositionX = element.currentStyle.backgroundPositionX;
+    if (!_isFixed(element)) {
+      _setExpression(element, "backgroundPositionX", "(parseInt(runtimeStyle.offsetLeft)+document." + $viewport + ".scrollLeft)||0");
+    }
+  };
+  eval(rotate(bgLeft));
+  
+  function setOffsetLeft(element) {
+    var propertyName = _isFixed(element) ? "backgroundPositionX" : "offsetLeft";
+    element.runtimeStyle[propertyName] =
+      getOffsetLeft(element, element.style.backgroundPositionX) -
+      element.getBoundingClientRect().left - element.clientLeft + 2;
+  };
+  eval(rotate(setOffsetLeft));
+  
+  function getOffsetLeft(element, position) {
+    switch (position) {
+      case "left":
+      case "top":
+        return 0;
+      case "right":
+      case "bottom":
+        return viewport.clientWidth - _tmp.offsetWidth;
+      case "center":
+        return (viewport.clientWidth - _tmp.offsetWidth) / 2;
+      default:
+        if (PERCENT.test(position)) {
+          return parseInt((viewport.clientWidth - _tmp.offsetWidth) * parseFloat(position) / 100);
+        }
+        _tmp.style.left = position;
+        return _tmp.offsetLeft;
+    }
+  };
+  eval(rotate(getOffsetLeft));
+  
+  // -----------------------------------------------------------------------
+  //  position: fixed
+  // -----------------------------------------------------------------------
+  
+  function _positionFixed(element) {
+    if (register(_positionFixed, element, isFixed(element))) {
+      setOverrideStyle(element, "position",  "absolute");
+      setOverrideStyle(element, "left",  element.currentStyle.left);
+      setOverrideStyle(element, "top",  element.currentStyle.top);
+      _fixBackground();
+      IE7.Layout.fixRight(element);
+      _foregroundPosition(element);
+    }
+  };
+  
+  function _foregroundPosition(element, recalc) {
+    positionTop(element, recalc);
+    positionLeft(element, recalc, true);
+    if (!element.runtimeStyle.autoLeft && element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.right != "auto") {
+      var left = viewport.clientWidth - getPixelWidth(element, element.currentStyle.right) -
+        getPixelWidth(element, element.runtimeStyle._left) - element.clientWidth;
+      if (element.currentStyle.marginRight == "auto") left = parseInt(left / 2);
+      if (_isFixed(element.offsetParent)) element.runtimeStyle.pixelLeft += left;
+      else element.runtimeStyle.shiftLeft = left;
+    }
+    clipWidth(element);
+    clipHeight(element);
+  };
+
+  function clipWidth(element) {
+    var fixWidth = element.runtimeStyle.fixWidth;
+    element.runtimeStyle.borderRightWidth = "";
+    element.runtimeStyle.width = fixWidth ? getPixelWidth(element, fixWidth) : "";
+    if (element.currentStyle.width != "auto") {
+      var rect = element.getBoundingClientRect();
+      var width = element.offsetWidth - viewport.clientWidth + rect.left - 2;
+      if (width >= 0) {
+        element.runtimeStyle.borderRightWidth = "0px";
+        width = Math.max(getPixelValue(element, element.currentStyle.width) - width, 0);
+        setOverrideStyle(element, "width",  width);
+        return width;
+      }
+    }
+  };
+  eval(rotate(clipWidth));
+  
+  function positionLeft(element, recalc) {
+    // if the element's width is in % units then it must be recalculated
+    //  with respect to the viewport
+    if (!recalc && PERCENT.test(element.currentStyle.width)) {
+      element.runtimeStyle.fixWidth = element.currentStyle.width;
+    }
+    if (element.runtimeStyle.fixWidth) {
+      element.runtimeStyle.width = getPixelWidth(element, element.runtimeStyle.fixWidth);
+    }
+    //if (recalc) {
+    //  // if the element is fixed on the right then no need to recalculate
+    //  if (!element.runtimeStyle.autoLeft) return;
+    //} else {
+      element.runtimeStyle.shiftLeft = 0;
+      element.runtimeStyle._left = element.currentStyle.left;
+      // is the element fixed on the right?
+      element.runtimeStyle.autoLeft = element.currentStyle.right != "auto" &&
+        element.currentStyle.left == "auto";
+    //}
+    // reset the element's "left" value and get it's natural position
+    element.runtimeStyle.left = "";
+    element.runtimeStyle.screenLeft = getScreenLeft(element);
+    element.runtimeStyle.pixelLeft = element.runtimeStyle.screenLeft;
+    // if the element is contained by another fixed element then there is no need to
+    //  continually recalculate it's left position
+    if (!recalc && !_isFixed(element.offsetParent)) {
+      // onsrcoll produces jerky movement, so we use an expression
+      _setExpression(element, "pixelLeft", "runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document." + $viewport + ".scrollLeft");
+    }
+  };
+  // clone this function so we can do "top"
+  eval(rotate(positionLeft));
+  
+  // I've forgotten how this works...
+  function getScreenLeft(element) { // thanks to kevin newman (captainn)
+    var screenLeft = element.offsetLeft, nested = 1;
+    if (element.runtimeStyle.autoLeft) {
+      screenLeft = viewport.clientWidth - element.offsetWidth - getPixelWidth(element, element.currentStyle.right);
+    }
+    // accommodate margins
+    if (element.currentStyle.marginLeft != "auto") {
+      screenLeft -= getPixelWidth(element, element.currentStyle.marginLeft);
+    }
+    while (element = element.offsetParent) {
+      if (element.currentStyle.position != "static") nested = -1;
+      screenLeft += element.offsetLeft * nested;
+    }
+    return screenLeft;
+  };
+  eval(rotate(getScreenLeft));
+  
+  function getPixelWidth(element, value) {
+    return PERCENT.test(value) ? parseInt(parseFloat(value) / 100 * viewport.clientWidth) : getPixelValue(element, value);
+  };
+  eval(rotate(getPixelWidth));
+  
+  // -----------------------------------------------------------------------
+  //  capture window resize
+  // -----------------------------------------------------------------------
+  
+  function _resize() {
+    // if the window has been resized then some positions need to be
+    //  recalculated (especially those aligned to "right" or "top"
+    var elements = _backgroundFixed.elements;
+    for (var i in elements) _backgroundPosition(elements[i]);
+    elements = _positionFixed.elements;
+    for (i in elements) {
+      _foregroundPosition(elements[i], true);
+      // do this twice to be sure - hackish, I know :-)
+      _foregroundPosition(elements[i], true);
+    }
+    _timer = 0;
+  };
+  
+  // use a timer for some reason.
+  //  (sometimes this is a good way to prevent resize loops)
+  var _timer;
+  addResize(function() {
+    if (!_timer) _timer = setTimeout(_resize, 0);
+  });
+};
+
+// =========================================================================
+// ie7-oveflow.js
+// =========================================================================
+
+/* ---------------------------------------------------------------------
+
+  This module alters the structure of the document.
+  It may adversely affect other CSS rules. Be warned.
+
+--------------------------------------------------------------------- */
+
+var WRAPPER_STYLE = {
+  backgroundColor: "transparent",
+  backgroundImage: "none",
+  backgroundPositionX: null,
+  backgroundPositionY: null,
+  backgroundRepeat: null,
+  borderTopWidth: 0,
+  borderRightWidth: 0,
+  borderBottomWidth: 0,
+  borderLeftStyle: "none",
+  borderTopStyle: "none",
+  borderRightStyle: "none",
+  borderBottomStyle: "none",
+  borderLeftWidth: 0,
+  height: null,
+  marginTop: 0,
+  marginBottom: 0,
+  marginRight: 0,
+  marginLeft: 0,
+  width: "100%"
+};
+
+IE7.CSS.addRecalc("overflow", "visible", function(element) {
+  // don't do this again
+  if (element.parentNode.ie7_wrapped) return;
+
+  // if max-height is applied, makes sure it gets applied first
+  if (IE7.Layout && element.currentStyle["max-height"] != "auto") {
+    IE7.Layout.maxHeight(element);
+  }
+
+  if (element.currentStyle.marginLeft == "auto") element.style.marginLeft = 0;
+  if (element.currentStyle.marginRight == "auto") element.style.marginRight = 0;
+
+  var wrapper = document.createElement(ANON);
+  wrapper.ie7_wrapped = element;
+  for (var propertyName in WRAPPER_STYLE) {
+    wrapper.style[propertyName] = element.currentStyle[propertyName];
+    if (WRAPPER_STYLE[propertyName] != null) {
+      element.runtimeStyle[propertyName] = WRAPPER_STYLE[propertyName];
+    }
+  }
+  wrapper.style.display = "block";
+  wrapper.style.position = "relative";
+  element.runtimeStyle.position = "absolute";
+  element.parentNode.insertBefore(wrapper, element);
+  wrapper.appendChild(element);
+});
+
+// =========================================================================
+// ie7-quirks.js
+// =========================================================================
+
+function ie7Quirks() {
+  var FONT_SIZES = "xx-small,x-small,small,medium,large,x-large,xx-large".split(",");
+  for (var i = 0; i < FONT_SIZES.length; i++) {
+    FONT_SIZES[FONT_SIZES[i]] = FONT_SIZES[i - 1] || "0.67em";
+  }
+  
+  IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/, function(match, label, size, value) {
+    return label + (FONT_SIZES[value] || value);
+  });
+  
+  if (appVersion < 6) {
+    var NEGATIVE = /^\-/, LENGTH = /(em|ex)$/i;
+    var EM = /em$/i, EX = /ex$/i;
+  
+    getPixelValue = function(element, value) {
+      if (PIXEL.test(value)) return parseInt(value)||0;
+      var scale = NEGATIVE.test(value)? -1 : 1;
+      if (LENGTH.test(value)) scale *= getFontScale(element);
+      temp.style.width = (scale < 0) ? value.slice(1) : value;
+      body.appendChild(temp);
+      // retrieve pixel width
+      value = scale * temp.offsetWidth;
+      // remove the temporary element
+      temp.removeNode();
+      return parseInt(value);
+    };
+
+    var temp = createTempElement();
+    function getFontScale(element) {
+      var scale = 1;
+      temp.style.fontFamily = element.currentStyle.fontFamily;
+      temp.style.lineHeight = element.currentStyle.lineHeight;
+      //temp.style.fontSize = "";
+      while (element != body) {
+        var fontSize = element.currentStyle["ie7-font-size"];
+        if (fontSize) {
+          if (EM.test(fontSize)) scale *= parseFloat(fontSize);
+          else if (PERCENT.test(fontSize)) scale *= (parseFloat(fontSize) / 100);
+          else if (EX.test(fontSize)) scale *= (parseFloat(fontSize) / 2);
+          else {
+            temp.style.fontSize = fontSize;
+            return 1;
+          }
+        }
+        element = element.parentElement;
+      }
+      return scale;
+    };
+
+    // cursor:pointer (IE5.x)
+    IE7.CSS.addFix(/cursor\s*:\s*pointer/, "cursor:hand");
+    // display:list-item (IE5.x)
+    IE7.CSS.addFix(/display\s*:\s*list-item/, "display:block");
+  }
+  
+  // -----------------------------------------------------------------------
+  //  margin:auto
+  // -----------------------------------------------------------------------
+  
+  function fixMargin(element) {
+    if (appVersion < 5.5) IE7.Layout.boxSizing(element.parentElement);
+    var parent = element.parentElement;
+    var margin = parent.offsetWidth - element.offsetWidth - getPaddingWidth(parent);
+    var autoRight = (element.currentStyle["ie7-margin"] && element.currentStyle.marginRight == "auto") ||
+      element.currentStyle["ie7-margin-right"] == "auto";
+    switch (parent.currentStyle.textAlign) {
+      case "right":
+        margin = autoRight ? parseInt(margin / 2) : 0;
+        element.runtimeStyle.marginRight = margin + "px";
+        break;
+      case "center":
+        if (autoRight) margin = 0;
+      default:
+        if (autoRight) margin /= 2;
+        element.runtimeStyle.marginLeft = parseInt(margin) + "px";
+    }
+  };
+
+  function getPaddingWidth(element) {
+    return getPixelValue(element, element.currentStyle.paddingLeft) +
+      getPixelValue(element, element.currentStyle.paddingRight);
+  };
+  
+  IE7.CSS.addRecalc("margin(-left|-right)?", "[^};]*auto", function(element) {
+    if (register(fixMargin, element,
+      element.parentElement &&
+      element.currentStyle.display == "block" &&
+      element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.position != "absolute")) {
+        fixMargin(element);
+    }
+  });
+  
+  addResize(function() {
+    for (var i in fixMargin.elements) {
+      var element = fixMargin.elements[i];
+      element.runtimeStyle.marginLeft =
+      element.runtimeStyle.marginRight = "";
+      fixMargin(element);
+    }
+  });
+};
+
+
+// -----------------------------------------------------------------------
+// initialisation
+// -----------------------------------------------------------------------
+
+IE7.loaded = true;
+
+(function() {
+  try {
+    // http://javascript.nwbox.com/IEContentLoaded/
+    documentElement.doScroll("left");
+  } catch (e) {
+    setTimeout(arguments.callee, 1);
+    return;
+  }
+  // execute the inner text of the IE7 script
+  try {
+    eval(script.innerHTML);
+  } catch (e) {
+    // ignore errors
+  }
+  PNG = new RegExp(rescape(typeof IE7_PNG_SUFFIX == "string" ? IE7_PNG_SUFFIX : "-trans.png") + "$", "i");
+
+  // frequently used references
+  body = document.body;
+  viewport = quirksMode ? body : documentElement;
+
+  // classes
+  body.className += " ie7_body";
+  documentElement.className += " ie7_html";
+
+  if (quirksMode) ie7Quirks();
+
+  IE7.CSS.init();
+  IE7.HTML.init();
+
+  IE7.HTML.apply();
+  IE7.CSS.apply();
+
+  IE7.recalc();
+})();
+
+
+})();
Index: admin/js/ie7/IE8.js
===================================================================
--- admin/js/ie7/IE8.js	(revision 175)
+++ admin/js/ie7/IE8.js	(revision 703)
@@ -1,2 +1,2601 @@
-/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */
-(function(){IE7={toString:function(){return"IE7 version 2.0 (beta2)"}};var m=IE7.appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(top.location.search)||m<5)return;var U=bT();var G=document.compatMode!="CSS1Compat";var bx=document.documentElement,w,t;var bN="!";var J=":link{ie7-link:link}:visited{ie7-link:visited}";var cB=/^[\w\.]+[^:]*$/;function bc(a,b){if(cB.test(a))a=(b||"")+a;return a};function by(a,b){a=bc(a,b);return a.slice(0,a.lastIndexOf("/")+1)};var bO=document.scripts[document.scripts.length-1];var cC=by(bO.src);try{var K=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}var bd={};function cD(a,b){try{a=bc(a,b);if(!bd[a]){K.open("GET",a,false);K.send();if(K.status==0||K.status==200){bd[a]=K.responseText}}}catch(e){}finally{return bd[a]||""}};if(m<5.5){undefined=U();bN="HTML:!";var cE=/(g|gi)$/;var cF=String.prototype.replace;String.prototype.replace=function(a,b){if(typeof b=="function"){if(a&&a.constructor==RegExp){var c=a;var d=c.global;if(d==null)d=cE.test(c);if(d)c=new RegExp(c.source)}else{c=new RegExp(W(a))}var f,g=this,h="";while(g&&(f=c.exec(g))){h+=g.slice(0,f.index)+b.apply(this,f);g=g.slice(f.index+f[0].length);if(!d)break}return h+g}return cF.apply(this,arguments)};Array.prototype.pop=function(){if(this.length){var a=this[this.length-1];this.length--;return a}return undefined};Array.prototype.push=function(){for(var a=0;a<arguments.length;a++){this[this.length]=arguments[a]}return this.length};var cG=this;Function.prototype.apply=function(a,b){if(a===undefined)a=cG;else if(a==null)a=window;else if(typeof a=="string")a=new String(a);else if(typeof a=="number")a=new Number(a);else if(typeof a=="boolean")a=new Boolean(a);if(arguments.length==1)b=[];else if(b[0]&&b[0].writeln)b[0]=b[0].documentElement.document||b[0];var c="#ie7_apply",d;a[c]=this;switch(b.length){case 0:d=a[c]();break;case 1:d=a[c](b[0]);break;case 2:d=a[c](b[0],b[1]);break;case 3:d=a[c](b[0],b[1],b[2]);break;case 4:d=a[c](b[0],b[1],b[2],b[3]);break;case 5:d=a[c](b[0],b[1],b[2],b[3],b[4]);break;default:var f=[],g=b.length-1;do f[g]="a["+g+"]";while(g--);eval("r=o[$]("+f+")")}if(typeof a.valueOf=="function"){delete a[c]}else{a[c]=undefined;if(d&&d.writeln)d=d.documentElement.document||d}return d};Function.prototype.call=function(a){return this.apply(a,bP.apply(arguments,[1]))};J+="address,blockquote,body,dd,div,dt,fieldset,form,"+"frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+"hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}"}var bP=Array.prototype.slice;var cZ=/%([1-9])/g;var cH=/^\s\s*/;var cI=/\s\s*$/;var cJ=/([\/()[\]{}|*+-.,^$?\\])/g;var bQ=/\bbase\b/;var bR=["constructor","toString"];var be;function B(){};B.extend=function(a,b){be=true;var c=new this;bf(c,a);be=false;var d=c.constructor;function f(){if(!be)d.apply(this,arguments)};c.constructor=f;f.extend=arguments.callee;bf(f,b);f.prototype=c;return f};B.prototype.extend=function(a){return bf(this,a)};var bz="#";var V="~";var cK=/\\./g;var cL=/\(\?[:=!]|\[[^\]]+\]/g;var cM=/\(/g;var H=B.extend({constructor:function(a){this[V]=[];this.merge(a)},exec:function(g){var h=this,j=this[V];return String(g).replace(new RegExp(this,this.ignoreCase?"gi":"g"),function(){var a,b=1,c=0;while((a=h[bz+j[c++]])){var d=b+a.length+1;if(arguments[b]){var f=a.replacement;switch(typeof f){case"function":return f.apply(h,bP.call(arguments,b,d));case"number":return arguments[b+f];default:return f}}b=d}})},add:function(a,b){if(a instanceof RegExp){a=a.source}if(!this[bz+a])this[V].push(String(a));this[bz+a]=new H.Item(a,b)},merge:function(a){for(var b in a)this.add(b,a[b])},toString:function(){return"("+this[V].join(")|(")+")"}},{IGNORE:"$0",Item:B.extend({constructor:function(a,b){a=a instanceof RegExp?a.source:String(a);if(typeof b=="number")b=String(b);else if(b==null)b="";if(typeof b=="string"&&/\$(\d+)/.test(b)){if(/^\$\d+$/.test(b)){b=parseInt(b.slice(1))}else{var c=/'/.test(b.replace(/\\./g,""))?'"':"'";b=b.replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\$(\d+)/g,c+"+(arguments[$1]||"+c+c+")+"+c);b=new Function("return "+c+b.replace(/(['"])\1\+(.*)\+\1\1$/,"$1")+c)}}this.length=H.count(a);this.replacement=b;this.toString=bT(a)}}),count:function(a){a=String(a).replace(cK,"").replace(cL,"");return L(a,cM).length}});function bf(a,b){if(a&&b){var c=(typeof b=="function"?Function:Object).prototype;var d=bR.length,f;if(be)while(f=bR[--d]){var g=b[f];if(g!=c[f]){if(bQ.test(g)){bS(a,f,g)}else{a[f]=g}}}for(f in b)if(c[f]===undefined){var g=b[f];if(a[f]&&typeof g=="function"&&bQ.test(g)){bS(a,f,g)}else{a[f]=g}}}return a};function bS(c,d,f){var g=c[d];c[d]=function(){var a=this.base;this.base=g;var b=f.apply(this,arguments);this.base=a;return b}};function cN(a,b){if(!b)b=a;var c={};for(var d in a)c[d]=b[d];return c};function i(c){var d=arguments;var f=new RegExp("%([1-"+arguments.length+"])","g");return String(c).replace(f,function(a,b){return b<d.length?d[b]:a})};function L(a,b){return String(a).match(b)||[]};function W(a){return String(a).replace(cJ,"\\$1")};function da(a){return String(a).replace(cH,"").replace(cI,"")};function bT(a){return function(){return a}};var bU=H.extend({ignoreCase:true});var cO=/\x01(\d+)/g,cP=/'/g,cQ=/^\x01/,cR=/\\([\da-fA-F]{1,4})/g;var bA=[];var bV=new bU({"<!\\-\\-|\\-\\->":"","\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/":"","@(namespace|import)[^;\\n]+[;\\n]":"","'(\\\\.|[^'\\\\])*'":bW,'"(\\\\.|[^"\\\\])*"':bW,"\\s+":" "});function cS(a){return bV.exec(a)};function bg(c){return c.replace(cO,function(a,b){return bA[b-1]})};function bW(c){return"\x01"+bA.push(c.replace(cR,function(a,b){return eval("'\\u"+"0000".slice(b.length)+b+"'")}).slice(1,-1).replace(cP,"\\'"))};function bB(a){return cQ.test(a)?bA[a.slice(1)-1]:a};var cT=new H({Width:"Height",width:"height",Left:"Top",left:"top",Right:"Bottom",right:"bottom",onX:"onY"});function C(a){return cT.exec(a)};var bX=[];function bC(a){cV(a);v(window,"onresize",a)};function v(a,b,c){a.attachEvent(b,c);bX.push(arguments)};function cU(a,b,c){try{a.detachEvent(b,c)}catch(ignore){}};v(window,"onunload",function(){var a;while(a=bX.pop()){cU(a[0],a[1],a[2])}});function X(a,b,c){if(!a.elements)a.elements={};if(c)a.elements[b.uniqueID]=b;else delete a.elements[b.uniqueID];return c};v(window,"onbeforeprint",function(){if(!IE7.CSS.print)new bJ("print");IE7.CSS.print.recalc()});var bY=/^\d+(px)?$/i;var M=/^\d+%$/;var D=function(a,b){if(bY.test(b))return parseInt(b);var c=a.style.left;var d=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;a.style.left=b||0;b=a.style.pixelLeft;a.style.left=c;a.runtimeStyle.left=d;return b};var bD="ie7-";var bZ=B.extend({constructor:function(){this.fixes=[];this.recalcs=[]},init:U});var bE=[];function cV(a){bE.push(a)};IE7.recalc=function(){IE7.HTML.recalc();IE7.CSS.recalc();for(var a=0;a<bE.length;a++)bE[a]()};function bh(a){return a.currentStyle["ie7-position"]=="fixed"};function bF(a,b){return a.currentStyle[bD+b]||a.currentStyle[b]};function N(a,b,c){if(a.currentStyle[bD+b]==null){a.runtimeStyle[bD+b]=a.currentStyle[b]}a.runtimeStyle[b]=c};function ca(a){var b=document.createElement(a||"object");b.style.cssText="position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";b.ie7_anon=true;return b};function x(a,b,c){if(!bj[a]){I=[];var d="";var f=E.escape(a).split(",");for(var g=0;g<f.length;g++){p=l=y=0;Y=f.length>1?2:0;var h=E.exec(f[g])||"if(0){";if(p){h+=i("if(e%1.nodeName!='!'){",l)}var j=Y>1?ch:"";h+=i(j+ci,l);h+=Array(L(h,/\{/g).length+1).join("}");d+=h}eval(i(cj,I)+E.unescape(d)+"return s?null:r}");bj[a]=_k}return bj[a](b||document,c)};var bi=m<6;var cb=/^(href|src)$/;var bG={"class":"className","for":"htmlFor"};IE7._1=1;IE7._e=function(a,b){var c=a.all[b]||null;if(!c||c.id==b)return c;for(var d=0;d<c.length;d++){if(c[d].id==b)return c[d]}return null};IE7._f=function(a,b){if(b=="src"&&a.pngSrc)return a.pngSrc;var c=bi?(a.attributes[b]||a.attributes[bG[b.toLowerCase()]]):a.getAttributeNode(b);if(c&&(c.specified||b=="value")){if(cb.test(b)){return a.getAttribute(b,2)}else if(b=="class"){return a.className.replace(/\sie7_\w+/g,"")}else if(b=="style"){return a.style.cssText}else{return c.nodeValue}}return null};var cc="colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";bf(bG,cN(cc.toLowerCase().split(","),cc.split(",")));IE7._3=function(a){while(a&&(a=a.nextSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};IE7._4=function(a){while(a&&(a=a.previousSibling)&&(a.nodeType!=1||a.nodeName=="!"))continue;return a};var cW=/([\s>+~,]|[^(]\+|^)([#.:\[])/g,cX=/(^|,)([^\s>+~])/g,cY=/\s*([\s>+~(),]|^|$)\s*/g,cd=/\s\*\s/g;var ce=H.extend({constructor:function(a){this.base(a);this.sorter=new H;this.sorter.add(/:not\([^)]*\)/,H.IGNORE);this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/,"$1$3$6$4")},ignoreCase:true,escape:function(a){return this.optimise(this.format(a))},format:function(a){return a.replace(cY,"$1").replace(cX,"$1 $2").replace(cW,"$1*$2")},optimise:function(a){return this.sorter.exec(a.replace(cd,">* "))},unescape:function(a){return bg(a)}});var cf={"":"%1!=null","=":"%1=='%2'","~=":/(^| )%1( |$)/,"|=":/^%1(-|$)/,"^=":/^%1/,"$=":/%1$/,"*=":/%1/};var bH={"first-child":"!IE7._4(e%1)","link":"e%1.currentStyle['ie7-link']=='link'","visited":"e%1.currentStyle['ie7-link']=='visited'"};var bI="var p%2=0,i%2,e%2,n%2=e%1.";var cg="e%1.sourceIndex";var ch="var g="+cg+";if(!p[g]){p[g]=1;";var ci="r[r.length]=e%1;if(s)return e%1;";var cj="var _k=function(e0,s){IE7._1++;var r=[],p={},reg=[%1],d=document;";var I;var l;var p;var y;var Y;var bj={};var E=new ce({" (\\*|[\\w-]+)#([\\w-]+)":function(a,b,c){p=false;var d="var e%2=IE7._e(d,'%4');if(e%2&&";if(b!="*")d+="e%2.nodeName=='%3'&&";d+="(e%1==d||e%1.contains(e%2))){";if(y)d+=i("i%1=n%1.length;",y);return i(d,l++,l,b.toUpperCase(),c)}," (\\*|[\\w-]+)":function(a,b){Y++;p=b=="*";var c=bI;c+=(p&&bi)?"all":"getElementsByTagName('%3')";c+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";return i(c,l++,y=l,b.toUpperCase())},">(\\*|[\\w-]+)":function(a,b){var c=y;p=b=="*";var d=bI;d+=c?"children":"childNodes";if(!p&&c)d+=".tags('%3')";d+=";for(i%2=0;(e%2=n%2[i%2]);i%2++){";if(p){d+="if(e%2.nodeType==1){";p=bi}else{if(!c)d+="if(e%2.nodeName=='%3'){"}return i(d,l++,y=l,b.toUpperCase())},"\\+(\\*|[\\w-]+)":function(a,b){var c="";if(p)c+="if(e%1.nodeName!='!'){";p=false;c+="e%1=IE7._3(e%1);if(e%1";if(b!="*")c+="&&e%1.nodeName=='%2'";c+="){";return i(c,l,b.toUpperCase())},"~(\\*|[\\w-]+)":function(a,b){var c="";if(p)c+="if(e%1.nodeName!='!'){";p=false;Y=2;c+="while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._1)break;if(";if(b=="*"){c+="e%1.nodeType==1";if(bi)c+="&&e%1.nodeName!='!'"}else c+="e%1.nodeName=='%2'";c+="){e%1.ie7_adjacent=IE7._1;";return i(c,l,b.toUpperCase())},"#([\\w-]+)":function(a,b){p=false;var c="if(e%1.id=='%2'){";if(y)c+=i("i%1=n%1.length;",y);return i(c,l,b)},"\\.([\\w-]+)":function(a,b){p=false;I.push(new RegExp("(^|\\s)"+W(b)+"(\\s|$)"));return i("if(e%1.className&&reg[%2].test(e%1.className)){",l,I.length-1)},"\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]":function(a,b,c,d){var f=bG[b]||b;if(c){var g="e%1.getAttribute('%2',2)";if(!cb.test(b)){g="e%1.%3||"+g}b=i("("+g+")",l,b,f)}else{b=i("IE7._f(e%1,'%2')",l,b)}var h=cf[c||""]||"0";if(h&&h.source){I.push(new RegExp(i(h.source,W(E.unescape(d)))));h="reg[%2].test(%1)";d=I.length-1}return"if("+i(h,b,d)+"){"},":+([\\w-]+)(\\(([^)]+)\\))?":function(a,b,c,d){b=bH[b];return"if("+(b?i(b,l,d||""):"0")+"){"}});var ck=/a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;var cl=/\s*\{\s*/,cm=/\s*\}\s*/,cn=/\s*\,\s*/;var co=/(.*)(:first-(line|letter))/;var z=document.styleSheets;IE7.CSS=new(bZ.extend({parser:new bU,screen:"",print:"",styles:[],rules:[],pseudoClasses:m<7?"first\\-child":"",dynamicPseudoClasses:{toString:function(){var a=[];for(var b in this)a.push(b);return a.join("|")}},init:function(){var a="^\x01$";var b="\\[class=?[^\\]]*\\]";var c=[];if(this.pseudoClasses)c.push(this.pseudoClasses);var d=this.dynamicPseudoClasses.toString();if(d)c.push(d);c=c.join("|");var f=m<7?["[>+~[(]|([:.])\\w+\\1"]:[b];if(c)f.push(":("+c+")");this.UNKNOWN=new RegExp(f.join("|")||a,"i");var g=m<7?["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"]:[b];var h=g.concat();if(c)h.push(":("+c+")");o.COMPLEX=new RegExp(h.join("|")||a,"ig");if(this.pseudoClasses)g.push(":("+this.pseudoClasses+")");O.COMPLEX=new RegExp(g.join("|")||a,"i");O.MATCH=new RegExp(d?"(.*):("+d+")(.*)":a,"i");this.createStyleSheet();this.refresh()},addEventHandler:function(){v.apply(null,arguments)},addFix:function(a,b){this.parser.add(a,b)},addRecalc:function(c,d,f,g){d=new RegExp("([{;\\s])"+c+"\\s*:\\s*"+d+"[^;}]*");var h=this.recalcs.length;if(g)g=c+":"+g;this.addFix(d,function(a,b){return(g?b+g:a)+";ie7-"+a.slice(1)+";ie7_recalc"+h+":1"});this.recalcs.push(arguments);return h},apply:function(){this.getInlineStyles();new bJ("screen");this.trash()},createStyleSheet:function(){this.styleSheet=document.createStyleSheet();this.styleSheet.ie7=true;this.styleSheet.owningElement.ie7=true;this.styleSheet.cssText=J},getInlineStyles:function(){var a=document.getElementsByTagName("style"),b;for(var c=a.length-1;(b=a[c]);c--){if(!b.disabled&&!b.ie7){this.styles.push(b.innerHTML)}}},getText:function(a,b){try{var c=a.cssText}catch(e){c=""}if(K)c=cD(a.href,b)||c;return c},recalc:function(){this.screen.recalc();var a=/ie7_recalc\d+/g;var b=J.match(/[{,]/g).length;var c=b+(this.screen.cssText.match(/\{/g)||"").length;var d=this.styleSheet.rules,f;var g,h,j,q,r,k,u,n;for(r=b;r<c;r++){f=d[r];var s=f.style.cssText;if(f&&(g=s.match(a))){j=x(f.selectorText);if(j.length)for(k=0;k<g.length;k++){n=g[k];h=IE7.CSS.recalcs[n.slice(10)][2];for(u=0;(q=j[u]);u++){if(q.currentStyle[n])h(q,s)}}}}},refresh:function(){this.styleSheet.cssText=J+this.screen+this.print},trash:function(){for(var a=0;a<z.length;a++){if(!z[a].ie7){try{var b=z[a].cssText}catch(e){b=""}if(b)z[a].cssText=""}}}}));var bJ=B.extend({constructor:function(a){this.media=a;this.load();IE7.CSS[a]=this;IE7.CSS.refresh()},createRule:function(a,b){if(IE7.CSS.UNKNOWN.test(a)){var c;if(F&&(c=a.match(F.MATCH))){return new F(c[1],c[2],b)}else if(c=a.match(O.MATCH)){if(!ck.test(c[0])||O.COMPLEX.test(c[0])){return new O(a,c[1],c[2],c[3],b)}}else return new o(a,b)}return a+" {"+b+"}"},getText:function(){var h=[].concat(IE7.CSS.styles);var j=/@media\s+([^{]*)\{([^@]+\})\s*\}/gi;var q=/\ball\b|^$/i,r=/\bscreen\b/i,k=/\bprint\b/i;function u(a,b){n.value=b;return a.replace(j,n)};function n(a,b,c){b=s(b);switch(b){case"screen":case"print":if(b!=n.value)return"";case"all":return c}return""};function s(a){if(q.test(a))return"all";else if(r.test(a))return(k.test(a))?"all":"screen";else if(k.test(a))return"print"};var R=this;function S(a,b,c,d){var f="";if(!d){c=s(a.media);d=0}if(c=="all"||c==R.media){if(d<3){for(var g=0;g<a.imports.length;g++){f+=S(a.imports[g],by(a.href,b),c,d+1)}}f+=cS(a.href?cy(a,b):h.pop()||"");f=u(f,R.media)}return f};var bw={};function cy(a,b){var c=bc(a.href,b);if(bw[c])return"";bw[c]=(a.disabled)?"":cA(IE7.CSS.getText(a,b),by(a.href,b));return bw[c]};var cz=/(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;function cA(a,b){return a.replace(cz,"$1"+b.slice(0,b.lastIndexOf("/")+1)+"$2")};for(var T=0;T<z.length;T++){if(!z[T].disabled&&!z[T].ie7){this.cssText+=S(z[T])}}},load:function(){this.cssText="";this.getText();this.parse();this.cssText=bg(this.cssText);bd={}},parse:function(){this.cssText=IE7.CSS.parser.exec(this.cssText);var a=IE7.CSS.rules.length;var b=this.cssText.split(cm),c;var d,f,g,h;for(g=0;g<b.length;g++){c=b[g].split(cl);d=c[0].split(cn);f=c[1];for(h=0;h<d.length;h++){d[h]=f?this.createRule(d[h],f):""}b[g]=d.join("\n")}this.cssText=b.join("\n");this.rules=IE7.CSS.rules.slice(a)},recalc:function(){var a,b;for(b=0;(a=this.rules[b]);b++)a.recalc()},toString:function(){return"@media "+this.media+"{"+this.cssText+"}"}});var F;var o=IE7.Rule=B.extend({constructor:function(a,b){this.id=IE7.CSS.rules.length;this.className=o.PREFIX+this.id;a=a.match(co)||a||"*";this.selector=a[1]||a;this.selectorText=this.parse(this.selector)+(a[2]||"");this.cssText=b;this.MATCH=new RegExp("\\s"+this.className+"(\\s|$)","g");IE7.CSS.rules.push(this);this.init()},init:U,add:function(a){a.className+=" "+this.className},recalc:function(){var a=x(this.selector);for(var b=0;b<a.length;b++)this.add(a[b])},parse:function(a){var b=a.replace(o.CHILD," ").replace(o.COMPLEX,"");if(m<7)b=b.replace(o.MULTI,"");var c=L(b,o.TAGS).length-L(a,o.TAGS).length;var d=L(b,o.CLASSES).length-L(a,o.CLASSES).length+1;while(d>0&&o.CLASS.test(b)){b=b.replace(o.CLASS,"");d--}while(c>0&&o.TAG.test(b)){b=b.replace(o.TAG,"$1*");c--}b+="."+this.className;d=Math.min(d,2);c=Math.min(c,2);var f=-10*d-c;if(f>0){b=b+","+o.MAP[f]+" "+b}return b},remove:function(a){a.className=a.className.replace(this.MATCH,"$1")},toString:function(){return i("%1 {%2}",this.selectorText,this.cssText)}},{CHILD:/>/g,CLASS:/\.[\w-]+/,CLASSES:/[.:\[]/g,MULTI:/(\.[\w-]+)+/g,PREFIX:"ie7_class",TAG:/^\w+|([\s>+~])\w+/,TAGS:/^\w|[\s>+~]\w/g,MAP:{1:"html",2:"html body",10:".ie7_html",11:"html.ie7_html",12:"html.ie7_html body",20:".ie7_html .ie7_body",21:"html.ie7_html .ie7_body",22:"html.ie7_html body.ie7_body"}});var O=o.extend({constructor:function(a,b,c,d,f){this.attach=b||"*";this.dynamicPseudoClass=IE7.CSS.dynamicPseudoClasses[c];this.target=d;this.base(a,f)},recalc:function(){var a=x(this.attach),b;for(var c=0;b=a[c];c++){var d=this.target?x(this.target,b):[b];if(d.length)this.dynamicPseudoClass.apply(b,d,this)}}});var A=B.extend({constructor:function(a,b){this.name=a;this.apply=b;this.instances={};IE7.CSS.dynamicPseudoClasses[a]=this},register:function(a){var b=a[2];a.id=b.id+a[0].uniqueID;if(!this.instances[a.id]){var c=a[1],d;for(d=0;d<c.length;d++)b.add(c[d]);this.instances[a.id]=a}},unregister:function(a){if(this.instances[a.id]){var b=a[2];var c=a[1],d;for(d=0;d<c.length;d++)b.remove(c[d]);delete this.instances[a.id]}}});if(m<7){var Z=new A("hover",function(a){var b=arguments;IE7.CSS.addEventHandler(a,m<5.5?"onmouseover":"onmouseenter",function(){Z.register(b)});IE7.CSS.addEventHandler(a,m<5.5?"onmouseout":"onmouseleave",function(){Z.unregister(b)})});v(document,"onmouseup",function(){var a=Z.instances;for(var b in a)if(!a[b][0].contains(event.srcElement))Z.unregister(a[b])})}IE7.CSS.addRecalc("[\\w-]+","inherit",function(c,d){var f=d.match(/[\w-]+\s*:\s*inherit/g);for(var g=0;g<f.length;g++){var h=f[g].replace(/ie7\-|\s*:\s*inherit/g,"").replace(/\-([a-z])/g,function(a,b){return b.toUpperCase()});c.runtimeStyle[h]=c.parentElement.currentStyle[h]}});IE7.HTML=new(bZ.extend({fixed:{},init:U,addFix:function(){this.fixes.push(arguments)},apply:function(){for(var a=0;a<this.fixes.length;a++){var b=x(this.fixes[a][0]);var c=this.fixes[a][1];for(var d=0;d<b.length;d++)c(b[d])}},addRecalc:function(){this.recalcs.push(arguments)},recalc:function(){for(var a=0;a<this.recalcs.length;a++){var b=x(this.recalcs[a][0]);var c=this.recalcs[a][1],d;var f=Math.pow(2,a);for(var g=0;(d=b[g]);g++){var h=d.uniqueID;if((this.fixed[h]&f)==0){d=c(d)||d;this.fixed[h]|=f}}}}}));if(m<7){document.createElement("abbr");IE7.HTML.addRecalc("label",function(a){if(!a.htmlFor){var b=x("input,textarea",a,true);if(b){v(a,"onclick",function(){b.click()})}}})}var P="[.\\d]";new function(_){var layout=IE7.Layout=this;J+="*{boxSizing:content-box}";IE7.hasLayout=m<5.5?function(a){return a.clientWidth}:function(a){return a.currentStyle.hasLayout};layout.boxSizing=function(a){if(!IE7.hasLayout(a)){a.style.height="0cm";if(a.currentStyle.verticalAlign=="auto")a.runtimeStyle.verticalAlign="top";collapseMargins(a)}};function collapseMargins(a){if(a!=t&&a.currentStyle.position!="absolute"){collapseMargin(a,"marginTop");collapseMargin(a,"marginBottom")}};function collapseMargin(a,b){if(!a.runtimeStyle[b]){var c=a.parentElement;if(c&&IE7.hasLayout(c)&&!IE7[b=="marginTop"?"_4":"_3"](a))return;var d=x(">*:"+(b=="marginTop"?"first":"last")+"-child",a,true);if(d&&d.currentStyle.styleFloat=="none"&&IE7.hasLayout(d)){collapseMargin(d,b);margin=_b(a,a.currentStyle[b]);childMargin=_b(d,d.currentStyle[b]);if(margin<0||childMargin<0){a.runtimeStyle[b]=margin+childMargin}else{a.runtimeStyle[b]=Math.max(childMargin,margin)}d.runtimeStyle[b]="0px"}}};function _b(a,b){return b=="auto"?0:D(a,b)};var UNIT=/^[.\d][\w%]*$/,AUTO=/^(auto|0cm)$/;var applyWidth,applyHeight;IE7.Layout.borderBox=function(a){applyWidth(a);applyHeight(a)};var fixWidth=function(g){applyWidth=function(a){if(!M.test(a.currentStyle.width))h(a);collapseMargins(a)};function h(a,b){if(!a.runtimeStyle.fixedWidth){if(!b)b=a.currentStyle.width;a.runtimeStyle.fixedWidth=(UNIT.test(b))?Math.max(0,r(a,b)):b;N(a,"width",a.runtimeStyle.fixedWidth)}};function j(a){if(!bh(a)){var b=a.offsetParent;while(b&&!IE7.hasLayout(b))b=b.offsetParent}return(b||t).clientWidth};function q(a,b){if(M.test(b))return parseInt(parseFloat(b)/100*j(a));return D(a,b)};var r=function(a,b){var c=a.currentStyle["box-sizing"]=="border-box";var d=0;if(G&&!c)d+=k(a)+u(a,"padding");else if(!G&&c)d-=k(a)+u(a,"padding");return q(a,b)+d};function k(a){return a.offsetWidth-a.clientWidth};function u(a,b){return q(a,a.currentStyle[b+"Left"])+q(a,a.currentStyle[b+"Right"])};J+="*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";layout.minWidth=function(a){if(a.currentStyle["min-width"]!=null){a.style.minWidth=a.currentStyle["min-width"]}if(X(arguments.callee,a,a.currentStyle.minWidth!="none")){layout.boxSizing(a);h(a);n(a)}};eval("IE7.Layout.maxWidth="+String(layout.minWidth).replace(/min/g,"max"));function n(a){var b=a.getBoundingClientRect();var c=b.right-b.left;if(a.currentStyle.minWidth!="none"&&c<=r(a,a.currentStyle.minWidth)){a.runtimeStyle.width=a.currentStyle.minWidth}else if(a.currentStyle.maxWidth!="none"&&c>=r(a,a.currentStyle.maxWidth)){a.runtimeStyle.width=a.currentStyle.maxWidth}else{a.runtimeStyle.width=a.runtimeStyle.fixedWidth}};function s(a){if(X(s,a,/^(fixed|absolute)$/.test(a.currentStyle.position)&&bF(a,"left")!="auto"&&bF(a,"right")!="auto"&&AUTO.test(bF(a,"width")))){R(a);IE7.Layout.boxSizing(a)}};IE7.Layout.fixRight=s;function R(a){var b=q(a,a.runtimeStyle._c||a.currentStyle.left);var c=j(a)-q(a,a.currentStyle.right)-b-u(a,"margin");if(parseInt(a.runtimeStyle.width)==c)return;a.runtimeStyle.width="";if(bh(a)||g||a.offsetWidth<c){if(!G)c-=k(a)+u(a,"padding");if(c<0)c=0;a.runtimeStyle.fixedWidth=c;N(a,"width",c)}};var S=0;bC(function(){if(!t)return;var a,b=(S<t.clientWidth);S=t.clientWidth;var c=layout.minWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==r(d,d.currentStyle.minWidth));if(b&&f)d.runtimeStyle.width="";if(b==f)n(d)}var c=layout.maxWidth.elements;for(a in c){var d=c[a];var f=(parseInt(d.runtimeStyle.width)==r(d,d.currentStyle.maxWidth));if(!b&&f)d.runtimeStyle.width="";if(b!=f)n(d)}for(a in s.elements)R(s.elements[a])});if(G){IE7.CSS.addRecalc("width",P,applyWidth)}if(m<7){IE7.CSS.addRecalc("min-width",P,layout.minWidth);IE7.CSS.addRecalc("max-width",P,layout.maxWidth);IE7.CSS.addRecalc("right",P,s)}};eval("var fixHeight="+C(fixWidth));fixWidth();fixHeight(true)};var bk=bc("blank.gif",cC);var bl="DXImageTransform.Microsoft.AlphaImageLoader";var bK="progid:"+bl+"(src='%1',sizingMethod='%2')";var bm;var Q=[];function bL(a){if(bm.test(a.src)){var b=new Image(a.width,a.height);b.onload=function(){a.width=b.width;a.height=b.height;b=null};b.src=a.src;a.pngSrc=a.src;bo(a)}};if(m>=5.5&&m<7){IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/,function(a,b,c,d,f){d=bB(d);return bm.test(d)?"filter:"+i(bK,d,"crop")+";zoom:1;background"+(b||"")+":"+(c||"")+"none"+(f||""):a});IE7.HTML.addRecalc("img,input",function(a){if(a.tagName=="INPUT"&&a.type!="image")return;bL(a);v(a,"onpropertychange",function(){if(!bn&&event.propertyName=="src"&&a.src.indexOf(bk)==-1)bL(a)})});var bn=false;v(window,"onbeforeprint",function(){bn=true;for(var a=0;a<Q.length;a++)cp(Q[a])});v(window,"onafterprint",function(){for(var a=0;a<Q.length;a++)bo(Q[a]);bn=false})}function bo(a,b){var c=a.filters[bl];if(c){c.src=a.src;c.enabled=true}else{a.runtimeStyle.filter=i(bK,a.src,b||"scale");Q.push(a)}a.src=bk};function cp(a){a.src=a.pngSrc;a.filters[bl].enabled=false};new function(_){if(m>=7)return;IE7.CSS.addRecalc("position","fixed",_8,"absolute");IE7.CSS.addRecalc("background(-attachment)?","[^};]*fixed",_5);var $viewport=G?"body":"documentElement";function _6(){if(w.currentStyle.backgroundAttachment!="fixed"){if(w.currentStyle.backgroundImage=="none"){w.runtimeStyle.backgroundRepeat="no-repeat";w.runtimeStyle.backgroundImage="url("+bk+")"}w.runtimeStyle.backgroundAttachment="fixed"}_6=U};var _0=ca("img");function _2(a){return a?bh(a)||_2(a.parentElement):false};function _d(a,b,c){setTimeout("document.all."+a.uniqueID+".runtimeStyle.setExpression('"+b+"','"+c+"')",0)};function _5(a){if(X(_5,a,a.currentStyle.backgroundAttachment=="fixed"&&!a.contains(w))){_6();bgLeft(a);bgTop(a);_a(a)}};function _a(a){_0.src=a.currentStyle.backgroundImage.slice(5,-2);var b=a.canHaveChildren?a:a.parentElement;b.appendChild(_0);setOffsetLeft(a);setOffsetTop(a);b.removeChild(_0)};function bgLeft(a){a.style.backgroundPositionX=a.currentStyle.backgroundPositionX;if(!_2(a)){_d(a,"backgroundPositionX","(parseInt(runtimeStyle.offsetLeft)+document."+$viewport+".scrollLeft)||0")}};eval(C(bgLeft));function setOffsetLeft(a){var b=_2(a)?"backgroundPositionX":"offsetLeft";a.runtimeStyle[b]=getOffsetLeft(a,a.style.backgroundPositionX)-a.getBoundingClientRect().left-a.clientLeft+2};eval(C(setOffsetLeft));function getOffsetLeft(a,b){switch(b){case"left":case"top":return 0;case"right":case"bottom":return t.clientWidth-_0.offsetWidth;case"center":return(t.clientWidth-_0.offsetWidth)/2;default:if(M.test(b)){return parseInt((t.clientWidth-_0.offsetWidth)*parseFloat(b)/100)}_0.style.left=b;return _0.offsetLeft}};eval(C(getOffsetLeft));function _8(a){if(X(_8,a,bh(a))){N(a,"position","absolute");N(a,"left",a.currentStyle.left);N(a,"top",a.currentStyle.top);_6();IE7.Layout.fixRight(a);_7(a)}};function _7(a,b){positionTop(a,b);positionLeft(a,b,true);if(!a.runtimeStyle.autoLeft&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.right!="auto"){var c=t.clientWidth-getPixelWidth(a,a.currentStyle.right)-getPixelWidth(a,a.runtimeStyle._c)-a.clientWidth;if(a.currentStyle.marginRight=="auto")c=parseInt(c/2);if(_2(a.offsetParent))a.runtimeStyle.pixelLeft+=c;else a.runtimeStyle.shiftLeft=c}clipWidth(a);clipHeight(a)};function clipWidth(a){var b=a.runtimeStyle.fixWidth;a.runtimeStyle.borderRightWidth="";a.runtimeStyle.width=b?getPixelWidth(a,b):"";if(a.currentStyle.width!="auto"){var c=a.getBoundingClientRect();var d=a.offsetWidth-t.clientWidth+c.left-2;if(d>=0){a.runtimeStyle.borderRightWidth="0px";d=Math.max(D(a,a.currentStyle.width)-d,0);N(a,"width",d);return d}}};eval(C(clipWidth));function positionLeft(a,b){if(!b&&M.test(a.currentStyle.width)){a.runtimeStyle.fixWidth=a.currentStyle.width}if(a.runtimeStyle.fixWidth){a.runtimeStyle.width=getPixelWidth(a,a.runtimeStyle.fixWidth)}a.runtimeStyle.shiftLeft=0;a.runtimeStyle._c=a.currentStyle.left;a.runtimeStyle.autoLeft=a.currentStyle.right!="auto"&&a.currentStyle.left=="auto";a.runtimeStyle.left="";a.runtimeStyle.screenLeft=getScreenLeft(a);a.runtimeStyle.pixelLeft=a.runtimeStyle.screenLeft;if(!b&&!_2(a.offsetParent)){_d(a,"pixelLeft","runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document."+$viewport+".scrollLeft")}};eval(C(positionLeft));function getScreenLeft(a){var b=a.offsetLeft,c=1;if(a.runtimeStyle.autoLeft){b=t.clientWidth-a.offsetWidth-getPixelWidth(a,a.currentStyle.right)}if(a.currentStyle.marginLeft!="auto"){b-=getPixelWidth(a,a.currentStyle.marginLeft)}while(a=a.offsetParent){if(a.currentStyle.position!="static")c=-1;b+=a.offsetLeft*c}return b};eval(C(getScreenLeft));function getPixelWidth(a,b){return M.test(b)?parseInt(parseFloat(b)/100*t.clientWidth):D(a,b)};eval(C(getPixelWidth));function _j(){var a=_5.elements;for(var b in a)_a(a[b]);a=_8.elements;for(b in a){_7(a[b],true);_7(a[b],true)}_9=0};var _9;bC(function(){if(!_9)_9=setTimeout(_j,0)})};var bp={backgroundColor:"transparent",backgroundImage:"none",backgroundPositionX:null,backgroundPositionY:null,backgroundRepeat:null,borderTopWidth:0,borderRightWidth:0,borderBottomWidth:0,borderLeftStyle:"none",borderTopStyle:"none",borderRightStyle:"none",borderBottomStyle:"none",borderLeftWidth:0,height:null,marginTop:0,marginBottom:0,marginRight:0,marginLeft:0,width:"100%"};IE7.CSS.addRecalc("overflow","visible",function(a){if(a.parentNode.ie7_wrapped)return;if(IE7.Layout&&a.currentStyle["max-height"]!="auto"){IE7.Layout.maxHeight(a)}if(a.currentStyle.marginLeft=="auto")a.style.marginLeft=0;if(a.currentStyle.marginRight=="auto")a.style.marginRight=0;var b=document.createElement(bN);b.ie7_wrapped=a;for(var c in bp){b.style[c]=a.currentStyle[c];if(bp[c]!=null){a.runtimeStyle[c]=bp[c]}}b.style.display="block";b.style.position="relative";a.runtimeStyle.position="absolute";a.parentNode.insertBefore(b,a);b.appendChild(a)});function cq(){var f="xx-small,x-small,small,medium,large,x-large,xx-large".split(",");for(var g=0;g<f.length;g++){f[f[g]]=f[g-1]||"0.67em"}IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/,function(a,b,c,d){return b+(f[d]||d)});if(m<6){var h=/^\-/,j=/(em|ex)$/i;var q=/em$/i,r=/ex$/i;D=function(a,b){if(bY.test(b))return parseInt(b)||0;var c=h.test(b)?-1:1;if(j.test(b))c*=u(a);k.style.width=(c<0)?b.slice(1):b;w.appendChild(k);b=c*k.offsetWidth;k.removeNode();return parseInt(b)};var k=ca();function u(a){var b=1;k.style.fontFamily=a.currentStyle.fontFamily;k.style.lineHeight=a.currentStyle.lineHeight;while(a!=w){var c=a.currentStyle["ie7-font-size"];if(c){if(q.test(c))b*=parseFloat(c);else if(M.test(c))b*=(parseFloat(c)/100);else if(r.test(c))b*=(parseFloat(c)/2);else{k.style.fontSize=c;return 1}}a=a.parentElement}return b};IE7.CSS.addFix(/cursor\s*:\s*pointer/,"cursor:hand");IE7.CSS.addFix(/display\s*:\s*list-item/,"display:block")}function n(a){if(m<5.5)IE7.Layout.boxSizing(a.parentElement);var b=a.parentElement;var c=b.offsetWidth-a.offsetWidth-s(b);var d=(a.currentStyle["ie7-margin"]&&a.currentStyle.marginRight=="auto")||a.currentStyle["ie7-margin-right"]=="auto";switch(b.currentStyle.textAlign){case"right":c=d?parseInt(c/2):0;a.runtimeStyle.marginRight=c+"px";break;case"center":if(d)c=0;default:if(d)c/=2;a.runtimeStyle.marginLeft=parseInt(c)+"px"}};function s(a){return D(a,a.currentStyle.paddingLeft)+D(a,a.currentStyle.paddingRight)};IE7.CSS.addRecalc("margin(-left|-right)?","[^};]*auto",function(a){if(X(n,a,a.parentElement&&a.currentStyle.display=="block"&&a.currentStyle.marginLeft=="auto"&&a.currentStyle.position!="absolute")){n(a)}});bC(function(){for(var a in n.elements){var b=n.elements[a];b.runtimeStyle.marginLeft=b.runtimeStyle.marginRight="";n(b)}})};IE7._g=function(a){a=a.firstChild;while(a){if(a.nodeType==3||(a.nodeType==1&&a.nodeName!="!"))return false;a=a.nextSibling}return true};IE7._h=function(a,b){while(a&&!a.getAttribute("lang"))a=a.parentNode;return a&&new RegExp("^"+W(b),"i").test(a.getAttribute("lang"))};function cr(a,b,c,d){d=/last/i.test(a)?d+"+1-":"";if(!isNaN(b))b="0n+"+b;else if(b=="even")b="2n";else if(b=="odd")b="2n+1";b=b.split("n");var f=b[0]?(b[0]=="-")?-1:parseInt(b[0]):1;var g=parseInt(b[1])||0;var h=f<0;if(h){f=-f;if(f==1)g++}var j=i(f==0?"%3%7"+(d+g):"(%4%3-%2)%6%1%70%5%4%3>=%2",f,g,c,d,"&&","%","==");if(h)j="!("+j+")";return j};bH={"link":"e%1.currentStyle['ie7-link']=='link'","visited":"e%1.currentStyle['ie7-link']=='visited'","checked":"e%1.checked","contains":"e%1.innerText.indexOf('%2')!=-1","disabled":"e%1.isDisabled","empty":"IE7._g(e%1)","enabled":"e%1.disabled===false","first-child":"!IE7._4(e%1)","lang":"IE7._h(e%1,'%2')","last-child":"!IE7._3(e%1)","only-child":"!IE7._4(e%1)&&!IE7._3(e%1)","target":"e%1.id==location.hash.slice(1)","indeterminate":"e%1.indeterminate"};IE7._i=function(a){if(a.rows){a.ie7_length=a.rows.length;a.ie7_lookup="rowIndex"}else if(a.cells){a.ie7_length=a.cells.length;a.ie7_lookup="cellIndex"}else if(a.ie7_indexed!=IE7._1){var b=0;var c=a.firstChild;while(c){if(c.nodeType==1&&c.nodeName!="!"){c.ie7_index=++b}c=c.nextSibling}a.ie7_length=b;a.ie7_lookup="ie7_index"}a.ie7_indexed=IE7._1;return a};var ba=E[V];var cs=ba[ba.length-1];ba.length--;E.merge({":not\\((\\*|[\\w-]+)?([^)]*)\\)":function(a,b,c){var d=(b&&b!="*")?i("if(e%1.nodeName=='%2'){",l,b.toUpperCase()):"";d+=E.exec(c);return"if(!"+d.slice(2,-1).replace(/\)\{if\(/g,"&&")+"){"},":nth(-last)?-child\\(([^)]+)\\)":function(a,b,c){p=false;b=i("e%1.parentNode.ie7_length",l);var d="if(p%1!==e%1.parentNode)p%1=IE7._i(e%1.parentNode);";d+="var i=e%1[p%1.ie7_lookup];if(p%1.ie7_lookup!='ie7_index')i++;if(";return i(d,l)+cr(a,c,"i",b)+"){"}});ba.push(cs);var bM="\\([^)]*\\)";if(IE7.CSS.pseudoClasses)IE7.CSS.pseudoClasses+="|";IE7.CSS.pseudoClasses+="before|after|last\\-child|only\\-child|empty|root|"+"not|nth\\-child|nth\\-last\\-child|contains|lang".split("|").join(bM+"|")+bM;bV.add(/::/,":");var bb=new A("focus",function(a){var b=arguments;IE7.CSS.addEventHandler(a,"onfocus",function(){bb.unregister(b);bb.register(b)});IE7.CSS.addEventHandler(a,"onblur",function(){bb.unregister(b)});if(a==document.activeElement){bb.register(b)}});var bq=new A("active",function(a){var b=arguments;IE7.CSS.addEventHandler(a,"onmousedown",function(){bq.register(b)})});v(document,"onmouseup",function(){var a=bq.instances;for(var b in a)bq.unregister(a[b])});var br=new A("checked",function(a){if(typeof a.checked!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="checked"){if(a.checked)br.register(b);else br.unregister(b)}});if(a.checked)br.register(b)});var bs=new A("enabled",function(a){if(typeof a.disabled!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="disabled"){if(!a.isDisabled)bs.register(b);else bs.unregister(b)}});if(!a.isDisabled)bs.register(b)});var bt=new A("disabled",function(a){if(typeof a.disabled!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="disabled"){if(a.isDisabled)bt.register(b);else bt.unregister(b)}});if(a.isDisabled)bt.register(b)});var bu=new A("indeterminate",function(a){if(typeof a.indeterminate!="boolean")return;var b=arguments;IE7.CSS.addEventHandler(a,"onpropertychange",function(){if(event.propertyName=="indeterminate"){if(a.indeterminate)bu.register(b);else bu.unregister(b)}});IE7.CSS.addEventHandler(a,"onclick",function(){bu.unregister(b)})});var bv=new A("target",function(a){var b=arguments;if(!a.tabIndex)a.tabIndex=0;IE7.CSS.addEventHandler(document,"onpropertychange",function(){if(event.propertyName=="activeElement"){if(a.id&&a.id==location.hash.slice(1))bv.register(b);else bv.unregister(b)}});if(a.id&&a.id==location.hash.slice(1))bv.register(b)});var ct=/^attr/;var cu=/^url\s*\(\s*([^)]*)\)$/;var cv={before0:"beforeBegin",before1:"afterBegin",after0:"afterEnd",after1:"beforeEnd"};var F=IE7.PseudoElement=o.extend({constructor:function(a,b,c){this.position=b;var d=c.match(F.CONTENT),f,g;if(d){d=d[1];f=d.split(/\s+/);for(var h=0;(g=f[h]);h++){f[h]=ct.test(g)?{attr:g.slice(5,-1)}:(g.charAt(0)=="'")?bB(g):bg(g)}d=f}this.content=d;this.base(a,bg(c))},init:function(){this.match=x(this.selector);for(var a=0;a<this.match.length;a++){var b=this.match[a].runtimeStyle;if(!b[this.position])b[this.position]={cssText:""};b[this.position].cssText+=";"+this.cssText;if(this.content!=null)b[this.position].content=this.content}},create:function(a){var b=a.runtimeStyle[this.position];if(b){var c=[].concat(b.content||"");for(var d=0;d<c.length;d++){if(typeof c[d]=="object"){c[d]=a.getAttribute(c[d].attr)}}c=c.join("");var f=c.match(cu);var g="overflow:hidden;"+b.cssText.replace(/'/g,'"');if(a.currentStyle.styleFloat!="none"){}var h=cv[this.position+Number(a.canHaveChildren)];var j='ie7_pseudo'+F.count++;a.insertAdjacentHTML(h,i(F.ANON,this.className,j,g,f?"":c));if(f){var q=document.getElementById(j);q.src=bB(f[1]);bo(q,"crop")}a.runtimeStyle[this.position]=null}},recalc:function(){if(this.content==null)return;for(var a=0;a<this.match.length;a++){this.create(this.match[a])}},toString:function(){return"."+this.className+"{display:inline}"}},{CONTENT:/content\s*:\s*([^;]*)(;|$)/,ANON:"<ie7:! class='ie7_anon %1' id=%2 style='%3'>%4</ie7:!>",MATCH:/(.*):(before|after).*/,count:0});var cw=/^(submit|reset|button)$/;IE7.HTML.addRecalc("button,input",function(a){if(a.tagName=="BUTTON"){var b=a.outerHTML.match(/ value="([^"]*)"/i);a.runtimeStyle.value=(b)?b[1]:""}if(a.type=="submit"){v(a,"onclick",function(){a.runtimeStyle.clicked=true;setTimeout("document.all."+a.uniqueID+".runtimeStyle.clicked=false",1)})}});IE7.HTML.addRecalc("form",function(c){v(c,"onsubmit",function(){for(var a,b=0;a=c[b];b++){if(cw.test(a.type)&&!a.disabled&&!a.runtimeStyle.clicked){a.disabled=true;setTimeout("document.all."+a.uniqueID+".disabled=false",1)}else if(a.tagName=="BUTTON"&&a.type=="submit"){setTimeout("document.all."+a.uniqueID+".value='"+a.value+"'",1);a.value=a.runtimeStyle.value}}})});IE7.HTML.addRecalc("img",function(a){if(a.alt&&!a.title)a.title=""});IE7.CSS.addRecalc("border-spacing",P,function(a){if(a.currentStyle.borderCollapse!="collapse"){a.cellSpacing=D(a,a.currentStyle["border-spacing"])}});IE7.CSS.addRecalc("box-sizing","content-box",IE7.Layout.boxSizing);IE7.CSS.addRecalc("box-sizing","border-box",IE7.Layout.borderBox);IE7.CSS.addFix(/opacity\s*:\s*([\d.]+)/,function(a,b){return"zoom:1;filter:Alpha(opacity="+((b*100)||1)+")"});var cx=/^image/i;IE7.HTML.addRecalc("object",function(a){if(cx.test(a.type)){a.body.style.cssText="margin:0;padding:0;border:none;overflow:hidden";return a}});IE7.loaded=true;(function(){try{bx.doScroll("left")}catch(e){setTimeout(arguments.callee,1);return}try{eval(bO.innerHTML)}catch(e){}bm=new RegExp(W(typeof IE7_PNG_SUFFIX=="string"?IE7_PNG_SUFFIX:"-trans.png")+"$","i");w=document.body;t=G?w:bx;w.className+=" ie7_body";bx.className+=" ie7_html";if(G)cq();IE7.CSS.init();IE7.HTML.init();IE7.HTML.apply();IE7.CSS.apply();IE7.recalc()})()})();
+// timestamp: Sun, 03 Feb 2008 19:26:22
+/*
+  IE7/IE8.js - copyright 2004-2008, Dean Edwards
+  http://dean.edwards.name/IE7/
+  http://www.opensource.org/licenses/mit-license.php
+*/
+
+/* W3C compliance for Microsoft Internet Explorer */
+
+/* credits/thanks:
+  Shaggy, Martijn Wargers, Jimmy Cerra, Mark D Anderson,
+  Lars Dieckow, Erik Arvidsson, Gellért Gyuris, James Denny,
+  Unknown W Brackets, Benjamin Westfarer, Rob Eberhardt,
+  Bill Edney, Kevin Newman, James Crompton, Matthew Mastracci,
+  Doug Wright, Richard York, Kenneth Kolano, MegaZone,
+  Thomas Verelst, Mark 'Tarquin' Wilton-Jones, Rainer Åhlfors,
+  David Zulaica, Ken Kolano, Kevin Newman
+*/
+
+// =======================================================================
+// TO DO
+// =======================================================================
+
+// PNG - unclickable content
+
+// =======================================================================
+// TEST/BUGGY
+// =======================================================================
+
+// hr{margin:1em auto} (doesn't look right in IE5)
+
+(function() {
+
+IE7 = {
+  toString: function(){return "IE7 version 2.0 (beta2)"}
+};
+var appVersion = IE7.appVersion = navigator.appVersion.match(/MSIE (\d\.\d)/)[1];
+
+if (/ie7_off/.test(top.location.search) || appVersion < 5) return;
+
+var Undefined = K();
+var quirksMode = document.compatMode != "CSS1Compat";
+var documentElement = document.documentElement, body, viewport;
+var ANON = "!";
+var HEADER = ":link{ie7-link:link}:visited{ie7-link:visited}";
+
+// -----------------------------------------------------------------------
+// external
+// -----------------------------------------------------------------------
+
+var RELATIVE = /^[\w\.]+[^:]*$/;
+function makePath(href, path) {
+  if (RELATIVE.test(href)) href = (path || "") + href;
+  return href;
+};
+
+function getPath(href, path) {
+  href = makePath(href, path);
+  return href.slice(0, href.lastIndexOf("/") + 1);
+};
+
+// get the path to this script
+var script = document.scripts[document.scripts.length - 1];
+var path = getPath(script.src);
+
+// we'll use microsoft's http request object to load external files
+try {
+  var httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+} catch (e) {
+  // ActiveX disabled
+}
+
+var fileCache = {};
+function loadFile(href, path) {
+try {
+  href = makePath(href, path);
+  if (!fileCache[href]) {
+    // easy to load a file huh?
+    httpRequest.open("GET", href, false);
+    httpRequest.send();
+    if (httpRequest.status == 0 || httpRequest.status == 200) {
+      fileCache[href] = httpRequest.responseText;
+    }
+  }
+} catch (e) {
+  // ignore errors
+} finally {
+  return fileCache[href] || "";
+}};
+
+// -----------------------------------------------------------------------
+// IE5.0 compatibility
+// -----------------------------------------------------------------------
+
+
+if (appVersion < 5.5) {
+  undefined = Undefined();
+
+  ANON = "HTML:!"; // for anonymous content
+  
+  // Fix String.replace (Safari1.x/IE5.0).
+  var GLOBAL = /(g|gi)$/;
+  var _String_replace = String.prototype.replace; 
+  String.prototype.replace = function(expression, replacement) {
+    if (typeof replacement == "function") { // Safari doesn't like functions
+      if (expression && expression.constructor == RegExp) {
+        var regexp = expression;
+        var global = regexp.global;
+        if (global == null) global = GLOBAL.test(regexp);
+        // we have to convert global RexpExps for exec() to work consistently
+        if (global) regexp = new RegExp(regexp.source); // non-global
+      } else {
+        regexp = new RegExp(rescape(expression));
+      }
+      var match, string = this, result = "";
+      while (string && (match = regexp.exec(string))) {
+        result += string.slice(0, match.index) + replacement.apply(this, match);
+        string = string.slice(match.index + match[0].length);
+        if (!global) break;
+      }
+      return result + string;
+    }
+    return _String_replace.apply(this, arguments);
+  };
+  
+  Array.prototype.pop = function() {
+    if (this.length) {
+      var i = this[this.length - 1];
+      this.length--;
+      return i;
+    }
+    return undefined;
+  };
+  
+  Array.prototype.push = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      this[this.length] = arguments[i];
+    }
+    return this.length;
+  };
+  
+  var ns = this;
+  Function.prototype.apply = function(o, a) {
+    if (o === undefined) o = ns;
+    else if (o == null) o = window;
+    else if (typeof o == "string") o = new String(o);
+    else if (typeof o == "number") o = new Number(o);
+    else if (typeof o == "boolean") o = new Boolean(o);
+    if (arguments.length == 1) a = [];
+    else if (a[0] && a[0].writeln) a[0] = a[0].documentElement.document || a[0];
+    var $ = "#ie7_apply", r;
+    o[$] = this;
+    switch (a.length) { // unroll for speed
+      case 0: r = o[$](); break;
+      case 1: r = o[$](a[0]); break;
+      case 2: r = o[$](a[0],a[1]); break;
+      case 3: r = o[$](a[0],a[1],a[2]); break;
+      case 4: r = o[$](a[0],a[1],a[2],a[3]); break;
+      case 5: r = o[$](a[0],a[1],a[2],a[3],a[4]); break;
+      default:
+        var b = [], i = a.length - 1;
+        do b[i] = "a[" + i + "]"; while (i--);
+        eval("r=o[$](" + b + ")");
+    }
+    if (typeof o.valueOf == "function") { // not a COM object
+      delete o[$];
+    } else {
+      o[$] = undefined;
+      if (r && r.writeln) r = r.documentElement.document || r;
+    }
+    return r;
+  };
+  
+  Function.prototype.call = function(o) {
+    return this.apply(o, _slice.apply(arguments, [1]));
+  };
+
+  // block elements are "inline" according to IE5.0 so we'll fix it
+  HEADER += "address,blockquote,body,dd,div,dt,fieldset,form,"+
+    "frame,frameset,h1,h2,h3,h4,h5,h6,iframe,noframes,object,p,"+
+    "hr,applet,center,dir,menu,pre,dl,li,ol,ul{display:block}";
+}
+
+// -----------------------------------------------------------------------
+// OO support
+// -----------------------------------------------------------------------
+
+
+// This is a cut-down version of base2 (http://code.google.com/p/base2/)
+
+var _slice = Array.prototype.slice;
+
+// private
+var _FORMAT = /%([1-9])/g;
+var _LTRIM = /^\s\s*/;
+var _RTRIM = /\s\s*$/;
+var _RESCAPE = /([\/()[\]{}|*+-.,^$?\\])/g;           // safe regular expressions
+var _BASE = /\bbase\b/;
+var _HIDDEN = ["constructor", "toString"];            // only override these when prototyping
+
+var prototyping;
+
+function Base(){};
+Base.extend = function(_instance, _static) {
+  // Build the prototype.
+  prototyping = true;
+  var _prototype = new this;
+  extend(_prototype, _instance);
+  prototyping = false;
+
+  // Create the wrapper for the constructor function.
+  var _constructor = _prototype.constructor;
+  function klass() {
+    // Don't call the constructor function when prototyping.
+    if (!prototyping) _constructor.apply(this, arguments);
+  };
+  _prototype.constructor = klass;
+
+  // Build the static interface.
+  klass.extend = arguments.callee;
+  extend(klass, _static);
+  klass.prototype = _prototype;
+  return klass;
+};
+Base.prototype.extend = function(source) {
+  return extend(this, source);
+};
+
+// A collection of regular expressions and their associated replacement values.
+// A Base class for creating parsers.
+
+var _HASH   = "#";
+var _KEYS   = "~";
+
+var _RG_ESCAPE_CHARS    = /\\./g;
+var _RG_ESCAPE_BRACKETS = /\(\?[:=!]|\[[^\]]+\]/g;
+var _RG_BRACKETS        = /\(/g;
+
+var RegGrp = Base.extend({
+  constructor: function(values) {
+    this[_KEYS] = [];
+    this.merge(values);
+  },
+
+  exec: function(string) {
+    var items = this, keys = this[_KEYS];    
+    return String(string).replace(new RegExp(this, this.ignoreCase ? "gi" : "g"), function() {
+      var item, offset = 1, i = 0;
+      // Loop through the RegGrp items.
+      while ((item = items[_HASH + keys[i++]])) {
+        var next = offset + item.length + 1;
+        if (arguments[offset]) { // do we have a result?
+          var replacement = item.replacement;
+          switch (typeof replacement) {
+            case "function":
+              return replacement.apply(items, _slice.call(arguments, offset, next));
+            case "number":
+              return arguments[offset + replacement];
+            default:
+              return replacement;
+          }
+        }
+        offset = next;
+      }
+    });
+  },
+
+  add: function(expression, replacement) {
+    if (expression instanceof RegExp) {
+      expression = expression.source;
+    }
+    if (!this[_HASH + expression]) this[_KEYS].push(String(expression));
+    this[_HASH + expression] = new RegGrp.Item(expression, replacement);
+  },
+
+  merge: function(values) {
+    for (var i in values) this.add(i, values[i]);
+  },
+
+  toString: function() {
+    // back references not supported in simple RegGrp
+    return "(" + this[_KEYS].join(")|(") + ")";
+  }
+}, {
+  IGNORE: "$0",
+
+  Item: Base.extend({
+    constructor: function(expression, replacement) {
+      expression = expression instanceof RegExp ? expression.source : String(expression);
+
+      if (typeof replacement == "number") replacement = String(replacement);
+      else if (replacement == null) replacement = "";
+
+      // does the pattern use sub-expressions?
+      if (typeof replacement == "string" && /\$(\d+)/.test(replacement)) {
+        // a simple lookup? (e.g. "$2")
+        if (/^\$\d+$/.test(replacement)) {
+          // store the index (used for fast retrieval of matched strings)
+          replacement = parseInt(replacement.slice(1));
+        } else { // a complicated lookup (e.g. "Hello $2 $1")
+          // build a function to do the lookup
+          var Q = /'/.test(replacement.replace(/\\./g, "")) ? '"' : "'";
+          replacement = replacement.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\$(\d+)/g, Q +
+            "+(arguments[$1]||" + Q+Q + ")+" + Q);
+          replacement = new Function("return " + Q + replacement.replace(/(['"])\1\+(.*)\+\1\1$/, "$1") + Q);
+        }
+      }
+
+      this.length = RegGrp.count(expression);
+      this.replacement = replacement;
+      this.toString = K(expression);
+    }
+  }),
+
+  count: function(expression) {
+    // Count the number of sub-expressions in a RegExp/RegGrp.Item.
+    expression = String(expression).replace(_RG_ESCAPE_CHARS, "").replace(_RG_ESCAPE_BRACKETS, "");
+    return match(expression, _RG_BRACKETS).length;
+  }
+});
+
+// =========================================================================
+// lang/extend.js
+// =========================================================================
+
+function extend(object, source) { // or extend(object, key, value)
+  if (object && source) {
+    var proto = (typeof source == "function" ? Function : Object).prototype;
+    // Add constructor, toString etc
+    var i = _HIDDEN.length, key;
+    if (prototyping) while (key = _HIDDEN[--i]) {
+      var value = source[key];
+      if (value != proto[key]) {
+        if (_BASE.test(value)) {
+          _override(object, key, value)
+        } else {
+          object[key] = value;
+        }
+      }
+    }
+    // Copy each of the source object's properties to the target object.
+    for (key in source) if (proto[key] === undefined) {
+      var value = source[key];
+      // Check for method overriding.
+      if (object[key] && typeof value == "function" && _BASE.test(value)) {
+        _override(object, key, value);
+      } else {
+        object[key] = value;
+      }
+    }
+  }
+  return object;
+};
+
+function _override(object, name, method) {
+  // Override an existing method.
+  var ancestor = object[name];
+  object[name] = function() {
+    var previous = this.base;
+    this.base = ancestor;
+    var returnValue = method.apply(this, arguments);
+    this.base = previous;
+    return returnValue;
+  };
+};
+
+function combine(keys, values) {
+  // Combine two arrays to make a hash.
+  if (!values) values = keys;
+  var hash = {};
+  for (var i in keys) hash[i] = values[i];
+  return hash;
+};
+
+function format(string) {
+  // Replace %n with arguments[n].
+  // e.g. format("%1 %2%3 %2a %1%3", "she", "se", "lls");
+  // ==> "she sells sea shells"
+  // Only %1 - %9 supported.
+  var args = arguments;
+  var _FORMAT = new RegExp("%([1-" + arguments.length + "])", "g");
+  return String(string).replace(_FORMAT, function(match, index) {
+    return index < args.length ? args[index] : match;
+  });
+};
+
+function match(string, expression) {
+  // Same as String.match() except that this function will return an empty
+  // array if there is no match.
+  return String(string).match(expression) || [];
+};
+
+function rescape(string) {
+  // Make a string safe for creating a RegExp.
+  return String(string).replace(_RESCAPE, "\\$1");
+};
+
+// http://blog.stevenlevithan.com/archives/faster-trim-javascript
+function trim(string) {
+  return String(string).replace(_LTRIM, "").replace(_RTRIM, "");
+};
+
+function K(k) {
+  return function() {
+    return k;
+  };
+};
+
+// -----------------------------------------------------------------------
+// parsing
+// -----------------------------------------------------------------------
+
+var Parser = RegGrp.extend({ignoreCase: true});
+
+var ENCODED = /\x01(\d+)/g,
+    QUOTES  = /'/g, 
+    STRING = /^\x01/,
+    UNICODE = /\\([\da-fA-F]{1,4})/g;
+
+var _strings = [];
+
+var encoder = new Parser({
+  // comments
+  "<!\\-\\-|\\-\\->": "",
+  "\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/": "",
+  // get rid
+  "@(namespace|import)[^;\\n]+[;\\n]": "",
+  // strings
+  "'(\\\\.|[^'\\\\])*'": encodeString,
+  '"(\\\\.|[^"\\\\])*"': encodeString,
+  // white space
+  "\\s+": " "
+});
+
+function encode(cssText) {
+  return encoder.exec(cssText);
+};
+
+function decode(cssText) {
+  return cssText.replace(ENCODED, function(match, index) {
+    return _strings[index - 1];
+  });
+};
+
+function encodeString(string) {
+  return "\x01" + _strings.push(string.replace(UNICODE, function(match, chr) {
+    return eval("'\\u" + "0000".slice(chr.length) + chr + "'");
+  }).slice(1, -1).replace(QUOTES, "\\'"));
+};
+
+function getString(value) {
+  return STRING.test(value) ? _strings[value.slice(1) - 1] : value;
+};
+
+// clone a "width" function to create a "height" function
+var rotater = new RegGrp({
+  Width: "Height",
+  width: "height",
+  Left:  "Top",
+  left:  "top",
+  Right: "Bottom",
+  right: "bottom",
+  onX:   "onY"
+});
+
+function rotate(fn) {
+  return rotater.exec(fn);
+};
+
+// -----------------------------------------------------------------------
+// event handling
+// -----------------------------------------------------------------------
+
+var eventHandlers = [];
+
+function addResize(handler) {
+  addRecalc(handler);
+  addEventHandler(window, "onresize", handler);
+};
+
+// add an event handler (function) to an element
+function addEventHandler(element, type, handler) {
+  element.attachEvent(type, handler);
+  // store the handler so it can be detached later
+  eventHandlers.push(arguments);
+};
+
+// remove an event handler assigned to an element by IE7
+function removeEventHandler(element, type, handler) {
+try {
+  element.detachEvent(type, handler);
+} catch (ignore) {
+  // write a letter of complaint to microsoft..
+}};
+
+// remove event handlers (they eat memory)
+addEventHandler(window, "onunload", function() {
+  var handler;
+  while (handler = eventHandlers.pop()) {
+    removeEventHandler(handler[0], handler[1], handler[2]);
+  }
+});
+
+function register(handler, element, condition) { // -@DRE
+  //var set = handler[element.uniqueID];
+  if (!handler.elements) handler.elements = {};
+  if (condition) handler.elements[element.uniqueID] = element;
+  else delete handler.elements[element.uniqueID];
+  //return !set && condition;
+  return condition;
+};
+
+addEventHandler(window, "onbeforeprint", function() {
+  if (!IE7.CSS.print) new StyleSheet("print");
+  IE7.CSS.print.recalc();
+});
+
+// -----------------------------------------------------------------------
+// pixel conversion
+// -----------------------------------------------------------------------
+
+// this is handy because it means that web developers can mix and match
+//  measurement units in their style sheets. it is not uncommon to
+//  express something like padding in "em" units whilst border thickness
+//  is most often expressed in pixels.
+
+var PIXEL = /^\d+(px)?$/i;
+var PERCENT = /^\d+%$/;
+var getPixelValue = function(element, value) {
+  if (PIXEL.test(value)) return parseInt(value);
+  var style = element.style.left;
+  var runtimeStyle = element.runtimeStyle.left;
+  element.runtimeStyle.left = element.currentStyle.left;
+  element.style.left = value || 0;
+  value = element.style.pixelLeft;
+  element.style.left = style;
+  element.runtimeStyle.left = runtimeStyle;
+  return value;
+};
+
+// -----------------------------------------------------------------------
+// generic
+// -----------------------------------------------------------------------
+
+var $IE7 = "ie7-";
+
+var Fix = Base.extend({
+  constructor: function() {
+    this.fixes = [];
+    this.recalcs = [];
+  },
+  init: Undefined
+});
+
+// a store for functions that will be called when refreshing IE7
+var recalcs = [];
+function addRecalc(recalc) {
+  recalcs.push(recalc);
+};
+
+IE7.recalc = function() {
+  IE7.HTML.recalc();
+  // re-apply style sheet rules (re-calculate ie7 classes)
+  IE7.CSS.recalc();
+  // apply global fixes to the document
+  for (var i = 0; i < recalcs.length; i++) recalcs[i]();
+};
+
+function isFixed(element) {
+  return element.currentStyle["ie7-position"] == "fixed";
+};
+
+// original style
+function getDefinedStyle(element, propertyName) {
+  return element.currentStyle[$IE7 + propertyName] || element.currentStyle[propertyName];
+};
+
+function setOverrideStyle(element, propertyName, value) {
+  if (element.currentStyle[$IE7 + propertyName] == null) {
+    element.runtimeStyle[$IE7 + propertyName] = element.currentStyle[propertyName];
+  }
+  element.runtimeStyle[propertyName] = value;
+};
+
+// create a temporary element which is used to inherit styles
+//  from the target element. the temporary element can be resized
+//  to determine pixel widths/heights
+function createTempElement(tagName) {
+  var element = document.createElement(tagName || "object");
+  element.style.cssText = "position:absolute;padding:0;display:block;border:none;clip:rect(0 0 0 0);left:-9999";
+  element.ie7_anon = true;
+  return element;
+};
+
+
+// =========================================================================
+// ie7-cssQuery.js
+// =========================================================================
+
+function cssQuery(selector, context, single) {
+  if (!_cache[selector]) {
+    reg = []; // store for RegExp objects
+    var fn = "";
+    var selectors = cssParser.escape(selector).split(",");
+    for (var i = 0; i < selectors.length; i++) {
+      _wild = _index = _list = 0; // reset
+      _duplicate = selectors.length > 1 ? 2 : 0; // reset
+      var block = cssParser.exec(selectors[i]) || "if(0){";
+      if (_wild) { // IE's pesky comment nodes
+        block += format("if(e%1.nodeName!='!'){", _index);
+      }
+      // check for duplicates before storing results
+      var store = _duplicate > 1 ? _TEST : "";
+      block += format(store + _STORE, _index);
+      // add closing braces
+      block += Array(match(block, /\{/g).length + 1).join("}");
+      fn += block;
+    }
+    eval(format(_FN, reg) + cssParser.unescape(fn) + "return s?null:r}");
+    _cache[selector] = _selectorFunction;
+  }
+  return _cache[selector](context || document, single);
+};
+
+var _MSIE5 = appVersion < 6;
+
+var _EVALUATED = /^(href|src)$/;
+var _ATTRIBUTES = {
+  "class": "className",
+  "for": "htmlFor"
+};
+
+IE7._indexed = 1;
+
+IE7._byId = function(document, id) {
+  var result = document.all[id] || null;
+  // returns a single element or a collection
+  if (!result || result.id == id) return result;
+  // document.all has returned a collection of elements with name/id
+  for (var i = 0; i < result.length; i++) {
+    if (result[i].id == id) return result[i];
+  }
+  return null;
+};
+
+IE7._getAttribute = function(element, name) {
+  if (name == "src" && element.pngSrc) return element.pngSrc;
+  
+  var attribute = _MSIE5 ? (element.attributes[name] || element.attributes[_ATTRIBUTES[name.toLowerCase()]]) : element.getAttributeNode(name);
+  if (attribute && (attribute.specified || name == "value")) {
+    if (_EVALUATED.test(name)) {
+      return element.getAttribute(name, 2);
+    } else if (name == "class") {
+     return element.className.replace(/\sie7_\w+/g, "");
+    } else if (name == "style") {
+     return element.style.cssText;
+    } else {
+     return attribute.nodeValue;
+    }
+  }
+  return null;
+};
+
+var names = "colSpan,rowSpan,vAlign,dateTime,accessKey,tabIndex,encType,maxLength,readOnly,longDesc";
+// Convert the list of strings to a hash, mapping the lowercase name to the camelCase name.
+extend(_ATTRIBUTES, combine(names.toLowerCase().split(","), names.split(",")));
+
+IE7._getNextElementSibling = function(node) {
+  // return the next element to the supplied element
+  //  nextSibling is not good enough as it might return a text or comment node
+  while (node && (node = node.nextSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+IE7._getPreviousElementSibling = function(node) {
+  // return the previous element to the supplied element
+  while (node && (node = node.previousSibling) && (node.nodeType != 1 || node.nodeName == "!")) continue;
+  return node;
+};
+
+// =========================================================================
+// CSSParser
+// =========================================================================
+
+var IMPLIED_ASTERISK = /([\s>+~,]|[^(]\+|^)([#.:\[])/g,
+    IMPLIED_SPACE =    /(^|,)([^\s>+~])/g,
+    WHITESPACE =       /\s*([\s>+~(),]|^|$)\s*/g,
+    WILD_CARD =        /\s\*\s/g;;
+
+var CSSParser = RegGrp.extend({
+  constructor: function(items) {
+    this.base(items);
+    this.sorter = new RegGrp;
+    this.sorter.add(/:not\([^)]*\)/, RegGrp.IGNORE);
+    this.sorter.add(/([ >](\*|[\w-]+))([^: >+~]*)(:\w+-child(\([^)]+\))?)([^: >+~]*)/, "$1$3$6$4");
+  },
+  
+  ignoreCase: true,
+
+  escape: function(selector) {
+    return this.optimise(this.format(selector));
+  },
+
+  format: function(selector) {
+    return selector
+      .replace(WHITESPACE, "$1")
+      .replace(IMPLIED_SPACE, "$1 $2")
+      .replace(IMPLIED_ASTERISK, "$1*$2");
+  },
+
+  optimise: function(selector) {
+    // optimise wild card descendant selectors
+    return this.sorter.exec(selector.replace(WILD_CARD, ">* "));
+  },
+
+  unescape: function(selector) {
+    return decode(selector);
+  }
+});
+
+// some constants
+var _OPERATORS = {
+  "":   "%1!=null",
+  "=":  "%1=='%2'",
+  "~=": /(^| )%1( |$)/,
+  "|=": /^%1(-|$)/,
+  "^=": /^%1/,
+  "$=": /%1$/,
+  "*=": /%1/
+};
+
+var _PSEUDO_CLASSES = {
+  "first-child": "!IE7._getPreviousElementSibling(e%1)",
+  "link":        "e%1.currentStyle['ie7-link']=='link'",
+  "visited":     "e%1.currentStyle['ie7-link']=='visited'"
+};
+
+var _VAR = "var p%2=0,i%2,e%2,n%2=e%1.";
+var _ID = "e%1.sourceIndex";
+var _TEST = "var g=" + _ID + ";if(!p[g]){p[g]=1;";
+var _STORE = "r[r.length]=e%1;if(s)return e%1;";
+var _FN = "var _selectorFunction=function(e0,s){IE7._indexed++;var r=[],p={},reg=[%1],d=document;";
+var reg; // a store for RexExp objects
+var _index;
+var _wild; // need to flag certain _wild card selectors as MSIE includes comment nodes
+var _list; // are we processing a node _list?
+var _duplicate; // possible duplicates?
+var _cache = {}; // store parsed selectors
+
+// a hideous parser
+var cssParser = new CSSParser({
+  " (\\*|[\\w-]+)#([\\w-]+)": function(match, tagName, id) { // descendant selector followed by ID
+    _wild = false;
+    var replacement = "var e%2=IE7._byId(d,'%4');if(e%2&&";
+    if (tagName != "*") replacement += "e%2.nodeName=='%3'&&";
+    replacement += "(e%1==d||e%1.contains(e%2))){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index++, _index, tagName.toUpperCase(), id);
+  },
+  
+  " (\\*|[\\w-]+)": function(match, tagName) { // descendant selector
+    _duplicate++; // this selector may produce duplicates
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // IE5.x does not support getElementsByTagName("*");
+    replacement += (_wild && _MSIE5) ? "all" : "getElementsByTagName('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  ">(\\*|[\\w-]+)": function(match, tagName) { // child selector
+    var children = _list;
+    _wild = tagName == "*";
+    var replacement = _VAR;
+    // use the children property for MSIE as it does not contain text nodes
+    //  (but the children collection still includes comments).
+    // the document object does not have a children collection
+    replacement += children ? "children": "childNodes";
+    if (!_wild && children) replacement += ".tags('%3')";
+    replacement += ";for(i%2=0;(e%2=n%2[i%2]);i%2++){";
+    if (_wild) {
+      replacement += "if(e%2.nodeType==1){";
+      _wild = _MSIE5;
+    } else {
+      if (!children) replacement += "if(e%2.nodeName=='%3'){";
+    }
+    return format(replacement, _index++, _list = _index, tagName.toUpperCase());
+  },
+  
+  "\\+(\\*|[\\w-]+)": function(match, tagName) { // direct adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    replacement += "e%1=IE7._getNextElementSibling(e%1);if(e%1";
+    if (tagName != "*") replacement += "&&e%1.nodeName=='%2'";
+    replacement += "){";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "~(\\*|[\\w-]+)": function(match, tagName) { // indirect adjacent selector
+    var replacement = "";
+    if (_wild) replacement += "if(e%1.nodeName!='!'){";
+    _wild = false;
+    _duplicate = 2; // this selector may produce duplicates
+    replacement += "while(e%1=e%1.nextSibling){if(e%1.ie7_adjacent==IE7._indexed)break;if(";
+    if (tagName == "*") {
+      replacement += "e%1.nodeType==1";
+      if (_MSIE5) replacement += "&&e%1.nodeName!='!'";
+    } else replacement += "e%1.nodeName=='%2'";
+    replacement += "){e%1.ie7_adjacent=IE7._indexed;";
+    return format(replacement, _index, tagName.toUpperCase());
+  },
+  
+  "#([\\w-]+)": function(match, id) { // ID selector
+    _wild = false;
+    var replacement = "if(e%1.id=='%2'){";
+    if (_list) replacement += format("i%1=n%1.length;", _list);
+    return format(replacement, _index, id);
+  },
+  
+  "\\.([\\w-]+)": function(match, className) { // class selector
+    _wild = false;
+    // store RegExp objects - slightly faster on IE
+    reg.push(new RegExp("(^|\\s)" + rescape(className) + "(\\s|$)"));
+    return format("if(e%1.className&&reg[%2].test(e%1.className)){", _index, reg.length - 1);
+  },
+  
+  "\\[([\\w-]+)\\s*([^=]?=)?\\s*([^\\]]*)\\]": function(match, attr, operator, value) { // attribute selectors
+    var alias = _ATTRIBUTES[attr] || attr;
+    if (operator) {
+      var getAttribute = "e%1.getAttribute('%2',2)";
+      if (!_EVALUATED.test(attr)) {
+        getAttribute = "e%1.%3||" + getAttribute;
+      }
+      attr = format("(" + getAttribute + ")", _index, attr, alias);
+    } else {
+      attr = format("IE7._getAttribute(e%1,'%2')", _index, attr);
+    }
+    var replacement = _OPERATORS[operator || ""] || "0";
+    if (replacement && replacement.source) {
+      reg.push(new RegExp(format(replacement.source, rescape(cssParser.unescape(value)))));
+      replacement = "reg[%2].test(%1)";
+      value = reg.length - 1;
+    }
+    return "if(" + format(replacement, attr, value) + "){";
+  },
+  
+  ":+([\\w-]+)(\\(([^)]+)\\))?": function(match, pseudoClass, $2, args) { // pseudo class selectors
+    pseudoClass = _PSEUDO_CLASSES[pseudoClass];
+    return "if(" + (pseudoClass ? format(pseudoClass, _index, args || "")  : "0") + "){";
+  }
+});
+
+// =========================================================================
+// ie7-css.js
+// =========================================================================
+
+var HYPERLINK = /a(#[\w-]+)?(\.[\w-]+)?:(hover|active)/i;
+var BRACE1 = /\s*\{\s*/, BRACE2 = /\s*\}\s*/, COMMA = /\s*\,\s*/;
+var FIRST_LINE_LETTER = /(.*)(:first-(line|letter))/;
+
+//var UNKNOWN = /UNKNOWN|([:.])\w+\1/i;
+
+var styleSheets = document.styleSheets;
+
+IE7.CSS = new (Fix.extend({ // single instance
+  parser: new Parser,
+  screen: "",
+  print: "",
+  styles: [],
+  rules: [],
+  pseudoClasses: appVersion < 7 ? "first\\-child" : "",
+  dynamicPseudoClasses: {
+    toString: function() {
+      var strings = [];
+      for (var pseudoClass in this) strings.push(pseudoClass);
+      return strings.join("|");
+    }
+  },
+  
+  init: function() {
+    var NONE = "^\x01$";
+    var CLASS = "\\[class=?[^\\]]*\\]";
+    var pseudoClasses = [];
+    if (this.pseudoClasses) pseudoClasses.push(this.pseudoClasses);
+    var dynamicPseudoClasses = this.dynamicPseudoClasses.toString(); 
+    if (dynamicPseudoClasses) pseudoClasses.push(dynamicPseudoClasses);
+    pseudoClasses = pseudoClasses.join("|");
+    var unknown = appVersion < 7 ? ["[>+~[(]|([:.])\\w+\\1"] : [CLASS];
+    if (pseudoClasses) unknown.push(":(" + pseudoClasses + ")");
+    this.UNKNOWN = new RegExp(unknown.join("|") || NONE, "i");
+    var complex = appVersion < 7 ? ["\\[[^\\]]+\\]|[^\\s(\\[]+\\s*[+~]"] : [CLASS];
+    var complexRule = complex.concat();
+    if (pseudoClasses) complexRule.push(":(" + pseudoClasses + ")");
+    Rule.COMPLEX = new RegExp(complexRule.join("|") || NONE, "ig");
+    if (this.pseudoClasses) complex.push(":(" + this.pseudoClasses + ")");
+    DynamicRule.COMPLEX = new RegExp(complex.join("|") || NONE, "i");
+    DynamicRule.MATCH = new RegExp(dynamicPseudoClasses ? "(.*):(" + dynamicPseudoClasses + ")(.*)" : NONE, "i");
+    
+    this.createStyleSheet();
+    this.refresh();
+  },
+  
+	addEventHandler: function() {
+		addEventHandler.apply(null, arguments);
+	},
+  
+  addFix: function(expression, replacement) {
+    this.parser.add(expression, replacement);
+  },
+  
+  addRecalc: function(propertyName, test, handler, replacement) {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    test = new RegExp("([{;\\s])" + propertyName + "\\s*:\\s*" + test + "[^;}]*");
+    var id = this.recalcs.length;
+    if (replacement) replacement = propertyName + ":" + replacement;
+    this.addFix(test, function(match, $1) {
+      return (replacement ? $1 + replacement : match) + ";ie7-" + match.slice(1) + ";ie7_recalc" + id + ":1";
+    });
+    this.recalcs.push(arguments);
+    return id;
+  },
+  
+  apply: function() {
+    this.getInlineStyles();
+    new StyleSheet("screen");
+    this.trash();
+  },
+  
+  createStyleSheet: function() {
+    // create the IE7 style sheet
+    this.styleSheet = document.createStyleSheet();
+    // flag it so we can ignore it during parsing
+    this.styleSheet.ie7 = true;
+    this.styleSheet.owningElement.ie7 = true;
+    this.styleSheet.cssText = HEADER;
+  },
+  
+  getInlineStyles: function() {
+    // load inline styles
+    var styleSheets = document.getElementsByTagName("style"), styleSheet;
+    for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) {
+      if (!styleSheet.disabled && !styleSheet.ie7) {
+        this.styles.push(styleSheet.innerHTML);
+      }
+    }
+  },
+  
+  getText: function(styleSheet, path) {
+    // explorer will trash unknown selectors (it converts them to "UNKNOWN").
+    // so we must reload external style sheets (internal style sheets can have their text
+    //  extracted through the innerHTML property).
+      // load the style sheet text from an external file
+    try {
+      var cssText = styleSheet.cssText;
+    } catch (e) {
+      cssText = "";
+    }
+    if (httpRequest) cssText = loadFile(styleSheet.href, path) || cssText;
+    return cssText;
+  },
+  
+  recalc: function() {
+    this.screen.recalc();
+    // we're going to read through all style rules.
+    //  certain rules have had ie7 properties added to them.
+    //   e.g. p{top:0; ie7_recalc2:1; left:0}
+    //  this flags a property in the rule as needing a fix.
+    //  the selector text is then used to query the document.
+    //  we can then loop through the results of the query
+    //  and fix the elements.
+    // we ignore the IE7 rules - so count them in the header
+    var RECALCS = /ie7_recalc\d+/g;
+    var start = HEADER.match(/[{,]/g).length;
+    // only calculate screen fixes. print fixes don't show up anyway
+    var stop = start + (this.screen.cssText.match(/\{/g)||"").length;
+    var rules = this.styleSheet.rules, rule;
+    var calcs, calc, elements, element, i, j, k, id;
+    // loop through all rules
+    for (i = start; i < stop; i++) {
+      rule = rules[i];
+      var cssText = rule.style.cssText;
+      // search for the "ie7_recalc" flag (there may be more than one)
+      if (rule && (calcs = cssText.match(RECALCS))) {
+        // use the selector text to query the document
+        elements = cssQuery(rule.selectorText);
+        // if there are matching elements then loop
+        //  through the recalc functions and apply them
+        //  to each element
+        if (elements.length) for (j = 0; j < calcs.length; j++) {
+          // get the matching flag (e.g. ie7_recalc3)
+          id = calcs[j];
+          // extract the numeric id from the end of the flag
+          //  and use it to index the collection of recalc
+          //  functions
+          calc = IE7.CSS.recalcs[id.slice(10)][2];
+          for (k = 0; (element = elements[k]); k++) {
+            // apply the fix
+            if (element.currentStyle[id]) calc(element, cssText);
+          }
+        }
+      }
+    }
+  },
+  
+  refresh: function() {
+    this.styleSheet.cssText = HEADER + this.screen + this.print;
+  },
+  
+  trash: function() {
+    // trash the old style sheets
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].ie7) {
+        try {
+          var cssText = styleSheets[i].cssText;
+        } catch (e) {
+          cssText = "";
+        }
+        if (cssText) styleSheets[i].cssText = "";
+      }
+    }
+  }
+}));
+
+// -----------------------------------------------------------------------
+//  IE7 StyleSheet class
+// -----------------------------------------------------------------------
+
+var StyleSheet = Base.extend({
+  constructor: function(media) {
+    this.media = media;
+    this.load();
+    IE7.CSS[media] = this;
+    IE7.CSS.refresh();
+  },
+  
+  createRule: function(selector, cssText) {
+    if (IE7.CSS.UNKNOWN.test(selector)) {
+      var match;
+      if (PseudoElement && (match = selector.match(PseudoElement.MATCH))) {
+        return new PseudoElement(match[1], match[2], cssText);
+      } else if (match = selector.match(DynamicRule.MATCH)) {
+        if (!HYPERLINK.test(match[0]) || DynamicRule.COMPLEX.test(match[0])) {
+          return new DynamicRule(selector, match[1], match[2], match[3], cssText);
+        }
+      } else return new Rule(selector, cssText);
+    }
+    return selector + " {" + cssText + "}";
+  },
+  
+  getText: function() {
+    // store for style sheet text
+    var _inlineStyles = [].concat(IE7.CSS.styles);
+    // parse media decalarations
+    var MEDIA = /@media\s+([^{]*)\{([^@]+\})\s*\}/gi;
+    var ALL = /\ball\b|^$/i, SCREEN = /\bscreen\b/i, PRINT = /\bprint\b/i;
+    function _parseMedia(cssText, media) {
+      _filterMedia.value = media;
+      return cssText.replace(MEDIA, _filterMedia);
+    };
+    function _filterMedia(match, media, cssText) {
+      media = _simpleMedia(media);
+      switch (media) {
+        case "screen":
+        case "print":
+          if (media != _filterMedia.value) return "";
+        case "all":
+          return cssText;
+      }
+      return "";
+    };
+    function _simpleMedia(media) {
+      if (ALL.test(media)) return "all";
+      else if (SCREEN.test(media)) return (PRINT.test(media)) ? "all" : "screen";
+      else if (PRINT.test(media)) return "print";
+    };
+    var self = this;
+    function _getCSSText(styleSheet, path, media, level) {
+      var cssText = "";
+      if (!level) {
+        media = _simpleMedia(styleSheet.media);
+        level = 0;
+      }
+      if (media == "all" || media == self.media) {
+        // IE only allows importing style sheets three levels deep.
+        // it will crash if you try to access a level below this
+        if (level < 3) {
+          // loop through imported style sheets
+          for (var i = 0; i < styleSheet.imports.length; i++) {
+            // call this function recursively to get all imported style sheets
+            cssText += _getCSSText(styleSheet.imports[i], getPath(styleSheet.href, path), media, level + 1);
+          }
+        }
+        // retrieve inline style or load an external style sheet
+        cssText += encode(styleSheet.href ? _loadStyleSheet(styleSheet, path) : _inlineStyles.pop() || "");
+        cssText = _parseMedia(cssText, self.media);
+      }
+      return cssText;
+    };
+    // store loaded cssText URLs
+    var fileCache = {};
+    // load an external style sheet
+    function _loadStyleSheet(styleSheet, path) {
+      var url = makePath(styleSheet.href, path);
+      // if the style sheet has already loaded then don't duplicate it
+      if (fileCache[url]) return "";
+      // load from source
+      fileCache[url] = (styleSheet.disabled) ? "" :
+        _fixUrls(IE7.CSS.getText(styleSheet, path), getPath(styleSheet.href, path));
+      return fileCache[url];
+    };
+    // fix css paths
+    // we're lumping all css text into one big style sheet so relative
+    //  paths have to be fixed. this is necessary anyway because of other
+    //  explorer bugs.
+    var URL = /(url\s*\(\s*['"]?)([\w\.]+[^:\)]*['"]?\))/gi;
+    function _fixUrls(cssText, pathname) {
+      // hack & slash
+      return cssText.replace(URL, "$1" + pathname.slice(0, pathname.lastIndexOf("/") + 1) + "$2");
+    };
+
+    // load all style sheets in the document
+    for (var i = 0; i < styleSheets.length; i++) {
+      if (!styleSheets[i].disabled && !styleSheets[i].ie7) {
+        this.cssText += _getCSSText(styleSheets[i]);
+      }
+    }
+  },
+  
+  load: function() {
+    this.cssText = "";
+    this.getText();
+    this.parse();
+    this.cssText = decode(this.cssText);
+    fileCache = {};
+  },
+  
+  parse: function() {
+    this.cssText = IE7.CSS.parser.exec(this.cssText);
+    
+    // parse the style sheet
+    var offset = IE7.CSS.rules.length;
+    var rules = this.cssText.split(BRACE2), rule;
+    var selectors, cssText, i, j;
+    for (i = 0; i < rules.length; i++) {
+      rule = rules[i].split(BRACE1);
+      selectors = rule[0].split(COMMA);
+      cssText = rule[1];
+      for (j = 0; j < selectors.length; j++) {
+        selectors[j] = cssText ? this.createRule(selectors[j], cssText) : "";
+      }
+      rules[i] = selectors.join("\n");
+    }
+    this.cssText = rules.join("\n");
+    this.rules = IE7.CSS.rules.slice(offset);
+  },
+  
+  recalc: function() {
+    var rule, i;
+    for (i = 0; (rule = this.rules[i]); i++) rule.recalc();
+  },
+  
+  toString: function() {
+    return "@media " + this.media + "{" + this.cssText + "}";
+  }
+});
+
+var PseudoElement;
+
+// -----------------------------------------------------------------------
+// IE7 style rules
+// -----------------------------------------------------------------------
+
+var Rule = IE7.Rule = Base.extend({
+  // properties
+  constructor: function(selector, cssText) {
+    this.id = IE7.CSS.rules.length;
+    this.className = Rule.PREFIX + this.id;
+    selector = selector.match(FIRST_LINE_LETTER) || selector || "*";
+    this.selector = selector[1] || selector;
+    this.selectorText = this.parse(this.selector) + (selector[2] || "");
+    this.cssText = cssText;
+    this.MATCH = new RegExp("\\s" + this.className + "(\\s|$)", "g");
+    IE7.CSS.rules.push(this);
+    this.init();
+  },
+  
+  init: Undefined,
+  
+  add: function(element) {
+    // allocate this class
+    element.className += " " + this.className;
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var match = cssQuery(this.selector);
+    // add the class name for all matching elements
+    for (var i = 0; i < match.length; i++) this.add(match[i]);
+  },
+
+  parse: function(selector) {
+    // attempt to preserve specificity for "loose" parsing by
+    //  removing unknown tokens from a css selector but keep as
+    //  much as we can..
+    var simple = selector.replace(Rule.CHILD, " ").replace(Rule.COMPLEX, "");
+    if (appVersion < 7) simple = simple.replace(Rule.MULTI, "");
+    var tags = match(simple, Rule.TAGS).length - match(selector, Rule.TAGS).length;
+    var classes = match(simple, Rule.CLASSES).length - match(selector, Rule.CLASSES).length + 1;
+    while (classes > 0 && Rule.CLASS.test(simple)) {
+      simple = simple.replace(Rule.CLASS, "");
+      classes--;
+    }
+    while (tags > 0 && Rule.TAG.test(simple)) {
+      simple = simple.replace(Rule.TAG, "$1*");
+      tags--;
+    }
+    simple += "." + this.className;
+    classes = Math.min(classes, 2);
+    tags = Math.min(tags, 2);
+    var score = -10 * classes - tags;
+    if (score > 0) {
+      simple = simple + "," + Rule.MAP[score] + " " + simple;
+    }
+    return simple;
+  },
+  
+  remove: function(element) {
+    // deallocate this class
+    element.className = element.className.replace(this.MATCH, "$1");
+  },
+  
+  toString: function() {
+    return format("%1 {%2}", this.selectorText, this.cssText);
+  }
+}, {
+  CHILD: />/g,
+  CLASS: /\.[\w-]+/,
+  CLASSES: /[.:\[]/g,
+  MULTI: /(\.[\w-]+)+/g,
+  PREFIX: "ie7_class",
+  TAG: /^\w+|([\s>+~])\w+/,
+  TAGS: /^\w|[\s>+~]\w/g,
+  MAP: {
+    1:  "html",
+    2:  "html body",
+    10: ".ie7_html",
+    11: "html.ie7_html",
+    12: "html.ie7_html body",
+    20: ".ie7_html .ie7_body",
+    21: "html.ie7_html .ie7_body",
+    22: "html.ie7_html body.ie7_body"
+  }
+});
+
+// -----------------------------------------------------------------------
+// IE7 dynamic style
+// -----------------------------------------------------------------------
+
+// object properties:
+// attach: the element that an event handler will be attached to
+// target: the element that will have the IE7 class applied
+
+var DynamicRule = Rule.extend({
+  // properties
+  constructor: function(selector, attach, dynamicPseudoClass, target, cssText) {
+    // initialise object properties
+    this.attach = attach || "*";
+    this.dynamicPseudoClass = IE7.CSS.dynamicPseudoClasses[dynamicPseudoClass];
+    this.target = target;
+    this.base(selector, cssText);
+  },
+  
+  recalc: function() {
+    // execute the underlying css query for this class
+    var attaches = cssQuery(this.attach), attach;
+    // process results
+    for (var i = 0; attach = attaches[i]; i++) {
+      // retrieve the event handler's target element(s)
+      var target = this.target ? cssQuery(this.target, attach) : [attach];
+      // attach event handlers for dynamic pseudo-classes
+      if (target.length) this.dynamicPseudoClass.apply(attach, target, this);
+    }
+  }
+});
+
+// -----------------------------------------------------------------------
+//  IE7 dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+var DynamicPseudoClass = Base.extend({
+  constructor: function(name, apply) {
+    this.name = name;
+    this.apply = apply;
+    this.instances = {};
+    IE7.CSS.dynamicPseudoClasses[name] = this;
+  },
+  
+  register: function(instance) {
+    // an "instance" is actually an Arguments object
+    var _class = instance[2];
+    instance.id = _class.id + instance[0].uniqueID;
+    if (!this.instances[instance.id]) {
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.add(target[j]);
+      this.instances[instance.id] = instance;
+    }
+  },
+  
+  unregister: function(instance) {
+    if (this.instances[instance.id]) {
+      var _class = instance[2];
+      var target = instance[1], j;
+      for (j = 0; j < target.length; j++) _class.remove(target[j]);
+      delete this.instances[instance.id];
+    }
+  }
+});
+  
+// -----------------------------------------------------------------------
+// dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+if (appVersion < 7) {
+  var Hover = new DynamicPseudoClass("hover", function(element) {
+    var instance = arguments;
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseover" : "onmouseenter", function() {
+      Hover.register(instance);
+    });
+    IE7.CSS.addEventHandler(element, appVersion < 5.5 ? "onmouseout" : "onmouseleave", function() {
+      Hover.unregister(instance);
+    });
+  });
+  
+  // globally trap the mouseup event (thanks Martijn!)
+  addEventHandler(document, "onmouseup", function() {
+    var instances = Hover.instances;
+    for (var i in instances)
+      if (!instances[i][0].contains(event.srcElement))
+        Hover.unregister(instances[i]);
+  });
+}
+
+// -----------------------------------------------------------------------
+// propertyName: inherit;
+// -----------------------------------------------------------------------
+
+IE7.CSS.addRecalc("[\\w-]+", "inherit", function(element, cssText) {
+  var inherited = cssText.match(/[\w-]+\s*:\s*inherit/g);
+  for (var i = 0; i < inherited.length; i++) {
+    var propertyName = inherited[i].replace(/ie7\-|\s*:\s*inherit/g, "").replace(/\-([a-z])/g, function(match, chr) {
+      return chr.toUpperCase()
+    });
+    element.runtimeStyle[propertyName] = element.parentElement.currentStyle[propertyName];
+  }
+});
+
+// =========================================================================
+// ie7-html.js
+// =========================================================================
+
+// default font-sizes
+//HEADER += "h1{font-size:2em}h2{font-size:1.5em;}h3{font-size:1.17em;}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.67em}";
+
+IE7.HTML = new (Fix.extend({ // single instance  
+  fixed: {},
+  
+  init: Undefined,
+  
+  addFix: function() {
+    // fixes are a one-off, they are applied when the document is loaded
+    this.fixes.push(arguments);
+  },
+  
+  apply: function() {
+    for (var i = 0; i < this.fixes.length; i++) {
+      var match = cssQuery(this.fixes[i][0]);
+      var fix = this.fixes[i][1];
+      for (var j = 0; j < match.length; j++) fix(match[j]);
+    }
+  },
+  
+  addRecalc: function() {
+    // recalcs occur whenever the document is refreshed using document.recalc()
+    this.recalcs.push(arguments);
+  },
+  
+  recalc: function() {
+    // loop through the fixes
+    for (var i = 0; i < this.recalcs.length; i++) {
+      var match = cssQuery(this.recalcs[i][0]);
+      var recalc = this.recalcs[i][1], element;
+      var key = Math.pow(2, i);
+      for (var j = 0; (element = match[j]); j++) {
+        var uniqueID = element.uniqueID;
+        if ((this.fixed[uniqueID] & key) == 0) {
+          element = recalc(element) || element;
+          this.fixed[uniqueID] |= key;
+        }
+      }
+    }
+  }
+}));
+
+if (appVersion < 7) {  
+  // provide support for the <abbr> tag.
+  //  this is a proper fix, it preserves the DOM structure and
+  //  <abbr> elements report the correct tagName & namespace prefix
+  document.createElement("abbr");
+  
+  // bind to the first child control
+  IE7.HTML.addRecalc("label", function(label) {
+    if (!label.htmlFor) {
+      var firstChildControl = cssQuery("input,textarea", label, true);
+      if (firstChildControl) {
+        addEventHandler(label, "onclick", function() {
+          firstChildControl.click();
+        });
+      }
+    }
+  });
+}
+
+// =========================================================================
+// ie7-layout.js
+// =========================================================================
+
+var NUMERIC = "[.\\d]";
+
+new function(_) {
+var layout = IE7.Layout = this;
+
+  // big, ugly box-model hack + min/max stuff
+  
+  // #tantek > #erik > #dean { voice-family: hacker; }
+  
+  // -----------------------------------------------------------------------
+  // "layout"
+  // -----------------------------------------------------------------------
+  
+  HEADER += "*{boxSizing:content-box}";
+  
+  // does an element have "layout" ?
+  IE7.hasLayout = appVersion < 5.5 ? function(element) {
+    // element.currentStyle.hasLayout doesn't work for IE5.0
+    return element.clientWidth;
+  } : function(element) {
+    return element.currentStyle.hasLayout;
+  };
+  
+  // give an element "layout"
+  layout.boxSizing = function(element) {
+    if (!IE7.hasLayout(element)) {
+    //#  element.runtimeStyle.fixedHeight =
+      element.style.height = "0cm";
+      if (element.currentStyle.verticalAlign == "auto")
+        element.runtimeStyle.verticalAlign = "top";
+      // when an element acquires "layout", margins no longer collapse correctly
+      collapseMargins(element);
+    }
+  };
+  
+  // -----------------------------------------------------------------------
+  // Margin Collapse
+  // -----------------------------------------------------------------------
+  
+  function collapseMargins(element) {
+    if (element != viewport && element.currentStyle.position != "absolute") {
+      collapseMargin(element, "marginTop");
+      collapseMargin(element, "marginBottom");
+    }
+  };
+  
+  function collapseMargin(element, type) {
+    if (!element.runtimeStyle[type]) {
+      var parentElement = element.parentElement;
+      if (parentElement && IE7.hasLayout(parentElement) && !IE7[type == "marginTop" ? "_getPreviousElementSibling" : "_getNextElementSibling"](element)) return;
+      var child = cssQuery(">*:" + (type == "marginTop" ? "first" : "last") + "-child", element, true);
+      if (child && child.currentStyle.styleFloat == "none" && IE7.hasLayout(child)) {
+        collapseMargin(child, type);
+        margin = _getMargin(element, element.currentStyle[type]);
+        childMargin = _getMargin(child, child.currentStyle[type]);
+        if (margin < 0 || childMargin < 0) {
+          element.runtimeStyle[type] = margin + childMargin;
+        } else {
+          element.runtimeStyle[type] = Math.max(childMargin, margin);
+        }
+        child.runtimeStyle[type] = "0px";
+      }
+    }
+  };
+  
+  function _getMargin(element, value) {
+    return value == "auto" ? 0 : getPixelValue(element, value);
+  };
+  
+  // -----------------------------------------------------------------------
+  // box-model
+  // -----------------------------------------------------------------------
+  
+  // constants
+  var UNIT = /^[.\d][\w%]*$/, AUTO = /^(auto|0cm)$/;
+  
+  var applyWidth, applyHeight;
+  IE7.Layout.borderBox = function(element){
+    applyWidth(element);
+    applyHeight(element);
+  };
+  
+  var fixWidth = function(HEIGHT) {
+    applyWidth = function(element) {
+      if (!PERCENT.test(element.currentStyle.width)) fixWidth(element);
+      collapseMargins(element);
+    };
+  
+    function fixWidth(element, value) {
+      if (!element.runtimeStyle.fixedWidth) {
+        if (!value) value = element.currentStyle.width;
+        element.runtimeStyle.fixedWidth = (UNIT.test(value)) ? Math.max(0, getFixedWidth(element, value)) : value;
+        setOverrideStyle(element, "width", element.runtimeStyle.fixedWidth);
+      }
+    };
+  
+    function layoutWidth(element) {
+      if (!isFixed(element)) {
+        var layoutParent = element.offsetParent;
+        while (layoutParent && !IE7.hasLayout(layoutParent)) layoutParent = layoutParent.offsetParent;
+      }
+      return (layoutParent || viewport).clientWidth;
+    };
+  
+    function getPixelWidth(element, value) {
+      if (PERCENT.test(value)) return parseInt(parseFloat(value) / 100 * layoutWidth(element));
+      return getPixelValue(element, value);
+    };
+  
+    var getFixedWidth = function(element, value) {
+      var borderBox = element.currentStyle["box-sizing"] == "border-box";
+      var adjustment = 0;
+      if (quirksMode && !borderBox)
+        adjustment += getBorderWidth(element) + getWidth(element, "padding");
+      else if (!quirksMode && borderBox)
+        adjustment -= getBorderWidth(element) + getWidth(element, "padding");
+      return getPixelWidth(element, value) + adjustment;
+    };
+  
+    // easy way to get border thickness for elements with "layout"
+    function getBorderWidth(element) {
+      return element.offsetWidth - element.clientWidth;
+    };
+  
+    // have to do some pixel conversion to get padding/margin thickness :-(
+    function getWidth(element, type) {
+      return getPixelWidth(element, element.currentStyle[type + "Left"]) + getPixelWidth(element, element.currentStyle[type + "Right"]);
+    };
+  
+    // -----------------------------------------------------------------------
+    // min/max
+    // -----------------------------------------------------------------------
+  
+    HEADER += "*{minWidth:none;maxWidth:none;min-width:none;max-width:none}";
+  
+    // handle min-width property
+    layout.minWidth = function(element) {
+      // IE6 supports min-height so we frig it here
+      //#if (element.currentStyle.minHeight == "auto") element.runtimeStyle.minHeight = 0;
+      if (element.currentStyle["min-width"] != null) {
+        element.style.minWidth = element.currentStyle["min-width"];
+      }
+      if (register(arguments.callee, element, element.currentStyle.minWidth != "none")) {
+        layout.boxSizing(element);
+        fixWidth(element);
+        resizeWidth(element);
+      }
+    };
+    
+    // clone the minWidth function to make a maxWidth function
+    eval("IE7.Layout.maxWidth=" + String(layout.minWidth).replace(/min/g, "max"));
+    
+    // apply min/max restrictions
+    function resizeWidth(element) {
+      // check boundaries
+      var rect = element.getBoundingClientRect();
+      var width = rect.right - rect.left;
+  
+      if (element.currentStyle.minWidth != "none" && width <= getFixedWidth(element, element.currentStyle.minWidth)) {
+        element.runtimeStyle.width = element.currentStyle.minWidth;
+      } else if (element.currentStyle.maxWidth != "none" && width >= getFixedWidth(element, element.currentStyle.maxWidth)) {
+        element.runtimeStyle.width = element.currentStyle.maxWidth;
+      } else {
+        element.runtimeStyle.width = element.runtimeStyle.fixedWidth; // || "auto";
+      }
+    };
+  
+    // -----------------------------------------------------------------------
+    // right/bottom
+    // -----------------------------------------------------------------------
+  
+    function fixRight(element) {
+      if (register(fixRight, element, /^(fixed|absolute)$/.test(element.currentStyle.position) &&
+        getDefinedStyle(element, "left") != "auto" &&
+        getDefinedStyle(element, "right") != "auto" &&
+        AUTO.test(getDefinedStyle(element, "width")))) {
+          resizeRight(element);
+          IE7.Layout.boxSizing(element);
+      }
+    };
+    IE7.Layout.fixRight = fixRight;
+  
+    function resizeRight(element) {
+      var left = getPixelWidth(element, element.runtimeStyle._left || element.currentStyle.left);
+      var width = layoutWidth(element) - getPixelWidth(element, element.currentStyle.right) -  left - getWidth(element, "margin");
+      if (parseInt(element.runtimeStyle.width) == width) return;
+      element.runtimeStyle.width = "";
+      if (isFixed(element) || HEIGHT || element.offsetWidth < width) {
+        if (!quirksMode) width -= getBorderWidth(element) + getWidth(element, "padding");
+        if (width < 0) width = 0;
+        element.runtimeStyle.fixedWidth = width;
+        setOverrideStyle(element, "width", width);
+      }
+    };
+  
+  // -----------------------------------------------------------------------
+  // window.onresize
+  // -----------------------------------------------------------------------
+  
+    // handle window resize
+    var clientWidth = 0;
+    addResize(function() {
+      if (!viewport) return;
+      var i, wider = (clientWidth < viewport.clientWidth);
+      clientWidth = viewport.clientWidth;
+      // resize elements with "min-width" set
+      var elements = layout.minWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.minWidth));
+        if (wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider == fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "max-width" set
+      var elements = layout.maxWidth.elements;
+      for (i in elements) {
+        var element = elements[i];
+        var fixedWidth = (parseInt(element.runtimeStyle.width) == getFixedWidth(element, element.currentStyle.maxWidth));
+        if (!wider && fixedWidth) element.runtimeStyle.width = "";
+        if (wider != fixedWidth) resizeWidth(element);
+      }
+      // resize elements with "right" set
+      for (i in fixRight.elements) resizeRight(fixRight.elements[i]);
+    });
+  
+  // -----------------------------------------------------------------------
+  // fix CSS
+  // -----------------------------------------------------------------------
+    if (quirksMode) {
+      IE7.CSS.addRecalc("width", NUMERIC, applyWidth);
+    }
+    if (appVersion < 7) {
+      IE7.CSS.addRecalc("min-width", NUMERIC, layout.minWidth);
+      IE7.CSS.addRecalc("max-width", NUMERIC, layout.maxWidth);
+      IE7.CSS.addRecalc("right", NUMERIC, fixRight);
+    }
+  };
+  
+  eval("var fixHeight=" + rotate(fixWidth));
+  
+  // apply box-model + min/max fixes
+  fixWidth();
+  fixHeight(true);
+};
+
+// =========================================================================
+// ie7-graphics.js
+// =========================================================================
+
+// a small transparent image used as a placeholder
+var BLANK_GIF = makePath("blank.gif", path);
+
+var ALPHA_IMAGE_LOADER = "DXImageTransform.Microsoft.AlphaImageLoader";
+var PNG_FILTER = "progid:" + ALPHA_IMAGE_LOADER + "(src='%1',sizingMethod='%2')";
+  
+// regular expression version of the above
+var PNG;
+
+var filtered = [];
+
+function fixImage(element) {
+  if (PNG.test(element.src)) {
+    // we have to preserve width and height
+    var image = new Image(element.width, element.height);
+    image.onload = function() {
+      element.width = image.width;
+      element.height = image.height;
+      image = null;
+    };
+    image.src = element.src;
+    // store the original url (we'll put it back when it's printed)
+    element.pngSrc = element.src;
+    // add the AlphaImageLoader thingy
+    addFilter(element);
+  }
+};
+
+if (appVersion >= 5.5 && appVersion < 7) {
+  // ** IE7 VARIABLE
+  // e.g. only apply the hack to files ending in ".png"
+  // IE7_PNG_SUFFIX = ".png";
+
+  // replace background(-image): url(..) ..  with background(-image): .. ;filter: ..;
+  IE7.CSS.addFix(/background(-image)?\s*:\s*([^};]*)?url\(([^\)]+)\)([^;}]*)?/, function(match, $1, $2, url, $4) {
+    url = getString(url);
+    return PNG.test(url) ? "filter:" + format(PNG_FILTER, url, "crop") +
+      ";zoom:1;background" + ($1||"") + ":" + ($2||"") + "none" + ($4||"") : match;
+  });
+  
+  // -----------------------------------------------------------------------
+  //  fix PNG transparency (HTML images)
+  // -----------------------------------------------------------------------
+
+  IE7.HTML.addRecalc("img,input", function(element) {
+    if (element.tagName == "INPUT" && element.type != "image") return;
+    fixImage(element);
+    addEventHandler(element, "onpropertychange", function() {
+      if (!printing && event.propertyName == "src" &&
+        element.src.indexOf(BLANK_GIF) == -1) fixImage(element);
+    });
+  });
+
+  // assume that background images should not be printed
+  //  (if they are not transparent then they'll just obscure content)
+  // but we'll put foreground images back...
+  var printing = false;
+  addEventHandler(window, "onbeforeprint", function() {
+    printing = true;
+    for (var i = 0; i < filtered.length; i++) removeFilter(filtered[i]);
+  });
+  addEventHandler(window, "onafterprint", function() {
+    for (var i = 0; i < filtered.length; i++) addFilter(filtered[i]);
+    printing = false;
+  });
+}
+
+// apply a filter
+function addFilter(element, sizingMethod) {
+  var filter = element.filters[ALPHA_IMAGE_LOADER];
+  if (filter) {
+    filter.src = element.src;
+    filter.enabled = true;
+  } else {
+    element.runtimeStyle.filter = format(PNG_FILTER, element.src, sizingMethod || "scale");
+    filtered.push(element);
+  }
+  // remove the real image
+  element.src = BLANK_GIF;
+};
+
+function removeFilter(element) {
+  element.src = element.pngSrc;
+  element.filters[ALPHA_IMAGE_LOADER].enabled = false;
+};
+
+// =========================================================================
+// ie7-fixed.js
+// =========================================================================
+
+new function(_) {
+  if (appVersion >= 7) return;
+  
+  // some things to consider for this hack.
+  // the document body requires a fixed background. even if
+  //  it is just a blank image.
+  // you have to use setExpression instead of onscroll, this
+  //  together with a fixed body background helps avoid the
+  //  annoying screen flicker of other solutions.
+  
+  IE7.CSS.addRecalc("position", "fixed", _positionFixed, "absolute");
+  IE7.CSS.addRecalc("background(-attachment)?", "[^};]*fixed", _backgroundFixed);
+  
+  // scrolling is relative to the documentElement (HTML tag) when in
+  //  standards mode, otherwise it's relative to the document body
+  var $viewport = quirksMode ? "body" : "documentElement";
+  
+  function _fixBackground() {
+    // this is required by both position:fixed and background-attachment:fixed.
+    // it is necessary for the document to also have a fixed background image.
+    // we can fake this with a blank image if necessary
+    if (body.currentStyle.backgroundAttachment != "fixed") {
+      if (body.currentStyle.backgroundImage == "none") {
+        body.runtimeStyle.backgroundRepeat = "no-repeat";
+        body.runtimeStyle.backgroundImage = "url(" + BLANK_GIF + ")"; // dummy
+      }
+      body.runtimeStyle.backgroundAttachment = "fixed";
+    }
+    _fixBackground = Undefined;
+  };
+  
+  var _tmp = createTempElement("img");
+  
+  function _isFixed(element) {
+    return element ? isFixed(element) || _isFixed(element.parentElement) : false;
+  };
+  
+  function _setExpression(element, propertyName, expression) {
+    setTimeout("document.all." + element.uniqueID + ".runtimeStyle.setExpression('" + propertyName + "','" + expression + "')", 0);
+  };
+  
+  // -----------------------------------------------------------------------
+  //  backgroundAttachment: fixed
+  // -----------------------------------------------------------------------
+  
+  function _backgroundFixed(element) {
+    if (register(_backgroundFixed, element, element.currentStyle.backgroundAttachment == "fixed" && !element.contains(body))) {
+      _fixBackground();
+      bgLeft(element);
+      bgTop(element);
+      _backgroundPosition(element);
+    }
+  };
+  
+  function _backgroundPosition(element) {
+    _tmp.src = element.currentStyle.backgroundImage.slice(5, -2);
+    var parentElement = element.canHaveChildren ? element : element.parentElement;
+    parentElement.appendChild(_tmp);
+    setOffsetLeft(element);
+    setOffsetTop(element);
+    parentElement.removeChild(_tmp);
+  };
+  
+  function bgLeft(element) {
+    element.style.backgroundPositionX = element.currentStyle.backgroundPositionX;
+    if (!_isFixed(element)) {
+      _setExpression(element, "backgroundPositionX", "(parseInt(runtimeStyle.offsetLeft)+document." + $viewport + ".scrollLeft)||0");
+    }
+  };
+  eval(rotate(bgLeft));
+  
+  function setOffsetLeft(element) {
+    var propertyName = _isFixed(element) ? "backgroundPositionX" : "offsetLeft";
+    element.runtimeStyle[propertyName] =
+      getOffsetLeft(element, element.style.backgroundPositionX) -
+      element.getBoundingClientRect().left - element.clientLeft + 2;
+  };
+  eval(rotate(setOffsetLeft));
+  
+  function getOffsetLeft(element, position) {
+    switch (position) {
+      case "left":
+      case "top":
+        return 0;
+      case "right":
+      case "bottom":
+        return viewport.clientWidth - _tmp.offsetWidth;
+      case "center":
+        return (viewport.clientWidth - _tmp.offsetWidth) / 2;
+      default:
+        if (PERCENT.test(position)) {
+          return parseInt((viewport.clientWidth - _tmp.offsetWidth) * parseFloat(position) / 100);
+        }
+        _tmp.style.left = position;
+        return _tmp.offsetLeft;
+    }
+  };
+  eval(rotate(getOffsetLeft));
+  
+  // -----------------------------------------------------------------------
+  //  position: fixed
+  // -----------------------------------------------------------------------
+  
+  function _positionFixed(element) {
+    if (register(_positionFixed, element, isFixed(element))) {
+      setOverrideStyle(element, "position",  "absolute");
+      setOverrideStyle(element, "left",  element.currentStyle.left);
+      setOverrideStyle(element, "top",  element.currentStyle.top);
+      _fixBackground();
+      IE7.Layout.fixRight(element);
+      _foregroundPosition(element);
+    }
+  };
+  
+  function _foregroundPosition(element, recalc) {
+    positionTop(element, recalc);
+    positionLeft(element, recalc, true);
+    if (!element.runtimeStyle.autoLeft && element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.right != "auto") {
+      var left = viewport.clientWidth - getPixelWidth(element, element.currentStyle.right) -
+        getPixelWidth(element, element.runtimeStyle._left) - element.clientWidth;
+      if (element.currentStyle.marginRight == "auto") left = parseInt(left / 2);
+      if (_isFixed(element.offsetParent)) element.runtimeStyle.pixelLeft += left;
+      else element.runtimeStyle.shiftLeft = left;
+    }
+    clipWidth(element);
+    clipHeight(element);
+  };
+
+  function clipWidth(element) {
+    var fixWidth = element.runtimeStyle.fixWidth;
+    element.runtimeStyle.borderRightWidth = "";
+    element.runtimeStyle.width = fixWidth ? getPixelWidth(element, fixWidth) : "";
+    if (element.currentStyle.width != "auto") {
+      var rect = element.getBoundingClientRect();
+      var width = element.offsetWidth - viewport.clientWidth + rect.left - 2;
+      if (width >= 0) {
+        element.runtimeStyle.borderRightWidth = "0px";
+        width = Math.max(getPixelValue(element, element.currentStyle.width) - width, 0);
+        setOverrideStyle(element, "width",  width);
+        return width;
+      }
+    }
+  };
+  eval(rotate(clipWidth));
+  
+  function positionLeft(element, recalc) {
+    // if the element's width is in % units then it must be recalculated
+    //  with respect to the viewport
+    if (!recalc && PERCENT.test(element.currentStyle.width)) {
+      element.runtimeStyle.fixWidth = element.currentStyle.width;
+    }
+    if (element.runtimeStyle.fixWidth) {
+      element.runtimeStyle.width = getPixelWidth(element, element.runtimeStyle.fixWidth);
+    }
+    //if (recalc) {
+    //  // if the element is fixed on the right then no need to recalculate
+    //  if (!element.runtimeStyle.autoLeft) return;
+    //} else {
+      element.runtimeStyle.shiftLeft = 0;
+      element.runtimeStyle._left = element.currentStyle.left;
+      // is the element fixed on the right?
+      element.runtimeStyle.autoLeft = element.currentStyle.right != "auto" &&
+        element.currentStyle.left == "auto";
+    //}
+    // reset the element's "left" value and get it's natural position
+    element.runtimeStyle.left = "";
+    element.runtimeStyle.screenLeft = getScreenLeft(element);
+    element.runtimeStyle.pixelLeft = element.runtimeStyle.screenLeft;
+    // if the element is contained by another fixed element then there is no need to
+    //  continually recalculate it's left position
+    if (!recalc && !_isFixed(element.offsetParent)) {
+      // onsrcoll produces jerky movement, so we use an expression
+      _setExpression(element, "pixelLeft", "runtimeStyle.screenLeft+runtimeStyle.shiftLeft+document." + $viewport + ".scrollLeft");
+    }
+  };
+  // clone this function so we can do "top"
+  eval(rotate(positionLeft));
+  
+  // I've forgotten how this works...
+  function getScreenLeft(element) { // thanks to kevin newman (captainn)
+    var screenLeft = element.offsetLeft, nested = 1;
+    if (element.runtimeStyle.autoLeft) {
+      screenLeft = viewport.clientWidth - element.offsetWidth - getPixelWidth(element, element.currentStyle.right);
+    }
+    // accommodate margins
+    if (element.currentStyle.marginLeft != "auto") {
+      screenLeft -= getPixelWidth(element, element.currentStyle.marginLeft);
+    }
+    while (element = element.offsetParent) {
+      if (element.currentStyle.position != "static") nested = -1;
+      screenLeft += element.offsetLeft * nested;
+    }
+    return screenLeft;
+  };
+  eval(rotate(getScreenLeft));
+  
+  function getPixelWidth(element, value) {
+    return PERCENT.test(value) ? parseInt(parseFloat(value) / 100 * viewport.clientWidth) : getPixelValue(element, value);
+  };
+  eval(rotate(getPixelWidth));
+  
+  // -----------------------------------------------------------------------
+  //  capture window resize
+  // -----------------------------------------------------------------------
+  
+  function _resize() {
+    // if the window has been resized then some positions need to be
+    //  recalculated (especially those aligned to "right" or "top"
+    var elements = _backgroundFixed.elements;
+    for (var i in elements) _backgroundPosition(elements[i]);
+    elements = _positionFixed.elements;
+    for (i in elements) {
+      _foregroundPosition(elements[i], true);
+      // do this twice to be sure - hackish, I know :-)
+      _foregroundPosition(elements[i], true);
+    }
+    _timer = 0;
+  };
+  
+  // use a timer for some reason.
+  //  (sometimes this is a good way to prevent resize loops)
+  var _timer;
+  addResize(function() {
+    if (!_timer) _timer = setTimeout(_resize, 0);
+  });
+};
+
+// =========================================================================
+// ie7-oveflow.js
+// =========================================================================
+
+/* ---------------------------------------------------------------------
+
+  This module alters the structure of the document.
+  It may adversely affect other CSS rules. Be warned.
+
+--------------------------------------------------------------------- */
+
+var WRAPPER_STYLE = {
+  backgroundColor: "transparent",
+  backgroundImage: "none",
+  backgroundPositionX: null,
+  backgroundPositionY: null,
+  backgroundRepeat: null,
+  borderTopWidth: 0,
+  borderRightWidth: 0,
+  borderBottomWidth: 0,
+  borderLeftStyle: "none",
+  borderTopStyle: "none",
+  borderRightStyle: "none",
+  borderBottomStyle: "none",
+  borderLeftWidth: 0,
+  height: null,
+  marginTop: 0,
+  marginBottom: 0,
+  marginRight: 0,
+  marginLeft: 0,
+  width: "100%"
+};
+
+IE7.CSS.addRecalc("overflow", "visible", function(element) {
+  // don't do this again
+  if (element.parentNode.ie7_wrapped) return;
+
+  // if max-height is applied, makes sure it gets applied first
+  if (IE7.Layout && element.currentStyle["max-height"] != "auto") {
+    IE7.Layout.maxHeight(element);
+  }
+
+  if (element.currentStyle.marginLeft == "auto") element.style.marginLeft = 0;
+  if (element.currentStyle.marginRight == "auto") element.style.marginRight = 0;
+
+  var wrapper = document.createElement(ANON);
+  wrapper.ie7_wrapped = element;
+  for (var propertyName in WRAPPER_STYLE) {
+    wrapper.style[propertyName] = element.currentStyle[propertyName];
+    if (WRAPPER_STYLE[propertyName] != null) {
+      element.runtimeStyle[propertyName] = WRAPPER_STYLE[propertyName];
+    }
+  }
+  wrapper.style.display = "block";
+  wrapper.style.position = "relative";
+  element.runtimeStyle.position = "absolute";
+  element.parentNode.insertBefore(wrapper, element);
+  wrapper.appendChild(element);
+});
+
+// =========================================================================
+// ie7-quirks.js
+// =========================================================================
+
+function ie7Quirks() {
+  var FONT_SIZES = "xx-small,x-small,small,medium,large,x-large,xx-large".split(",");
+  for (var i = 0; i < FONT_SIZES.length; i++) {
+    FONT_SIZES[FONT_SIZES[i]] = FONT_SIZES[i - 1] || "0.67em";
+  }
+  
+  IE7.CSS.addFix(/(font(-size)?\s*:\s*)([\w.-]+)/, function(match, label, size, value) {
+    return label + (FONT_SIZES[value] || value);
+  });
+  
+  if (appVersion < 6) {
+    var NEGATIVE = /^\-/, LENGTH = /(em|ex)$/i;
+    var EM = /em$/i, EX = /ex$/i;
+  
+    getPixelValue = function(element, value) {
+      if (PIXEL.test(value)) return parseInt(value)||0;
+      var scale = NEGATIVE.test(value)? -1 : 1;
+      if (LENGTH.test(value)) scale *= getFontScale(element);
+      temp.style.width = (scale < 0) ? value.slice(1) : value;
+      body.appendChild(temp);
+      // retrieve pixel width
+      value = scale * temp.offsetWidth;
+      // remove the temporary element
+      temp.removeNode();
+      return parseInt(value);
+    };
+
+    var temp = createTempElement();
+    function getFontScale(element) {
+      var scale = 1;
+      temp.style.fontFamily = element.currentStyle.fontFamily;
+      temp.style.lineHeight = element.currentStyle.lineHeight;
+      //temp.style.fontSize = "";
+      while (element != body) {
+        var fontSize = element.currentStyle["ie7-font-size"];
+        if (fontSize) {
+          if (EM.test(fontSize)) scale *= parseFloat(fontSize);
+          else if (PERCENT.test(fontSize)) scale *= (parseFloat(fontSize) / 100);
+          else if (EX.test(fontSize)) scale *= (parseFloat(fontSize) / 2);
+          else {
+            temp.style.fontSize = fontSize;
+            return 1;
+          }
+        }
+        element = element.parentElement;
+      }
+      return scale;
+    };
+
+    // cursor:pointer (IE5.x)
+    IE7.CSS.addFix(/cursor\s*:\s*pointer/, "cursor:hand");
+    // display:list-item (IE5.x)
+    IE7.CSS.addFix(/display\s*:\s*list-item/, "display:block");
+  }
+  
+  // -----------------------------------------------------------------------
+  //  margin:auto
+  // -----------------------------------------------------------------------
+  
+  function fixMargin(element) {
+    if (appVersion < 5.5) IE7.Layout.boxSizing(element.parentElement);
+    var parent = element.parentElement;
+    var margin = parent.offsetWidth - element.offsetWidth - getPaddingWidth(parent);
+    var autoRight = (element.currentStyle["ie7-margin"] && element.currentStyle.marginRight == "auto") ||
+      element.currentStyle["ie7-margin-right"] == "auto";
+    switch (parent.currentStyle.textAlign) {
+      case "right":
+        margin = autoRight ? parseInt(margin / 2) : 0;
+        element.runtimeStyle.marginRight = margin + "px";
+        break;
+      case "center":
+        if (autoRight) margin = 0;
+      default:
+        if (autoRight) margin /= 2;
+        element.runtimeStyle.marginLeft = parseInt(margin) + "px";
+    }
+  };
+
+  function getPaddingWidth(element) {
+    return getPixelValue(element, element.currentStyle.paddingLeft) +
+      getPixelValue(element, element.currentStyle.paddingRight);
+  };
+  
+  IE7.CSS.addRecalc("margin(-left|-right)?", "[^};]*auto", function(element) {
+    if (register(fixMargin, element,
+      element.parentElement &&
+      element.currentStyle.display == "block" &&
+      element.currentStyle.marginLeft == "auto" &&
+      element.currentStyle.position != "absolute")) {
+        fixMargin(element);
+    }
+  });
+  
+  addResize(function() {
+    for (var i in fixMargin.elements) {
+      var element = fixMargin.elements[i];
+      element.runtimeStyle.marginLeft =
+      element.runtimeStyle.marginRight = "";
+      fixMargin(element);
+    }
+  });
+};
+
+
+// =========================================================================
+// ie8-cssQuery.js
+// =========================================================================
+
+IE7._isEmpty = function(element) {
+  element = element.firstChild;
+  while (element) {
+    if (element.nodeType == 3 || (element.nodeType == 1 && element.nodeName != "!")) return false;
+    element = element.nextSibling;
+  }
+  return true;
+};
+
+IE7._isLang = function(element, code) {
+  while (element && !element.getAttribute("lang")) element = element.parentNode;
+  return element && new RegExp("^" + rescape(code), "i").test(element.getAttribute("lang"));
+};
+
+function _nthChild(match, args, position, last) {
+  // ugly but it works...
+  last = /last/i.test(match) ? last + "+1-" : "";
+  if (!isNaN(args)) args = "0n+" + args;
+  else if (args == "even") args = "2n";
+  else if (args == "odd") args = "2n+1";
+  args = args.split("n");
+  var a = args[0] ? (args[0] == "-") ? -1 : parseInt(args[0]) : 1;
+  var b = parseInt(args[1]) || 0;
+  var negate = a < 0;
+  if (negate) {
+    a = -a;
+    if (a == 1) b++;
+  }
+  var query = format(a == 0 ? "%3%7" + (last + b) : "(%4%3-%2)%6%1%70%5%4%3>=%2", a, b, position, last, "&&", "%", "==");
+  if (negate) query = "!(" + query + ")";
+  return query;
+};
+
+_PSEUDO_CLASSES = {
+  "link":          "e%1.currentStyle['ie7-link']=='link'",
+  "visited":       "e%1.currentStyle['ie7-link']=='visited'",
+  "checked":       "e%1.checked",
+  "contains":      "e%1.innerText.indexOf('%2')!=-1",
+  "disabled":      "e%1.isDisabled",
+  "empty":         "IE7._isEmpty(e%1)",
+  "enabled":       "e%1.disabled===false",
+  "first-child":   "!IE7._getPreviousElementSibling(e%1)",
+  "lang":          "IE7._isLang(e%1,'%2')",
+  "last-child":    "!IE7._getNextElementSibling(e%1)",
+  "only-child":    "!IE7._getPreviousElementSibling(e%1)&&!IE7._getNextElementSibling(e%1)",
+  "target":        "e%1.id==location.hash.slice(1)",
+  "indeterminate": "e%1.indeterminate"
+};
+
+
+// register a node and index its children
+IE7._register = function(element) {
+  if (element.rows) {
+    element.ie7_length = element.rows.length;
+    element.ie7_lookup = "rowIndex";
+  } else if (element.cells) {
+    element.ie7_length = element.cells.length;
+    element.ie7_lookup = "cellIndex";
+  } else if (element.ie7_indexed != IE7._indexed) {
+    var index = 0;
+    var child = element.firstChild;
+    while (child) {
+      if (child.nodeType == 1 && child.nodeName != "!") {
+        child.ie7_index = ++index;
+      }
+      child = child.nextSibling;
+    }
+    element.ie7_length = index;
+    element.ie7_lookup = "ie7_index";
+  }
+  element.ie7_indexed = IE7._indexed;
+  return element;
+};
+
+var keys = cssParser[_KEYS];
+var pseudoClass = keys[keys.length - 1];
+keys.length--;
+
+cssParser.merge({
+  ":not\\((\\*|[\\w-]+)?([^)]*)\\)": function(match, tagName, filters) { // :not pseudo class
+    var replacement = (tagName && tagName != "*") ? format("if(e%1.nodeName=='%2'){", _index, tagName.toUpperCase()) : "";
+    replacement += cssParser.exec(filters);
+    return "if(!" + replacement.slice(2, -1).replace(/\)\{if\(/g, "&&") + "){";
+  },
+  
+  ":nth(-last)?-child\\(([^)]+)\\)": function(match, last, args) { // :nth-child pseudo classes
+    _wild = false;
+    last = format("e%1.parentNode.ie7_length", _index);
+    var replacement = "if(p%1!==e%1.parentNode)p%1=IE7._register(e%1.parentNode);";
+    replacement += "var i=e%1[p%1.ie7_lookup];if(p%1.ie7_lookup!='ie7_index')i++;if(";
+    return format(replacement, _index) + _nthChild(match, args, "i", last) + "){";
+  }
+});
+
+keys.push(pseudoClass);
+
+// =========================================================================
+// ie8-css.js
+// =========================================================================
+
+var BRACKETS = "\\([^)]*\\)";
+
+if (IE7.CSS.pseudoClasses) IE7.CSS.pseudoClasses += "|";
+IE7.CSS.pseudoClasses += "before|after|last\\-child|only\\-child|empty|root|" +
+  "not|nth\\-child|nth\\-last\\-child|contains|lang".split("|").join(BRACKETS + "|") + BRACKETS;
+
+// pseudo-elements can be declared with a double colon
+encoder.add(/::/, ":");
+
+// -----------------------------------------------------------------------
+// dynamic pseudo-classes
+// -----------------------------------------------------------------------
+
+var Focus = new DynamicPseudoClass("focus", function(element) {
+  var instance = arguments;
+  
+  IE7.CSS.addEventHandler(element, "onfocus", function() {
+    Focus.unregister(instance); // in case it starts with focus
+    Focus.register(instance);
+  });
+  
+  IE7.CSS.addEventHandler(element, "onblur", function() {
+    Focus.unregister(instance);
+  });
+  
+  // check the active element for initial state
+  if (element == document.activeElement) {
+    Focus.register(instance)
+  }
+});
+
+var Active = new DynamicPseudoClass("active", function(element) {
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onmousedown", function() {
+    Active.register(instance);
+  });
+});
+
+// globally trap the mouseup event (thanks Martijn!)
+addEventHandler(document, "onmouseup", function() {
+  var instances = Active.instances;
+  for (var i in instances) Active.unregister(instances[i]);
+});
+
+// :checked
+var Checked = new DynamicPseudoClass("checked", function(element) {
+  if (typeof element.checked != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "checked") {
+      if (element.checked) Checked.register(instance);
+      else Checked.unregister(instance);
+    }
+  });
+  // check current checked state
+  if (element.checked) Checked.register(instance);
+});
+
+// :enabled
+var Enabled = new DynamicPseudoClass("enabled", function(element) {
+  if (typeof element.disabled != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "disabled") {
+      if (!element.isDisabled) Enabled.register(instance);
+      else Enabled.unregister(instance);
+    }
+  });
+  // check current disabled state
+  if (!element.isDisabled) Enabled.register(instance);
+});
+
+// :disabled
+var Disabled = new DynamicPseudoClass("disabled", function(element) {
+  if (typeof element.disabled != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "disabled") {
+      if (element.isDisabled) Disabled.register(instance);
+      else Disabled.unregister(instance);
+    }
+  });
+  // check current disabled state
+  if (element.isDisabled) Disabled.register(instance);
+});
+
+// :indeterminate (Kevin Newman)
+var Indeterminate = new DynamicPseudoClass("indeterminate", function(element) {
+  if (typeof element.indeterminate != "boolean") return;
+  var instance = arguments;
+  IE7.CSS.addEventHandler(element, "onpropertychange", function() {
+    if (event.propertyName == "indeterminate") {
+      if (element.indeterminate) Indeterminate.register(instance);
+      else Indeterminate.unregister(instance);
+    }
+  });
+  IE7.CSS.addEventHandler(element, "onclick", function() {
+    Indeterminate.unregister(instance);
+  });
+  // clever Kev says no need to check this up front
+});
+
+// :target
+var Target = new DynamicPseudoClass("target", function(element) {
+  var instance = arguments;
+  // if an element has a tabIndex then it can become "active".
+  //  The default is zero anyway but it works...
+  if (!element.tabIndex) element.tabIndex = 0;
+  // this doesn't detect the back button. I don't know how to do that :-(
+  IE7.CSS.addEventHandler(document, "onpropertychange", function() {
+    if (event.propertyName == "activeElement") {
+      if (element.id && element.id == location.hash.slice(1)) Target.register(instance);
+      else Target.unregister(instance);
+    }
+  });
+  // check the current location
+  if (element.id && element.id == location.hash.slice(1)) Target.register(instance);
+});
+
+// -----------------------------------------------------------------------
+// IE7 pseudo elements
+// -----------------------------------------------------------------------
+
+// constants
+var ATTR = /^attr/;
+var URL = /^url\s*\(\s*([^)]*)\)$/;
+var POSITION_MAP = {
+  before0: "beforeBegin",
+  before1: "afterBegin",
+  after0: "afterEnd",
+  after1: "beforeEnd"
+};
+
+var PseudoElement = IE7.PseudoElement = Rule.extend({
+  constructor: function(selector, position, cssText) {
+    // initialise object properties
+    this.position = position;
+    var content = cssText.match(PseudoElement.CONTENT), match, entity;
+    if (content) {
+      content = content[1];
+      match = content.split(/\s+/);
+      for (var i = 0; (entity = match[i]); i++) {
+        match[i] = ATTR.test(entity) ? {attr: entity.slice(5, -1)} :
+          (entity.charAt(0) == "'") ? getString(entity) : decode(entity);
+      }
+      content = match;
+    }
+    this.content = content;
+    // CSS text needs to be decoded immediately
+    this.base(selector, decode(cssText));
+  },
+  
+  init: function() {
+    // execute the underlying css query for this class
+    this.match = cssQuery(this.selector);
+    for (var i = 0; i < this.match.length; i++) {
+      var runtimeStyle = this.match[i].runtimeStyle;
+      if (!runtimeStyle[this.position]) runtimeStyle[this.position] = {cssText:""};
+      runtimeStyle[this.position].cssText += ";" + this.cssText;
+      if (this.content != null) runtimeStyle[this.position].content = this.content;
+    }
+  },
+  
+  create: function(target) {
+    var generated = target.runtimeStyle[this.position];
+    if (generated) {
+      // copy the array of values
+      var content = [].concat(generated.content || "");
+      for (var j = 0; j < content.length; j++) {
+        if (typeof content[j] == "object") {
+          content[j] = target.getAttribute(content[j].attr);
+        }
+      }
+      content = content.join("");
+      var url = content.match(URL);
+      var cssText = "overflow:hidden;" + generated.cssText.replace(/'/g, '"');
+      if (target.currentStyle.styleFloat != "none") {
+        //cssText = cssText.replace(/display\s*:\s*block/, "display:inline-block");
+      }
+      var position = POSITION_MAP[this.position + Number(target.canHaveChildren)];
+      var id = 'ie7_pseudo' + PseudoElement.count++;
+      target.insertAdjacentHTML(position, format(PseudoElement.ANON, this.className, id, cssText, url ? "" : content));
+      if (url) {
+        var pseudoElement = document.getElementById(id);
+        pseudoElement.src = getString(url[1]);
+        addFilter(pseudoElement, "crop");
+      }
+      target.runtimeStyle[this.position] = null;
+    }
+  },
+  
+  recalc: function() {
+    if (this.content == null) return;
+    for (var i = 0; i < this.match.length; i++) {
+      this.create(this.match[i]);
+    }
+  },
+
+  toString: function() {
+    return "." + this.className + "{display:inline}";
+  }
+}, {  
+  CONTENT: /content\s*:\s*([^;]*)(;|$)/,
+  ANON: "<ie7:! class='ie7_anon %1' id=%2 style='%3'>%4</ie7:!>",
+  MATCH: /(.*):(before|after).*/,
+  
+  count: 0
+});
+
+// =========================================================================
+// ie8-html.js
+// =========================================================================
+
+var UNSUCCESSFUL = /^(submit|reset|button)$/;
+
+// -----------------------------------------------------------------------
+// <button>
+// -----------------------------------------------------------------------
+
+// IE bug means that innerText is submitted instead of "value"
+IE7.HTML.addRecalc("button,input", function(button) {
+  if (button.tagName == "BUTTON") {
+    var match = button.outerHTML.match(/ value="([^"]*)"/i);
+    button.runtimeStyle.value = (match) ? match[1] : "";
+  }
+  // flag the button/input that was used to submit the form
+  if (button.type == "submit") {
+    addEventHandler(button, "onclick", function() {
+      button.runtimeStyle.clicked = true;
+      setTimeout("document.all." + button.uniqueID + ".runtimeStyle.clicked=false", 1);
+    });
+  }
+});
+
+// -----------------------------------------------------------------------
+// <form>
+// -----------------------------------------------------------------------
+
+// only submit "successful controls
+IE7.HTML.addRecalc("form", function(form) {
+  addEventHandler(form, "onsubmit", function() {
+    for (var element, i = 0; element = form[i]; i++) {
+      if (UNSUCCESSFUL.test(element.type) && !element.disabled && !element.runtimeStyle.clicked) {
+        element.disabled = true;
+        setTimeout("document.all." + element.uniqueID + ".disabled=false", 1);
+      } else if (element.tagName == "BUTTON" && element.type == "submit") {
+        setTimeout("document.all." + element.uniqueID + ".value='" +
+          element.value + "'", 1);
+        element.value = element.runtimeStyle.value;
+      }
+    }
+  });
+});
+
+// -----------------------------------------------------------------------
+// <img>
+// -----------------------------------------------------------------------
+
+// get rid of the spurious tooltip produced by the alt attribute on images
+IE7.HTML.addRecalc("img", function(img) {
+  if (img.alt && !img.title) img.title = "";
+});
+
+// =========================================================================
+// ie8-layout.js
+// =========================================================================
+
+IE7.CSS.addRecalc("border-spacing", NUMERIC, function(element) {
+  if (element.currentStyle.borderCollapse != "collapse") {
+    element.cellSpacing = getPixelValue(element, element.currentStyle["border-spacing"]);
+  }
+});
+IE7.CSS.addRecalc("box-sizing", "content-box", IE7.Layout.boxSizing);
+IE7.CSS.addRecalc("box-sizing", "border-box", IE7.Layout.borderBox);
+
+// =========================================================================
+// ie8-graphics.js
+// =========================================================================
+
+IE7.CSS.addFix(/opacity\s*:\s*([\d.]+)/, function(match, value) {
+  return "zoom:1;filter:Alpha(opacity=" + ((value * 100) || 1) + ")";
+});
+
+// fix object[type=image/*]
+var IMAGE = /^image/i;
+IE7.HTML.addRecalc("object", function(element) {
+  if (IMAGE.test(element.type)) {
+    element.body.style.cssText = "margin:0;padding:0;border:none;overflow:hidden";
+    return element;
+  }
+});
+
+// -----------------------------------------------------------------------
+// initialisation
+// -----------------------------------------------------------------------
+
+IE7.loaded = true;
+
+(function() {
+  try {
+    // http://javascript.nwbox.com/IEContentLoaded/
+    documentElement.doScroll("left");
+  } catch (e) {
+    setTimeout(arguments.callee, 1);
+    return;
+  }
+  // execute the inner text of the IE7 script
+  try {
+    eval(script.innerHTML);
+  } catch (e) {
+    // ignore errors
+  }
+  PNG = new RegExp(rescape(typeof IE7_PNG_SUFFIX == "string" ? IE7_PNG_SUFFIX : "-trans.png") + "$", "i");
+
+  // frequently used references
+  body = document.body;
+  viewport = quirksMode ? body : documentElement;
+
+  // classes
+  body.className += " ie7_body";
+  documentElement.className += " ie7_html";
+
+  if (quirksMode) ie7Quirks();
+
+  IE7.CSS.init();
+  IE7.HTML.init();
+
+  IE7.HTML.apply();
+  IE7.CSS.apply();
+
+  IE7.recalc();
+})();
+
+
+})();
Index: admin/js/ie7/ie7-recalc.js
===================================================================
--- admin/js/ie7/ie7-recalc.js	(revision 0)
+++ admin/js/ie7/ie7-recalc.js	(revision 703)
@@ -1,2 +1,166 @@
-/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */
-(function(){if(!IE7.loaded)return;CLASSES=/\sie7_class\d+/g;IE7.CSS.extend({elements:{},handlers:[],reset:function(){this.removeEventHandlers();var a=this.elements;for(var b in a)a[b].runtimeStyle.cssText="";this.elements={};var a=IE7.Rule.elements;for(var b in a){with(a[b])className=className.replace(CLASSES,"")}IE7.Rule.elements={}},reload:function(){this.rules=[];this.getInlineStyles();this.screen.load();if(this.print)this.print.load();this.refresh();this.trash()},addRecalc:function(b,c,d,e){this.base(b,c,function(a){d(a);IE7.CSS.elements[a.uniqueID]=a},e)},recalc:function(){this.reset();this.base()},addEventHandler:function(a,b,c){a.attachEvent(b,c);this.handlers.push(arguments)},removeEventHandlers:function(){var a;while(a=this.handlers.pop()){a[0].detachEvent(a[1],a[2])}},getInlineStyles:function(){var a=document.getElementsByTagName("style"),b;for(var c=a.length-1;(b=a[c]);c--){if(!b.disabled&&!b.ie7){var d=b.cssText||b.innerHTML;this.styles.push(d);b.cssText=d}}},trash:function(){var a=document.styleSheets,b,c;for(c=0;c<a.length;c++){b=a[c];if(!b.ie7&&!b.cssText){b.cssText=b.cssText}}this.base()},getText:function(a){return a.cssText||this.base(a)}});IE7.CSS.addEventHandler(window,"onunload",function(){IE7.CSS.removeEventHandlers()});IE7.Rule.elements={};IE7.Rule.prototype.extend({add:function(a){this.base(a);IE7.Rule.elements[a.uniqueID]=a}});if(IE7.PseudoElement){IE7.PseudoElement.hash={};IE7.PseudoElement.prototype.extend({create:function(a){var b=this.selector+":"+a.uniqueID;if(!IE7.PseudoElement.hash[b]){IE7.PseudoElement.hash[b]=true;this.base(a)}}})}IE7.HTML.extend({elements:{},addRecalc:function(b,c){this.base(b,function(a){if(!this.elements[a.uniqueID]){c(a);this.elements[a.uniqueID]=a}})}});document.recalc=function(a){if(IE7.CSS.screen){if(a)IE7.CSS.reload();IE7.recalc()}}})();
+
+// =========================================================================
+// ie7-recalc.js
+// =========================================================================
+
+(function() {
+  /* ---------------------------------------------------------------------
+  
+    This allows refreshing of IE7 style rules. If you modify the DOM
+    you can update IE7 by calling document.recalc().
+  
+    This should be the LAST module included.
+  
+  --------------------------------------------------------------------- */
+  
+  if (!IE7.loaded) return;
+  
+  // remove all IE7 classes from an element
+  CLASSES = /\sie7_class\d+/g;
+  
+  IE7.CSS.extend({
+    // store for elements that have style properties calculated
+    elements: {},
+    handlers: [],
+    
+    // clear IE7 classes and styles
+    reset: function() {
+      this.removeEventHandlers();
+      // reset IE7 classes here
+      var elements = this.elements;
+      for (var i in elements) elements[i].runtimeStyle.cssText = "";
+      this.elements = {};
+      // reset runtimeStyle here
+      var elements = IE7.Rule.elements;
+      for (var i in elements) {
+        with (elements[i]) className = className.replace(CLASSES, "");
+      }
+      IE7.Rule.elements = {};
+    },
+    
+    reload: function() {
+      this.rules = [];
+      this.getInlineStyles();
+      this.screen.load();
+      if (this.print) this.print.load();
+      this.refresh();
+      this.trash();
+    },
+    
+    addRecalc: function(propertyName, test, handler, replacement) {
+      // call the ancestor method to add a wrapped recalc method
+      this.base(propertyName, test, function(element) {
+        // execute the original recalc method
+        handler(element);
+        // store a reference to this element so we can clear its style later
+        IE7.CSS.elements[element.uniqueID] = element;
+      }, replacement);
+    },
+    
+    recalc: function() {
+      // clear IE7 styles and classes
+      this.reset();
+      // execute the ancestor method to perform recalculations
+      this.base();
+    },
+    
+    addEventHandler: function(element, type, handler) {
+      element.attachEvent(type, handler);
+      // store the handler so it can be detached later
+      this.handlers.push(arguments);
+    },
+    
+    removeEventHandlers: function() {
+      var handler;
+       while (handler = this.handlers.pop()) {
+         handler[0].detachEvent(handler[1], handler[2]);
+       }
+    },
+    
+    getInlineStyles: function() {
+      // load inline styles
+      var styleSheets = document.getElementsByTagName("style"), styleSheet;
+      for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) {
+        if (!styleSheet.disabled && !styleSheet.ie7) {
+          var cssText = styleSheet.cssText || styleSheet.innerHTML;
+          this.styles.push(cssText);
+          styleSheet.cssText = cssText;
+        }
+      }
+    },
+    
+    trash: function() {
+      // trash the old style sheets
+      var styleSheets = document.styleSheets, styleSheet, i;
+      for (i = 0; i < styleSheets.length; i++) {
+        styleSheet = styleSheets[i];
+        if (!styleSheet.ie7 && !styleSheet.cssText) {
+          styleSheet.cssText = styleSheet.cssText;
+        }
+      }
+      this.base();
+    },
+    
+    getText: function(styleSheet) {
+      return styleSheet.cssText || this.base(styleSheet);
+    }
+  });
+  
+  // remove event handlers (they eat memory)
+  IE7.CSS.addEventHandler(window, "onunload", function() {
+     IE7.CSS.removeEventHandlers();
+  });
+  
+  // store all elements with an IE7 class assigned
+  IE7.Rule.elements = {};
+
+  IE7.Rule.prototype.extend({
+    add: function(element) {
+      // execute the ancestor "add" method
+      this.base(element);
+      // store a reference to this element so we can clear its classes later
+      IE7.Rule.elements[element.uniqueID] = element;
+    }
+  });
+
+  // store created pseudo elements
+  if (IE7.PseudoElement) {
+    IE7.PseudoElement.hash = {};
+  
+    IE7.PseudoElement.prototype.extend({
+      create: function(target) {
+        var key = this.selector + ":" + target.uniqueID;
+        if (!IE7.PseudoElement.hash[key]) {
+          IE7.PseudoElement.hash[key] = true;
+          this.base(target);
+        }
+      }
+    });
+  }
+  
+  IE7.HTML.extend({
+    elements: {},
+    
+    addRecalc: function(selector, handler) {
+      // call the ancestor method to add a wrapped recalc method
+      this.base(selector, function(element) {
+        if (!this.elements[element.uniqueID]) {
+          // execute the original recalc method
+          handler(element);
+          // store a reference to this element so that
+          //  it is not "fixed" again
+          this.elements[element.uniqueID] = element;
+        }
+      });
+    }
+  });
+  
+  // allow refreshing of IE7 fixes
+  document.recalc = function(reload) {
+    if (IE7.CSS.screen) {
+      if (reload) IE7.CSS.reload();
+      IE7.recalc();
+    }
+  };
+
+})();
Index: admin/js/ie7/ie7-squish.js
===================================================================
--- admin/js/ie7/ie7-squish.js	(revision 0)
+++ admin/js/ie7/ie7-squish.js	(revision 703)
Index: admin/js/jquery/jquery.candyUpload.js
===================================================================
--- admin/js/jquery/jquery.candyUpload.js	(revision 3)
+++ admin/js/jquery/jquery.candyUpload.js	(revision 536)
@@ -501,5 +501,5 @@
 			
 			var size = this.formatSize(upldr.params.file_size_limit);
-			$('<div class="cu-maxsize">' + this.locales.max_file_size + ' ' + size + '</div>').appendTo(this.ctrl.block);
+			$('<p class="cu-maxsize form-note info">' + this.locales.max_file_size + ' ' + size + '</p>').appendTo(this.ctrl.block);
 		},
 		
@@ -553,5 +553,5 @@
 					'<div class="cu-fileinfo"><span class="cu-filename">' + o.name + '</span> ' + 
 					'<span class="cu-filesize">(' + this.formatSize(o.size) + ')</span> ' +
-					'<span class="cu-filecancel"><a href="#">cancel</a></span> ' +
+					'<span class="cu-filecancel"><a href="#">cancel</a> </span> ' +
 					'<span class="cu-filemsg"></span>' +
 					'</div>');
Index: admin/js/jsToolBar/jsToolBar.js
===================================================================
--- admin/js/jsToolBar/jsToolBar.js	(revision 0)
+++ admin/js/jsToolBar/jsToolBar.js	(revision 530)
@@ -44,18 +44,15 @@
 	
 	// Dragable resizing (only for gecko)
-	if (this.editor.addEventListener)
+	if (navigator.appName == 'Microsoft Internet Explorer')
 	{
-		this.handle = document.createElement('div');
-		this.handle.className = 'jstHandle';
-		var dragStart = this.resizeDragStart;
-		var This = this;
-		this.handle.addEventListener('mousedown',function(event) { dragStart.call(This,event); },false);
-		// fix memory leak in Firefox (bug #241518)
-		window.addEventListener('unload',function() {
-				var del = This.handle.parentNode.removeChild(This.handle);
-				delete(This.handle);
-		},false);
-		
-		this.editor.parentNode.insertBefore(this.handle,this.editor.nextSibling);
+		if (this.editor.addEventListener)
+		{		
+			this.handle = document.createElement('div');
+			this.handle.className = 'jstHandle';
+			var dragStart = this.resizeDragStart;
+			var This = this;
+			this.handle.addEventListener('mousedown',function(event) { dragStart.call(This,event); },false);
+			this.editor.parentNode.insertBefore(this.handle,this.editor.nextSibling);
+		}
 	}
 	
Index: admin/js/prelude.js
===================================================================
--- admin/js/prelude.js	(revision 447)
+++ admin/js/prelude.js	(revision 447)
@@ -0,0 +1,20 @@
+// Accessibility links thks to vie-publique.fr
+aFocus = function() {
+	if(document.getElementById("prelude")) {
+		var aElts = document.getElementById("prelude").getElementsByTagName("A");
+		for (var i=0; i<aElts.length; i++) {
+			aElts[i].className="hidden";
+			aElts[i].onfocus=function() {
+				this.className="";
+			}
+		}
+	}
+}
+// events onload
+function addLoadEvent(func) {
+	if (window.addEventListener)
+		window.addEventListener("load", func, false);
+	else if (window.attachEvent)
+		window.attachEvent("onload", func);
+}
+addLoadEvent(aFocus);
Index: admin/langs.php
===================================================================
--- admin/langs.php	(revision 270)
+++ admin/langs.php	(revision 500)
@@ -133,5 +133,5 @@
 
 echo
-'<h2>'.__('Languages management').'</h2>';
+'<h2 class="page-title">'.__('Languages management').'</h2>';
 
 if (!empty($_GET['removed'])) {
Index: admin/media.php
===================================================================
--- admin/media.php	(revision 270)
+++ admin/media.php	(revision 557)
@@ -68,5 +68,4 @@
 	unset($post);
 }
-
 $d = isset($_REQUEST['d']) ? $_REQUEST['d'] : null;
 $dir = null;
@@ -223,5 +222,5 @@
 	call_user_func($open_f,__('Media manager'));
 	
-	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Media manager').' &rsaquo; '.__('confirm removal').'</h2>';
+	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Media manager').' &rsaquo; <span class="page-title">'.__('confirm removal').'</span></h2>';
 	
 	echo
@@ -229,6 +228,6 @@
 	'<p>'.sprintf(__('Are you sure you want to remove %s?'),
 	html::escapeHTML($_GET['remove'])).'</p>'.
-	'<p><input type="submit" value="'.__('cancel').'" /> '.
-	' &nbsp; <input type="submit" name="rmyes" value="'.__('yes').'" />'.
+	'<p><input type="submit" value="'.__('Cancel').'" /> '.
+	' &nbsp; <input type="submit" name="rmyes" value="'.__('Yes').'" />'.
 	form::hidden('d',$d).
 	$core->formNonce().
@@ -279,6 +278,15 @@
 }
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <a href="'.html::escapeURL($page_url.'&d=').'">'.__('Media manager').'</a>'.
-' / '.(isset($core->media) ? $core->media->breadCrumb(html::escapeURL($page_url).'&amp;d=%s') : '').'</h2>';
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; ';
+if (!isset($core->media)) {
+	echo '<span class="page-title">'.__('Media manager').'</span></h2>';
+} else {
+	$breadcrumb = $core->media->breadCrumb(html::escapeURL($page_url).'&amp;d=%s','<span class="page-title">%s</span>');
+	if ($breadcrumb == '') {
+		echo '<span class="page-title">'.__('Media manager').'</span></h2>';
+	} else {
+		echo '<a href="'.html::escapeURL($page_url.'&d=').'">'.__('Media manager').'</a>'.' / '.$breadcrumb.'</h2>';
+	}
+}
 
 if (!$dir) {
@@ -315,5 +323,5 @@
 	form::hidden(array('popup'),$popup).
 	form::hidden(array('post_id'),$post_id).
-	'<input type="submit" value="'.__('ok').'" /></p>'.
+	'<input type="submit" value="'.__('Sort').'" /></p>'.
 	'</form>'.
 	
@@ -336,10 +344,10 @@
 	
 	echo
-	'<div class="col"><h3 id="add-file">'.__('Add files').'</h3>'.
+	'<div class="col">'.
+	'<fieldset id="add-file-f"><legend>'.__('Add files').'</legend>'.
 	'<p>'.__('Please take care to publish media that you own and that are not protected by copyright.').'</p>'.
 	'<form id="media-upload" class="clear" action="'.html::escapeURL($page_url).'" method="post" enctype="multipart/form-data">'.
 	'<div>'.form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
 	$core->formNonce().'</div>'.
-	'<fieldset id="add-file-f">'.
 	'<p><label for="upfile">'.__('Choose a file:').
 	' ('.sprintf(__('Maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.
@@ -351,5 +359,5 @@
 	'<p class="form-help info">'.__('To send several files at the same time, you can activate the enhanced uploader in').
 	'<a href="preferences.php?tab=user-options"> '.__('My preferences').'</a></p>'.
-	'<p><input type="submit" value="'.__('send').'" />'.
+	'<p><input type="submit" value="'.__('Send').'" />'.
 	form::hidden(array('d'),$d).'</p>'.
 	'</fieldset>'.
@@ -358,11 +366,12 @@
 	
 	echo
-	'<div class="col"><h3 id="new-dir">'.__('New directory').'</h3>'.
+	'<div class="col">'.
 	'<form class="clear" action="'.html::escapeURL($page_url).'" method="post">'.
 	'<fieldset id="new-dir-f">'.
+	'<legend>'.__('New directory').'</legend>'.
 	$core->formNonce().
 	'<p><label for="newdir">'.__('Directory Name:').
 	form::field(array('newdir','newdir'),35,255).'</label></p>'.
-	'<p><input type="submit" value="'.__('Save').'" />'.
+	'<p><input type="submit" value="'.__('Create').'" />'.
 	form::hidden(array('d'),html::escapeHTML($d)).'</p>'.
 	'</fieldset>'.
Index: admin/media_item.php
===================================================================
--- admin/media_item.php	(revision 270)
+++ admin/media_item.php	(revision 663)
@@ -182,5 +182,5 @@
 echo '<h2><a href="'.html::escapeURL($media_page_url).'">'.__('Media manager').'</a>'.
 ' / '.$core->media->breadCrumb(html::escapeURL($media_page_url).'&amp;d=%s').
-$file->basename.'</h2>';
+'<span class="page-title">'.$file->basename.'</span></h2>';
 
 # Insertion popup
@@ -394,5 +394,9 @@
 	if ($file->media_image)
 	{ # We look for thumbnails too
-		$media_root = $core->blog->host.path::clean($core->blog->settings->system->public_url).'/';
+		if (preg_match('#^http(s)?://#',$core->blog->settings->system->public_url)) {
+			$media_root = $core->blog->settings->system->public_url;
+		} else {
+			$media_root = $core->blog->host.path::clean($core->blog->settings->system->public_url).'/';
+		}
 		foreach ($file->media_thumb as $v) {
 			$v = preg_replace('/^'.preg_quote($media_root,'/').'/','',$v);
@@ -452,5 +456,5 @@
 		'<fieldset><legend>'.__('Update thumbnails').'</legend>'.
 		'<p>'.__('This will create or update thumbnails for this image.').'</p>'.
-		'<p><input type="submit" name="thumbs" value="'.__('update thumbnails').'" />'.
+		'<p><input type="submit" name="thumbs" value="'.__('Update thumbnails').'" />'.
 		form::hidden(array('id'),$id).
 		$core->formNonce().'</p>'.
@@ -476,5 +480,5 @@
 		'<p><label for="inflate_mode" class="classic">'.__('Extract mode:').' '.
 		form::combo('inflate_mode',$inflate_combo,'new').'</label> '.
-		'<input type="submit" name="unzip" value="'.__('extract').'" />'.
+		'<input type="submit" name="unzip" value="'.__('Extract').'" />'.
 		form::hidden(array('id'),$id).
 		$core->formNonce().'</p>'.
@@ -508,5 +512,5 @@
 	'<input type="file" id="upfile" name="upfile" size="35" />'.
 	'</label></p>'.
-	'<p><input type="submit" value="'.__('send').'" />'.
+	'<p><input type="submit" value="'.__('Send').'" />'.
 	form::hidden(array('id'),$id).
 	$core->formNonce().'</p>'.
Index: admin/permissions.php
===================================================================
--- admin/permissions.php	(revision 270)
+++ admin/permissions.php	(revision 536)
@@ -98,5 +98,5 @@
 );
 
-echo '<h2><a href="users.php">'.__('Users').'</a> &rsaquo; '.__('Permissions').'</h2>';
+echo '<h2><a href="users.php">'.__('Users').'</a> &rsaquo; <span class="page-title">'.__('Permissions').'</span></h2>';
 
 if (!empty($_GET['upd'])) {
@@ -143,7 +143,7 @@
 	
 	echo
-	'<fieldset>'.
+	'<fieldset><legend>'.__('Validate permissions').'</legend>'.
 	'<p><label for="your_pwd">'.__('Your password:').
-	form::password('your_pwd',20,255,'','',15).'</label></p>'.
+	form::password('your_pwd',20,255).'</label></p>'.
 	'</fieldset>'.
 	'<p><input type="submit" accesskey="s" value="'.__('Save').'" />'.
Index: admin/permissions_blog.php
===================================================================
--- admin/permissions_blog.php	(revision 270)
+++ admin/permissions_blog.php	(revision 557)
@@ -90,5 +90,5 @@
 dcPage::open(__('choose a blog'),$starting_script);
 
-echo '<h2><a href="users.php">'.__('Users').'</a> &rsaquo; '.__('Choose a blog').'</h2>';
+echo '<h2><a href="users.php">'.__('Users').'</a> &rsaquo; <span class="page-title">'.__('Choose a blog').'</span></h2>';
 
 if (!$core->error->flag())
@@ -165,5 +165,5 @@
 		'<p class="checkboxes-helpers"></p>'.
 		
-		'<p><input type="submit" value="'.__('set permissions').'" />'.
+		'<p><input type="submit" value="'.__('Set permissions').'" />'.
 		$hidden_fields.
 		$core->formNonce().'</p>'.
Index: admin/plugin.php
===================================================================
--- admin/plugin.php	(revision 270)
+++ admin/plugin.php	(revision 500)
@@ -83,5 +83,5 @@
 	call_user_func($open_f,__('Plugin not found'));
 	
-	echo '<h2>'.__('Plugin not found').'</h2>';
+	echo '<h2 class="page-title">'.__('Plugin not found').'</h2>';
 	
 	echo '<p>'.__('The plugin you reached does not exist or does not have an admin page.').'</p>';
Index: admin/plugins.php
===================================================================
--- admin/plugins.php	(revision 270)
+++ admin/plugins.php	(revision 500)
@@ -173,5 +173,5 @@
 
 echo
-'<h2>'.__('Plugins management').'</h2>';
+'<h2 class="page-title">'.__('Plugins management').'</h2>';
 
 if (!empty($_GET['removed'])) {
Index: admin/popup_link.php
===================================================================
--- admin/popup_link.php	(revision 270)
+++ admin/popup_link.php	(revision 500)
@@ -21,5 +21,5 @@
 dcPage::openPopup(__('Add a link'),dcPage::jsLoad('js/jsToolBar/popup_link.js'));
 
-echo '<h2>'.__('Add a link').'</h2>';
+echo '<h2 class="page-title">'.__('Add a link').'</h2>';
 
 # Languages combo
Index: admin/popup_posts.php
===================================================================
--- admin/popup_posts.php	(revision 270)
+++ admin/popup_posts.php	(revision 557)
@@ -33,9 +33,9 @@
 	dcPage::jsLoad('js/jsToolBar/popup_posts.js'));
 
-echo '<h2>'.__('Add a link to an entry').'</h2>';
+echo '<h2 class="page-title">'.__('Add a link to an entry').'</h2>';
 
 echo '<form action="popup_posts.php" method="get">'.
 '<p><label for="q" class="classic">'.__('Search entry:').' '.form::field('q',30,255,html::escapeHTML($q)).'</label> '.
-' <input type="submit" value="'.__('ok').'" /></p>'.
+' <input type="submit" value="'.__('Search').'" /></p>'.
 '</form>';
 
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 322)
+++ admin/post.php	(revision 559)
@@ -32,6 +32,4 @@
 $post_open_comment = $core->blog->settings->system->allow_comments;
 $post_open_tb = $core->blog->settings->system->allow_trackbacks;
-
-$post_media = array();
 
 $page_title = __('New entry');
@@ -146,5 +144,4 @@
 		try {
 			$core->media = new dcMedia($core);
-			$post_media = $core->media->getPostMedia($post_id);
 		} catch (Exception $e) {}
 	}
@@ -317,4 +314,5 @@
 	$post_excerpt = $post_excerpt_xhtml;
 	$post_content = $post_content_xhtml;
+	$post_title = $post_title_xhtml;
 	$post_format = 'xhtml';
 	
@@ -322,19 +320,14 @@
 }
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.'<a href="posts.php">'.__('Entries').'</a> &rsaquo; '.$page_title;
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.'<a href="posts.php">'.__('Entries').'</a> &rsaquo; <span class="page-title">'.$page_title;
+
+	if ($post_id) {
+		echo ' &ldquo;'.$post_title.'&rdquo;';
+	}
+echo	'</span></h2>';
 
 if ($post_id && $post->post_status == 1) {
-	echo ' - <a id="post-preview" href="'.$post->getURL().'" class="button">'.__('View entry').'</a>';
-} elseif ($post_id) {
-	$preview_url =
-	$core->blog->url.$core->url->getBase('preview').'/'.
-	$core->auth->userID().'/'.
-	http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
-	'/'.$post->post_url;
-	echo ' - <a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview entry').'</a>';
-}
-
-echo '</h2>';
-
+	echo '<p><a href="'.$post->getURL().'" onclick="window.open(this.href);return false;" title="'.$post_title.' ('.__('new window').')'.'">'.__('Go to this entry on the site').' <img src="images/outgoing-blue.png" alt="" /></a></p>';
+}
 if ($post_id)
 {
@@ -363,43 +356,88 @@
 	echo '<div class="multi-part" title="'.__('Edit entry').'" id="edit-entry">';
 	echo '<form action="post.php" method="post" id="entry-form">';
+	echo '<div id="entry-wrapper">';
+	echo '<div id="entry-content"><div class="constrained">';
+	
+	echo
+	'<p class="col"><label class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
+	form::field('post_title',20,255,html::escapeHTML($post_title),'maximal').
+	'</label></p>'.
+	
+	'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'</label> '.
+	form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)).
+	'</p>'.
+	
+	'<p class="area"><label class="required" '.
+	'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
+	form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content)).
+	'</p>'.
+	
+	'<p class="area" id="notes-area"><label for="post_notes">'.__('Notes:').'</label>'.
+	form::textarea('post_notes',50,5,html::escapeHTML($post_notes)).
+	'</p>';
+	
+	# --BEHAVIOR-- adminPostForm
+	$core->callBehavior('adminPostForm',isset($post) ? $post : null);
+	
+	echo
+	'<p>'.
+	($post_id ? form::hidden('id',$post_id) : '').
+	'<input type="submit" value="'.__('Save').' (s)" '.
+	'accesskey="s" name="save" /> ';
+	if ($post_id) {
+		$preview_url =
+		$core->blog->url.$core->url->getBase('preview').'/'.
+		$core->auth->userID().'/'.
+		http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
+		'/'.$post->post_url;
+		echo '<a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview').'</a> ';
+	}
+	echo
+	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
+	$core->formNonce().
+	'</p>';
+	
+	echo '</div></div>';		// End #entry-content
+	echo '</div>';		// End #entry-wrapper
+
 	echo '<div id="entry-sidebar">';
 	
 	echo
 	'<p><label for="cat_id">'.__('Category:').
-	form::combo('cat_id',$categories_combo,$cat_id,'maximal',3).
+	form::combo('cat_id',$categories_combo,$cat_id,'maximal').
 	'</label></p>'.
 	
 	'<p><label for="post_status">'.__('Entry status:').
-	form::combo('post_status',$status_combo,$post_status,'',3,!$can_publish).
+	form::combo('post_status',$status_combo,$post_status,'','',!$can_publish).
 	'</label></p>'.
 	
 	'<p><label for="post_dt">'.__('Published on:').
-	form::field('post_dt',16,16,$post_dt,'',3).
+	form::field('post_dt',16,16,$post_dt).
 	'</label></p>'.
 	
 	'<p><label for="post_format">'.__('Text formating:').
-	form::combo('post_format',$formaters_combo,$post_format,'',3).
+	form::combo('post_format',$formaters_combo,$post_format).
 	'</label>'.
 	'</p>'.
 	'<p>'.($post_id && $post_format != 'xhtml' ? '<a id="convert-xhtml" class="button" href="post.php?id='.$post_id.'&amp;xconv=1">'.__('Convert to XHTML').'</a>' : '').'</p>'.
 	
-	'<p><label for="post_open_comment" class="classic">'.form::checkbox('post_open_comment',1,$post_open_comment,'',3).' '.
+	'<p><label for="post_open_comment" class="classic">'.form::checkbox('post_open_comment',1,$post_open_comment).' '.
 	__('Accept comments').'</label></p>'.
-	'<p><label for="post_open_tb" class="classic">'.form::checkbox('post_open_tb',1,$post_open_tb,'',3).' '.
+	'<p><label for="post_open_tb" class="classic">'.form::checkbox('post_open_tb',1,$post_open_tb).' '.
 	__('Accept trackbacks').'</label></p>'.
-	'<p><label for="post_selected" class="classic">'.form::checkbox('post_selected',1,$post_selected,'',3).' '.
+	'<p><label for="post_selected" class="classic">'.form::checkbox('post_selected',1,$post_selected).' '.
 	__('Selected entry').'</label></p>'.
 	
 	'<p><label for="post_lang">'.__('Entry lang:').
-	form::combo('post_lang',$lang_combo,$post_lang,'',5).
+	form::combo('post_lang',$lang_combo,$post_lang).
 	'</label></p>'.
 	
 	'<p><label for="post_password">'.__('Entry password:').
-	form::field('post_password',10,32,html::escapeHTML($post_password),'maximal',3).
+	form::field('post_password',10,32,html::escapeHTML($post_password),'maximal').
 	'</label></p>'.
 	
 	'<div class="lockable">'.
 	'<p><label for="post_url">'.__('Basename:').
-	form::field('post_url',10,255,html::escapeHTML($post_url),'maximal',3).
+	form::field('post_url',10,255,html::escapeHTML($post_url),'maximal').
 	'</label></p>'.
 	'<p class="form-note warn">'.
@@ -408,80 +446,14 @@
 	'</div>';
 	
-	if ($post_id)
-	{
-		echo
-		'<h3 class="clear">'.__('Attachments').'</h3>';
-		foreach ($post_media as $f)
-		{
-			$ftitle = $f->media_title;
-			if (strlen($ftitle) > 18) {
-				$ftitle = substr($ftitle,0,16).'...';
-			}
-			echo
-			'<div class="media-item">'.
-			'<a class="media-icon" href="media_item.php?id='.$f->media_id.'">'.
-			'<img src="'.$f->media_icon.'" alt="" title="'.$f->basename.'" /></a>'.
-			'<ul>'.
-			'<li><a class="media-link" href="media_item.php?id='.$f->media_id.'"'.
-			'title="'.$f->basename.'">'.$ftitle.'</a></li>'.
-			'<li>'.$f->media_dtstr.'</li>'.
-			'<li>'.files::size($f->size).' - '.
-			'<a href="'.$f->file_url.'">'.__('open').'</a>'.'</li>'.
-			
-			'<li class="media-action"><a class="attachment-remove" id="attachment-'.$f->media_id.'" '.
-			'href="post_media.php?post_id='.$post_id.'&amp;media_id='.$f->media_id.'&amp;remove=1">'.
-			'<img src="images/check-off.png" alt="'.__('remove').'" /></a>'.
-			'</li>'.
-			
-			'</ul>'.
-			'</div>';
-		}
-		unset($f);
-		
-		if (empty($post_media)) {
-			echo '<p>'.__('No attachment.').'</p>';
-		}
-		echo '<p><a class="button" href="media.php?post_id='.$post_id.'">'.__('Add files to this entry').'</a></p>';
-	}
-	
 	# --BEHAVIOR-- adminPostFormSidebar
 	$core->callBehavior('adminPostFormSidebar',isset($post) ? $post : null);
 	
 	echo '</div>';		// End #entry-sidebar
-	
-	echo '<div id="entry-content"><fieldset class="constrained">';
-	
-	echo
-	'<p class="col"><label class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
-	form::field('post_title',20,255,html::escapeHTML($post_title),'maximal',2).
-	'</label></p>'.
-	
-	'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'</label> '.
-	form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt),'',2).
-	'</p>'.
-	
-	'<p class="area"><label class="required" '.
-	'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
-	form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content),'',2).
-	'</p>'.
-	
-	'<p class="area" id="notes-area"><label for="post_notes">'.__('Notes:').'</label>'.
-	form::textarea('post_notes',50,5,html::escapeHTML($post_notes),'',2).
-	'</p>';
+
+	echo '</form>';
 	
 	# --BEHAVIOR-- adminPostForm
-	$core->callBehavior('adminPostForm',isset($post) ? $post : null);
-	
-	echo
-	'<p>'.
-	($post_id ? form::hidden('id',$post_id) : '').
-	'<input type="submit" value="'.__('Save').' (s)" tabindex="4" '.
-	'accesskey="s" name="save" /> '.
-	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
-	$core->formNonce().
-	'</p>';
-	
-	echo '</fieldset></div>';		// End #entry-content
-	echo '</form>';
+	$core->callBehavior('adminPostAfterForm',isset($post) ? $post : null);
+	
 	echo '</div>';
 	
@@ -491,13 +463,4 @@
 	}
 	
-	if ($post_id && !empty($post_media))
-	{
-		echo
-		'<form action="post_media.php" id="attachment-remove-hide" method="post">'.
-		'<div>'.form::hidden(array('post_id'),$post_id).
-		form::hidden(array('media_id'),'').
-		form::hidden(array('remove'),1).
-		$core->formNonce().'</div></form>';
-	}
 }
 
@@ -580,5 +543,5 @@
 	
 	'<form action="comment.php" method="post" id="comment-form">'.
-	'<fieldset class="constrained">'.
+	'<div class="constrained">'.
 	'<p><label for="comment_author" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Name:').
 	form::field('comment_author',30,255,html::escapeHTML($core->auth->getInfo('user_cn'))).
@@ -601,5 +564,5 @@
 	$core->formNonce().
 	'<input type="submit" name="add" value="'.__('Save').'" /></p>'.
-	'</fieldset>'.
+	'</div>'.
 	'</form>'.
 	'</div>';
Index: admin/post_media.php
===================================================================
--- admin/post_media.php	(revision 270)
+++ admin/post_media.php	(revision 557)
@@ -61,11 +61,11 @@
 		dcPage::open(__('Remove attachment'));
 		
-		echo '<h2>'.__('Attachment').' &rsaquo; '.__('confirm removal').'</h2>';
+		echo '<h2>'.__('Attachment').' &rsaquo; <span class="page-title">'.__('confirm removal').'</span></h2>';
 		
 		echo
 		'<form action="post_media.php" method="post">'.
 		'<p>'.__('Are you sure you want to remove this attachment?').'</p>'.
-		'<p><input type="submit" class="reset" value="'.__('cancel').'" /> '.
-		' &nbsp; <input type="submit" class="delete" name="remove" value="'.__('yes').'" />'.
+		'<p><input type="submit" class="reset" value="'.__('Cancel').'" /> '.
+		' &nbsp; <input type="submit" class="delete" name="remove" value="'.__('Yes').'" />'.
 		form::hidden('post_id',$post_id).
 		form::hidden('media_id',$media_id).
Index: admin/posts.php
===================================================================
--- admin/posts.php	(revision 270)
+++ admin/posts.php	(revision 500)
@@ -231,5 +231,5 @@
 {
 	echo 
-	'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Entries').'</h2>'.
+	'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Entries').'</span></h2>'.
 	'<p class="top-add"><a class="button add" href="post.php">'.__('New entry').'</a></p>';
 	
Index: admin/posts_actions.php
===================================================================
--- admin/posts_actions.php	(revision 270)
+++ admin/posts_actions.php	(revision 500)
@@ -207,5 +207,5 @@
 if ($action == 'category')
 {
-	echo '<h2>'.__('Change category for entries').'</h2>';
+	echo '<h2 class="page-title">'.__('Change category for entries').'</h2>';
 	
 	# categories list
@@ -238,5 +238,5 @@
 elseif ($action == 'author' && $core->auth->check('admin',$core->blog->id))
 {
-	echo '<h2>'.__('Change author for entries').'</h2>';
+	echo '<h2 class="page-title">'.__('Change author for entries').'</h2>';
 	
 	echo
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 270)
+++ admin/preferences.php	(revision 712)
@@ -41,8 +41,10 @@
 	$user_ui_hide_std_favicon = $core->auth->user_prefs->interface->hide_std_favicon;
 }
+$user_ui_iconset = @$core->auth->user_prefs->interface->iconset;
 
 $default_tab = !empty($_GET['tab']) ? html::escapeHTML($_GET['tab']) : 'user-profile';
 
-if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder']) || !empty($_GET['replaced'])) {
+if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder']) || 
+	!empty($_GET['replaced']) || !empty($_POST['appendaction']) || !empty($_POST['removeaction'])) {
 	$default_tab = 'user-favorites';
 } elseif (!empty($_GET['updated'])) {
@@ -59,4 +61,16 @@
 foreach ($core->blog->getAllPostStatus() as $k => $v) {
 	$status_combo[$v] = $k;
+}
+
+$iconsets_combo = array(__('Default') => '');
+$iconsets_root = dirname(__FILE__).'/images/iconset/';
+if (is_dir($iconsets_root) && is_readable($iconsets_root)) {
+	if (($d = @dir($iconsets_root)) !== false) {
+		while (($entry = $d->read()) !== false) {
+			if ($entry != '.' && $entry != '..' && is_dir($iconsets_root.'/'.$entry)) {
+				$iconsets_combo[$entry] = $entry;
+			}
+		}
+	}
 }
 
@@ -122,5 +136,6 @@
 
 # Update user options
-if (isset($_POST['user_post_format'])) {
+if (isset($_POST['user_post_format'])) 
+{
 	try
 	{
@@ -159,4 +174,5 @@
 			$core->auth->user_prefs->interface->put('hide_std_favicon',!empty($_POST['user_ui_hide_std_favicon']),'boolean',null,true,true);
 		}
+		$core->auth->user_prefs->interface->put('iconset',(!empty($_POST['user_ui_iconset']) ? $_POST['user_ui_iconset'] : ''));
 		
 		# Udate user
@@ -175,23 +191,75 @@
 
 # Add selected favorites
-if (!empty($_POST['appendaction']) && !empty($_POST['append'])) {
-	$ws = $core->auth->user_prefs->addWorkspace('favorites');
-	$user_favs = $ws->DumpLocalPrefs();
-	$count = count($user_favs);
-	foreach ($_POST['append'] as $k => $v)
-	{
+if (!empty($_POST['appendaction'])) 
+{
+	try {
+		if (empty($_POST['append'])) {
+			throw new Exception(__('No favorite selected'));
+		}
+
+		$ws = $core->auth->user_prefs->addWorkspace('favorites');
+		$user_favs = $ws->DumpLocalPrefs();
+		$count = count($user_favs);
+		foreach ($_POST['append'] as $k => $v)
+		{
+			try {
+				$found = false;
+				foreach ($user_favs as $f) {
+					$f = unserialize($f['value']);
+					if ($f['name'] == $v) {
+						$found = true;
+						break;
+					}
+				}
+				if (!$found) {
+					$uid = sprintf("u%03s",$count);
+					$fav = array('name' => $_fav[$v][0],'title' => $_fav[$v][1],'url' => $_fav[$v][2],'small-icon' => $_fav[$v][3],
+						'large-icon' => $_fav[$v][4],'permissions' => $_fav[$v][5],'id' => $_fav[$v][6],'class' => $_fav[$v][7]);
+					$core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
+					$count++;
+				}
+			} catch (Exception $e) {
+				$core->error->add($e->getMessage());
+				break;
+			}
+		}
+	
+		if (!$core->error->flag()) {
+			http::redirect('preferences.php?append=1');
+		}
+	} catch (Exception $e) {
+		$core->error->add($e->getMessage());
+	}
+}
+
+# Delete selected favorites
+if (!empty($_POST['removeaction']))
+{
+	try {
+		if (empty($_POST['remove'])) {
+			throw new Exception(__('No favorite selected'));
+		}
+		
+		$ws = $core->auth->user_prefs->addWorkspace('favorites');
+		foreach ($_POST['remove'] as $k => $v)
+		{
+			try {
+				$core->auth->user_prefs->favorites->drop($v);
+			} catch (Exception $e) {
+				$core->error->add($e->getMessage());
+				break;
+			}
+		}
+		// Update pref_id values
 		try {
-			$found = false;
-			foreach ($user_favs as $f) {
-				$f = unserialize($f['value']);
-				if ($f['name'] == $v) {
-					$found = true;
-					break;
-				}
-			}
-			if (!$found) {
+			$user_favs = $ws->DumpLocalPrefs();
+			$core->auth->user_prefs->favorites->dropAll();
+			$count = 0;
+			foreach ($user_favs as $k => $v)
+			{
 				$uid = sprintf("u%03s",$count);
-				$fav = array('name' => $_fav[$v][0],'title' => $_fav[$v][1],'url' => $_fav[$v][2],'small-icon' => $_fav[$v][3],
-					'large-icon' => $_fav[$v][4],'permissions' => $_fav[$v][5],'id' => $_fav[$v][6],'class' => $_fav[$v][7]);
+				$f = unserialize($v['value']);
+				$fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
+					'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
 				$core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
 				$count++;
@@ -199,45 +267,11 @@
 		} catch (Exception $e) {
 			$core->error->add($e->getMessage());
-			break;
-		}
-	}
+		}
 	
-	if (!$core->error->flag()) {
-		http::redirect('preferences.php?append=1');
-	}
-}
-
-# Delete selected favorites
-if (!empty($_POST['removeaction']) && !empty($_POST['remove'])) {
-	$ws = $core->auth->user_prefs->addWorkspace('favorites');
-	foreach ($_POST['remove'] as $k => $v)
-	{
-		try {
-			$core->auth->user_prefs->favorites->drop($v);
-		} catch (Exception $e) {
-			$core->error->add($e->getMessage());
-			break;
-		}
-	}
-	// Update pref_id values
-	try {
-		$user_favs = $ws->DumpLocalPrefs();
-		$core->auth->user_prefs->favorites->dropAll();
-		$count = 0;
-		foreach ($user_favs as $k => $v)
-		{
-			$uid = sprintf("u%03s",$count);
-			$f = unserialize($v['value']);
-			$fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
-				'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
-			$core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
-			$count++;
+		if (!$core->error->flag()) {
+			http::redirect('preferences.php?removed=1');
 		}
 	} catch (Exception $e) {
 		$core->error->add($e->getMessage());
-	}
-	
-	if (!$core->error->flag()) {
-		http::redirect('preferences.php?removed=1');
 	}
 }
@@ -334,7 +368,5 @@
 }
 
-echo '<h2>'.$page_title.'</h2>';
-
-$tabindex = 2;
+echo '<h2 class="page-title">'.$page_title.'</h2>';
 
 # User profile
@@ -347,17 +379,17 @@
 '<div class="col">'.
 '<p><label for="user_name">'.__('Last Name:').
-form::field('user_name',20,255,html::escapeHTML($user_name),'',$tabindex++).'</label></p>'.
+form::field('user_name',20,255,html::escapeHTML($user_name)).'</label></p>'.
 
 '<p><label for="user_firstname">'.__('First Name:').
-form::field('user_firstname',20,255,html::escapeHTML($user_firstname),'',$tabindex++).'</label></p>'.
+form::field('user_firstname',20,255,html::escapeHTML($user_firstname)).'</label></p>'.
 
 '<p><label for="user_displayname">'.__('Display name:').
-form::field('user_displayname',20,255,html::escapeHTML($user_displayname),'',$tabindex++).'</label></p>'.
+form::field('user_displayname',20,255,html::escapeHTML($user_displayname)).'</label></p>'.
 
 '<p><label for="user_email">'.__('Email:').
-form::field('user_email',20,255,html::escapeHTML($user_email),'',$tabindex++).'</label></p>'.
+form::field('user_email',20,255,html::escapeHTML($user_email)).'</label></p>'.
 
 '<p><label for="user_url">'.__('URL:').
-form::field('user_url',30,255,html::escapeHTML($user_url),'',$tabindex++).'</label></p>'.
+form::field('user_url',30,255,html::escapeHTML($user_url)).'</label></p>'.
 
 '</div>'.
@@ -366,8 +398,8 @@
 
 '<p><label for="user_lang">'.__('User language:').
-form::combo('user_lang',$lang_combo,$user_lang,'l10n',$tabindex++).'</label></p>'.
+form::combo('user_lang',$lang_combo,$user_lang,'l10n').'</label></p>'.
 
 '<p><label for="user_tz">'.__('User timezone:').
-form::combo('user_tz',dt::getZones(true,true),$user_tz,'',$tabindex++).'</label></p>'.
+form::combo('user_tz',dt::getZones(true,true),$user_tz).'</label></p>'.
 
 '</div>'.
@@ -383,15 +415,13 @@
 	
 	'<p><label for="new_pwd">'.__('New password:').
-	form::password('new_pwd',20,255,'','',$tabindex++).'</label></p>'.
+	form::password('new_pwd',20,255).'</label></p>'.
 	
 	'<p><label for="new_pwd_c">'.__('Confirm password:').
-	form::password('new_pwd_c',20,255,'','',$tabindex++).'</label></p>'.
+	form::password('new_pwd_c',20,255).'</label></p>'.
 	'</fieldset>'.
 	
-	'<fieldset>'.
-	'<p>'.__('If you want to change your email or password you must provide your current password.').'</p>'.
+	'<p>'.__('If you have changed this user email or password you must provide your current password to save these modifications.').'</p>'.
 	'<p><label for="cur_pwd">'.__('Your password:').
-	form::password('cur_pwd',20,255,'','',$tabindex++).'</label></p>'.
-	'</fieldset>';
+	form::password('cur_pwd',20,255).'</label></p>';
 }
 
@@ -399,5 +429,5 @@
 '<p class="clear">'.
 $core->formNonce().
-'<input type="submit" accesskey="s" value="'.__('Save').'" tabindex="33" /></p>'.
+'<input type="submit" accesskey="s" value="'.__('Save').'" /></p>'.
 '</form>';
 
@@ -412,24 +442,32 @@
 
 '<p><label for="user_post_format">'.__('Preferred format:').
-form::combo('user_post_format',$formaters_combo,$user_options['post_format'],'',$tabindex++).'</label></p>'.
+form::combo('user_post_format',$formaters_combo,$user_options['post_format']).'</label></p>'.
 
 '<p><label for="user_post_status">'.__('Default entry status:').
-form::combo('user_post_status',$status_combo,$user_post_status,'',$tabindex++).'</label></p>'.
+form::combo('user_post_status',$status_combo,$user_post_status).'</label></p>'.
 
 '<p><label for="user_edit_size">'.__('Entry edit field height:').
-form::field('user_edit_size',5,4,(integer) $user_options['edit_size'],'',$tabindex++).'</label></p>'.
+form::field('user_edit_size',5,4,(integer) $user_options['edit_size']).'</label></p>'.
 
 '<p><label for="user_wysiwyg" class="classic">'.
-form::checkbox('user_wysiwyg',1,$user_options['enable_wysiwyg'],'',$tabindex++).' '.
+form::checkbox('user_wysiwyg',1,$user_options['enable_wysiwyg']).' '.
 __('Enable WYSIWYG mode').'</label></p>'.
 
 '<p><label for="user_ui_enhanceduploader" class="classic">'.
-form::checkbox('user_ui_enhanceduploader',1,$user_ui_enhanceduploader,'',$tabindex++).' '.
+form::checkbox('user_ui_enhanceduploader',1,$user_ui_enhanceduploader).' '.
 __('Activate enhanced uploader in media manager').'</label></p>';
+
+if (count($iconsets_combo) > 1) {
+	echo 
+		'<p><label for="user_ui_iconset">'.__('Iconset:').
+		form::combo('user_ui_iconset',$iconsets_combo,$user_ui_iconset).'</label></p>';
+} else {
+	form::hidden('user_ui_iconset','');
+}
 
 if ($core->auth->isSuperAdmin()) {
 	echo
 	'<p><label for="user_ui_hide_std_favicon" class="classic">'.
-	form::checkbox('user_ui_hide_std_favicon',1,$user_ui_hide_std_favicon,'',$tabindex++).' '.
+	form::checkbox('user_ui_hide_std_favicon',1,$user_ui_hide_std_favicon).' '.
 	__('Do not use standard favicon').'</label></p>'.
 	'<p class="clear form-note info">'.__('This will be applied for all users').'</p>';
@@ -444,5 +482,5 @@
 
 '<p><label for="user_acc_nodragdrop" class="classic">'.
-form::checkbox('user_acc_nodragdrop',1,$user_acc_nodragdrop,'',$tabindex++).' '.
+form::checkbox('user_acc_nodragdrop',1,$user_acc_nodragdrop).' '.
 __('Disable javascript powered drag and drop for ordering items').'</label></p>'.
 
@@ -454,13 +492,13 @@
 
 '<p><label for="user_dm_doclinks" class="classic">'.
-form::checkbox('user_dm_doclinks',1,$user_dm_doclinks,'',$tabindex++).' '.
+form::checkbox('user_dm_doclinks',1,$user_dm_doclinks).' '.
 __('Display documentation links').'</label></p>'.
 
 '<p><label for="user_dm_dcnews" class="classic">'.
-form::checkbox('user_dm_dcnews',1,$user_dm_dcnews,'',$tabindex++).' '.
+form::checkbox('user_dm_dcnews',1,$user_dm_dcnews).' '.
 __('Display Dotclear news').'</label></p>'.
 
 '<p><label for="user_dm_quickentry" class="classic">'.
-form::checkbox('user_dm_quickentry',1,$user_dm_quickentry,'',$tabindex++).' '.
+form::checkbox('user_dm_quickentry',1,$user_dm_quickentry).' '.
 __('Display quick entry form').'</label></p>'.
 
@@ -474,5 +512,5 @@
 '<p class="clear">'.
 $core->formNonce().
-'<input type="submit" accesskey="s" value="'.__('Save').'" tabindex="33" /></p>'.
+'<input type="submit" accesskey="s" value="'.__('Save').'" /></p>'.
 '</form>';
 
@@ -496,8 +534,8 @@
 			$count++;
 			echo '<li id="fu-'.$k.'">'.
-				'<img src="'.$fav['large-icon'].'" alt="" /> '.
+				'<img src="'.dc_admin_icon_url($fav['large-icon']).'" alt="" /> '.
 				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 +580,5 @@
 			$count++;
 			echo '<li id="fd-'.$k.'">'.
-			'<img src="'.$fav['small-icon'].'" alt="" /> '.$fav['title'].'</li>';
+			'<img src="'.dc_admin_icon_url($fav['small-icon']).'" alt="" /> '.__($fav['title']).'</li>';
 		}
 	}
@@ -555,8 +593,8 @@
 $array = $_fav;
 function cmp($a,$b) {
-    if ($a[1] == $b[1]) {
+    if (__($a[1]) == __($b[1])) {
         return 0;
     }
-    return ($a[1] < $b[1]) ? -1 : 1;
+    return (__($a[1]) < __($b[1])) ? -1 : 1;
 }
 $array=$array->getArrayCopy();
@@ -568,6 +606,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="'.dc_admin_icon_url($fav[3]).'" alt="" /> '.'<span class="zoom"><img src="'.dc_admin_icon_url($fav[4]).'" alt="" /></span>'.
+			__($fav[1]).'</label>'.'</li>';
 	}
 }	
Index: admin/search.php
===================================================================
--- admin/search.php	(revision 270)
+++ admin/search.php	(revision 557)
@@ -73,12 +73,12 @@
 
 echo
-'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Search').'</h2>'.
+'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Search').'</span></h2>'.
 '<form action="search.php" method="get">'.
-'<fieldset><legend>'.__('Search options').'</legend>'.
-'<p><label for="q" class="classic">'.__('Query:').' '.form::field('q',30,255,html::escapeHTML($q)).'</label> '.
-'<label for="qtype1" class="classic">'.form::radio(array('qtype','qtype1'),'p',$qtype == 'p').' '.__('search entries').'</label> '.
-'<label for="qtype2" class="classic">'.form::radio(array('qtype','qtype2'),'c',$qtype == 'c').' '.__('search comments').'</label> '.
-' <input type="submit" value="'.__('ok').'" /></p>'.
-'</fieldset>'.
+'<div class="fieldset"><h3>'.__('Search options').'</h3>'.
+'<p><label for="q">'.__('Query:').' </label>'.form::field('q',30,255,html::escapeHTML($q)).'</p>'.
+'<p><label for="qtype1" class="classic">'.form::radio(array('qtype','qtype1'),'p',$qtype == 'p').' '.__('Search entries').'</label> '.
+'<label for="qtype2" class="classic">'.form::radio(array('qtype','qtype2'),'c',$qtype == 'c').' '.__('Search comments').'</label></p>'.
+'</p><input type="submit" value="'.__('Search').'" /></p>'.
+'</div>'.
 '</form>';
 
Index: admin/style/candyUpload/style.css
===================================================================
--- admin/style/candyUpload/style.css	(revision 3)
+++ admin/style/candyUpload/style.css	(revision 536)
@@ -1,33 +1,27 @@
 
-div.cu-ctrl {
+.cu-ctrl {
 	background: #f5f5f5;
-	padding: 5px 0 0 0;
+	padding: .5em 0 0 0;
 	margin: 0 0 1em 0;
 	overflow: hidden;
-	border-color: #ccc;
-	border-width: 1px 0;
-	border-style: solid;
 }
-
-div.cu-msg {
-	padding: 0 0.5em;
+.cu-msg {
 	font-weight: bold;
 }
-div.cu-msg.cu-error {
+.cu-msg.cu-error {
 	color: #c00;
 }
-
-div.cu-files {
+.cu-files {
 	padding: 0 0.5em;
 	margin: 10px 0;
 }
-div.cu-file {
+.cu-file {
 	margin: 0 0 8px 0;
 	position: relative;
 }
-div.cu-fileinfo {
+.cu-fileinfo {
 	margin-left: 16px;
 }
-div.cu-fileinfo span.cu-filecancel {
+.cu-fileinfo span.cu-filecancel {
 	display: block;
 	position: absolute;
@@ -36,5 +30,5 @@
 	left: -16px;
 }
-div.cu-files span.cu-filecancel a {
+.cu-filecancel a {
 	display: block;
 	width: 12px;
@@ -45,16 +39,15 @@
 	outline: none;
 }
-div.cu-files span.cu-filemsg {
+.cu-filemsg {
 	font-weight: bold;
 	color: green;
 }
-div.cu-files span.cu-filemsg.cu-error {
+span.cu-filemsg.cu-error {
 	color: #c00;
 }
-
-div.cu-progress {
+.cu-progress {
 	margin-left: 16px;
 }
-div.cu-progress div {
+.cu-progress div {
 	height: 10px;
 	width: 0;
@@ -69,6 +62,5 @@
 	-moz-border-radius: 2px;
 }
-
-div.cu-btn {
+.cu-btn {
 	padding: 0 0.5em;
 	line-height: 1.2em;
@@ -77,20 +69,23 @@
 	position: relative;
 }
-div.cu-btn span {
+.cu-btn span {
 	display: block;
-	margin: 0 0 0 .5em;
+	margin: 0 1em 0 0;
 	float: right;
 }
-div.cu-btn span a {
+.cu-btn span a {
 	display: block;
 	padding: .3em 1.5em;
 }
-div.cu-btn span.cu-btn-browse {
+span.cu-btn-browse {
 	float: none;
 	position: absolute;
-	left: 0.5em;
+	left: 0;
 	margin: 0;
 }
-div.cu-btn span.cu-btn-upload a.button {
+span.cu-btn-upload, span.cu-btn-clean {
+	margin-right: 0;
+}
+span.cu-btn-upload a.button {
 	color: #fff;
 	border: 1px solid #2373A8;
@@ -99,5 +94,6 @@
 	background: -moz-linear-gradient(top,  #2C8FD1,  #2373A8);
 }
-div.cu-btn span.cu-btn-upload a.button:hover, div.cu-btn span.cu-btn-upload a.button:focus {
+span.cu-btn-upload a.button:hover, 
+span.cu-btn-upload a.button:focus {
 	color: #fff;
 	border: 1px solid #2C8FD1;
@@ -107,11 +103,10 @@
 	filter:  progid:DXImageTransform.Microsoft.gradient(startColorstr='#2373A8', endColorstr='#2C8FD1');
 }
-div.cu-maxsize {
+.cu-maxsize.form-note {
 	clear: both;
-	margin: .75em 0 0 0.5em;
+	margin: 1.5em 0 0;
 	font-style: italic;
 }
-
-div.cu-disable {
+.cu-disable {
 	margin: 1em 0;
 	padding: 0 0 0.5em 0.5em;
Index: admin/style/default.css
===================================================================
--- admin/style/default.css	(revision 257)
+++ admin/style/default.css	(revision 683)
@@ -11,6 +11,8 @@
 # -- END LICENSE BLOCK -----------------------------------------
 */
+
+/* ------------------------------------------------------------------ html */
 body {
-	font: 76%/1.5em Helvetica,Arial,sans-serif;
+	font: 75%/1.5em Helvetica,Arial,sans-serif;
 	color: #333;
 	background: #f5f5f5;
@@ -21,6 +23,4 @@
 	background: #fff;
 }
-
-a img,:link img,:visited img { border:none }
 
 a, a:link, a:visited {
@@ -32,4 +32,7 @@
 	text-decoration: underline;
 }
+a img, a:link img, a:visited img { 
+	border:none;
+}
 
 h1, h2, h3, h4, h5, h6, p {
@@ -37,5 +40,4 @@
 	margin-bottom: 0.6em;
 }
-
 h2 {
 	color: #666;
@@ -43,14 +45,14 @@
 	padding: 4px 0;
 }
-
+.page-title {
+	color: #d30e60;
+}
 h3 {
 	color: #333;
 	font-size: 1.2em;
 }
-
 p, div.p {
 	margin: 0 0 1em 0;
 }
-
 hr {
 	height: 1px;
@@ -59,5 +61,4 @@
 	border-style: solid;
 }
-
 pre, code {
 	font: 100% "Andale Mono","Courier New",monospace;
@@ -77,12 +78,35 @@
 }
 
-
 /* LAYOUT
 -------------------------------------------------------- */
-
+/* header */
+#header {
+	background: #575859;
+	height: 3em;
+	position: relative;
+}
+#prelude {
+	background: #575859;
+	line-height: 1.5em;
+	margin: 0;
+	padding: 0 1.7em 0 1em;
+	overflow: hidden;
+	position: absolute;
+	top: 1.2em;
+	left: 0;
+	}
+#prelude li {
+	list-style-type: none;
+	margin: 0 1em 0 0;
+	background:transparent;
+	}
+#prelude li a {
+	color:#fff;
+	}
 #top {
 	margin: 0;
 	padding: 0;
-	background: #575859 url(dc_bg.png) repeat-x 0 3em;
+	width: 13em;
+	float: left;
 }
 #top h1 {
@@ -103,49 +127,57 @@
 	color: #fff;
 }
-
-#info-box {
+#info-boxes {
 	background: #575859;
-	position: absolute;
-	left: 13em;
-	top: 3px;
-	margin: 0;
-	padding: 3px 3px 4px 0;
+	font-size: .95em;
+	height: 3em;
+}
+#info-box1 {
+	margin: 0;
+	padding: .5em 3px 4px 0;
 	color: #fff;
+	float: left;
+	background: #575859;
 }
 #info-box2 {
+	margin: .1em 0 0 0;
+	padding: .5em 1.3em 4px 0;
+	color: #fff;
+	float: right;
+	text-align: right;
 	background: #575859;
-	position: absolute;
-	right: 1em;
-	top: 3px;
-	margin: 0;
-	padding: 3px 3px 4px 0;
-	color: #fff;
-}
-#info-box div, #info-box2 div {
-	margin: 0; padding: 0;
-}
-#info-box div div, #info-box2 div div {
-	display: inline;
-}
-#info-box>form>div, #info-box2>form>div {
-	line-height: 1.5;
-}
-#info-box select {
-	width: 20em;
-}
-#info-box a img, #info-box2 a img {
+	height: 2em;
+}
+#info-box1 select {
+	width: 15em;
+}
+#info-box1 a img, #info-box2 a img {
 	vertical-align: middle;
 	padding-left: .3em;
 	}
-#info-box a, #info-box2 a {
+#info-box1 a, #info-box2 a {
 	background: #575859;
 	font-weight: bold;
 	color: #fff;
 	border-bottom-color: #ccc;
-}
-#info-box a {
-	margin-left: 2em;
-}
-
+	margin-left: .3em;
+	margin-right: .3em;
+	white-space: nowrap;
+	font-weight: normal;
+}
+#info-box1 a {
+	margin-left: 1.33em;
+}
+#info-box2 a.active {
+	border-bottom-color: #f5f5f5;
+	margin: 0;
+	padding: 1.2em .5em;
+	background-color: #f5f5f5;
+	color: #333;
+	font-weight: bold;
+}
+#info-box2 span {
+	color: #575859;
+}
+/* prelude */
 #wrapper {
 	width: 100%;
@@ -158,5 +190,5 @@
 }
 #content {
-	margin: .5em 1.5em 4em 13em;
+	margin: 1.5em 1.5em 4em 13em;
 	padding: 1em;
 	background: #fff;
@@ -169,16 +201,86 @@
 	#content:before, #content:after {content:"";display:table;}
 	#content:after {clear:both;}
-
+/* -------------------------------------------------- layout - multipart */
+.three-cols {
+}
+.three-cols .col {
+	width: 32.3%;
+	float: left;
+	margin-left: 1%;
+}
+.three-cols .col:first-child {
+	width: 33.3%;
+	margin-left: 0;
+}
+.two-cols {
+	position: static;
+}
+.two-cols .col {
+	width: 49%;
+	margin-left: 2%;
+	float: left;
+}
+.two-cols .col:first-child {
+	width: 49%;
+	margin-left: 0;
+}
+.two-cols .col70{
+	width: 69%;
+	margin-left: 0;
+	float: left;
+}
+.two-cols .col30 {
+	width: 28%;
+	margin-left: 2%;
+	float: left;
+}
+/* -------------------------------------------------------------- layout - onglets */
+.part-tabs ul {
+	padding: .3em 0 1px 1em;
+	border-bottom: 1px solid #999;
+}
+.part-tabs li {
+	list-style: none;
+	margin: 0;
+	display: inline;
+}
+.part-tabs li a {
+	padding: .3em 0.5em;
+	margin-right: .5em;
+	border: 1px solid #999;
+	border-bottom: none;
+	background: #dfdfdf;
+	text-decoration: none;
+	-webkit-border-top-left-radius: .3em;
+	-webkit-border-top-right-radius: .3em;
+	-moz-border-radius-topleft: .3em;
+	-moz-border-radius-topright: .3em;
+	border-top-left-radius: .3em;
+	border-top-right-radius: .3em;
+	color: #000;
+}
+.part-tabs li.part-tabs-link a {
+	background: #ffe;
+}
+.part-tabs li a:hover, .part-tabs li a:focus {
+	color: #000;
+	background: #fff;
+	border-bottom-color: #fff;
+}
+.part-tabs li.part-tabs-active a {
+	background: #fff;
+	border-bottom: 1px solid #fff;
+	color: #000;
+	font-weight: bold;
+}
+/* ------------------------------------------------------------------ main-menu */
 #main-menu {
 	width: 13em;
 	float: left;
-	margin-top: 1em;
+	margin-top: 1.2em;
 	margin-bottom: 1em;
 }
-#main-menu * {
-}
-
 #main-menu h3 {
-	margin: 0 0 0.5em 0;
+	margin: 0 0 0.5em;
 	padding: .5em 0 0 .5em;
 	text-transform: uppercase;
@@ -194,5 +296,5 @@
 #main-menu li {
 	display: block;
-	margin: 0.5em 0 0 0;
+	margin: 0.5em 0 0;
 	padding: .2em 0 0 32px;
 	background-repeat: no-repeat;
@@ -206,5 +308,5 @@
 	color: #333;
 }
-#main-menu li.active {
+#main-menu .active {
 	background-color: #fff;
 	padding: .4em 0 .1em 32px;
@@ -214,8 +316,23 @@
 	margin-right: -1px;
 }
-#main-menu #dashboard-menu li {
-	margin-left: 0;
-}
-
+#favorites-menu {
+	margin: 0 0 2em;
+}
+#favorites-menu h3 {
+	color: #333;
+	text-transform: none;
+}
+#favorites-menu a {
+	color: #333;
+}
+#favorites-menu .active {
+	background-color: transparent;
+	border: none;
+}
+#favorites-menu .active a {
+	font-weight: bold;
+	color: #666;
+}
+/* ------------------------------------------------------------------ footer */
 #footer {
 	clear: both;
@@ -241,27 +358,36 @@
 	font-weight: normal;
 }
-
-#debug {
-	position: absolute;
-	top: 0;
+/* ---------------------------------------------------------------------------- auth.php */
+#login-screen {
+	display: block;
+	width: 18em;
+	margin: 1.5em auto 0;
+	font-size: 1.1em;
+}
+#login-screen h1 {
+	text-indent: -2000px;
+	background: transparent url(dotclear-logo2.png) no-repeat top left;
+	height: 50px;
+	margin-bottom: .5em;
+	margin-left: .5em;
+}
+#login-screen fieldset, #login-screen .fieldset {
+	border: 1px solid #999;
+	padding: 1em 1em 0 1em;
+	-moz-border-radius: 4px;
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+}
+#login-screen input[type=text], #login-screen input[type=password], #login-screen input[type=submit] {
 	width: 100%;
-	height: 4px;
-	background: #d99;
-}
-#debug div {
-	display: none;
-	padding: 3px 0.5em 2px;
-}
-#debug p {
-	margin: 0.5em 0;
-}
-#debug:hover {
-	height: auto;
-}
-#debug:hover div {
-	display: block;
-}
-
-/* DASHBOARD */
+}
+#login-screen #issue {
+	margin-left: 1em;
+	font-size: 1em;
+}
+#login-screen #issue strong {font-weight: normal;}
+
+
+/* ------------------------------------------------------------------ dashboard */
 #dashboard-main {
 	float: left;
@@ -275,10 +401,10 @@
 	float: none;
 }
-#dashboard-main #icons {
+#icons {
 	overflow: hidden;
 	padding-bottom: 1em;
 	text-align: center;
 }
-#dashboard-main #icons p {
+#icons p {
 	width: 210px;
 	text-align: center;
@@ -286,23 +412,27 @@
 	display:inline-block;
 }
-#dashboard-main #icons span {
-	display: block;
-}
-#dashboard-main #icons a {
-	border-bottom-width: 0;
-}
-#dashboard-main #icons span a {
-	border-bottom-width: 1px;
-}
-
-#dashboard-main #quick {
+#icons a,
+#icons a:link,
+#icons a:visited,
+#icons a:hover,
+#icons a:focus {
+	border-bottom-width: 0px;
+	text-decoration: none;
+}
+#icons a span {
+	border-bottom: 1px dotted #f90;
+}
+#icons a:focus span, #icons a:hover span {
+	text-decoration: underline;
+}
+#quick {
 	clear: left;
 	margin-top: 2em;
 }
-#dashboard-main #quick h3 {
+#quick h3 {
 	margin-bottom: 0.2em;
 	font-size: 1.2em;
 }
-#dashboard-main #quick p.qinfo {
+#quick p.qinfo {
 	margin: -.7em -1em 1em;
 	background: #eef url(info.png) no-repeat .2em .2em;
@@ -311,5 +441,4 @@
 	color: #666;
 }
-
 #dashboard-items {
 	float: left;
@@ -319,5 +448,5 @@
 	padding-top: 3em;
 }
-#dashboard-items p img {
+#dashboard-items img {
 	vertical-align: middle;
 }
@@ -331,12 +460,12 @@
 	color: #666;
 }
-#dashboard-items #news dt {
+#news dt {
 	font-weight: bold;
 	margin: 0 0 0.4em 0;
 }
-#dashboard-items #news dd {
+#news dd {
 	margin: 0 0 1em 0;
 }
-#dashboard-items #news dd p {
+#news dd p {
 	margin: 0.2em 0 0 0;
 }
@@ -350,18 +479,21 @@
 	color: #fff;
 }
-
-/* POST */
+/* ------------------------------------------------------------------ post */
+#entry-wrapper {
+	float: left;
+	width: 100%;
+	margin-right: -18em;
+}
+#entry-content {
+	margin-right: 18em;
+}
 #entry-sidebar {
 	width: 17em;
 	float: right;
 }
-#entry-content {
-	margin-right: 18em;
-}
 #comments {
 	clear: both;
 }
-
-/* CATEGORIES */
+/* ------------------------------------------------------------------ categories */
 #categories {
 	margin: 1em 0 2em;
@@ -372,5 +504,5 @@
 	padding: 0;
 }
-#categories ul li {
+#categories li {
 	margin: .5em 0;
 	padding: .3em 1.5em;
@@ -381,11 +513,11 @@
 	border-radius: .3em;
 }
-#categories ul li h4 {
-	margin: 0;
-}
-#categories ul li h4 span {
+#categories h4 {
+	margin: 0;
+}
+#categories h4 span {
 	font-weight: normal;
 }
-#categories ul li p {
+#categories li p {
 	margin: 0;
 }
@@ -393,6 +525,5 @@
 	width: 100%;
 }
-
-/* MEDIA */
+/* ------------------------------------------------------------------ media */
 #media-icon {
 	float: left;
@@ -417,5 +548,4 @@
 	height: 500px;
 }
-
 #add-file-f {
 	position: relative;
@@ -428,6 +558,52 @@
 	border: none;
 }
-
-/* favorites */
+.media-list {
+	position: static;
+}
+.media-col-0 {
+	clear: left;
+}
+.media-item {
+	position: relative;
+	border-top: 1px solid #ccc;
+	margin-bottom: 1em;
+	padding: 5px 0;
+}
+div.media-list .media-item {
+	width: 49%;
+	float: left;
+	margin-right: 1%;
+}
+a.media-icon {
+	display: block;
+	border-bottom: none;
+	float: left;
+}
+.media-icon img {
+	display: block;
+}
+.media-item ul {
+	display: block;
+	list-style: none;
+	margin: 0 0 0 60px;
+	padding: 0;
+}
+li.media-action {
+	display: block;
+	position: absolute;
+	top: 5px;
+	right: 5px;
+	height: 16px;
+}
+li.media-action a {
+	border: none;
+}
+li.media-action form {
+	display: inline;
+}
+li.media-action input {
+	border: none;
+}
+/* ------------------------------------------------------------------ preferences */
 #my-favs ul {
 	list-style-type: none;
@@ -436,5 +612,5 @@
 	line-height: 1.2;
 }
-#my-favs ul li {
+#my-favs li {
 	display: block;
 	float: left;
@@ -455,10 +631,8 @@
 	display: inline;
 }
-
 #default-favs h3 {
 	margin-top: 2em;
 	margin-bottom: 1em;
 }
-
 .fav-list {
 	list-style-type: none;
@@ -472,5 +646,5 @@
 	position: relative;
 }
-.fav-list li img {
+.fav-list img {
 	vertical-align: middle;
 	margin-right: .2em;
@@ -491,6 +665,130 @@
 	border-radius: .5em;
 }
-
-/* Help */
+/* -------------------------------------------------------------------- Themes */
+#themes {
+	border-bottom: 1px solid #ccc;
+	margin: 1em 0;
+}
+#themes div.theme-details {
+	clear: left;
+	border-top: 1px solid #ccc;
+	padding: 1em 0;
+}
+#themes div.theme-details:hover {
+	background: #eee;
+}
+#themes div.theme-details div.theme-shot {
+	float: left;
+}
+#themes div.theme-details div.theme-shot img {
+	display: block;
+	width: 57px;
+	height: 50px;
+	border: 1px solid #ccc;
+}
+#themes div.theme-details div.theme-info {
+	margin-left: 67px;
+}
+#themes div.theme-details div.theme-info span.theme-desc {
+	display: block;
+}
+#themes div.theme-details div.theme-info span.theme-version {
+	color: #666;
+}
+#themes div.theme-details div.theme-actions {
+	margin-left: 67px;
+}
+/* Themes list, JS version */
+#themes-wrapper {
+}
+#theme-box {
+	border: 1px solid #999;
+	border-left: none;
+	padding: 5px;
+	float: right;
+	height: 420px;
+	width: 320px;
+	overflow: auto;
+}
+#theme-box div.theme-shot img {
+	display: block;
+	margin: 0 0 0 10px;
+	width: 280px;
+	height: 245px;
+	border: 1px solid #ccc;
+}
+#theme-box div.theme-info {
+	margin: 1em 0 0 10px;
+}
+#theme-box h3 {
+	margin: 0;
+}
+#theme-box div.theme-info span {
+	display: block;
+}
+#theme-box span.theme-version {
+	color: #666;
+}
+#theme-box span.theme-parent-ok {
+	color: #666;
+}
+#theme-box span.theme-parent-missing {
+	color: #c00;
+	font-weight:bold;
+}
+#theme-box div.theme-actions {
+	margin-left: 10px;
+}
+#themes-wrapper #themes {
+	border: 1px solid #999;
+	overflow: auto;
+	height: 420px;
+	padding: 5px;
+	margin: 0;
+}
+#themes div.theme-details-js {
+	float: left;
+	width: 120px;
+	height: 150px;
+	margin: 0 10px 20px;
+	padding: 10px 10px 0;
+	text-align: center;
+	background: #f3f3f3;
+	border: 1px solid #f3f3f3;
+	cursor: pointer;
+	-moz-border-radius: 4px;
+	-webkit-border-radius: 4px;
+	border-radius: 4px;
+}
+#themes div.theme-details-js label {
+	cursor: pointer;
+}
+#themes div.theme-details-js.theme-selected {
+	background: #E5E3DA;
+	border: 1px solid #999;
+}
+#themes div.theme-details-js div.theme-shot img {
+	width: 120px;
+	height: 105px;
+	border: 1px solid #fff;
+}
+#themes div.theme-details-js h3 {
+	font-family: inherit;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+}
+/* ----------------------------------------------------------  Plugins list */
+#plugins td.action {
+	vertical-align: middle;
+}
+
+select.l10n option {
+	padding-left: 16px;
+}
+option.avail10n {
+	background: transparent url(../images/check-on.png) no-repeat 0 50%;
+}
+/* ------------------------------------------------------------------ contextual help */
 #help {
 	margin-top: 2em;
@@ -539,8 +837,16 @@
 	padding: 0 5px 1em 5px;
 }
-
-/* POPUP */
+.help-content dt {
+	font-weight: bold;
+	color: #626262;
+	margin: 0;
+}
+.help-content dd {
+	margin: 0.3em 0 1.5em 0;
+}
+/* ------------------------------------------------------------------ popups */
 body.popup #wrapper, body.popup #top {
 	margin-top: -1.5em;
+	float: none;
 }
 body.popup #top h1 {
@@ -562,9 +868,59 @@
 	border: none;
 }
-
-/* CLASSES
--------------------------------------------------------- */
-
-/* -------------- paragraphe pour bouton Nouveau bidule ----------- */
+/* ------------------------------------------------------------------ messages */
+div.error, p.error, 
+div.message, p.message, 
+div.static-msg, p.static-msg {
+	padding: 0.5em 0.5em 0.5em 40px;
+	margin-bottom: 1em;
+	-moz-border-radius: 8px;
+	-webkit-border-radius: 8px;
+	border-radius: 8px;
+}
+p.error, p.message, p.static-msg {
+	padding-top: 1em;
+	padding-bottom: 1em;
+}
+div.error, p.error {
+	background: #e5bfbf url(msg-error.png) no-repeat 5px 5px;
+	color: #600;
+}
+div.message, p.message, 
+div.static-msg, p.static-msg {
+	background: #666 url(msg-std.png) no-repeat 5px 5px;
+	color: #fff;
+}
+div.message a, p.message a, 
+div.static-msg a, p.static-msg a {
+	color: #fff;
+}
+/* ------------------------------------------------------------------ debug */
+#debug {
+	position: absolute;
+	top: 0;
+	width: 100%;
+	height: 4px;
+	background: #d99;
+}
+#debug div {
+	display: none;
+	padding: 3px 0.5em 2px;
+}
+#debug p {
+	margin: 0.5em 0;
+}
+#debug:hover {
+	height: auto;
+}
+#debug:hover div {
+	display: block;
+}
+/* -------------------------------------------------------------------- CLASSES COMMUNES */
+
+.no-margin {
+	margin: 0;
+}
+
+/* paragraphe pour bouton Nouveau bidule */
 p.top-add {
 	text-align: right;
@@ -579,5 +935,4 @@
 	vertical-align: middle;
 }
-
 /* Si quelque chose a besoin d'être caché sauf pour les revues d'écran */
 .hidden {
@@ -591,15 +946,4 @@
     overflow: hidden;
     }
-
-/* -------------- aide ----------- */
-.help-content dt {
-	font-weight: bold;
-	color: #626262;
-	margin: 0;
-}
-.help-content dd {
-	margin: 0.3em 0 1.5em 0;
-}
-
 .clear {
 	clear: both;
@@ -625,40 +969,13 @@
 	overflow: auto;
 }
-
 .grid {
 	background: transparent repeat url('grid.png') 0 0;
 }
-
 .line p {
 	margin: 0;
 }
-
-div.error, p.error, div.message, p.message, div.static-msg, p.static-msg {
-	padding: 0.5em 0.5em 0.5em 40px;
-	margin-bottom: 1em;
-	-moz-border-radius: 8px;
-	-webkit-border-radius: 8px;
-	border-radius: 8px;
-}
-p.error, p.message, p.static-msg {
-	padding-top: 1em;
-	padding-bottom: 1em;
-}
-div.error, p.error {
-	background: #e5bfbf url(msg-error.png) no-repeat 5px 5px;
-	color: #600;
-}
-div.message, p.message, div.static-msg, p.static-msg {
-	background: #666 url(msg-std.png) no-repeat 5px 5px;
-	color: #fff;
-}
-div.message a, p.message a, div.static-msg a, p.static-msg a {
-	color: #fff;
-}
-
 .offline {
 	color: #666;
 }
-
 ul.nice {
 	margin: 1em 0;
@@ -670,39 +987,9 @@
 	padding: 0;
 }
-
-.three-cols {
-}
-.three-cols .col {
-	width: 32.3%;
-	float: left;
-	margin-left: 1%;
-}
-.three-cols .col:first-child {
-	width: 33.3%;
-	margin-left: 0;
-}
-.two-cols {
-	position: static;
-}
-.two-cols .col {
-	width: 49%;
-	margin-left: 2%;
-	float: left;
-}
-.two-cols .col:first-child {
-	width: 49%;
-	margin-left: 0;
-}
-.two-cols .col70{
-	width: 69%;
-	margin-left: 0;
-	float: left;
-}
-.two-cols .col30 {
-	width: 28%;
-	margin-left: 2%;
-	float: left;
-}
-
+.zip-dl {
+	background: transparent url(package.png) no-repeat 0 50%;
+	padding: 5px 0 5px 20px;
+}
+/* pas trouvé dans le code */
 .comment {
 	border-top: 2px solid #ccc;
@@ -717,224 +1004,4 @@
 	right: 0;
 }
-
-/* -------- onglets ------ */
-.part-tabs ul {
-	padding: .3em 0 1px 1em;
-	border-bottom: 1px solid #999;
-}
-.part-tabs li {
-	list-style: none;
-	margin: 0;
-	display: inline;
-}
-.part-tabs li a {
-	padding: .3em 0.5em;
-	margin-right: .5em;
-	border: 1px solid #999;
-	border-bottom: none;
-	background: #dfdfdf;
-	text-decoration: none;
-	-webkit-border-top-left-radius: .3em;
-	-webkit-border-top-right-radius: .3em;
-	-moz-border-radius-topleft: .3em;
-	-moz-border-radius-topright: .3em;
-	border-top-left-radius: .3em;
-	border-top-right-radius: .3em;
-	color: #000;
-}
-.part-tabs li.part-tabs-link a {
-	background: #ffe;
-}
-.part-tabs li a:hover, .part-tabs li a:focus {
-	color: #000;
-	background: #fff;
-	border-bottom-color: #fff;
-}
-.part-tabs li.part-tabs-active a {
-	background: #fff;
-	border-bottom: 1px solid #fff;
-	color: #000;
-	font-weight: bold;
-}
-
-/* Themes list */
-#themes {
-	border-bottom: 1px solid #ccc;
-	margin: 1em 0;
-}
-#themes div.theme-details {
-	clear: left;
-	border-top: 1px solid #ccc;
-	padding: 1em 0;
-}
-#themes div.theme-details:hover {
-	background: #eee;
-}
-#themes div.theme-details div.theme-shot {
-	float: left;
-}
-#themes div.theme-details div.theme-shot img {
-	display: block;
-	width: 57px;
-	height: 50px;
-	border: 1px solid #ccc;
-}
-#themes div.theme-details div.theme-info {
-	margin-left: 67px;
-}
-#themes div.theme-details div.theme-info span.theme-desc {
-	display: block;
-}
-#themes div.theme-details div.theme-info span.theme-version {
-	color: #666;
-}
-#themes div.theme-details div.theme-actions {
-	margin-left: 67px;
-}
-/* Themes list, JS version */
-#themes-wrapper {
-}
-#theme-box {
-	border: 1px solid #999;
-	border-left: none;
-	padding: 5px;
-	float: right;
-	height: 420px;
-	width: 320px;
-	overflow: auto;
-}
-#theme-box div.theme-shot img {
-	display: block;
-	margin: 0 0 0 10px;
-	width: 280px;
-	height: 245px;
-	border: 1px solid #ccc;
-}
-#theme-box div.theme-info {
-	margin: 1em 0 0 10px;
-}
-#theme-box h3 {
-	margin: 0;
-}
-#theme-box div.theme-info span {
-	display: block;
-}
-#theme-box span.theme-version {
-	color: #666;
-}
-#theme-box span.theme-parent-ok {
-	color: #666;
-}
-#theme-box span.theme-parent-missing {
-	color: #c00;
-	font-weight:bold;
-}
-#theme-box div.theme-actions {
-	margin-left: 10px;
-}
-#themes-wrapper #themes {
-	border: 1px solid #999;
-	overflow: auto;
-	height: 420px;
-	padding: 5px;
-	margin: 0;
-}
-#themes div.theme-details-js {
-	float: left;
-	width: 120px;
-	height: 150px;
-	margin: 0 10px 20px;
-	padding: 10px 10px 0;
-	text-align: center;
-	background: #f3f3f3;
-	border: 1px solid #f3f3f3;
-	cursor: pointer;
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	border-radius: 4px;
-}
-#themes div.theme-details-js label {
-	cursor: pointer;
-}
-#themes div.theme-details-js.theme-selected {
-	background: #E5E3DA;
-	border: 1px solid #999;
-}
-#themes div.theme-details-js div.theme-shot img {
-	width: 120px;
-	height: 105px;
-	border: 1px solid #fff;
-}
-#themes div.theme-details-js h3 {
-	font-family: inherit;
-	font-weight: normal;
-	margin: 0;
-	padding: 0;
-}
-
-/* Plugins list */
-#plugins td.action {
-	vertical-align: middle;
-}
-.media-list {
-	position: static;
-}
-.media-col-0 {
-	clear: left;
-}
-.media-item {
-	position: relative;
-	border-top: 1px solid #ccc;
-	margin-bottom: 1em;
-	padding: 5px 0;
-}
-div.media-list .media-item {
-	width: 49%;
-	float: left;
-	margin-right: 1%;
-}
-a.media-icon {
-	display: block;
-	border-bottom: none;
-	float: left;
-}
-.media-icon img {
-	display: block;
-}
-.media-item ul {
-	display: block;
-	list-style: none;
-	margin: 0 0 0 60px;
-	padding: 0;
-}
-li.media-action {
-	display: block;
-	position: absolute;
-	top: 5px;
-	right: 5px;
-	height: 16px;
-}
-li.media-action a {
-	border: none;
-}
-li.media-action form {
-	display: inline;
-}
-li.media-action input {
-	border: none;
-}
-
-.zip-dl {
-	background: transparent url(package.png) no-repeat 0 50%;
-	padding: 5px 0 5px 20px;
-}
-
-select.l10n option {
-	padding-left: 16px;
-}
-option.avail10n {
-	background: transparent url(../images/check-on.png) no-repeat 0 50%;
-}
-
 /* TABLES
 -------------------------------------------------------- */
@@ -947,4 +1014,12 @@
 	background: #ddd;
 }
+caption {
+	color: #333;
+	font-size: 1.2em;
+	font-weight: bold;
+	text-align: left;
+	margin-bottom: .5em;
+}
+
 th, td {
 	border-width: 0 0 1px 0;
@@ -958,9 +1033,7 @@
 	border-bottom-color: #666;
 }
-
 .noborder td, td.noborder, .noborder th, th.noborder {
 	border-width: 0;
 }
-
 table .maximal, table.maximal {
 	width: 100%;
@@ -969,10 +1042,8 @@
 	width: 1px;
 }
-
 table .nowrap {
 	white-space: nowrap;
 	vertical-align: top;
 }
-
 td.status {
 	vertical-align: middle;
@@ -1014,6 +1085,5 @@
 }
 
-/* FORMS
--------------------------------------------------------- */
+/* ----------------------------------------------------------------- FORMS */
 form {
 	display: block;
@@ -1021,6 +1091,5 @@
 	padding: 0;
 }
-
-fieldset {
+fieldset, .fieldset {
 	display: block;
 	margin: 0 0 1em 0;
@@ -1047,5 +1116,4 @@
 	font-weight: normal;
 }
-
 input, textarea, select {
 	background: #f9f9f9;
@@ -1074,5 +1142,4 @@
 	background: transparent;
 }
-
 label {
 	display: block;
@@ -1113,6 +1180,6 @@
 	display: block;
 	width: 100%;
-}
-
+	resize: vertical;
+}
 label.required {
 	font-weight: bold;
@@ -1127,5 +1194,5 @@
 p.field {
 	position: relative;
-
+	
 }
 p.field label {
@@ -1139,7 +1206,9 @@
 	top: 0;
 }
-
 label .maximal, textarea.maximal, input.maximal {
 	width: 100%;
+}
+textarea.maximal {
+	resize: vertical;
 }
 
@@ -1151,6 +1220,5 @@
 	padding-left: 20px;
 }
-
-fieldset.constrained {
+.constrained {
 	margin: 0;
 	padding: 0;
@@ -1159,35 +1227,5 @@
 }
 
-#login-screen {
-	display: block;
-	width: 18em;
-	margin: 1.5em auto 0;
-	font-size: 1.1em;
-}
-#login-screen h1 {
-	text-indent: -2000px;
-	background: transparent url(dotclear-logo2.png) no-repeat top left;
-	height: 50px;
-	margin-bottom: .5em;
-	margin-left: .5em;
-}
-#login-screen fieldset {
-	border: 1px solid #999;
-	padding: 1em 1em 0 1em;
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	border-radius: 4px;
-}
-#login-screen input[type=text], #login-screen input[type=password], #login-screen input[type=submit] {
-	width: 100%;
-}
-#login-screen #issue {
-	margin-left: 1em;
-	font-size: 1em;
-}
-#login-screen #issue strong {font-weight: normal;}
-
-
-/* ------------------  Tous les boutons -------------------- */
+/* --------------------------------------------------------------- buttons */
 h2 a.button {
 	color: #333;
@@ -1208,5 +1246,5 @@
 	text-align: center;
 	text-decoration: none;
-	padding: .1em .5em;
+	padding: .1em .5em 0 .5em;
 	text-shadow: 0 1px 1px rgba(0,0,0,.3);
 	-webkit-border-radius: .2em;
@@ -1268,4 +1306,8 @@
 input[type=submit].delete {
 	color: #c00;
+	padding-bottom: .1em;
+}
+#entry-content .delete {
+	margin-left: 1em;
 }
 a.delete:hover,
@@ -1293,7 +1335,7 @@
 	border-radius: .5em;
 	margin-bottom: .1em;	
-	background: #2C8FD1 url(add.png) no-repeat .2em center;
+	background: #2C8FD1 url(add.png) no-repeat 6px center;
 	color: #fff;
-	padding: .1em 1em .2em 28px;
+	padding: .2em 16px .2em 30px;
 	border: 1px solid #2373A8;
 }
Index: admin/trackbacks.php
===================================================================
--- admin/trackbacks.php	(revision 270)
+++ admin/trackbacks.php	(revision 510)
@@ -95,5 +95,5 @@
 }
 
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.$page_title.'</h2>';
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.$page_title.'</span></h2>';
 
 echo '<p><a class="back" href="'.$core->getPostAdminURL($post->post_type,$id).'">'.
Index: admin/user.php
===================================================================
--- admin/user.php	(revision 313)
+++ admin/user.php	(revision 557)
@@ -154,5 +154,9 @@
 			$core->callBehavior('adminAfterUserCreate',$cur,$new_id);
 			
-			http::redirect('user.php?id='.$new_id.'&add=1');
+			if (!empty($_POST['saveplus'])) {
+				http::redirect('user.php?add=1');
+			} else {
+				http::redirect('user.php?id='.$new_id.'&add=1');
+			}
 		}
 	}
@@ -181,5 +185,5 @@
 }
 
-echo '<h2><a href="users.php">'.__('Users').'</a> &rsaquo; '.$page_title.'</h2>';
+echo '<h2><a href="users.php">'.__('Users').'</a> &rsaquo; <span class="page-title">'.$page_title.'</span></h2>';
 
 if ($user_id == $core->auth->userID()) {
@@ -195,5 +199,5 @@
 '<div class="col">'.
 '<p><label for="user_id" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Username:').' '.
-form::field('user_id',20,255,html::escapeHTML($user_id),'',2).
+form::field('user_id',20,255,html::escapeHTML($user_id)).
 '</label></p>'.
 '<p class="form-note">'.__('At least 2 characters using letters, numbers or symbols.').'</p>'.
@@ -202,5 +206,5 @@
 ($user_id != '' ? '' : '<abbr title="'.__('Required field').'">*</abbr> ').
 ($user_id != '' ? __('New password:') : __('Password:')).' '.
-form::password('new_pwd',20,255,'','',3).
+form::password('new_pwd',20,255).
 '</label></p>'.
 '<p class="form-note">'.__('Password must contain at least 6 characters.').'</p>'.
@@ -208,46 +212,47 @@
 '<p><label for="new_pwd_c" '.($user_id != '' ? '' : 'class="required"').'>'.
 ($user_id != '' ? '' : '<abbr title="'.__('Required field').'">*</abbr> ').__('Confirm password:').' '.
-form::password('new_pwd_c',20,255,'','',4).
+form::password('new_pwd_c',20,255).
 '</label></p>'.
 
 '<p><label for="user_name">'.__('Last Name:').' '.
-form::field('user_name',20,255,html::escapeHTML($user_name),'',5).
+form::field('user_name',20,255,html::escapeHTML($user_name)).
 '</label></p>'.
 
 '<p><label for="user_firstname">'.__('First Name:').' '.
-form::field('user_firstname',20,255,html::escapeHTML($user_firstname),'',6).
+form::field('user_firstname',20,255,html::escapeHTML($user_firstname)).
 '</label></p>'.
 
 '<p><label for="user_displayname">'.__('Display name:').' '.
-form::field('user_displayname',20,255,html::escapeHTML($user_displayname),'',7).
+form::field('user_displayname',20,255,html::escapeHTML($user_displayname)).
 '</label></p>'.
 
 '<p><label for="user_email">'.__('Email:').' '.
-form::field('user_email',20,255,html::escapeHTML($user_email),'',8).
-'</label></p>'.
+form::field('user_email',20,255,html::escapeHTML($user_email)).
+'</label></p>'.
+'<p class="form-note">'.__('Mandatory for password recovering procedure.').'</p>'.
 '</div>'.
 
 '<div class="col">'.
 '<p><label for="user_url">'.__('URL:').' '.
-form::field('user_url',30,255,html::escapeHTML($user_url),'',9).
+form::field('user_url',30,255,html::escapeHTML($user_url)).
 '</label></p>'.
 '<p><label for="user_post_format">'.__('Preferred format:').' '.
-form::combo('user_post_format',$formaters_combo,$user_options['post_format'],'',10).
+form::combo('user_post_format',$formaters_combo,$user_options['post_format']).
 '</label></p>'.
 
 '<p><label for="user_post_status">'.__('Default entry status:').' '.
-form::combo('user_post_status',$status_combo,$user_post_status,'',11).
+form::combo('user_post_status',$status_combo,$user_post_status).
 '</label></p>'.
 
 '<p><label for="user_edit_size">'.__('Entry edit field height:').' '.
-form::field('user_edit_size',5,4,(integer) $user_options['edit_size'],'',12).
+form::field('user_edit_size',5,4,(integer) $user_options['edit_size']).
 '</label></p>'.
 
 '<p><label for="user_lang">'.__('User language:').' '.
-form::combo('user_lang',$lang_combo,$user_lang,'l10n',13).
+form::combo('user_lang',$lang_combo,$user_lang,'l10n').
 '</label></p>'.
 
 '<p><label for="user_tz">'.__('User timezone:').' '.
-form::combo('user_tz',dt::getZones(true,true),$user_tz,'',14).
+form::combo('user_tz',dt::getZones(true,true),$user_tz).
 '</label></p>';
 
@@ -255,5 +260,5 @@
 	echo
 	'<p><label for="user_change_pwd" class="classic">'.
-	form::checkbox('user_change_pwd','1',$user_change_pwd,'',15).' '.
+	form::checkbox('user_change_pwd','1',$user_change_pwd).' '.
 	__('Password change required to connect').'</label></p>';
 }
@@ -262,5 +267,5 @@
 
 echo
-'<p><label for="user_super" class="classic">'.form::checkbox('user_super','1',$user_super,'',16,$super_disabled).' '.
+'<p><label for="user_super" class="classic">'.form::checkbox('user_super','1',$user_super,'','',$super_disabled).' '.
 __('Super administrator').'</label></p>'.
 '</div>'.
@@ -272,10 +277,9 @@
 
 echo
-'<fieldset>'.
 '<p><label for="your_pwd" '.($user_id != '' ? '' : 'class="required"').'>'.
 ($user_id != '' ? '' : '<abbr title="'.__('Required field').'">*</abbr> ').__('Your password:').
-form::password('your_pwd',20,255,'','',17).'</label></p>'.
-'</fieldset>'.
-'<p class="clear"><input type="submit" accesskey="s" value="'.__('Save').'" tabindex="16" />'.
+form::password('your_pwd',20,255).'</label></p>'.
+'<p class="clear"><input type="submit" name="save" accesskey="s" value="'.__('Save').'" />'.
+($user_id != '' ? '' : ' <input type="submit" name="saveplus" value="'.__('Save and create another').'" />').
 ($user_id != '' ? form::hidden('id',$user_id) : '').
 $core->formNonce().
@@ -286,5 +290,5 @@
 if ($user_id)
 {
-	echo '<fieldset class="clear"><legend>'.__('Permissions').'</legend>';
+	echo '<div class="clear fieldset"><h3>'.__('Permissions').'</h3>';
 	
 	$permissions = $core->getUserPermissions($user_id);
@@ -304,5 +308,5 @@
 				html::escapeHTML($v['name']).'</a> ('.html::escapeHTML($k).') - '.
 				'<a href="permissions.php?blog_id[]='.$k.'&amp;user_id[]='.$user_id.'">'
-				.__('change permissions').'</a></h4>';
+				.__('Change permissions').'</a></h4>';
 				
 				echo '<ul>';
@@ -320,5 +324,5 @@
 	'<p><a href="permissions_blog.php?user_id[]='.$user_id.'">'.
 	__('Add new permissions').'</a></p>'.
-	'</fieldset>';
+	'</div>';
 }
 
Index: admin/users.php
===================================================================
--- admin/users.php	(revision 313)
+++ admin/users.php	(revision 565)
@@ -59,5 +59,5 @@
 );
 
-# --BEHAVIOR-- adminUser	sActionsCombo
+# --BEHAVIOR-- adminUsersActionsCombo
 $core->callBehavior('adminUsersActionsCombo',array(&$combo_action));
 
@@ -118,5 +118,5 @@
 	
 	echo 
-	'<h2>'.__('Users').'</h2>'.
+	'<h2 class="post-title">'.__('Users').'</h2>'.
 	'<p class="top-add"><strong><a class="button add" href="user.php">'.__('Create a new user').'</a></strong></p>';
 	
Index: inc/admin/class.dc.menu.php
===================================================================
--- inc/admin/class.dc.menu.php	(revision 270)
+++ inc/admin/class.dc.menu.php	(revision 691)
@@ -75,4 +75,6 @@
 		}
 		
+		$img = dc_admin_icon_url($img);
+		
 		return
 		'<li'.(($active || $class) ? ' class="'.(($active) ? 'active ' : '').(($class) ? $class : '').'"' : '').
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 270)
+++ inc/admin/lib.dc.page.php	(revision 680)
@@ -16,4 +16,6 @@
 class dcPage
 {
+	private static $loaded_js=array();
+
 	# Auth check
 	public static function check($permissions)
@@ -73,5 +75,5 @@
 			__('Blogs:').' '.
 			$core->formNonce().
-			form::combo('switchblog',$blogs,$core->blog->id,	'',1).
+			form::combo('switchblog',$blogs,$core->blog->id).
 			'</label>'.
 			'<noscript><div><input type="submit" value="'.__('ok').'" /></div></noscript>';
@@ -96,9 +98,8 @@
 		
 		self::jsLoadIE7().
-		'  <style type="text/css">'."\n". 
-		'  @import "style/default.css";'."\n".
-		"  </style>\n";
+		'  	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
 		if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
-			echo '  <style type="text/css">'."\n".'  @import "style/default-rtl.css";'."\n"."  </style>\n";
+			echo
+		'  	<link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
 		}
 
@@ -122,17 +123,21 @@
 		'">'."\n".
 		
-		'<div id="top"><h1><a href="index.php">'.DC_VENDOR_NAME.'</a></h1></div>'."\n";
-		
-		
-		echo
-		'<div id="info-box">'.
-		'<form action="index.php" method="post"><div>'.
+		'<div id="header">'.
+		'<ul id="prelude"><li><a href="#content">Aller au contenu</a></li><li><a href="#main-menu">Aller au menu</a></li></ul>'."\n".
+		'<div id="top"><h1><a href="index.php">'.DC_VENDOR_NAME.'</a></h1></div>'."\n";	
+		
+		echo
+		'<div id="info-boxes">'.
+		'<div id="info-box1">'.
+		'<form action="index.php" method="post">'.
 		$blog_box.
 		'<a href="'.$core->blog->url.'" onclick="window.open(this.href);return false;" title="'.__('Go to site').' ('.__('new window').')'.'">'.__('Go to site').' <img src="images/outgoing.png" alt="" /></a>'.
-		'</div></form>'.
+		'</form>'.
 		'</div>'.
-		'<div id="info-box2"><div>'.
-		' '.__('User:').' <strong>'.$core->auth->userID().'</strong>'.
-		' - <a href="index.php?logout=1" class="logout">'.__('Logout').' <img src="images/logout.png" alt="" /></a>'.
+		'<div id="info-box2">'.
+		'<a'.(preg_match('/index.php$/',$_SERVER['REQUEST_URI']) ? ' class="active"' : '').' href="index.php">'.__('My dashboard').'</a>'.
+		'<span> | </span><a'.(preg_match('/preferences.php(\?.*)?$/',$_SERVER['REQUEST_URI']) ? ' class="active"' : '').' href="preferences.php">'.__('My preferences').'</a>'.
+		'<span> | </span><a href="index.php?logout=1" class="logout">'.sprintf(__('Logout %s'),$core->auth->userID()).' <img src="images/logout.png" alt="" /></a>'.
+		'</div>'.
 		'</div>'.
 		'</div>';
@@ -178,5 +183,4 @@
 		'<div id="footer"><p>'.
 		sprintf(__('Thank you for using %s.'),'<a href="http://dotclear.org/">Dotclear '.DC_VERSION.'</a>').
-		' <span class="credit"> (Icons by <a href="http://dryicons.com/">Dryicons</a>)</span>'.
 		'</p></div>'."\n".
 		"</div>\n";		// End of #wrapper
@@ -210,9 +214,8 @@
 		
 		self::jsLoadIE7().
-		'  <style type="text/css">'."\n". 
-		'  @import "style/default.css";'."\n".
-		"  </style>\n";
+		'  	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />'."\n"; 
 		if (l10n::getTextDirection($GLOBALS['_lang']) == 'rtl') {
-			echo '  <style type="text/css">'."\n".'  @import "style/default-rtl.css";'."\n"."  </style>\n";
+			echo
+			'  	<link rel="stylesheet" href="style/default-rtl.css" type="text/css" media="screen" />'."\n"; 
 		}
 		
@@ -270,7 +273,7 @@
 			} else {
 				$prof_url = http::getSelfURI();
-				$prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&amp;';
+				$prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&';
 				$prof_url .= 'XDEBUG_PROFILE';
-				$res .= '<p><a href="'.$prof_url.'">Trigger profiler</a></p>';
+				$res .= '<p><a href="'.html::escapeURL($prof_url).'">Trigger profiler</a></p>';
 			}
 			
@@ -349,5 +352,9 @@
 	public static function jsLoad($src)
 	{
-		return '<script type="text/javascript" src="'.html::escapeHTML($src).'"></script>'."\n";
+		$escaped_src = html::escapeHTML($src);
+		if (!isset(self::$loaded_js[$escaped_src])) {
+			self::$loaded_js[$escaped_src]=true;
+			return '<script type="text/javascript" src="'.$escaped_src.'"></script>'."\n";
+		}
 	}
 	
@@ -364,4 +371,5 @@
 		self::jsLoad('js/jquery/jquery.bgFade.js').
 		self::jsLoad('js/common.js').
+		self::jsLoad('js/prelude.js').
 		
 		'<script type="text/javascript">'."\n".
Index: inc/admin/prepend.php
===================================================================
--- inc/admin/prepend.php	(revision 270)
+++ inc/admin/prepend.php	(revision 692)
@@ -22,4 +22,17 @@
 define('DC_CONTEXT_ADMIN',true);
 
+function dc_valid_fav($url) {
+	global $core;
+
+	if (preg_match('#plugin\.php\?p=([^&]+)#',$url,$matches)) {
+		if (isset($matches[1])) {
+			if (!$core->plugins->moduleExists($matches[1])) {
+				return false;
+			}
+		}
+	}
+	return true;
+}
+
 function dc_prepare_url($url) {
 
@@ -43,4 +56,28 @@
 	l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/main');
 	l10n::set(dirname(__FILE__).'/../../locales/'.$_lang.'/plugins');
+}
+
+function dc_admin_icon_url($img)
+{
+	global $core;
+	
+	$core->auth->user_prefs->addWorkspace('interface');
+	$user_ui_iconset = @$core->auth->user_prefs->interface->iconset;
+	if (($user_ui_iconset) && ($img)) {
+		$icon = false;
+		if ((preg_match('/^images\/menu\/(.+)$/',$img,$m)) || 
+			(preg_match('/^index\.php\?pf=(.+)$/',$img,$m))) {
+			if ($m[1]) {
+				$icon = path::real(dirname(__FILE__).'/../../admin/images/iconset/'.$user_ui_iconset.'/'.$m[1],false);
+				if ($icon !== false) {
+					$allow_types = array('png','jpg','jpeg','gif');
+					if (is_file($icon) && is_readable($icon) && in_array(files::getExtension($icon),$allow_types)) {
+						return DC_ADMIN_URL.'images/iconset/'.$user_ui_iconset.'/'.$m[1];
+					}
+				}
+			}
+		}
+	}
+	return $img;
 }
 
@@ -185,43 +222,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));
@@ -254,11 +291,4 @@
 	}
 */
-	$_menu['Dashboard']->prependItem(__('My preferences'),'preferences.php','images/menu/user-pref.png',
-		preg_match('/preferences.php(\?.*)?$/',$_SERVER['REQUEST_URI']),
-		true);
-	$_menu['Dashboard']->prependItem(__('Dashboard'),'index.php','images/menu/dashboard.png',
-		preg_match('/index.php$/',$_SERVER['REQUEST_URI']),
-		$core->auth->check('usage,contentadmin',$core->blog->id));
-	
 	$_menu['Blog']->prependItem(__('Blog appearance'),'blog_theme.php','images/menu/themes.png',
 		preg_match('/blog_theme.php(\?.*)?$/',$_SERVER['REQUEST_URI']),
@@ -309,9 +339,11 @@
 		// User favorites only
 		if (!$v['global']) {
-			$count++;
 			$fav = unserialize($v['value']);
-			$_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']);
+			if (dc_valid_fav($fav['url'])) {
+				$count++;
+				$_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']);
+			}
 		}
 	}	
@@ -319,9 +351,11 @@
 		// Global favorites if any
 		foreach ($ws->dumpPrefs() as $k => $v) {
-			$count++;
 			$fav = unserialize($v['value']);
-			$_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']);
+			if (dc_valid_fav($fav['url'])) {
+				$count++;
+				$_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 270)
+++ inc/config.php.in	(revision 362)
@@ -40,4 +40,7 @@
 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/core/class.dc.auth.php
===================================================================
--- inc/core/class.dc.auth.php	(revision 333)
+++ inc/core/class.dc.auth.php	(revision 527)
@@ -4,5 +4,5 @@
 # This file is part of Dotclear 2.
 #
-# Copyright (c) 2003-2010 Olivier Meunier & Association Dotclear
+# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
 # See LICENSE file or
Index: inc/core/class.dc.blog.php
===================================================================
--- inc/core/class.dc.blog.php	(revision 337)
+++ inc/core/class.dc.blog.php	(revision 407)
@@ -727,8 +727,6 @@
 		if (isset($params['post_type']))
 		{
-			if (is_array($params['post_type']) && !empty($params['post_type'])) {
+			if (is_array($params['post_type']) || $params['post_type'] != '') {
 				$strReq .= 'AND post_type '.$this->con->in($params['post_type']);
-			} elseif ($params['post_type'] != '') {
-				$strReq .= "AND post_type = '".$this->con->escape($params['post_type'])."' ";
 			}
 		}
@@ -1784,9 +1782,5 @@
 		if (!empty($params['post_type']))
 		{
-			if (is_array($params['post_type']) && !empty($params['post_type'])) {
-				$strReq .= 'AND post_type '.$this->con->in($params['post_type']);
-			} else {
-				$strReq .= "AND post_type = '".$this->con->escape($params['post_type'])."' ";
-			}
+			$strReq .= 'AND post_type '.$this->con->in($params['post_type']);
 		}
 		
Index: inc/core/class.dc.core.php
===================================================================
--- inc/core/class.dc.core.php	(revision 331)
+++ inc/core/class.dc.core.php	(revision 706)
@@ -27,5 +27,5 @@
 {
 	public $con;		///< <b>connection</b>		Database connection object
-	public $prefix;	///< <b>string</b>			Database tables prefix
+	public $prefix;		///< <b>string</b>			Database tables prefix
 	public $blog;		///< <b>dcBlog</b>			dcBlog object
 	public $error;		///< <b>dcError</b>			dcError object
@@ -36,5 +36,6 @@
 	public $plugins;	///< <b>dcModules</b>		dcModules object
 	public $media;		///< <b>dcMedia</b>			dcMedia object
-	public $rest;		///< <b>dcRestServer</b>		dcRestServer object
+	public $postmedia;	///< <b>dcPostMedia</b>		dcPostMedia object
+	public $rest;		///< <b>dcRestServer</b>	dcRestServer object
 	public $log;		///< <b>dcLog</b>			dcLog object
 	
@@ -789,5 +790,5 @@
 			'edit_size' => 24,
 			'enable_wysiwyg' => true,
-			'post_format' => 'wiki',
+			'post_format' => 'wiki'
 		);
 	}
@@ -1291,5 +1292,5 @@
 				array('lang','string','en',
 				'Default blog language'),
-				array('media_exclusion','string','',
+				array('media_exclusion','string','/\.php$/i',
 				'File name exclusion pattern in media manager. (PCRE value)'),
 				array('media_img_m_size','integer',448,
Index: inc/core/class.dc.media.php
===================================================================
--- inc/core/class.dc.media.php	(revision 270)
+++ inc/core/class.dc.media.php	(revision 705)
@@ -23,6 +23,6 @@
 	protected $con;		///< <b>connection</b> Database connection
 	protected $table;		///< <b>string</b> Media table name
-	protected $table_ref;	///< <b>string</b> Post-media relation table name
 	protected $type;		///< <b>string</b> Media type filter
+	protected $postmedia;
 	protected $file_sort = 'name-asc';
 	
@@ -57,4 +57,5 @@
 		$this->core =& $core;
 		$this->con =& $core->con;
+		$this->postmedia = new dcPostMedia($core);
 		
 		if ($this->core->blog == null) {
@@ -63,5 +64,4 @@
 		
 		$this->table = $this->core->prefix.'media';
-		$this->table_ref = $this->core->prefix.'post_media';
 		$root = $this->core->blog->public_path;
 		
@@ -175,14 +175,21 @@
 	
 	@param	href		<b>string</b>		URL pattern
+	@param	last		<b>string</b>		Last item pattern
 	@return	<b>string</b> HTML code
 	*/
-	public function breadCrumb($href)
+	public function breadCrumb($href,$last='')
 	{
 		$res = '';
 		if ($this->relpwd && $this->relpwd != '.') {
 			$pwd = '';
-			foreach (explode('/',$this->relpwd) as $v) {
-				$pwd .= rawurlencode($v).'/';
-				$res .= '<a href="'.sprintf($href,$pwd).'">'.$v.'</a> / ';
+			$arr = explode('/',$this->relpwd);
+			$count = count($arr);
+			foreach ($arr as $v) {
+				if (($last != '') && (0 === --$count)) {
+					$res .= sprintf($last,$v);
+				} else {
+					$pwd .= rawurlencode($v).'/';
+					$res .= '<a href="'.sprintf($href,$pwd).'">'.$v.'</a> / ';
+				}
 			}
 		}
@@ -494,19 +501,12 @@
 	public function getPostMedia($post_id,$media_id=null)
 	{
-		$post_id = (integer) $post_id;
-		
-		$strReq =
-		'SELECT media_file, M.media_id, media_path, media_title, media_meta, media_dt, '.
-		'media_creadt, media_upddt, media_private, user_id '.
-		'FROM '.$this->table.' M '.
-		'INNER JOIN '.$this->table_ref.' PM ON (M.media_id = PM.media_id) '.
-		"WHERE media_path = '".$this->path."' ".
-		'AND post_id = '.$post_id.' ';
-		
+		$params = array(
+			'post_id' => $post_id,
+			'media_path' => $this->path
+		);
 		if ($media_id) {
-			$strReq .= 'AND M.media_id = '.(integer) $media_id.' ';
-		}
-		
-		$rs = $this->con->select($strReq);
+			$params['media_id'] = (integer) $media_id;
+		}
+		$rs = $this->postmedia->getPostMedia($params);
 		
 		$res = array();
@@ -523,45 +523,19 @@
 	
 	/**
-	Attaches a media to a post.
-	
-	@param	post_id	<b>integer</b>		Post ID
-	@param	media_id	<b>integer</b>		Optionnal media ID
+	@deprecated since version 2.4
+	@see dcPostMedia::addPostMedia
 	*/
 	public function addPostMedia($post_id,$media_id)
 	{
-		$post_id = (integer) $post_id;
-		$media_id = (integer) $media_id;
-		
-		$f = $this->getPostMedia($post_id,$media_id);
-		
-		if (!empty($f)) {
-			return;
-		}
-		
-		$cur = $this->con->openCursor($this->table_ref);
-		$cur->post_id = $post_id;
-		$cur->media_id = $media_id;
-		
-		$cur->insert();
-		$this->core->blog->triggerBlog();
-	}
-	
-	/**
-	Detaches a media from a post.
-	
-	@param	post_id	<b>integer</b>		Post ID
-	@param	media_id	<b>integer</b>		Optionnal media ID
+		$this->postmedia->addPostMedia($post_id,$media_id);
+	}
+	
+	/**
+	@deprecated since version 2.4
+	@see dcPostMedia::removePostMedia
 	*/
 	public function removePostMedia($post_id,$media_id)
 	{
-		$post_id = (integer) $post_id;
-		$media_id = (integer) $media_id;
-		
-		$strReq = 'DELETE FROM '.$this->table_ref.' '.
-				'WHERE post_id = '.$post_id.' '.
-				'AND media_id = '.$media_id.' ';
-		
-		$this->con->execute($strReq);
-		$this->core->blog->triggerBlog();
+		$this->postmedia->removePostMedia($post_id,$media_id,"attachment");
 	}
 	
@@ -856,4 +830,5 @@
 	{
 		$zip = new fileUnzip($f->file);
+		$zip->setExcludePattern($this->exclude_pattern);
 		$zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#');
 		
Index: inc/core/class.dc.modules.php
===================================================================
--- inc/core/class.dc.modules.php	(revision 270)
+++ inc/core/class.dc.modules.php	(revision 464)
@@ -159,9 +159,26 @@
 	@param	author		<b>string</b>		Module author name
 	@param	version		<b>string</b>		Module version
-	@param	permissions	<b>string</b>		Module permissions
-	@param	priority		<b>integer</b>		Module priority
-	*/
-	public function registerModule($name,$desc,$author,$version,$permissions=null,$priority=1000)
-	{
+	@param	properties	<b>array</b>		extra properties (currently available keys : permissions, priority)
+	*/
+	public function registerModule($name,$desc,$author,$version, $properties = array())
+	{
+		if (!is_array($properties)) {
+			//Fallback to legacy registerModule parameters
+			$args = func_get_args();
+			$properties = array();
+			if (isset($args[4])) {
+				$properties['permissions']=$args[4];
+			}
+			if (isset($args[5])) {
+				$properties['priority']= (integer)$args[5];
+			}
+		}
+		$properties = array_merge(
+			array(
+				'permissions' => null,
+				'priority' => 1000
+			), $properties
+		);
+		$permissions = $properties['permissions'];
 		if ($this->ns == 'admin') {
 			if ($permissions == '' && !$this->core->auth->isSuperAdmin()) {
@@ -177,13 +194,14 @@
 			if (!$module_exists || ($module_exists && $module_overwrite)) {
 				$this->modules_names[$name] = $version;
-				$this->modules[$this->id] = array(
-					'root' => $this->mroot,
-					'name' => $name,
-					'desc' => $desc,
-					'author' => $author,
-					'version' => $version,
-					'permissions' => $permissions,
-					'priority' => $priority === null ? 1000 : (integer) $priority,
-					'root_writable' => is_writable($this->mroot)
+				$this->modules[$this->id] = array_merge(
+					$properties,
+					array(
+						'root' => $this->mroot,
+						'name' => $name,
+						'desc' => $desc,
+						'author' => $author,
+						'version' => $version,
+						'root_writable' => is_writable($this->mroot)
+					)
 				);
 			}
Index: inc/core/class.dc.postmedia.php
===================================================================
--- inc/core/class.dc.postmedia.php	(revision 407)
+++ inc/core/class.dc.postmedia.php	(revision 407)
@@ -0,0 +1,172 @@
+<?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; }
+
+class dcPostMedia
+{
+	protected $core;		///< <b>dcCore</b> dcCore instance
+	protected $con;		///< <b>connection</b> Database connection
+	protected $table;		///< <b>string</b> Post-Media table name
+	
+	/**
+	Object constructor.
+	
+	@param	core		<b>dcCore</b>		dcCore instance
+	@param	type		<b>string</b>		Media type filter
+	*/
+	public function __construct($core,$type='')
+	{
+		$this->core =& $core;
+		$this->con =& $core->con;
+		$this->table = $this->core->prefix.'post_media';
+	}
+	
+	/**
+	Returns media items attached to a blog post. Result is an array containing
+	fileItems objects.
+	
+	@param	post_id	<b>integer</b>		Post ID
+	@param	media_id	<b>integer</b>		Optionnal media ID
+	@return	<b>array</b> Array of fileItems
+	*/
+	public function getPostMedia($params=array())
+	{
+		$strReq =
+		'SELECT M.media_file, M.media_id, M.media_path, M.media_title, M.media_meta, M.media_dt, '.
+		'M.media_creadt, M.media_upddt, M.media_private, M.user_id, PM.post_id ';
+		
+		if (!empty($params['columns']) && is_array($params['columns'])) {
+			$strReq .= implode(', ',$params['columns']).', ';
+		}
+		
+		$strReq .=
+		'FROM '.$this->core->prefix.'media M '.
+		'INNER JOIN '.$this->table.' PM ON (M.media_id = PM.media_id) ';
+		
+		if (!empty($params['from'])) {
+			$strReq .= $params['from'].' ';
+		}
+		
+		$where='';
+		if (isset($params['post_id'])) {
+			$where[]="PM.post_id ".$this->con->in($params['post_id']);
+		}
+		if (isset($params['media_id'])) {
+			$where[]="M.media_id ".$this->con->in($params['media_id']);
+		}
+		if (isset($params['media_path'])) {
+			$where[]="M.media_path ".$this->con->in($params['media_path']);
+		}
+		if (isset($params['link_type'])) {
+			$where[]="PM.link_type ".$this->con->in($params['link_type']);
+		} else {
+			$where[]="PM.link_type='attachment'";
+		}
+
+		$strReq .= 'WHERE '.join('AND ',$where).' ';
+
+		if (isset($params['sql'])) {
+			$strReq .= $params['sql'];
+		}
+	//echo $strReq; exit;
+		$rs = $this->con->select($strReq);
+		
+		return $rs;
+	}
+
+	/**
+	Attaches a media to a post.
+	
+	@param	post_id	<b>integer</b>		Post ID
+	@param	media_id	<b>integer</b>		Optionnal media ID
+	*/
+	public function addPostMedia($post_id,$media_id,$link_type='attachment')
+	{
+		$post_id = (integer) $post_id;
+		$media_id = (integer) $media_id;
+		
+		$f = $this->getPostMedia(array('post_id'=>$post_id,'media_id'=>$media_id,'link_type'=>$link_type));
+		
+		if (!$f->isEmpty()) {
+			return;
+		}
+		
+		$cur = $this->con->openCursor($this->table);
+		$cur->post_id = $post_id;
+		$cur->media_id = $media_id;
+		$cur->link_type = $link_type;
+		
+		$cur->insert();
+		$this->core->blog->triggerBlog();
+	}
+	
+	/**
+	Detaches a media from a post.
+	
+	@param	post_id	<b>integer</b>		Post ID
+	@param	media_id	<b>integer</b>		Optionnal media ID
+	*/
+	public function removePostMedia($post_id,$media_id,$link_type=null)
+	{
+		$post_id = (integer) $post_id;
+		$media_id = (integer) $media_id;
+		
+		$strReq = 'DELETE FROM '.$this->table.' '.
+				'WHERE post_id = '.$post_id.' '.
+				'AND media_id = '.$media_id.' ';
+		if ($link_type != null) {
+			$strReq .= "AND link_type = '".$this->con->escape($link_type)."'";
+		}
+		$this->con->execute($strReq);
+		$this->core->blog->triggerBlog();
+	}
+	
+	/**
+	Returns media items attached to a blog post. Result is an array containing
+	fileItems objects.
+	
+	@param	post_id	<b>integer</b>		Post ID
+	@param	media_id	<b>integer</b>		Optionnal media ID
+	@return	<b>array</b> Array of fileItems
+	*/
+	public function getLegacyPostMedia($post_id,$media_id=null)
+	{
+		$post_id = (integer) $post_id;
+		
+		$strReq =
+		'SELECT media_file, M.media_id, media_path, media_title, media_meta, media_dt, '.
+		'media_creadt, media_upddt, media_private, user_id '.
+		'FROM '.$this->table.' M '.
+		'INNER JOIN '.$this->table_ref.' PM ON (M.media_id = PM.media_id) '.
+		"WHERE media_path = '".$this->path."' ".
+		'AND post_id = '.$post_id.' ';
+		
+		if ($media_id) {
+			$strReq .= 'AND M.media_id = '.(integer) $media_id.' ';
+		}
+		
+		$rs = $this->con->select($strReq);
+		
+		$res = array();
+		
+		while ($rs->fetch()) {
+			$f = $this->fileRecord($rs);
+			if ($f !== null) {
+				$res[] = $f;
+			}
+		}
+		
+		return $res;
+	}
+	
+}
+?>
Index: inc/core/class.dc.themes.php
===================================================================
--- inc/core/class.dc.themes.php	(revision 270)
+++ inc/core/class.dc.themes.php	(revision 465)
@@ -39,19 +39,37 @@
 	@param	author		<b>string</b>		Module author name
 	@param	version		<b>string</b>		Module version
-	@param	parent		<b>string</b>		Module parent
-	@param	priority		<b>integer</b>		Module priority
+	@param	properties	<b>array</b>		extra properties (currently available keys : parent, priority, standalone_config)
 	*/
-	public function registerModule($name,$desc,$author,$version,$parent = null,$priority = 1000)
+	public function registerModule($name,$desc,$author,$version,$properties = array())
 	{
+		if (!is_array($properties)) {
+			//Fallback to legacy registerModule parameters
+			$args = func_get_args();
+			$properties = array();
+			if (isset($args[4])) {
+				$properties['parent']=$args[4];
+			}
+			if (isset($args[5])) {
+				$properties['priority']= (integer)$args[5];
+			}
+		}
+		$properties = array_merge(
+			array(
+				'parent' => null,
+				'priority' => 1000,
+				'standalone_config' => false
+			), $properties
+		);
 		if ($this->id) {
-			$this->modules[$this->id] = array(
-			'root' => $this->mroot,
-			'name' => $name,
-			'desc' => $desc,
-			'author' => $author,
-			'version' => $version,
-			'parent' => $parent,
-			'priority' => 1000,
-			'root_writable' => is_writable($this->mroot)
+			$this->modules[$this->id] = array_merge(
+				$properties,
+				array(
+					'root' => $this->mroot,
+					'name' => $name,
+					'desc' => $desc,
+					'author' => $author,
+					'version' => $version,
+					'root_writable' => is_writable($this->mroot)
+				)
 			);
 		}
Index: inc/core/class.dc.xmlrpc.php
===================================================================
--- inc/core/class.dc.xmlrpc.php	(revision 270)
+++ inc/core/class.dc.xmlrpc.php	(revision 696)
@@ -1223,5 +1223,5 @@
 				'author_url'			=> $rs->comment_site,
 				'author_email'			=> $rs->comment_email,
-				'author_ip'			=> $rs->comment_ip,
+				'author_ip'			=> $rs->comment_ip
 			);
 		}
Index: inc/dbschema/db-schema.php
===================================================================
--- inc/dbschema/db-schema.php	(revision 270)
+++ inc/dbschema/db-schema.php	(revision 407)
@@ -152,6 +152,7 @@
 	->media_id	('bigint',	0,	false)
 	->post_id		('bigint',	0,	false)
-	
-	->primary('pk_post_media','media_id','post_id')
+	->link_type		('varchar',	32,	false,	"'attachment'")
+	
+	->primary('pk_post_media','media_id','post_id','link_type')
 	;
 
@@ -235,4 +236,5 @@
 $_s->media->index		('idx_media_user_id',			'btree',	'user_id');
 $_s->post_media->index	('idx_post_media_post_id',		'btree',	'post_id');
+$_s->post_media->index	('idx_post_media_media_id',		'btree',	'media_id');
 $_s->log->index		('idx_log_user_id',				'btree',	'user_id');
 $_s->comment->index		('idx_comment_post_id',			'btree',	'post_id');
Index: inc/dbschema/upgrade.php
===================================================================
--- inc/dbschema/upgrade.php	(revision 270)
+++ inc/dbschema/upgrade.php	(revision 706)
@@ -20,5 +20,5 @@
 	}
 	
-	if (version_compare($version,DC_VERSION,'<') == 1)
+	if (version_compare($version,DC_VERSION,'<') == 1 || strpos(DC_VERSION,'dev'))
 	{
 		try
@@ -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,4 +290,20 @@
 			}
 			
+			if (version_compare($version,'2.3.1','<'))
+			{
+				# Remove unecessary file
+				@unlink(DC_ROOT.'/'.'inc/libs/clearbricks/.hgignore');
+			}
+
+			if (version_compare($version,'2.4.0','<='))
+			{
+				# setup media_exclusion
+				$strReq = 'UPDATE '.$core->prefix.'setting '.
+						"SET setting_value = '/\\.php\$/i' ".
+						"WHERE setting_id = 'media_exclusion' ".
+						"AND setting_value = '' ";
+				$core->con->execute($strReq);
+			}
+			
 			$core->setVersion('core',DC_VERSION);
 			$core->blogDefaults();
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 289)
+++ inc/prepend.php	(revision 704)
@@ -43,4 +43,5 @@
 $__autoload['dcMeta']				= dirname(__FILE__).'/core/class.dc.meta.php';
 $__autoload['dcMedia']				= dirname(__FILE__).'/core/class.dc.media.php';
+$__autoload['dcPostMedia']				= dirname(__FILE__).'/core/class.dc.postmedia.php';
 $__autoload['dcModules']				= dirname(__FILE__).'/core/class.dc.modules.php';
 $__autoload['dcThemes']				= dirname(__FILE__).'/core/class.dc.themes.php';
@@ -118,5 +119,5 @@
 # Constants
 define('DC_ROOT',path::real(dirname(__FILE__).'/..'));
-define('DC_VERSION','2.4.0-dev');
+define('DC_VERSION','2.4.0-beta1');
 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 270)
+++ inc/public/class.dc.template.php	(revision 570)
@@ -54,18 +54,4 @@
 		$this->addValue('ArchiveEntriesCount',array($this,'ArchiveEntriesCount'));
 		$this->addValue('ArchiveURL',array($this,'ArchiveURL'));
-		
-		# Attachments
-		$this->addBlock('Attachments',array($this,'Attachments'));
-		$this->addBlock('AttachmentsHeader',array($this,'AttachmentsHeader'));
-		$this->addBlock('AttachmentsFooter',array($this,'AttachmentsFooter'));
-		$this->addValue('AttachmentMimeType',array($this,'AttachmentMimeType'));
-		$this->addValue('AttachmentType',array($this,'AttachmentType'));
-		$this->addValue('AttachmentFileName',array($this,'AttachmentFileName'));
-		$this->addValue('AttachmentSize',array($this,'AttachmentSize'));
-		$this->addValue('AttachmentTitle',array($this,'AttachmentTitle'));
-		$this->addValue('AttachmentThumbnailURL',array($this,'AttachmentThumbnailURL'));
-		$this->addValue('AttachmentURL',array($this,'AttachmentURL'));
-		$this->addBlock('AttachmentIf',array($this,'AttachmentIf'));
-		$this->addValue('MediaURL',array($this,'MediaURL'));
 		
 		# Blog
@@ -141,5 +127,4 @@
 		$this->addBlock('EntriesHeader',array($this,'EntriesHeader'));
 		$this->addValue('EntryExcerpt',array($this,'EntryExcerpt'));
-		$this->addValue('EntryAttachmentCount',array($this,'EntryAttachmentCount'));
 		$this->addValue('EntryAuthorCommonName',array($this,'EntryAuthorCommonName'));
 		$this->addValue('EntryAuthorDisplayName',array($this,'EntryAuthorDisplayName'));
@@ -323,4 +308,10 @@
 		}
 		
+		if (($node instanceof tplNodeBlock) && !$node->isClosed()) {
+			$errors[] = sprintf(
+				__('Did not find closing tag for block <tpl:%s>. Content has been ignored.'),
+				html::escapeHTML($node->getTag()));
+		}
+		
 		$err = "";
 		if (count($errors) > 0) {
@@ -341,4 +332,7 @@
 		# --BEHAVIOR-- templateBeforeBlock
 		$res = $this->core->callBehavior('templateBeforeBlock',$this->core,$this->current_tag,$attr);
+		
+		# --BEHAVIOR-- templateInsideBlock
+		$this->core->callBehavior('templateInsideBlock',$this->core,$this->current_tag,$attr,array(&$content));
 		
 		if (isset($this->blocks[$this->current_tag])) {
@@ -563,5 +557,5 @@
 		}
 		
-		if (empty($attr['no_context']))
+		if (empty($attr['no_context']) && !isset($attr['category']))
 		{
 			$p .=
@@ -740,173 +734,4 @@
 	}
 	
-	/* Attachments ---------------------------------------- */
-	/*dtd
-	<!ELEMENT tpl:Attachments - - -- Post Attachments loop -->
-	*/
-	public function Attachments($attr,$content)
-	{
-		$res =
-		"<?php\n".
-		'if ($_ctx->posts !== null && $core->media) {'."\n".
-			'$_ctx->attachments = new ArrayObject($core->media->getPostMedia($_ctx->posts->post_id));'."\n".
-		"?>\n".
-		
-		'<?php foreach ($_ctx->attachments as $attach_i => $attach_f) : '.
-		'$GLOBALS[\'attach_i\'] = $attach_i; $GLOBALS[\'attach_f\'] = $attach_f;'.
-		'$_ctx->file_url = $attach_f->file_url; ?>'.
-		$content.
-		'<?php endforeach; $_ctx->attachments = null; unset($attach_i,$attach_f,$_ctx->file_url); ?>'.
-		
-		"<?php } ?>\n";
-		
-		return $res;
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentsHeader - - -- First attachments result container -->
-	*/
-	public function AttachmentsHeader($attr,$content)
-	{
-		return
-		"<?php if (\$attach_i == 0) : ?>".
-		$content.
-		"<?php endif; ?>";
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentsFooter - - -- Last attachments result container -->
-	*/
-	public function AttachmentsFooter($attr,$content)
-	{
-		return
-		"<?php if (\$attach_i+1 == count(\$_ctx->attachments)) : ?>".
-		$content.
-		"<?php endif; ?>";
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentsIf - - -- Test on attachment fields -->
-	<!ATTLIST tpl:AttachmentIf
-	is_image	(0|1)	#IMPLIED	-- test if attachment is an image (value : 1) or not (value : 0)
-	has_thumb	(0|1)	#IMPLIED	-- test if attachment has a square thumnail (value : 1) or not (value : 0)
-	is_mp3	(0|1)	#IMPLIED	-- test if attachment is a mp3 file (value : 1) or not (value : 0)
-	is_flv	(0|1)	#IMPLIED	-- test if attachment is a flv file (value : 1) or not (value : 0)
-	>
-	*/
-	public function AttachmentIf($attr,$content)
-	{
-		$if = array();
-		
-		$operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
-		
-		if (isset($attr['is_image'])) {
-			$sign = (boolean) $attr['is_image'] ? '' : '!';
-			$if[] = $sign.'$attach_f->media_image';
-		}
-		
-		if (isset($attr['has_thumb'])) {
-			$sign = (boolean) $attr['has_thumb'] ? '' : '!';
-			$if[] = $sign.'isset($attach_f->media_thumb[\'sq\'])';
-		}
-		
-		if (isset($attr['is_mp3'])) {
-			$sign = (boolean) $attr['is_mp3'] ? '==' : '!=';
-			$if[] = '$attach_f->type '.$sign.' "audio/mpeg3"';
-		}
-		
-		if (isset($attr['is_flv'])) {
-			$sign = (boolean) $attr['is_flv'] ? '' : '!';
-			$if[] = $sign.
-				'($attach_f->type == "video/x-flv" || '.
-				'$attach_f->type == "video/mp4" || '.
-				'$attach_f->type == "video/x-m4v")';
-		}
-		
-		if (!empty($if)) {
-			return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
-		} else {
-			return $content;
-		}
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentMimeType - O -- Attachment MIME Type -->
-	*/
-	public function AttachmentMimeType($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->type').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentType - O -- Attachment type -->
-	*/
-	public function AttachmentType($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->media_type').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentFileName - O -- Attachment file name -->
-	*/
-	public function AttachmentFileName($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->basename').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentSize - O -- Attachment size -->
-	<!ATTLIST tpl:AttachmentSize
-	full	CDATA	#IMPLIED	-- if set, size is rounded to a human-readable value (in KB, MB, GB, TB)
-	>
-	*/
-	public function AttachmentSize($attr)
-	{
-		$f = $this->getFilters($attr);
-		if (!empty($attr['full'])) {
-			return '<?php echo '.sprintf($f,'$attach_f->size').'; ?>';
-		}
-		return '<?php echo '.sprintf($f,'files::size($attach_f->size)').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentTitle - O -- Attachment title -->
-	*/
-	public function AttachmentTitle($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->media_title').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentThumbnailURL - O -- Attachment square thumbnail URL -->
-	*/
-	public function AttachmentThumbnailURL($attr)
-	{
-		$f = $this->getFilters($attr);
-		return
-		'<?php '.
-		'if (isset($attach_f->media_thumb[\'sq\'])) {'.
-			'echo '.sprintf($f,'$attach_f->media_thumb[\'sq\']').';'.
-		'}'.
-		'?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentURL - O -- Attachment URL -->
-	*/
-	public function AttachmentURL($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->file_url').'; ?>';
-	}
-	
-	public function MediaURL($attr)
-	{
-		$f = $this->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->file_url').'; ?>';
-	}
 	
 	/* Blog ----------------------------------------------- */
@@ -1151,5 +976,5 @@
 	public function CategoryIf($attr,$content)
 	{
-		$if = array();
+		$if = new ArrayObject();
 		$operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
 		
@@ -1174,6 +999,8 @@
 		} 
 		
-		if (!empty($if)) {
-			return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
+		$this->core->callBehavior('tplIfConditions','CategoryIf',$attr,$content,$if);
+		
+		if (count($if) != 0) {
+			return '<?php if('.implode(' '.$operator.' ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
 		} else {
 			return $content;
@@ -1324,13 +1151,19 @@
 		if (empty($attr['no_context']))
 		{
-			$p .=
-			'if ($_ctx->exists("users")) { '.
-				"\$params['user_id'] = \$_ctx->users->user_id; ".
-			"}\n";
+			if (!isset($attr['author']))
+			{
+				$p .=
+				'if ($_ctx->exists("users")) { '.
+					"\$params['user_id'] = \$_ctx->users->user_id; ".
+				"}\n";
+			}
 			
-			$p .=
-			'if ($_ctx->exists("categories")) { '.
-				"\$params['cat_id'] = \$_ctx->categories->cat_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 .=
@@ -1416,5 +1249,5 @@
 	selected	(0|1)	#IMPLIED	-- post is selected (value : 1) or not (value : 0)
 	has_category	(0|1)	#IMPLIED	-- post has a category (value : 1) or not (value : 0)
-	has_attachment	(0|1)	#IMPLIED	-- post has attachments (value : 1) or not (value : 0)
+	has_attachment	(0|1)	#IMPLIED	-- post has attachments (value : 1) or not (value : 0) (see Attachment plugin for code)
 	comments_active	(0|1)	#IMPLIED	-- comments are active for this post (value : 1) or not (value : 0)
 	pings_active	(0|1)	#IMPLIED	-- trackbacks are active for this post (value : 1) or not (value : 0)
@@ -1427,5 +1260,5 @@
 	public function EntryIf($attr,$content)
 	{
-		$if = array();
+		$if = new ArrayObject();
 		$extended = null;
 		$hascategory = null;
@@ -1484,9 +1317,4 @@
 		}
 		
-		if (isset($attr['has_attachment'])) {
-			$sign = (boolean) $attr['has_attachment'] ? '' : '!';
-			$if[] = $sign.'$_ctx->posts->countMedia()';
-		}
-		
 		if (isset($attr['comments_active'])) {
 			$sign = (boolean) $attr['comments_active'] ? '' : '!';
@@ -1525,6 +1353,8 @@
 		}
 		
-		if (!empty($if)) {
-			return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
+		$this->core->callBehavior('tplIfConditions','EntryIf',$attr,$content,$if);
+		
+		if (count($if) != 0) {
+			return '<?php if('.implode(' '.$operator.' ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
 		} else {
 			return $content;
@@ -1621,37 +1451,4 @@
 	}
 	
-	/*dtd
-	<!ELEMENT tpl:EntryAttachmentCount - O -- Number of attachments for entry -->
-	<!ATTLIST tpl:EntryAttachmentCount
-	none	CDATA	#IMPLIED	-- text to display for "no attachment" (default: no attachment)
-	one	CDATA	#IMPLIED	-- text to display for "one attachment" (default: one attachment)
-	more	CDATA	#IMPLIED	-- text to display for "more attachment" (default: %s attachment, %s is replaced by the number of attachments)
-	>
-	*/
-	public function EntryAttachmentCount($attr)
-	{
-		$none = 'no attachment';
-		$one = 'one attachment';
-		$more = '%d attachments';
-		
-		if (isset($attr['none'])) {
-			$none = addslashes($attr['none']);
-		}
-		if (isset($attr['one'])) {
-			$one = addslashes($attr['one']);
-		}
-		if (isset($attr['more'])) {
-			$more = addslashes($attr['more']);
-		}
-		
-		return
-		"<?php if (\$_ctx->posts->countMedia() == 0) {\n".
-		"  printf(__('".$none."'),(integer) \$_ctx->posts->countMedia());\n".
-		"} elseif (\$_ctx->posts->countMedia() == 1) {\n".
-		"  printf(__('".$one."'),(integer) \$_ctx->posts->countMedia());\n".
-		"} else {\n".
-		"  printf(__('".$more."'),(integer) \$_ctx->posts->countMedia());\n".
-		"} ?>";
-	}
 	
 	/*dtd
@@ -1907,5 +1704,5 @@
 		$rfc822 = !empty($attr['rfc822']);
 		$type = (!empty($attr['creadt']) ? 'creadt' : '');
-		$type = (!empty($attr['upddt']) ? 'upddt' : '');
+		$type = (!empty($attr['upddt']) ? 'upddt' : $type);
 		
 		$f = $this->getFilters($attr);
@@ -1936,5 +1733,5 @@
 		
 		$type = (!empty($attr['creadt']) ? 'creadt' : '');
-		$type = (!empty($attr['upddt']) ? 'upddt' : '');
+		$type = (!empty($attr['upddt']) ? 'upddt' : $type);
         
 		$f = $this->getFilters($attr);
@@ -2209,6 +2006,8 @@
 		}
 		
-		if (!empty($if)) {
-			return '<?php if('.implode(' && ',$if).') : ?>'.$content.'<?php endif; ?>';
+		$this->core->callBehavior('tplIfConditions','PaginationIf',$attr,$content,$if);
+		
+		if (count($if) != 0) {
+			return '<?php if('.implode(' && ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
 		} else {
 			return $content;
@@ -2482,6 +2281,8 @@
 		}
 		
-		if (!empty($if)) {
-			return '<?php if('.implode(' && ',$if).') : ?>'.$content.'<?php endif; ?>';
+		$this->core->callBehavior('tplIfConditions','CommentIf',$attr,$content,$if);
+		
+		if (count($if) != 0) {
+			return '<?php if('.implode(' && ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
 		} else {
 			return $content;
@@ -2973,5 +2774,5 @@
 	current_mode		CDATA	#IMPLIED	-- tests if current URL mode is the one given in parameter
 	has_tpl			CDATA     #IMPLIED  -- tests if a named template exists
-	has_tag			CDATA     #IMPLIED  -- tests if a named template tag exists
+	has_tag			CDATA     #IMPLIED  -- tests if a named template tag exists (see Tag plugin for code)
 	blog_id			CDATA     #IMPLIED  -- tests if current blog ID is the one given in parameter
 	comments_active	(0|1)	#IMPLIED	-- test if comments are enabled blog-wide 
@@ -2983,5 +2784,5 @@
 	public function SysIf($attr,$content)
 	{
-		$if = array();
+		$if = new ArrayObject();
 		$is_ping = null;
 		
@@ -3029,13 +2830,4 @@
 		}
 		
-		if (isset($attr['has_tag'])) {
-			$sign = '';
-			if (substr($attr['has_tag'],0,1) == '!') {
-				$sign = '!';
-				$attr['has_tag'] = substr($attr['has_tag'],1);
-			}
-			$if[] =  $sign."(\$core->tpl->tagExists('".addslashes($attr['has_tag'])."') )";
-		}
-		
 		if (isset($attr['blog_id'])) {
 			$sign = '';
@@ -3067,6 +2859,8 @@
 		}
 		
-		if (!empty($if)) {
-			return '<?php if('.implode(' '.$operator.' ',$if).') : ?>'.$content.'<?php endif; ?>';
+		$this->core->callBehavior('tplIfConditions','SysIf',$attr,$content,$if);
+		
+		if (count($if) != 0) {
+			return '<?php if('.implode(' '.$operator.' ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
 		} else {
 			return $content;
@@ -3230,4 +3024,7 @@
 		$this->closed = true;
 	}
+	public function isClosed() {
+		return $this->closed;
+	}
 	public function compile($tpl) {
 		if ($this->closed) {
Index: inc/public/default-templates/password-form.html
===================================================================
--- inc/public/default-templates/password-form.html	(revision 199)
+++ inc/public/default-templates/password-form.html	(revision 454)
@@ -34,6 +34,5 @@
 
 <p>{{tpl:lang You must give a password to access this area.}}</p>
-<p><label>{{tpl:lang Password:}} <input type="password" name="password" value=""
-tabindex="1" /></label> <input type="submit" value="ok" /></p>
+<p><label>{{tpl:lang Password:}} <input type="password" name="password" value="" /></label> <input type="submit" value="ok" /></p>
 
 </form>
Index: nc/public/default-templates/tag.html
===================================================================
--- inc/public/default-templates/tag.html	(revision 199)
+++ 	(revision )
@@ -1,153 +1,0 @@
-<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
-  
-  <title>{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
-  <meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  
-  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
-  <meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
-  <meta name="dc.language" content="{{tpl:BlogLanguage}}" />
-  <meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  <meta name="dc.type" content="text" />
-  <meta name="dc.format" content="text/html" />
-  
-  <link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
-  <link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
-  
-  <tpl:Entries no_content="1">
-    <tpl:EntriesHeader>
-      <tpl:Pagination>
-        <tpl:PaginationIf end="0">
-        <link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
-        </tpl:PaginationIf>
-        
-        <tpl:PaginationIf start="0">
-        <link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
-        </tpl:PaginationIf>
-      </tpl:Pagination>
-    </tpl:EntriesHeader>
-    
-    <link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
-  </tpl:Entries>
-  
-  <link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:TagFeedURL type="atom"}}" />
-  <link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
-  
-  {{tpl:include src="_head.html"}}
-</head>
-
-<body class="dc-tag">
-<div id="page">
-{{tpl:include src="_top.html"}}
-
-<div id="wrapper">
-
-<div id="main">
-  <div id="content">
-  
-  <div id="content-info">
-    <h2>{{tpl:lang Tag}} - {{tpl:TagID}}</h2>
-    
-    <p><a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}"
-    title="{{tpl:lang This tag's entries Atom feed}}" class="feed">{{tpl:lang Entries feed}}</a>
-    
-    <tpl:SysIf operator="or" comments_active="1" pings_active="1">
-    - <a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}/comments"
-    title="{{tpl:lang This tag's comments Atom feed}}" class="feed">{{tpl:lang Comments feed}}</a>
-    </tpl:SysIf>
-    </p>
-  </div>
-  
-  <tpl:Entries>
-    <div id="p{{tpl:EntryID}}" class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}}" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}">
-    <!-- # New day date -->
-    <tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader>
-    
-    <h2 class="post-title"><a
-    href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
-    
-    <p class="post-info">{{tpl:lang By}} {{tpl:EntryAuthorLink}}
-    {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
-    <tpl:EntryIf has_category="1">
-    - <a href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a>
-    </tpl:EntryIf>
-    </p>
-    
-    <tpl:EntryTags>
-    <tpl:TagsHeader><ul class="post-tags"></tpl:TagsHeader>
-    <li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li>
-    <tpl:TagsFooter></ul></tpl:TagsFooter>
-    </tpl:EntryTags>
-    
-    <!-- # --BEHAVIOR-- publicEntryBeforeContent -->
-    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
-    
-    <!-- # Entry with an excerpt -->
-    <tpl:EntryIf extended="1">
-      <div class="post-content">{{tpl:EntryExcerpt}}</div>
-      <p class="read-it"><a href="{{tpl:EntryURL}}"
-      title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue
-      reading}}</a>...</p>
-    </tpl:EntryIf>
-    
-    <!-- # Entry without excerpt -->
-    <tpl:EntryIf extended="0">
-      <div class="post-content">{{tpl:EntryContent}}</div>
-    </tpl:EntryIf>
-    
-    <!-- # --BEHAVIOR-- publicEntryAfterContent -->
-    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}
-    
-    <!-- # Number of comments, trackbacks and attachments -->
-    <tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
-      <p class="post-info-co">
-    </tpl:EntryIf>
-    <tpl:EntryIf show_comments="1">
-      <a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
-    </tpl:EntryIf>
-    <tpl:EntryIf show_pings="1">
-      <a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
-    <tpl:EntryIf has_attachment="1">
-      <a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
-    <tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
-      </p>
-    </tpl:EntryIf>
-    </div>
-    
-    <tpl:EntriesFooter>
-      <tpl:Pagination>
-        <p class="pagination"><tpl:PaginationIf end="0"><a href="{{tpl:PaginationURL offset="+1"}}" class="prev">&#171;
-        {{tpl:lang previous entries}}</a> - </tpl:PaginationIf>
-        {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
-        <tpl:PaginationIf start="0"> - <a href="{{tpl:PaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}}
-        &#187;</a></tpl:PaginationIf></p>
-      </tpl:Pagination>
-    </tpl:EntriesFooter>
-  </tpl:Entries>
-  </div>
-</div> <!-- End #main -->
-
-<div id="sidebar">
-  <div id="blognav">
-    {{tpl:Widgets type="nav"}}
-  </div> <!-- End #blognav -->
-  
-  <div id="blogextra">
-    {{tpl:Widgets type="extra"}}
-  </div> <!-- End #blogextra -->
-</div>
-
-</div> <!-- End #wrapper -->
-
-{{tpl:include src="_footer.html"}}
-</div> <!-- End #page -->
-</body>
-</html>
Index: nc/public/default-templates/tags.html
===================================================================
--- inc/public/default-templates/tags.html	(revision 199)
+++ 	(revision )
@@ -1,69 +1,0 @@
-<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
-  
-  <title>{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}</title>
-  <meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  
-  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
-  <meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}" />
-  <meta name="dc.language" content="{{tpl:BlogLanguage}}" />
-  <meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  <meta name="dc.type" content="text" />
-  <meta name="dc.format" content="text/html" />
-  
-  <link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
-  <link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
-  
-  <link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
-  
-  {{tpl:include src="_head.html"}}
-</head>
-
-<body class="dc-tags">
-<div id="page">
-{{tpl:include src="_top.html"}}
-
-<div id="wrapper">
-
-<div id="main">
-  <div id="content">
-  
-  <div id="content-info">
-    <h2>{{tpl:lang Tags}}</h2>
-  </div>
-  
-  <div class="content-inner">  
-  <ul class="tags">
-    <tpl:Tags>
-      <li><a href="{{tpl:TagURL}}" class="tag{{tpl:TagRoundPercent}}">{{tpl:TagID}}</a></li>
-    </tpl:Tags>
-    </ul>
-  </div>
-  
-  </div>
-</div> <!-- End #main -->
-
-<div id="sidebar">
-  <div id="blognav">
-    {{tpl:Widgets type="nav"}}
-  </div> <!-- End #blognav -->
-  
-  <div id="blogextra">
-    {{tpl:Widgets type="extra"}}
-  </div> <!-- End #blogextra -->
-</div>
-
-</div> <!-- End #wrapper -->
-
-{{tpl:include src="_footer.html"}}
-</div> <!-- End #page -->
-</body>
-</html>
Index: inc/public/lib.tpl.context.php
===================================================================
--- inc/public/lib.tpl.context.php	(revision 270)
+++ inc/public/lib.tpl.context.php	(revision 687)
@@ -342,10 +342,11 @@
 	public static function EntryFirstImageHelper($size,$with_category,$class="")
 	{
-		if (!preg_match('/^sq|t|s|m|o$/',$size)) {
+		global $core, $_ctx;
+		
+		$media = new dcMedia($core);
+		$sizes = implode('|',array_keys($media->thumb_sizes)).'|o';
+		if (!preg_match('/^'.$sizes.'$/',$size)) {
 			$size = 's';
 		}
-		
-		global $core, $_ctx;
-		
 		$p_url = $core->blog->settings->system->public_url;
 		$p_site = preg_replace('#^(.+?//.+?)/(.*)$#','$1',$core->blog->url);
@@ -353,5 +354,5 @@
 		
 		$pattern = '(?:'.preg_quote($p_site,'/').')?'.preg_quote($p_url,'/');
-		$pattern = sprintf('/<img.+?src="%s(.*?\.(?:jpg|gif|png))"[^>]+/msu',$pattern);
+		$pattern = sprintf('/<img.+?src="%s(.*?\.(?:jpg|jpeg|gif|png))"[^>]+/msu',$pattern);
 		
 		$src = '';
@@ -400,9 +401,13 @@
 	private static function ContentFirstImageLookup($root,$img,$size)
 	{
+		global $core;
+		
 		# Get base name and extension
 		$info = path::info($img);
 		$base = $info['base'];
 		
-		if (preg_match('/^\.(.+)_(sq|t|s|m)$/',$base,$m)) {
+		$media = new dcMedia($core);
+		$sizes = implode('|',array_keys($media->thumb_sizes));
+		if (preg_match('/^\.(.+)_('.$sizes.')$/',$base,$m)) {
 			$base = $m[1];
 		}
@@ -420,4 +425,6 @@
 			} elseif (file_exists($f.'.jpg')) {
 				$res = $base.'.jpg';
+			} elseif (file_exists($f.'.jpeg')) {
+				$res = $base.'.jpeg';
 			} elseif (file_exists($f.'.png')) {
 				$res = $base.'.png';
Index: inc/public/prepend.php
===================================================================
--- inc/public/prepend.php	(revision 270)
+++ inc/public/prepend.php	(revision 420)
@@ -113,4 +113,10 @@
 $core->themes->loadNsFile($__theme,'public');
 
+# Loading translations for selected theme
+if ($__parent_theme) {
+	$core->themes->loadModuleL10N($__parent_theme,$_lang,'main');
+}
+$core->themes->loadModuleL10N($__theme,$_lang,'main');
+
 # --BEHAVIOR-- publicPrepend
 $core->callBehavior('publicPrepend',$core);
Index: locales/_pot/main.pot
===================================================================
--- locales/_pot/main.pot	(revision 261)
+++ locales/_pot/main.pot	(revision 558)
@@ -539,5 +539,5 @@
 
 #: admin/blog_pref.php:530 admin/user.php:300
-msgid "change permissions"
+msgid "Change permissions"
 msgstr ""
 
@@ -1056,5 +1056,5 @@
 #: admin/comments.php:119 admin/media.php:450 admin/post.php:526
 #: admin/search.php:107 admin/search.php:150
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -1361,5 +1361,5 @@
 
 #: admin/install/index.php:340
-msgid "save"
+msgid "Save"
 msgstr ""
 
@@ -1607,9 +1607,9 @@
 #: admin/media.php:231 admin/popup_link.php:52 admin/popup_posts.php:54
 #: admin/post_media.php:68
-msgid "cancel"
+msgid "Cancel"
 msgstr ""
 
 #: admin/media.php:232 admin/post_media.php:69
-msgid "yes"
+msgid "Yes"
 msgstr ""
 
@@ -1954,5 +1954,5 @@
 
 #: admin/permissions_blog.php:167
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/_pot/plugins.pot
===================================================================
--- locales/_pot/plugins.pot	(revision 261)
+++ locales/_pot/plugins.pot	(revision 558)
@@ -1868,9 +1868,9 @@
 
 #: plugins/widgets/index.php:209
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr ""
 
 #: plugins/widgets/index.php:210
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/bn/main.po
===================================================================
--- locales/bn/main.po	(revision 261)
+++ locales/bn/main.po	(revision 558)
@@ -389,5 +389,5 @@
 msgstr "শূণ্য ইউজার"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "অনুমতি পরিবর্তন করুন"
 
@@ -752,5 +752,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr "মুছে ফেলুন"
 
@@ -985,5 +985,5 @@
 msgstr "ভুল ইউজারনেম বা পাসওয়ার্ড"
 
-msgid "save"
+msgid "Save"
 msgstr "সংরক্ষণ করুন"
 
@@ -1170,8 +1170,8 @@
 msgstr "আপনি কি আসলেই %s মুছে ফেলতে চান?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "বাতিল"
 
-msgid "yes"
+msgid "Yes"
 msgstr "হ্যাঁ"
 
@@ -1431,5 +1431,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/bn/plugins.po
===================================================================
--- locales/bn/plugins.po	(revision 261)
+++ locales/bn/plugins.po	(revision 558)
@@ -1369,8 +1369,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/ca/main.po
===================================================================
--- locales/ca/main.po	(revision 261)
+++ locales/ca/main.po	(revision 558)
@@ -396,5 +396,5 @@
 msgstr "Cap usuari"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "Canviar permisos"
 
@@ -779,5 +779,5 @@
 msgstr "marca com a no desitjat"
 
-msgid "delete"
+msgid "Delete"
 msgstr "suprimir"
 
@@ -1017,5 +1017,5 @@
 msgstr "Identificador o contrasenya incorrectes"
 
-msgid "save"
+msgid "Save"
 msgstr "desa"
 
@@ -1217,8 +1217,8 @@
 msgstr "Està segur que vol suprimir  %s?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "Anul·lar"
 
-msgid "yes"
+msgid "Yes"
 msgstr "Sí"
 
@@ -1484,5 +1484,5 @@
 msgstr "Esculli un o més blogs en els quals vulgui atribuir permisos als usuaris %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "definir els permisos"
 
Index: locales/ca/plugins.po
===================================================================
--- locales/ca/plugins.po	(revision 261)
+++ locales/ca/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/cs/main.po
===================================================================
--- locales/cs/main.po	(revision 261)
+++ locales/cs/main.po	(revision 558)
@@ -387,5 +387,5 @@
 msgstr "Žádní uživatelé"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "změnit práva"
 
@@ -756,5 +756,5 @@
 msgstr "označit jako podezřelé"
 
-msgid "delete"
+msgid "Delete"
 msgstr "smazat"
 
@@ -987,5 +987,5 @@
 msgstr "Uživatelské jméno a heslo"
 
-msgid "save"
+msgid "Save"
 msgstr "uložit"
 
@@ -1170,8 +1170,8 @@
 msgstr "Jeste si jisti, že chcete odstranit %s?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "zrušit"
 
-msgid "yes"
+msgid "Yes"
 msgstr "ano"
 
@@ -1430,5 +1430,5 @@
 msgstr "Vyberte jeden nebo více blogů, ke kterým chcete uživateli %s dát oprávnění."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "Nastavit oprávnění"
 
Index: locales/cs/plugins.po
===================================================================
--- locales/cs/plugins.po	(revision 261)
+++ locales/cs/plugins.po	(revision 558)
@@ -1372,8 +1372,8 @@
 msgstr "Extra panel"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "aktualizovat panely"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "resetovat panely"
 
Index: locales/da/main.po
===================================================================
--- locales/da/main.po	(revision 261)
+++ locales/da/main.po	(revision 558)
@@ -389,5 +389,5 @@
 msgstr "Ingen brugere"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "Skift rettigheder"
 
@@ -757,5 +757,5 @@
 msgstr "marker som junk"
 
-msgid "delete"
+msgid "Delete"
 msgstr "slet"
 
@@ -992,5 +992,5 @@
 msgstr "Forkert brugernavn eller kodeord"
 
-msgid "save"
+msgid "Save"
 msgstr "gem"
 
@@ -1177,8 +1177,8 @@
 msgstr ""
 
-msgid "cancel"
-msgstr ""
-
-msgid "yes"
+msgid "Cancel"
+msgstr ""
+
+msgid "Yes"
 msgstr ""
 
@@ -1437,5 +1437,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/da/plugins.po
===================================================================
--- locales/da/plugins.po	(revision 261)
+++ locales/da/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/de/main.po
===================================================================
--- locales/de/main.po	(revision 261)
+++ locales/de/main.po	(revision 558)
@@ -388,5 +388,5 @@
 msgstr "Keine Benutzer"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "Rechte ändern"
 
@@ -757,5 +757,5 @@
 msgstr "Markiere als Junk"
 
-msgid "delete"
+msgid "Delete"
 msgstr "löschen"
 
@@ -989,5 +989,5 @@
 msgstr "Benutzername und Passwort"
 
-msgid "save"
+msgid "Save"
 msgstr "speichern"
 
@@ -1172,8 +1172,8 @@
 msgstr "Willst Du wirklich %s löschen?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "abbrechen"
 
-msgid "yes"
+msgid "Yes"
 msgstr "ja"
 
@@ -1432,5 +1432,5 @@
 msgstr "Wähle einen oder mehrere Blogs für die Rechte der Benutzer %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "setze Rechte"
 
Index: locales/de/plugins.po
===================================================================
--- locales/de/plugins.po	(revision 261)
+++ locales/de/plugins.po	(revision 558)
@@ -1375,8 +1375,8 @@
 msgstr "Extra Sidebar"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "Sidebars aktualisieren"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "Sidebars zurücksetzen"
 
Index: locales/de/public.po
===================================================================
--- locales/de/public.po	(revision 221)
+++ locales/de/public.po	(revision 722)
@@ -86,11 +86,11 @@
 
 msgid "Your search for <em>%1$s</em> returned no result."
-msgstr "Deine Suche nach <em>%1$s</em> ergab keinen Treffer."
+msgstr "Ihre Suche nach <em>%1$s</em> ergab keinen Treffer."
 
 msgid "Your search for <em>%1$s</em> returned <strong>%2$s</strong> result."
-msgstr "Deine Suche nach <em>%1$s</em> ergab <strong>%2$s</strong> Treffer."
+msgstr "Ihre Suche nach <em>%1$s</em> ergab <strong>%2$s</strong> Treffer."
 
 msgid "Your search for <em>%1$s</em> returned <strong>%2$s</strong> results."
-msgstr "Deine Suche nach <em>%1$s</em> ergab <strong>%2$s</strong> Treffer."
+msgstr "Ihre Suche nach <em>%1$s</em> ergab <strong>%2$s</strong> Treffer."
 
 msgid "Home"
Index: locales/eo/main.po
===================================================================
--- locales/eo/main.po	(revision 261)
+++ locales/eo/main.po	(revision 558)
@@ -384,5 +384,5 @@
 msgstr ""
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr ""
 
@@ -745,5 +745,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -968,5 +968,5 @@
 msgstr ""
 
-msgid "save"
+msgid "Save"
 msgstr ""
 
@@ -1151,8 +1151,8 @@
 msgstr ""
 
-msgid "cancel"
-msgstr ""
-
-msgid "yes"
+msgid "Cancel"
+msgstr ""
+
+msgid "Yes"
 msgstr ""
 
@@ -1411,5 +1411,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/eo/plugins.po
===================================================================
--- locales/eo/plugins.po	(revision 261)
+++ locales/eo/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/es-ar/main.po
===================================================================
--- locales/es-ar/main.po	(revision 261)
+++ locales/es-ar/main.po	(revision 558)
@@ -390,5 +390,5 @@
 msgstr "Ningún usuario"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "cambiar permisos"
 
@@ -759,5 +759,5 @@
 msgstr "no deseado"
 
-msgid "delete"
+msgid "Delete"
 msgstr "eliminar"
 
@@ -991,5 +991,5 @@
 msgstr "Nombre de usuario y contraseña:"
 
-msgid "save"
+msgid "Save"
 msgstr "guardar"
 
@@ -1175,8 +1175,8 @@
 msgstr "¿Está seguro de que desea eliminar %s?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "cancelar"
 
-msgid "yes"
+msgid "Yes"
 msgstr "sí"
 
@@ -1436,5 +1436,5 @@
 msgstr "Elija uno o más blogs sobre los que desee que los siguientes usuarios tengan permisos: %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "establecer permisos"
 
Index: locales/es-ar/plugins.po
===================================================================
--- locales/es-ar/plugins.po	(revision 261)
+++ locales/es-ar/plugins.po	(revision 558)
@@ -1379,8 +1379,8 @@
 msgstr "Barra lateral extra"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "actualizar barras laterales"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "restaurar barras laterales"
 
Index: locales/es/main.po
===================================================================
--- locales/es/main.po	(revision 261)
+++ locales/es/main.po	(revision 558)
@@ -391,5 +391,5 @@
 msgstr "Ningún usuario"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "cambiar los permisos"
 
@@ -761,5 +761,5 @@
 msgstr "marcar como no deseado"
 
-msgid "delete"
+msgid "Delete"
 msgstr "borrar"
 
@@ -994,5 +994,5 @@
 msgstr "Usuario y contraseña"
 
-msgid "save"
+msgid "Save"
 msgstr "guardar"
 
@@ -1178,8 +1178,8 @@
 msgstr "¿Seguro que desea eliminar %s ?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "cancelar"
 
-msgid "yes"
+msgid "Yes"
 msgstr "sí"
 
@@ -1439,5 +1439,5 @@
 msgstr "Elija uno o más blogs sobre los que quiera dar permisos a los siguientes usuarios: %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "establecer los permisos"
 
Index: locales/es/plugins.po
===================================================================
--- locales/es/plugins.po	(revision 261)
+++ locales/es/plugins.po	(revision 558)
@@ -1383,8 +1383,8 @@
 msgstr "Barra lateral extra"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "actualizar las barras laterales"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "Reinicializar las barras laterales"
 
Index: locales/eu/main.po
===================================================================
--- locales/eu/main.po	(revision 261)
+++ locales/eu/main.po	(revision 558)
@@ -384,5 +384,5 @@
 msgstr ""
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr ""
 
@@ -745,5 +745,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -968,5 +968,5 @@
 msgstr ""
 
-msgid "save"
+msgid "Save"
 msgstr ""
 
@@ -1151,8 +1151,8 @@
 msgstr ""
 
-msgid "cancel"
-msgstr ""
-
-msgid "yes"
+msgid "Cancel"
+msgstr ""
+
+msgid "Yes"
 msgstr ""
 
@@ -1411,5 +1411,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/eu/plugins.po
===================================================================
--- locales/eu/plugins.po	(revision 261)
+++ locales/eu/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/fr/help/core_blog_pref.html
===================================================================
--- locales/fr/help/core_blog_pref.html	(revision 175)
+++ locales/fr/help/core_blog_pref.html	(revision 352)
@@ -43,6 +43,7 @@
 <dl>
   <dt>Nom de l'éditeur du blog</dt>
-  <dd>Nom de la personne en charge du blog. Peut être le propriétaire ou le
-  directeur de publication s'il existe.</dd>
+  <dd>Nom de la personne responsable du contenu du blog. Peut être le propriétaire
+  ou le directeur de publication s'il existe. Information affichée dans les
+  informations du flux de syndication.</dd>
   
   <dt>Note de copyright</dt>
Index: locales/fr/main.po
===================================================================
--- locales/fr/main.po	(revision 261)
+++ locales/fr/main.po	(revision 718)
@@ -238,8 +238,8 @@
 
 msgid "URL scan method:"
-msgstr "Méthode de lecture de l'URL"
+msgstr "Méthode de lecture de l'URL :"
 
 msgid "Blog status:"
-msgstr "État du blog"
+msgstr "État du blog :"
 
 msgid "Blog configuration"
@@ -383,6 +383,6 @@
 msgstr "Aucun utilisateur"
 
-msgid "change permissions"
-msgstr "changer les permissions"
+msgid "Change permissions"
+msgstr "Changer les permissions"
 
 msgid "Super administrator"
@@ -420,6 +420,9 @@
 msgstr "Feuille de style"
 
+msgid "Configure theme"
+msgstr "Configurer le thème"
+
 msgid "Theme configuration"
-msgstr "Configuration du thème"
+msgstr "Configurer le thème"
 
 msgid "Blog themes"
@@ -455,8 +458,8 @@
 msgstr "Vous utilisez actuellement \"%s\""
 
-msgid "use selected theme"
-msgstr "utiliser le thème sélectionné"
-
-msgid "delete selected theme"
+msgid "Use selected theme"
+msgstr "Utiliser le thème sélectionné"
+
+msgid "Delete selected theme"
 msgstr "Supprimer le thème sélectionné"
 
@@ -605,4 +608,7 @@
 msgid "Top level"
 msgstr "Premier niveau"
+
+msgid "Create"
+msgstr "Créer"
 
 msgid "Remove a category"
@@ -795,4 +801,7 @@
 msgstr "Nouveau billet"
 
+msgid "My dashboard"
+msgstr "Mon tableau de bord"
+
 msgid "My preferences"
 msgstr "Mes préférences"
@@ -850,6 +859,6 @@
 msgstr "Catégorie :"
 
-msgid "save and publish"
-msgstr "enregister et publier"
+msgid "Save and publish"
+msgstr "Enregister et publier"
 
 #, php-format
@@ -973,6 +982,6 @@
 msgstr "Identifiant et mot de passe"
 
-msgid "save"
-msgstr "enregistrer"
+msgid "Save"
+msgstr "Enregistrer"
 
 msgid "All done!"
@@ -1156,8 +1165,8 @@
 msgstr "Êtes-vous certain de vouloir supprimer %s ?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "annuler"
 
-msgid "yes"
+msgid "Yes"
 msgstr "oui"
 
@@ -1197,4 +1206,7 @@
 msgstr "Trier les fichiers :"
 
+msgid "Sort"
+msgstr "Trier"
+
 msgid "Add files"
 msgstr "Ajouter des fichiers"
@@ -1216,6 +1228,6 @@
 msgstr "Pour envoyer plusieurs fichiers à la fois, vous pouvez activer l'interface avancée dans"
 
-msgid "send"
-msgstr "envoyer"
+msgid "Send"
+msgstr "Envoyer"
 
 msgid "New directory"
@@ -1416,5 +1428,5 @@
 msgstr "Choisissez un ou plusieurs blogs pour lesquels les utilisateurs suivants auront des permissions : %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "définir les permissions"
 
@@ -1573,4 +1585,7 @@
 msgstr "Prévisualiser le billet"
 
+msgid "Go to this entry on the site"
+msgstr "Voir ce billet sur le site"
+
 msgid "Entry status:"
 msgstr "État du billet :"
@@ -1606,4 +1621,7 @@
 msgstr "supprimer"
 
+msgid "Remove"
+msgstr "Supprimer"
+
 msgid "No attachment."
 msgstr "Aucune pièce jointe"
@@ -1735,5 +1753,5 @@
 msgstr "Identifiant de l'utilisateur :"
 
-msgid "If you want to change your email or password you must provide your current password."
+msgid "If you have changed this user email or password you must provide your current password to save these modifications."
 msgstr "Si vous voulez changer votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe."
 
@@ -1786,4 +1804,7 @@
 msgstr "Activer l'interface avancée du gestionnaire de médias"
 
+msgid "Iconset:"
+msgstr "Jeu d'icônes :"
+
 msgid "Do not use standard favicon"
 msgstr "Ne pas utiliser le favicon standard"
@@ -1859,9 +1880,9 @@
 msgstr "Requête :"
 
-msgid "search entries"
-msgstr "rechercher des billets"
-
-msgid "search comments"
-msgstr "recherche des commentaires"
+msgid "Search entries"
+msgstr "Rechercher des billets"
+
+msgid "Search comments"
+msgstr "Rechercher des commentaires"
 
 msgid "schedule"
@@ -2048,4 +2069,7 @@
 msgid "Logout"
 msgstr "Déconnexion"
+
+msgid "Logout %s"
+msgstr "Déconnecter %s"
 
 msgid "Safe mode"
@@ -2765,4 +2789,7 @@
 msgstr "Connexion à la base de données impossible"
 
+msgid "Mandatory for password recovering procedure."
+msgstr "Obligatoire pour la procédure de récupération de mot de passe."
+
 #, php-format
 msgid "<p>This either means that the username and password information in your <strong>config.php</strong> file is incorrect or we can't contact the database server at \"<em>%s</em>\". This could mean your host's database server is down.</p> <ul><li>Are you sure you have the correct username and password?</li><li>Are you sure that you have typed the correct hostname?</li><li>Are you sure that the database server is running?</li></ul><p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href=\"http://forum.dotclear.net/\">Dotclear Support Forums</a>.</p>"
@@ -2819,2 +2846,5 @@
 #~ msgid "Modify numbers in fields to change favorites order."
 #~ msgstr "Modifiez les nombres dans les champs pour changer l'ordre des favoris."
+
+msgid "Save and create another"
+msgstr "Enregistrer et créer un nouveau"
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 261)
+++ locales/fr/plugins.po	(revision 710)
@@ -531,5 +531,5 @@
 
 msgid "Preview"
-msgstr "Prévisualisation"
+msgstr "Prévisualiser"
 
 msgid "Sidebar"
@@ -851,8 +851,8 @@
 
 msgid "Import all categories as tags:"
-msgstr "Importer les catégories comme des tags :"
+msgstr "Importer les catégories comme des mots-clés :"
 
 msgid "Prefix such tags with:"
-msgstr "Préfixer ces tags avec :"
+msgstr "Préfixer ces mots-clés avec :"
 
 msgid "Content filters"
@@ -1021,5 +1021,5 @@
 
 msgid "Are you sure you want to delete this page?"
-msgstr "Êtes-vous certain de vouloir supprimer cette pages ?"
+msgstr "Êtes-vous certain de vouloir supprimer cette page ?"
 
 msgid "Page has been successfully updated."
@@ -1084,8 +1084,8 @@
 
 msgid "Tags"
-msgstr "Tags"
+msgstr "Mots-clés"
 
 msgid "Tags:"
-msgstr "Tags :"
+msgstr "Mots-clés :"
 
 #, php-format
@@ -1104,5 +1104,5 @@
 
 msgid "Tag"
-msgstr "Tag"
+msgstr "Mot-clé"
 
 msgid "used in %e - frequency %p%"
@@ -1116,26 +1116,26 @@
 
 msgid "Enter tags separated by coma"
-msgstr "Entrer les tags séparés par une virgule"
+msgstr "Entrer les mots-clés séparés par une virgule"
 
 msgid "Add tags"
-msgstr "Ajouter des tags"
+msgstr "Ajouter des mots-clés"
 
 msgid "Remove tags"
-msgstr "Supprimer des tags"
+msgstr "Supprimer des mots-clés"
 
 msgid "Add tags to entries"
-msgstr "Ajouter des tags aux billets"
+msgstr "Ajouter des mots-clés aux billets"
 
 msgid "Tags to add:"
-msgstr "Tags à ajouter :"
+msgstr "Mots-clés à ajouter :"
 
 msgid "Remove selected tags from entries"
-msgstr "Supprimer les tags sélectionnés des billets"
+msgstr "Supprimer les mots-clés sélectionnés des billets"
 
 msgid "No tags for selected entries"
-msgstr "Aucun tag pour les billets sélectionnés"
+msgstr "Aucun mot-clé pour les billets sélectionnés"
 
 msgid "Following tags have been found in selected entries:"
-msgstr "Les tags suivants ont été trouvés dans les billets sélectionnés :"
+msgstr "Les mots-clés suivants ont été trouvés dans les billets sélectionnés :"
 
 msgid "short"
@@ -1146,11 +1146,11 @@
 
 msgid "Tags list format:"
-msgstr "Format de la liste des tags :"
+msgstr "Format de la liste des mots-clés :"
 
 msgid "This tag's comments Atom feed"
-msgstr "Fil Atom des commentaires de ce tag"
+msgstr "Fil Atom des commentaires de ce mot-clé"
 
 msgid "This tag's entries Atom feed"
-msgstr "Fil Atom des billets de ce tag"
+msgstr "Fil Atom des billets de ce mot-clé"
 
 msgid "Limit (empty means no limit):"
@@ -1161,32 +1161,41 @@
 
 msgid "Tag name"
-msgstr "Nom du tag"
+msgstr "Nom du mot-clé"
 
 msgid "All tags"
-msgstr "Tous les tags"
+msgstr "Tous les mots-clés"
 
 msgid "Link to all tags:"
-msgstr "Lien vers tous les mots-clefs :"
+msgstr "Lien vers tous les mots-clés :"
 
 msgid "Edit tag"
-msgstr "Modifier un tag"
+msgstr "Modifier le mot-clé"
+
+msgid "Actions for this tag"
+msgstr "Actions pour ce mot-clé"
 
 msgid "Tag has been successfully renamed"
-msgstr "Tag renommé avec succès"
+msgstr "Mot-clé renommé avec succès"
 
 msgid "Back to tags list"
-msgstr "Retour à la liste des tags"
-
-msgid "Rename this tag:"
-msgstr "Renommer ce tag :"
-
-msgid "Delete this tag"
-msgstr "Supprimer ce tag"
+msgstr "Retour à la liste des mots-clés"
+
+msgid "Edit tag name:"
+msgstr "Renommer ce mot-clé :"
+
+msgid "Rename"
+msgstr "Renommer"
+
+msgid "Delete this tag:"
+msgstr "Supprimer ce mot-clé :"
 
 msgid "Tag has been successfully removed"
-msgstr "Tag supprimé avec succès"
+msgstr "Mot-clé supprimé avec succès"
 
 msgid "No tags on this blog."
-msgstr "Aucun tag sur ce blog"
+msgstr "Aucun mot-clé sur ce blog"
+
+msgid "List of entries with this tag"
+msgstr "Liste des billets avec ce mot-clé"
 
 msgid "Theme Editor"
@@ -1309,5 +1318,5 @@
 
 msgid "Tag:"
-msgstr "Tag :"
+msgstr "Mot-clé :"
 
 msgid "Last comments"
@@ -1343,4 +1352,7 @@
 msgstr "extra"
 
+msgid "custom"
+msgstr "supplémentaire"
+
 msgid "Widgets"
 msgstr "Widgets"
@@ -1364,8 +1376,11 @@
 msgstr "Bandeau d'extra"
 
-msgid "update sidebars"
+msgid "Custom sidebar"
+msgstr "Bandeau supplémentaire"
+
+msgid "Update sidebars"
 msgstr "Mettre à jour les bandeaux"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "Réinitialiser les bandeaux"
 
@@ -1444,2 +1459,5 @@
 #~ msgid "Invalid page URL"
 #~ msgstr "URL de la page non valide"
+
+msgid "Goto:"
+msgstr "Aller à :"
Index: locales/hu/main.po
===================================================================
--- locales/hu/main.po	(revision 261)
+++ locales/hu/main.po	(revision 558)
@@ -394,5 +394,5 @@
 msgstr "Nincsenek felhasználók"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "jogok megváltoztatása"
 
@@ -779,5 +779,5 @@
 msgstr "szemétként megjelöl"
 
-msgid "delete"
+msgid "Delete"
 msgstr "törlés"
 
@@ -1016,5 +1016,5 @@
 msgstr "Hibás felhasználónév vagy jelszó"
 
-msgid "save"
+msgid "Save"
 msgstr "mentés"
 
@@ -1206,8 +1206,8 @@
 msgstr "Biztosan szeretnéd a %s-t törölni?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "vissza"
 
-msgid "yes"
+msgid "Yes"
 msgstr "igen"
 
@@ -1469,5 +1469,5 @@
 msgstr "Válassz legalább egy blogot, hogy melyikhez szeretnéd a(z) %s jogait megváltoztatni."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "jogok beállítása"
 
Index: locales/hu/plugins.po
===================================================================
--- locales/hu/plugins.po	(revision 261)
+++ locales/hu/plugins.po	(revision 558)
@@ -1390,8 +1390,8 @@
 msgstr "Extra oldalsáv"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "Oldalsáv frissítése"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "Oldalsáv visszaállítása"
 
Index: locales/it/main.po
===================================================================
--- locales/it/main.po	(revision 261)
+++ locales/it/main.po	(revision 558)
@@ -386,5 +386,5 @@
 msgstr "Nessun utente"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "cambia i permessi"
 
@@ -755,5 +755,5 @@
 msgstr "segna come spam"
 
-msgid "delete"
+msgid "Delete"
 msgstr "elimina"
 
@@ -986,5 +986,5 @@
 msgstr "Nome utente e password"
 
-msgid "save"
+msgid "Save"
 msgstr "salva"
 
@@ -1169,8 +1169,8 @@
 msgstr "Si è sicuri di voler eliminare %s?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "annulla"
 
-msgid "yes"
+msgid "Yes"
 msgstr "sì"
 
@@ -1429,5 +1429,5 @@
 msgstr "Selezionare uno o più blog ai quali si desidera dare i permessi agli utenti %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "imposta permessi"
 
Index: locales/it/plugins.po
===================================================================
--- locales/it/plugins.po	(revision 261)
+++ locales/it/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/ja/main.po
===================================================================
--- locales/ja/main.po	(revision 261)
+++ locales/ja/main.po	(revision 558)
@@ -395,5 +395,5 @@
 msgstr "ユーザはいません"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "パーミッションの変更"
 
@@ -764,5 +764,5 @@
 msgstr "ジャンクに指定"
 
-msgid "delete"
+msgid "Delete"
 msgstr "削除"
 
@@ -999,5 +999,5 @@
 msgstr "ユーザ名またはパスワードが間違っています"
 
-msgid "save"
+msgid "Save"
 msgstr "保存"
 
@@ -1183,8 +1183,8 @@
 msgstr "本当に、%s を削除してもよろしいですか？"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "キャンセル"
 
-msgid "yes"
+msgid "Yes"
 msgstr "はい"
 
@@ -1445,5 +1445,5 @@
 msgstr "ユーザ %s さんにパーミッションを与えたいブログを、1つ以上選択してください。"
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "パーミッションを設定"
 
Index: locales/ja/plugins.po
===================================================================
--- locales/ja/plugins.po	(revision 261)
+++ locales/ja/plugins.po	(revision 558)
@@ -1383,8 +1383,8 @@
 msgstr "拡張サイドバー"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "サイドバーを更新"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "サイドバーをリセット"
 
Index: locales/ko/main.po
===================================================================
--- locales/ko/main.po	(revision 261)
+++ locales/ko/main.po	(revision 558)
@@ -394,5 +394,5 @@
 msgstr "사용자 없음"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "권한 변경"
 
@@ -763,5 +763,5 @@
 msgstr "스팸으로 표시"
 
-msgid "delete"
+msgid "Delete"
 msgstr "삭제"
 
@@ -998,5 +998,5 @@
 msgstr "잘못된 사용자이름 또는 비밀번호"
 
-msgid "save"
+msgid "Save"
 msgstr "저장"
 
@@ -1183,8 +1183,8 @@
 msgstr "%s을 삭제하시려는 게 확실하십니까?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "취소"
 
-msgid "yes"
+msgid "Yes"
 msgstr "예"
 
@@ -1445,5 +1445,5 @@
 msgstr "사용자 %s가 권한을 가지게될 블로그들을 선택해주세요."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "권한 설정"
 
Index: locales/ko/plugins.po
===================================================================
--- locales/ko/plugins.po	(revision 261)
+++ locales/ko/plugins.po	(revision 558)
@@ -1390,8 +1390,8 @@
 msgstr "추가사항 측면판"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "측면판 갱신"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "측면판 초기화"
 
Index: locales/nl/main.po
===================================================================
--- locales/nl/main.po	(revision 261)
+++ locales/nl/main.po	(revision 558)
@@ -384,5 +384,5 @@
 msgstr "Geen gebruikers"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "verander toestemmingen"
 
@@ -745,5 +745,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -969,5 +969,5 @@
 msgstr ""
 
-msgid "save"
+msgid "Save"
 msgstr "opslaan"
 
@@ -1152,8 +1152,8 @@
 msgstr ""
 
-msgid "cancel"
-msgstr ""
-
-msgid "yes"
+msgid "Cancel"
+msgstr ""
+
+msgid "Yes"
 msgstr ""
 
@@ -1412,5 +1412,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/nl/plugins.po
===================================================================
--- locales/nl/plugins.po	(revision 261)
+++ locales/nl/plugins.po	(revision 558)
@@ -1367,8 +1367,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/oc/main.po
===================================================================
--- locales/oc/main.po	(revision 261)
+++ locales/oc/main.po	(revision 558)
@@ -385,5 +385,5 @@
 msgstr ""
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr ""
 
@@ -752,5 +752,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -981,5 +981,5 @@
 msgstr ""
 
-msgid "save"
+msgid "Save"
 msgstr "salvar"
 
@@ -1168,8 +1168,8 @@
 msgstr ""
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "dirimir"
 
-msgid "yes"
+msgid "Yes"
 msgstr "òc"
 
@@ -1429,5 +1429,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/oc/plugins.po
===================================================================
--- locales/oc/plugins.po	(revision 261)
+++ locales/oc/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/pl/main.po
===================================================================
--- locales/pl/main.po	(revision 261)
+++ locales/pl/main.po	(revision 558)
@@ -9,6 +9,6 @@
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2011-05-13 19:36+0200\n"
-"PO-Revision-Date: 2008-07-13 15:08+0200\n"
-"Last-Translator: Nnidŷu <nnidyu@asylumeternity.net>\n"
+"PO-Revision-Date: 2011-06-26 20:18+0100\n"
+"Last-Translator: \n"
 "Language-Team: Polish\n"
 "Language: \n"
@@ -49,18 +49,15 @@
 msgstr "Hasła nie pasują do siebie"
 
-#, fuzzy
 msgid "You didn't change your password."
-msgstr "Zmień swoje hasło"
-
-#, fuzzy
+msgstr "Nie zmieniłeś hasła."
+
 msgid "You have to change your password before you can login."
-msgstr "Jeżeli chcesz zmienić swój e-mail lub hasło, musisz podać swoje aktualne hasło."
+msgstr "Musisz zmienić hasło zanim się zalogujesz."
 
 msgid "In order to login, you have to change your password now."
-msgstr ""
-
-#, fuzzy
+msgstr "Aby zalogować się, musisz zmienić teraz hasło."
+
 msgid "Safe Mode can only be used for super administrators."
-msgstr "Nie masz uprawień super administratora."
+msgstr "Tryb bezpieczny może być używany tylko przez Super-administratorów."
 
 msgid "Wrong username or password"
@@ -88,23 +85,21 @@
 msgstr "Potwierdź hasło:"
 
-#, fuzzy
 msgid "change"
-msgstr "anuluj"
+msgstr "zmień"
 
 msgid "Safe mode login"
-msgstr ""
+msgstr "Logowanie w trybie bezpiecznym"
 
 msgid "This mode allows you to login without activating any of your plugins. This may be useful to solve compatibility problems"
-msgstr ""
+msgstr "Ten tryb pozwala na zalogowanie bez aktywowania wtyczek. Jest to pomocne w rozwiązywaniu problemów z kompatybilnością."
 
 msgid "Disable or delete any plugin suspected to cause trouble, then log out and log back in normally."
-msgstr ""
+msgstr "Wyłącz lub usuń jakąkolwiek wtyczkę podejrzaną o powodowanie problemów a następnie wyloguj się i zaloguj ponownie."
 
 msgid "Remember my ID on this computer"
 msgstr "Zapamiętaj moje ID na tym komputerze"
 
-#, fuzzy
 msgid "log in"
-msgstr "Nazwa bloga"
+msgstr "zaloguj się"
 
 msgid "You must accept cookies in order to use the private area."
@@ -112,8 +107,8 @@
 
 msgid "Get back to normal authentication"
-msgstr ""
+msgstr "Wróć do normalnego uwierzytelniania"
 
 msgid "Connection issue?"
-msgstr ""
+msgstr "Problemy z połączeniem?"
 
 msgid "I forgot my password"
@@ -121,5 +116,5 @@
 
 msgid "I want to log in in safe mode"
-msgstr ""
+msgstr "Chcę zalogować sie w trybie bezpiecznym"
 
 msgid "New blog"
@@ -217,11 +212,9 @@
 msgstr "Chcę, aby wyszukiwarki i archiwizery indeksowały ale nie archiwizowały zawartości mojego bloga."
 
-#, fuzzy
 msgid "I would like to prevent search engines and archivers from indexing or archiving my blog's content."
 msgstr "Chcę, aby wyszukiwarki i archiwizery nie indeksowały i nie archiwizowały zawartości mojego bloga."
 
-#, fuzzy
 msgid "That blog Id is already in use."
-msgstr "Dotclear jest już zainstalowany."
+msgstr "Ten identyfikator bloga jest już używany."
 
 msgid "Invalid language code"
@@ -232,8 +225,8 @@
 
 msgid "Warning: except for special configurations, it is generally advised to have a trailing \"/\" in your blog URL in PATH_INFO mode."
-msgstr ""
+msgstr "Ostrzeżenie: pomijając specjalne konfiguracje, radzimy w Twoim blogu używać na końcu URL znaku \"/\" w trybie PATH_INFO."
 
 msgid "Warning: except for special configurations, it is generally advised to have a trailing \"?\" in your blog URL in QUERY_STRING mode."
-msgstr ""
+msgstr "Ostrzeżenie: pomijając specjalne konfiguracje, radzimy w Twoim blogu używać na końcu URL znaku \"?\" w trybie QUERY_STRING."
 
 msgid "Blog has been successfully created."
@@ -354,5 +347,5 @@
 
 msgid "This defines image tag title when you insert it in a post from the media manager. It is retrieved from the picture's metadata."
-msgstr "Definiuje atrybut title obrazu, gdy wstawiasz go do wpisu za pomocą menedżera mediów. Generowany jest z metadanych obrazu."
+msgstr "Definiuje atrybut title obrazu, gdy wstawiasz go do wpisu za pomocą menedżera plików. Generowany jest z metadanych obrazu."
 
 msgid "Search engines robots policy"
@@ -368,5 +361,4 @@
 msgstr "Interfejs XML/RPC jest nieaktywny. Zmień ustawienia, aby go włączyć."
 
-#, fuzzy
 msgid "XML/RPC interface is active. You should set the following parameters on your XML/RPC client:"
 msgstr "Interfejs XML/RPC jest aktywny. Powinieneś ustawić następujące parametry w Twoim kliencie XML/RPC:"
@@ -393,9 +385,9 @@
 msgstr "Brak użytkowników"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "zmień uprawnienia"
 
 msgid "Super administrator"
-msgstr "Super administrator"
+msgstr "Super-administrator"
 
 msgid "You can't remove default theme."
@@ -408,7 +400,6 @@
 msgstr "Nie można przenieść wysłanego pliku."
 
-#, fuzzy
 msgid "An error occurred while downloading the file."
-msgstr "Podczas ściągania pliku wystąpił błąd."
+msgstr "Wystąpił błąd podczas pobierania pliku."
 
 #, php-format
@@ -416,18 +407,18 @@
 msgstr "przez %s"
 
-#, fuzzy, php-format
+#, php-format
 msgid "version %s"
-msgstr "Wersja"
+msgstr "wersja %s"
 
 #, php-format
 msgid "(built on \"%s\")"
-msgstr ""
+msgstr "(oparty na \"%s\")"
 
 #, php-format
 msgid "(requires \"%s\")"
-msgstr ""
+msgstr "(wymaga \"%s\")"
 
 msgid "Stylesheet"
-msgstr ""
+msgstr "Arkusz stylów"
 
 msgid "Theme configuration"
@@ -437,7 +428,6 @@
 msgstr "Motywy bloga"
 
-#, fuzzy
 msgid "Blog appearance"
-msgstr "Nazwa bloga"
+msgstr "Wygląd bloga"
 
 msgid "Theme has been successfully changed."
@@ -455,8 +445,8 @@
 #, php-format
 msgid "You can find additional themes for your blog on %s."
-msgstr ""
+msgstr "Możesz znaleźć więcej motywów dla Twojego bloga na %s."
 
 msgid "To install or upgrade a theme you generally just need to upload it in \"Install or upgrade a theme\" section."
-msgstr ""
+msgstr "Aby zainstalowac lub ulepszyć motyw, musisz wrzucic plik w sekcji \"Instalacja lub ulepszenie motywu\"."
 
 msgid "Themes"
@@ -465,5 +455,5 @@
 #, php-format
 msgid "You are currently using \"%s\""
-msgstr ""
+msgstr "Aktualnie używasz \"%s\""
 
 msgid "use selected theme"
@@ -531,5 +521,5 @@
 
 msgid "Order by:"
-msgstr "Sortuj wg.:"
+msgstr "Sortuj wg:"
 
 msgid "Sort:"
@@ -542,7 +532,6 @@
 msgstr "Blogów na stronę"
 
-#, fuzzy
 msgid "Apply filters"
-msgstr "Dodaj pliki"
+msgstr "Zastosuj filtry"
 
 msgid "No blog"
@@ -550,5 +539,5 @@
 
 msgid "Page(s)"
-msgstr "Stron(a)"
+msgstr "Strona"
 
 msgid "Entries"
@@ -569,7 +558,6 @@
 msgstr "Przełącz do bloga %s"
 
-#, fuzzy
 msgid "This category does not exist."
-msgstr "Ten wpis nie istnieje."
+msgstr "Taka kategoria nie istnieje."
 
 msgid "Categories"
@@ -577,29 +565,24 @@
 
 msgid "The category has been successfully created."
-msgstr "Kategoria została pomyślnie utworzona."
-
-#, fuzzy
+msgstr "Kategoria została utworzona."
+
 msgid "The category has been successfully removed."
-msgstr "Kategoria została pomyślnie utworzona."
-
-#, fuzzy
+msgstr "Kategoria została usunięta."
+
 msgid "Categories have been successfully reordered."
-msgstr "Kategorie zostały pomyślnie usunięte."
-
-#, fuzzy
+msgstr "Kolejność kategorii została zapisana."
+
 msgid "The category has been successfully moved."
-msgstr "Kategoria została pomyślnie utworzona."
-
-#, fuzzy
+msgstr "Kategoria została przeniesiona."
+
 msgid "No category yet."
 msgstr "Brak kategorii."
 
-#, fuzzy
 msgid "Categories list"
-msgstr "Kategorie"
+msgstr "Lista kategorii"
 
 #, php-format
 msgid "%d entries"
-msgstr "%d wpisów"
+msgstr "%d wpisy(-ów)"
 
 #, php-format
@@ -608,44 +591,38 @@
 
 msgid "total:"
-msgstr ""
+msgstr "ogółem:"
 
 msgid "URL:"
 msgstr "URL:"
 
-#, fuzzy
 msgid "Add a new category"
-msgstr "Utwórz nową kategorię"
+msgstr "Dodaj nową kategorię"
 
 msgid "Title:"
 msgstr "Tytuł:"
 
-#, fuzzy
 msgid "Parent:"
-msgstr "Przeszukaj wpis:"
+msgstr "Kategoria nadrzędna:"
 
 msgid "Top level"
-msgstr ""
-
-#, fuzzy
+msgstr "Najwyższy poziom"
+
 msgid "Remove a category"
-msgstr "Brak kategorii."
-
-#, fuzzy
+msgstr "Usuń kategorię"
+
 msgid "Choose a category to remove:"
-msgstr "Zmień kategorię dla wpisów"
+msgstr "Wybierz kategorię do usunięcia:"
 
 msgid "ok"
-msgstr "ok"
-
-#, fuzzy
+msgstr "Ok"
+
 msgid "Reorder categories"
-msgstr "zarządzaj kategoriami"
+msgstr "Usuń hierarchię"
 
 msgid "This will relocate all categories on the top level"
-msgstr ""
-
-#, fuzzy
+msgstr "Umieść wszystkie kategorie na jednym poziomie"
+
 msgid "Reorder"
-msgstr "Zapisz kolejność"
+msgstr "Wykonaj"
 
 msgid "New category"
@@ -655,7 +632,6 @@
 msgstr "Kategoria została pomyślnie zaktualizowana"
 
-#, fuzzy
 msgid "Category information"
-msgstr "więcej informacji"
+msgstr "Informacje o kategorii"
 
 msgid "Warning: If you set the URL manually, it may conflict with another category."
@@ -665,30 +641,24 @@
 msgstr "Opis:"
 
-#, fuzzy
 msgid "Move this category"
-msgstr "Brak kategorii."
-
-#, fuzzy
+msgstr "Przenieś kategorię"
+
 msgid "Category parent"
-msgstr "Kategoria"
-
-#, fuzzy
+msgstr "Wybierz kategorię nadrzędną"
+
 msgid "Category sibling"
-msgstr "Kategoria"
-
-#, fuzzy
+msgstr "Kategorie równorzędne"
+
 msgid "Move current category"
-msgstr "Rozpakuj w bieżącym katalogu"
-
-#, fuzzy
+msgstr "Przenieś bieżącą kategorię"
+
 msgid "after"
-msgstr "filtruj"
+msgstr "za"
 
 msgid "before"
-msgstr ""
-
-#, fuzzy
+msgstr "przed"
+
 msgid "position: "
-msgstr "Dyspozycja MP3"
+msgstr "pozycja:"
 
 msgid "Entry does not exist."
@@ -709,5 +679,5 @@
 #, php-format
 msgid "Your comment on my blog %s"
-msgstr ""
+msgstr "Twój komentarz na moim blogu %s"
 
 #, php-format
@@ -720,7 +690,13 @@
 "\n"
 msgstr ""
+"Cześć!\n"
+"\n"
+"Napisałeś komentarz na temat:\n"
+"%s\n"
+"\n"
+"\n"
 
 msgid "Send an e-mail"
-msgstr ""
+msgstr "Wyślij e-email"
 
 #, php-format
@@ -771,10 +747,10 @@
 
 msgid "mark as pending"
-msgstr "oznacz jako oczekujący"
+msgstr "oznacz jako w przygotowaniu"
 
 msgid "mark as junk"
 msgstr "oznacz jako niechciane"
 
-msgid "delete"
+msgid "Delete"
 msgstr "usuń"
 
@@ -804,7 +780,6 @@
 msgstr "Akcja dla wybranych komentarzy:"
 
-#, fuzzy
 msgid "action: "
-msgstr "Opis:"
+msgstr "akcja:"
 
 msgid "Comments"
@@ -822,11 +797,9 @@
 msgstr "Nowy wpis"
 
-#, fuzzy
 msgid "My preferences"
-msgstr "Ustawienia uzytkownika"
-
-#, fuzzy
+msgstr "Moje ustawienia"
+
 msgid "Documentation and support"
-msgstr "Dokumentacja"
+msgstr "Dokumentacja i wsparcie"
 
 msgid "Latest news"
@@ -854,24 +827,22 @@
 msgstr "Następujące wtyczki nie zostały zainstalowane:"
 
-#, fuzzy, php-format
+#, php-format
 msgid "Dotclear %s is available!"
-msgstr "Dotclear jest już zainstalowany."
+msgstr "Dotclear %s jest już dostępny!"
 
 msgid "Upgrade now"
-msgstr ""
+msgstr "Ulepsz teraz"
 
 msgid "Remind me later"
-msgstr ""
+msgstr "Przypomnij mi później"
 
 msgid "information about this version"
-msgstr ""
-
-#, fuzzy
+msgstr "informacje o tej wersji"
+
 msgid "Some plugins are installed twice:"
-msgstr "Następujące wtyczki zostały zainstalowane:"
-
-#, fuzzy
+msgstr "Niektóre wtyczki zostały zainstalowane podwójnie:"
+
 msgid "Quick entry"
-msgstr "1 wpis"
+msgstr "Szybki wpis"
 
 msgid "Content:"
@@ -881,7 +852,6 @@
 msgstr "Kategoria:"
 
-#, fuzzy
 msgid "save and publish"
-msgstr "anuluj publikację"
+msgstr "Zapisz i opublikuj"
 
 #, php-format
@@ -890,5 +860,5 @@
 
 msgid "Multibyte string module (mbstring) is not available."
-msgstr "Moduł mbstring jest niedostepny."
+msgstr "Moduł mbstring jest niedostępny."
 
 msgid "Iconv module is not available."
@@ -908,5 +878,5 @@
 
 msgid "SPL module is not available."
-msgstr "Biblioteka standardowa jest niedostępna."
+msgstr "Biblioteka standardowa SPL jest niedostępna."
 
 #, php-format
@@ -949,14 +919,14 @@
 
 msgid "%A, %B %e %Y"
-msgstr ""
+msgstr "%A, %B %e %Y"
 
 msgid "Welcome to Dotclear!"
-msgstr ""
+msgstr "Witaj w Dotclear!"
 
 msgid "This is your first entry. When you're ready to blog, log in to edit or delete it."
-msgstr ""
+msgstr "To jest Twój pierwszy wpis. Kiedy będziesz gotowy do blogowania, zaloguj się aby edytować lub usunąć go."
 
 msgid "Dotclear Team"
-msgstr ""
+msgstr "Zespół Dotclear"
 
 msgid ""
@@ -964,19 +934,18 @@
 "<p>To delete it, log in and view your blog's comments. Then you might remove or edit it.</p>"
 msgstr ""
-
-#, fuzzy
+"<p>To jest komentarz.</p>\n"
+"<p>Aby go usunąć, zaloguj się i zajrzyj do komentarzy bloga. Możesz je tam usuwać lub edytować.</p>"
+
 msgid "Pages"
-msgstr "Stron(a)"
-
-#, fuzzy
+msgstr "Strony"
+
 msgid "Blogroll"
-msgstr "Blog"
-
-#, fuzzy
+msgstr "Lista polecanych odnośników"
+
 msgid "Dotclear Install"
-msgstr "Instalacja DotClear"
+msgstr "Instalacja Dotclear"
 
 msgid "show"
-msgstr ""
+msgstr "pokaż"
 
 msgid "Dotclear installation"
@@ -990,5 +959,4 @@
 msgstr "Błędy:"
 
-#, fuzzy
 msgid "Configuration file has been successfully created."
 msgstr "Plik konfiguracyjny został pomyślnie utworzony."
@@ -1000,17 +968,14 @@
 msgstr "Proszę podać następujące informacje potrzebne do stworzenia pierwszego użytkownika."
 
-#, fuzzy
 msgid "First Name:"
 msgstr "Imię:"
 
-#, fuzzy
 msgid "Last Name:"
-msgstr "Ostatnia aktualizacja"
-
-#, fuzzy
+msgstr "Nazwisko:"
+
 msgid "Username and password"
-msgstr "Zła nazwa użytkownika lub hasło"
-
-msgid "save"
+msgstr "Nazwa użytkownika i hasło"
+
+msgid "Save"
 msgstr "zapisz"
 
@@ -1019,29 +984,26 @@
 
 msgid "Dotclear has been successfully installed. Here is some useful information you should keep."
-msgstr ""
+msgstr "Dotclear został pomyślnie zainstalowany. Oto kilka pomocnych informacji które warto zapamiętać."
 
 msgid "Your account"
-msgstr ""
-
-#, fuzzy
+msgstr "Twoje konto"
+
 msgid "Your blog"
-msgstr "Brak bloga"
-
-#, fuzzy
+msgstr "Twój blog"
+
 msgid "Blog address:"
-msgstr "Adres IP:"
-
-#, fuzzy
+msgstr "Adres bloga:"
+
 msgid "Administration interface:"
-msgstr "administrator"
+msgstr "Interfejs administratora"
 
 msgid "Manage your blog now"
-msgstr ""
+msgstr "Zarządzaj swoim blogiem"
 
 msgid "Installation can not be completed"
-msgstr ""
+msgstr "Instalacja nie może być dokończona"
 
 msgid "For the said reasons, Dotclear can not be installed. Please refer to <a href=\"http://dotclear.org/documentation/2.0/admin/install\">the documentation</a> to learn how to correct the problem."
-msgstr ""
+msgstr "Z powyższych powodów Dotclear nie może być zainstalowany. Zajrzyj do <a href=\"http://dotclear.org/documentation/2.0/admin/install\">dokumentacji</a> aby dowiedzieć się jak poradzić sobie z problemem."
 
 #, php-format
@@ -1057,15 +1019,14 @@
 
 msgid "Welcome"
-msgstr ""
+msgstr "Witaj"
 
 msgid "To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done."
-msgstr ""
-
-#, fuzzy
+msgstr "Aby zakończyć instalację Dotclear i rozpocząć pisanie Twojego bloga, musisz podać parametry dostępu do bazy danych oraz informacje o Tobie. Wypełnij dwa proste formularze w kreatorze a będziesz mógł rozpocząć pracę."
+
 msgid "Attention:"
-msgstr "Załącznik"
+msgstr "Uwaga:"
 
 msgid "this wizard may not function on every host. If it does not work for you, please refer to <a href=\"http://dotclear.org/documentation/2.0/admin/install\">the documentation</a> to learn how to create the <strong>config.php</strong> file manually."
-msgstr ""
+msgstr "ten kreator może nie działać na niektórych serwerach. Jeżeli nie działa Tobie, proszę zajrzeć do <a href=\"http://dotclear.org/documentation/2.0/admin/install\">dokumentacji</a> aby dowiedzieć sie jak utworzyć plik <strong>config.php</strong> ręcznie."
 
 msgid "System information"
@@ -1094,102 +1055,83 @@
 
 msgid "No such installed language"
-msgstr ""
-
-#, fuzzy
+msgstr "Nie zainstalowano takiej wersji językowej"
+
 msgid "You can't remove English language."
-msgstr "Nie możesz usunąć domyślnego motywu"
-
-#, fuzzy
+msgstr "Nie można usunąć domyślnego języka."
+
 msgid "Permissions to delete language denied."
-msgstr "Brak uprawnień."
-
-#, fuzzy
+msgstr "Brak uprawnień do usunięcia wersji językowej."
+
 msgid "Invalid language file URL."
-msgstr "Niepoprawny kod języka"
-
-#, fuzzy
+msgstr "Niepoprawny odnośnik do pliku z wersją językową."
+
 msgid "Languages management"
-msgstr "Zarządzanie wtyczkami"
-
-#, fuzzy
+msgstr "Zarządzanie wersjami językowymi"
+
 msgid "Language has been successfully deleted."
-msgstr "Blog został pomyślnie usunięty."
-
-#, fuzzy
+msgstr "Wersja językowa została usunięta."
+
 msgid "Language has been successfully installed."
-msgstr "Wtyczka została pomyślnie zainstalowana."
-
-#, fuzzy
+msgstr "Wersja jezykowa została pomyślnie zainstalowana."
+
 msgid "Language has been successfully upgraded"
-msgstr "Wtyczka została pomyślnie zaktualizowana"
+msgstr "Wersja językowa została pomyślnie zaktualizowanya."
 
 msgid "Here you can install, upgrade or remove languages for your Dotclear installation."
-msgstr ""
+msgstr "Tutaj możesz zainstalować, ulepszyć lub usunąć wersje językowe użyte w Twojej instalacji Dotclear."
 
 #, php-format
 msgid "You can change your user language in your <a href=\"%1$s\">preferences</a> or change your blog's main language in your <a href=\"%2$s\">blog settings</a>."
-msgstr ""
-
-#, fuzzy
+msgstr "Możesz zmienić język któy używasz w <a href=\"%1$s\">ustawieniach</a> lub zmienić główny język Twojego blogu w <a href=\"%2$s\">ustawieniach blogu</a>."
+
 msgid "Installed languages"
-msgstr "Niepoprawny kod języka"
+msgstr "Zainstalowane języki"
 
 msgid "No additional language is installed."
-msgstr ""
-
-#, fuzzy
+msgstr "Nie zaisntalowano dodatnowych wersji językowych."
+
 msgid "Language"
-msgstr "Język?"
+msgstr "Język"
 
 msgid "Action"
-msgstr ""
-
-#, fuzzy
+msgstr "Akcja"
+
 msgid "Install or upgrade languages"
-msgstr "Zainstaluj lub zaktualizuj wtyczkę"
+msgstr "Zainstaluj lub zaktualizuj wersje językowe"
 
 #, php-format
 msgid "You can install or remove a language by adding or removing the relevant directory in your %s folder."
-msgstr ""
-
-#, fuzzy
+msgstr "Możesz zainstalować lub usunąć wersję językową poprzez dodanie lub usunięcie odpowiedniego katalogu w Twoim katalogu %s."
+
 msgid "Available languages"
-msgstr "Dostępne motywy"
+msgstr "Dostępne wersje językowe"
 
 #, php-format
 msgid "You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s."
-msgstr ""
-
-#, fuzzy
+msgstr "Możesz pobrać i zainstalować dodatkowe wersje językowe bezpośrenio z Dotclear.net. Proponowane jezyki bazują na Twojej wersji: %s."
+
 msgid "Language:"
-msgstr "Język?"
-
-#, fuzzy
+msgstr "Język:"
+
 msgid "Install language"
-msgstr "Niepoprawny kod języka"
-
-#, fuzzy
+msgstr "Zainstaluj język"
+
 msgid "You can install languages by uploading zip files."
-msgstr "Możesz instalować wtyczki wysyłając lub pobierając pliki zip."
-
-#, fuzzy
+msgstr "Możesz instalować języki wysyłając plik w formacie zip."
+
 msgid "Language zip file:"
-msgstr "Plik zip z wtyczką:"
-
-#, fuzzy
+msgstr "Plik językowy (zip):"
+
 msgid "Upload language"
-msgstr "Wyślij wtyczkę"
-
-#, fuzzy
+msgstr "Wyślij język"
+
 msgid "Invalid language zip file."
-msgstr "Niepoprawny kod języka"
-
-#, fuzzy
+msgstr "Niepoprawny plik językowy w formacie zip"
+
 msgid "The zip file does not appear to be a valid Dotclear language pack."
-msgstr "Ten plik zip nie wydaje się być poprawnym modułem Dotclear."
-
-#, fuzzy
+msgstr "Ten plik zip nie wydaje się być poprawnym tłumaczeniem Dotclear."
+
 msgid "An error occurred during language upgrade."
-msgstr "Wystąpił błąd podczas usuwania modułu."
+msgstr "Wystąpił błąd podczas ulepszania modułu."
 
 msgid "Error:"
@@ -1209,5 +1151,5 @@
 
 msgid "Media manager"
-msgstr "Menedżer mediów"
+msgstr "Menedżer plików"
 
 msgid "confirm removal"
@@ -1218,8 +1160,8 @@
 msgstr "Jesteś pewien, że chcesz usunąć %s?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "anuluj"
 
-msgid "yes"
+msgid "Yes"
 msgstr "tak"
 
@@ -1239,11 +1181,10 @@
 msgstr "Katalog został pomyślnie przebudowany."
 
-#, fuzzy
 msgid "Zip file has been successfully extracted."
 msgstr "Plik zip został pomyślnie rozpakowany."
 
-#, fuzzy, php-format
+#, php-format
 msgid "Choose a file to attach to entry %s by clicking on %s."
-msgstr "Wybierz plik, który ma być dołączony do wpisu, klikając na %s."
+msgstr "Wybierz plik, który ma być dołączony do wpisu %s, klikając na %s."
 
 msgid "Attach this file to entry"
@@ -1277,5 +1218,5 @@
 
 msgid "To send several files at the same time, you can activate the enhanced uploader in"
-msgstr ""
+msgstr "Aby wysłać kilka plików jednocześnie, możęsz aktywować ulepszony uploader w"
 
 msgid "send"
@@ -1285,7 +1226,6 @@
 msgstr "Nowy katalog"
 
-#, fuzzy
 msgid "Directory Name:"
-msgstr "Nowy katalog:"
+msgstr "Nazwa katalogu:"
 
 msgid "Download this directory as a zip file"
@@ -1349,18 +1289,15 @@
 msgstr "Zauważ, że nie możesz wstawiać plików video w edytorze WYSIWYG."
 
-#, fuzzy
 msgid "Video size"
-msgstr "Zobacz stronę"
+msgstr "Rozmiar wideo"
 
 msgid "Width:"
-msgstr ""
-
-#, fuzzy
+msgstr "Szerokość:"
+
 msgid "Height:"
-msgstr "Prawa"
-
-#, fuzzy
+msgstr "Wysokość:"
+
 msgid "Video disposition"
-msgstr "Dyspozycja wideo FLV"
+msgstr "Charakter wideo"
 
 msgid "Media item will be inserted as a link."
@@ -1374,5 +1311,5 @@
 
 msgid "Media details"
-msgstr "Szczegóły mediów"
+msgstr "Szczegóły pliku"
 
 msgid "Available sizes:"
@@ -1392,12 +1329,11 @@
 
 msgid "Show entries containing this media"
-msgstr ""
+msgstr "Pokaż wpisy używające tego pliku"
 
 msgid "Entries containing this media"
-msgstr ""
-
-#, fuzzy
+msgstr "Wpisy wykorzystujace ten plik"
+
 msgid "No entry seems contain this media."
-msgstr "Brak zawartości wpisu"
+msgstr "Zaden wpis nie odnosi się do tego pliku."
 
 msgid "Image details"
@@ -1416,33 +1352,27 @@
 msgstr "zaktualizuj miniaturki"
 
-#, fuzzy
 msgid "Extract in a new directory"
-msgstr "Rozpakuj do nowego katalogu"
-
-#, fuzzy
+msgstr "Rozpakuj w nowym katalogu"
+
 msgid "Extract in current directory"
 msgstr "Rozpakuj w bieżącym katalogu"
 
-#, fuzzy
 msgid "Extract archive"
 msgstr "Rozpakuj archiwum"
 
-#, fuzzy
 msgid "This will extract archive in a new directory that should not exist yet."
-msgstr "Wypakuje zawartość archiwum w nowym katalogu, który nie powinien jeszcze istnieć."
-
-#, fuzzy
+msgstr "Wypakuj zawartość archiwum w nowym, nieistniejącym katalogu."
+
 msgid "This will extract archive in current directory and will overwrite existing files or directory."
-msgstr "Wypakuje zawartość archiwum w bieżącym katalogu i nadpisze istniejące pliki i katalogi."
-
-#, fuzzy
+msgstr "Wypakuj zawartość archiwum w bieżącym katalogu i nadpisz istniejące pliki i katalogi."
+
 msgid "Extract mode:"
 msgstr "Tryb wypakowywania:"
 
 msgid "extract"
-msgstr ""
+msgstr "rozpakuj"
 
 msgid "Change media properties"
-msgstr "Zmień właściwości mediów"
+msgstr "Zmień właściwości"
 
 msgid "File name:"
@@ -1484,5 +1414,5 @@
 
 msgid "Entries per page"
-msgstr "Wpisów na stronę"
+msgstr "wpisy(-ów) na stronę"
 
 #, php-format
@@ -1490,10 +1420,9 @@
 msgstr "Wybierz jeden lub więcej blogów do których chcesz nadać uprawnienia użytkownikowi %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "ustaw uprawnienia"
 
-#, fuzzy
 msgid "select"
-msgstr "wybrane"
+msgstr "wybierz"
 
 msgid "No content found on this plugin."
@@ -1512,12 +1441,10 @@
 msgstr "Nie masz uprawnień do usunięcia tej wtyczki."
 
-#, fuzzy
 msgid "You don't have permissions to deactivate this plugin."
-msgstr "Nie masz uprawnień do usunięcia tej wtyczki."
+msgstr "Nie masz uprawnień do wyłączenia tej wtyczki."
 
 msgid "Plugins management"
 msgstr "Zarządzanie wtyczkami"
 
-#, fuzzy
 msgid "Plugin has been successfully deleted."
 msgstr "Wtyczka została pomyślnie usunięta."
@@ -1530,22 +1457,21 @@
 
 msgid "Plugins add new functionalities to Dotclear. Here you can activate or deactivate installed plugins."
-msgstr ""
+msgstr "Wtyczki zwiększają funkcjonalność Dotclear. Tutaj możesz włączyć lub wyłączyć zainstalowane wtyczki."
 
 #, php-format
 msgid "You can find additional plugins for your blog on %s."
-msgstr ""
+msgstr "Dodatkowe wtyczki dla Twojego bloga możesz znaleźć na %s."
 
 msgid "To install or upgrade a plugin you generally just need to upload it in \"Install or upgrade a plugin\" section."
-msgstr ""
+msgstr "Aby zaisntalować lub ulepszyć wtyczkę, generalnie musisz wysłać ja w sekcji \"Zainstaluj lub ulepsz wtyczkę\""
 
 msgid "To install or upgrade a plugin you just need to extract it in your plugins directory."
-msgstr ""
+msgstr "Aby zaisntalować lub ulepszyć wtyczkę, musisz rozpakować ją w katalogu \"plugins\""
 
 msgid "Plugins"
 msgstr "Wtyczki"
 
-#, fuzzy
 msgid "Activated plugins"
-msgstr "Usuń zaznaczone wtyczki"
+msgstr "Aktywne wtyczki"
 
 msgid "Plugin"
@@ -1555,19 +1481,15 @@
 msgstr "Wersja"
 
-#, fuzzy
 msgid "Details"
-msgstr "Szczegóły bloga"
-
-#, fuzzy
+msgstr "Szczegóły"
+
 msgid "Deactivate"
-msgstr "rok/tytuł"
-
-#, fuzzy
+msgstr "Wyłącz"
+
 msgid "Deactivated plugins"
-msgstr "Usuń zaznaczone wtyczki"
-
-#, fuzzy
+msgstr "Nieaktywne wtyczki"
+
 msgid "Activate"
-msgstr "Prywatne"
+msgstr "Aktywuj"
 
 msgid "Install or upgrade a plugin"
@@ -1604,7 +1526,6 @@
 msgstr "URL odnośnika:"
 
-#, fuzzy
 msgid "Link title:"
-msgstr "Tytuł pliku:"
+msgstr "Tytuł odnośnika:"
 
 msgid "Link language:"
@@ -1650,11 +1571,9 @@
 msgstr "Nie zapomnij aby sprawdzić konwersję XHTML przez zapisanie wpisu."
 
-#, fuzzy
 msgid "View entry"
-msgstr "zobacz wpis"
-
-#, fuzzy
+msgstr "Zobacz wpis"
+
 msgid "Preview entry"
-msgstr "zobacz wpis"
+msgstr "Podgląd wpisu"
 
 msgid "Entry status:"
@@ -1662,5 +1581,5 @@
 
 msgid "Published on:"
-msgstr "Opublikowane o:"
+msgstr "Data publikacji:"
 
 msgid "Text formating:"
@@ -1671,5 +1590,5 @@
 
 msgid "Selected entry"
-msgstr "Wybrany wpis"
+msgstr "Pokaż w nawigacji"
 
 msgid "Entry lang:"
@@ -1728,16 +1647,14 @@
 
 msgid "pending"
-msgstr "oczekujący"
+msgstr "w przygotowaniu"
 
 msgid "junk"
-msgstr "śmieci"
-
-#, fuzzy
+msgstr "niechciane"
+
 msgid "select this comment"
-msgstr "Edytuj ten komentarz"
-
-#, fuzzy
+msgstr "Wybierz ten komentarz"
+
 msgid "select this trackback"
-msgstr "Akceptuj trackbacki"
+msgstr "Wybierz ten trackback"
 
 msgid "Edit this comment"
@@ -1757,8 +1674,8 @@
 
 msgid "selected"
-msgstr "wybrane"
+msgstr "oznaczone gwiazdką"
 
 msgid "not selected"
-msgstr "niewybrane"
+msgstr "nieoznaczone"
 
 msgid "Category"
@@ -1766,47 +1683,38 @@
 
 msgid "Selected"
-msgstr "Wybrane"
-
-#, fuzzy
+msgstr "Oznaczone gwiazdką"
+
 msgid "Publish"
-msgstr "publikuj"
-
-#, fuzzy
+msgstr "Publikuj"
+
 msgid "Unpublish"
-msgstr "anuluj publikację"
-
-#, fuzzy
+msgstr "Anuluj publikację"
+
 msgid "Schedule"
-msgstr "programmer"
-
-#, fuzzy
+msgstr "Oczekujące"
+
 msgid "Mark as pending"
-msgstr "oznacz jako oczekujący"
+msgstr "Zaznacz jako w przygotowaniu"
 
 msgid "Mark"
-msgstr ""
-
-#, fuzzy
+msgstr "Zaznacz"
+
 msgid "Mark as selected"
-msgstr "wybrane"
-
-#, fuzzy
+msgstr "Zaznacz gwiazdką"
+
 msgid "Mark as unselected"
-msgstr "wybrane"
-
-#, fuzzy
+msgstr "Usuń gwiazdkę"
+
 msgid "Change"
-msgstr "Zmień plik"
-
-#, fuzzy
+msgstr "Zmień"
+
 msgid "Change category"
-msgstr "zmień kategorię"
-
-#, fuzzy
+msgstr "Zmień kategorię"
+
 msgid "Change author"
-msgstr "zmień autora"
+msgstr "Zmień autora"
 
 msgid "Selected:"
-msgstr "Wybrane:"
+msgstr "Zaznaczenie:"
 
 msgid "Month:"
@@ -1837,26 +1745,21 @@
 msgstr "Informacje osobowe zostały pomyślnie zaktualizowane."
 
-#, fuzzy
 msgid "Personal options has been successfully updated."
-msgstr "Informacje osobowe zostały pomyślnie zaktualizowane."
-
-#, fuzzy
+msgstr "Opcje osobiste zostały pomyślnie zaktualizowane."
+
 msgid "Favorites have been successfully added."
-msgstr "Plik został pomyślnie wysłany."
-
-#, fuzzy
+msgstr "Ulubione zostały pomyślnie dodane."
+
 msgid "Favorites have been successfully updated."
-msgstr "Plik został pomyślnie zaktualizowany"
-
-#, fuzzy
+msgstr "Ulubione zostały pomyślnie zaktualizowane."
+
 msgid "Favorites have been successfully removed."
-msgstr "Plik został pomyślnie usunięty."
-
-#, fuzzy
+msgstr "Usunięto ulubione."
+
 msgid "Default favorites have been successfully updated."
-msgstr "Miniaturki zostały pomyślnie zaktualizowane"
+msgstr "Domyślne ulubione zostały pomyślnie zaktualizowane."
 
 msgid "My profile"
-msgstr ""
+msgstr "Mój profil"
 
 msgid "Display name:"
@@ -1869,7 +1772,6 @@
 msgstr "Strefa czasowa:"
 
-#, fuzzy
 msgid "My options"
-msgstr "Opcje wyszukiwania"
+msgstr "Moje opcje"
 
 msgid "Preferred format:"
@@ -1886,76 +1788,69 @@
 
 msgid "Activate enhanced uploader in media manager"
-msgstr ""
+msgstr "Włącz ulepszony uploader w menedżerze plików"
 
 msgid "Do not use standard favicon"
-msgstr ""
+msgstr "Nie używaj standardowej ikony witryny (favicon)"
 
 msgid "This will be applied for all users"
-msgstr ""
+msgstr "Opcje te są wspólne dla wszystkich użytkowników bloga"
 
 msgid "Accessibility options"
-msgstr ""
+msgstr "Opcje ułatwień"
 
 msgid "Disable javascript powered drag and drop for ordering items"
-msgstr ""
+msgstr "Wyłącz dynamiczne ustawianie kolejności elementów (\"przeciągnij i upuść\")"
 
 msgid "Numeric fields will allow to type the elements' ordering number."
-msgstr ""
-
-#, fuzzy
+msgstr "Po włączeniu tej opcji dostępne będą pola z numerami pozwalające na wpisanie kolejności elementów."
+
 msgid "Dashboard modules"
-msgstr "Panel zarządzania"
-
-#, fuzzy
+msgstr "Moduły panelu zarządzania"
+
 msgid "Display documentation links"
-msgstr "Dokumentacja"
-
-#, fuzzy
+msgstr "Wyświetl odnośniki do dokumentacji"
+
 msgid "Display Dotclear news"
-msgstr "Nazwa wyświetlana"
+msgstr "Wyświetl wiadomości Dotclear-a"
 
 msgid "Display quick entry form"
-msgstr ""
+msgstr "Wyświetl formularz szybkiego wpisu w panelu głównym"
 
 msgid "My favorites"
-msgstr ""
+msgstr "Moje ulubione"
 
 #, php-format
 msgid "position of %s"
-msgstr ""
-
-#, fuzzy
+msgstr "pozycja z %s"
+
 msgid "Save order"
 msgstr "Zapisz kolejność"
 
-#, fuzzy
 msgid "Delete selected favorites"
-msgstr "Usuń zaznaczone kategorie"
-
-#, fuzzy
+msgstr "Usuń zaznaczone ulubione"
+
 msgid "Are you sure you want to remove selected favorites?"
-msgstr "Czy na pewno chcesz usunąć ten element?"
+msgstr "Jesteś pewny, że chcesz usunąc zazanczone ulubione?"
 
 msgid "If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation:"
-msgstr ""
+msgstr "Jeżeli jesteś Super-administratorem, możesz zdefiniować zestaw ulubionych które będą użyte domyślnie na wszystkich blogach w tej instalacji:"
 
 msgid "Define as default favorites"
-msgstr ""
+msgstr "Definiuj jako domyślne ulubione"
 
 msgid "Currently no personal favorites."
-msgstr ""
+msgstr "Lista jest pusta."
 
 msgid "Default favorites"
-msgstr ""
+msgstr "Domyślne ulubione"
 
 msgid "Those favorites are displayed when My Favorites list is empty."
-msgstr ""
-
-#, fuzzy
+msgstr "Te ulubione są wyświetlane kiedy Twoja lista \"Moje ulubione\" jest pusta."
+
 msgid "Available favorites"
-msgstr "Dostępne rozmiary:"
+msgstr "Dostępne ulubione"
 
 msgid "Add to my favorites"
-msgstr ""
+msgstr "Dodaj do ulubionych"
 
 msgid "Search"
@@ -1975,5 +1870,5 @@
 
 msgid "schedule"
-msgstr "programmer"
+msgstr "oczekujący"
 
 msgid "change category"
@@ -1985,5 +1880,5 @@
 #, php-format
 msgid "%d entries found"
-msgstr "znaleziono %d wpisów"
+msgstr "znaleziono %d wpisy(-ów)"
 
 #, php-format
@@ -2017,75 +1912,69 @@
 msgstr "Wcześniej wysłane sygnały ping"
 
-#, fuzzy
 msgid "Dotclear update"
-msgstr "Dotclear został zaktualizowany."
-
-#, fuzzy, php-format
+msgstr "Uaktualnienia Dotclear"
+
+#, php-format
 msgid "Unable to delete file %s"
-msgstr "Nie można zmienić nazwy pliku."
+msgstr "Nie mogę usunąć pliku %s"
 
 #, php-format
 msgid "Downloaded Dotclear archive seems to be corrupted. Try <a %s>download it</a> again."
-msgstr ""
+msgstr "Pobrane archiwum Dotclear wygląda na uszkodzone. Spróbuj <a %s>pobrać je</a> ponownie."
 
 msgid "The following files of your Dotclear installation have been modified so we won't try to update your installation. Please try to <a href=\"http://dotclear.org/download\">update manually</a>."
-msgstr ""
+msgstr "Następujące pliki Twojej instalacji Dotclear zostały zmodyfikowane, więc aktualizacja nie zostanie przeprowadzona. Możesz spróbować również <a href=\"http://dotclear.org/download\">ręcznej aktualizacji</a>."
 
 #, php-format
 msgid "The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually."
-msgstr ""
+msgstr "Nie można odczytać następujących plików Twojej instalacji Dotclear. Ustaw odpowiednie prawa dostępu lub spróbuj utworzyć plik zapasowy o nazwie %s ręcznie."
 
 msgid "The following files of your Dotclear installation cannot be written. Please fix this or try to <a href=\"http://dotclear.org/download\">update manually</a>."
-msgstr ""
-
-#, fuzzy
+msgstr "Następujące pliki Twojej instalacji Dotclear nie mogą być zapisane. Ustaw odpowiednie prawa dostępu lub spróbuj <a href=\"http://dotclear.org/download\">ręcznej aktualizacji</a>."
+
 msgid "No newer Dotclear version available."
-msgstr "Moduł iconv jest niedostępny."
-
-#, fuzzy, php-format
+msgstr "Posiadasz najnowszą wersję Dotclear-a."
+
+#, php-format
 msgid "Dotclear %s is available."
-msgstr "Dotclear jest już zainstalowany."
+msgstr "Dotclear %s jest już dostepny."
 
 msgid "To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory."
-msgstr ""
+msgstr "Aby uaktualnić instalację Dotclear-a kliknij poniższy przycisk. Plik zapasowy bieżącej instalacji zostanie utworzony w Twoim katalogu głownym."
 
 msgid "Update Dotclear"
-msgstr ""
-
-#, fuzzy
+msgstr "Uaktualnij Dotclear"
+
 msgid "Update backup files"
-msgstr "Zaktualizuj miniaturki"
+msgstr "Uaktualnij pliki zapasowe"
 
 msgid "The following files are backups of previously updates. You can revert your previous installation or delete theses files."
-msgstr ""
+msgstr "Następujące pliki są plikami zapasowymi z poprzednich uaktualnień. Możesz przywrócić poprzednie instalacje lub usunąć te pliki."
 
 msgid "Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version."
-msgstr ""
+msgstr "Przywrócenie poprzedniej wersji Dotcleara może mieć niepożądane skutki uboczne. Zalecane jest tylko kiedy masz naprawdę spore problemy z nową wersją."
 
 #, php-format
 msgid "You should not revert to version prior to last one (%s)."
-msgstr ""
-
-#, fuzzy
+msgstr "Nie powinieneś przywracać wersji wcześniejszej niż ostatnio (%s)."
+
 msgid "Delete selected file"
-msgstr "Usuń zaznaczone kategorie"
-
-#, fuzzy
+msgstr "Usuń wybrany plik"
+
 msgid "Revert to selected file"
-msgstr "Usuń zaznaczone wtyczki"
+msgstr "Przywróć za pomocą wybranego pliku"
 
 msgid "Congratulations, you're one click away from the end of the update."
-msgstr ""
-
-#, fuzzy
+msgstr "Gratulacje, jesteś o jedno kliknięcie od zakończenia aktualizacji."
+
 msgid "Finish the update."
-msgstr "Ostatnia aktualizacja"
+msgstr "Dokończ aktualizację."
 
 msgid "new user"
 msgstr "nowy użytkownik"
 
-#, fuzzy, php-format
+#, php-format
 msgid "User \"%s\" already exists."
-msgstr "Nowy plik już istnieje."
+msgstr "Użytkownik \"%s\" już istnieje."
 
 msgid "User has been successfully updated."
@@ -2098,10 +1987,9 @@
 msgstr "Ostrzeżenie:"
 
-#, fuzzy
 msgid "If you change your username, you will have to log in again."
-msgstr "Jeżeli zmienisz login, będziesz musiał zalogować się ponownie."
+msgstr "Jeżeli zmienisz nazwę użytkownika, będziesz musiał zalogować się ponownie."
 
 msgid "Password change required to connect"
-msgstr ""
+msgstr "Zmiana hasła wymagana przy połączeniu"
 
 msgid "No permissions."
@@ -2111,13 +1999,10 @@
 msgstr "Dodaj nowe uprawnienia"
 
-#, fuzzy
 msgid "Username"
 msgstr "Nazwa użytkownika:"
 
-#, fuzzy
 msgid "Last Name"
-msgstr "Ostatnia aktualizacja"
-
-#, fuzzy
+msgstr "Nazwisko"
+
 msgid "First Name"
 msgstr "Imię"
@@ -2157,8 +2042,8 @@
 
 msgid "Go to site"
-msgstr ""
+msgstr "Przejdź do witryny"
 
 msgid "new window"
-msgstr ""
+msgstr "nowe okno"
 
 msgid "User:"
@@ -2169,12 +2054,12 @@
 
 msgid "Safe mode"
-msgstr ""
+msgstr "Tryb bezpieczny"
 
 msgid "You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities"
-msgstr ""
+msgstr "Jesteś w trybie bezpiecznym. Wszystkie wtyczki zostały tymczasowo wyłączone. Po wylogowaniu u ponownym zalogowaniu zostanie przywrócona normalna funkcjonalność."
 
 #, php-format
 msgid "Thank you for using %s."
-msgstr ""
+msgstr "Dziękujemy za korzystanie z %s."
 
 msgid "Help"
@@ -2190,7 +2075,6 @@
 msgstr "pomoc"
 
-#, fuzzy
 msgid "no selection"
-msgstr "odwróć zaznaczenie"
+msgstr "usuń zaznaczenie"
 
 msgid "select all"
@@ -2203,14 +2087,14 @@
 msgstr "zobacz wpis"
 
-#, fuzzy, php-format
+#, php-format
 msgid "Are you sure you want to delete selected entries (%s)?"
-msgstr "Czy na pewno chcesz usunąć zaznaczone wpisy?"
+msgstr "Czy jesteś pewny że chcesz usunąć zaznaczone wpisy (%s)?"
 
 msgid "Are you sure you want to delete this entry?"
 msgstr "Czy na pewno chcesz usunąć ten wpis?"
 
-#, fuzzy, php-format
+#, php-format
 msgid "Are you sure you want to delete selected comments (%s)?"
-msgstr "Czy na pewno chcesz usunąć zaznaczone komentarze?"
+msgstr "Czy jesteś pewny że chcesz usunąć zaznaczone komentarze (%s)?"
 
 msgid "Are you sure you want to delete this comment?"
@@ -2218,49 +2102,45 @@
 
 msgid "Users with posts cannot be deleted."
-msgstr ""
-
-#, fuzzy, php-format
+msgstr "Nie można usunąć użytkowników posiadających wpisy."
+
+#, php-format
 msgid "Are you sure you want to delete selected users (%s)?"
-msgstr "Czy na pewno chcesz usunąć zaznaczonych użytkowników?"
-
-#, fuzzy, php-format
+msgstr "Czy na pewno chcesz usunąć zaznaczonego użytkownika (%s)?"
+
+#, php-format
 msgid "Are you sure you want to delete category \"%s\"?"
-msgstr "Czy na pewno chcesz usunąć ten wpis?"
-
-#, fuzzy
+msgstr "Czy na pewno chcesz usunąć kategorię \"%s\"?"
+
 msgid "Are you sure you want to reorder all categories?"
-msgstr "Czy na pewno chcesz usunąć zaznaczone kategorie?"
-
-#, fuzzy, php-format
+msgstr "Czy na pewno chcesz zmienić kolejność wszystkich kategorii?"
+
+#, php-format
 msgid "Are you sure you want to remove media \"%s\"?"
-msgstr "Jesteś pewien, że chcesz usunąć %s?"
-
-#, fuzzy
+msgstr "Jesteś pewien, że chcesz usunąć \"%s\"?"
+
 msgid "Are you sure you want to extract archive in current directory?"
-msgstr "Czy na pewno chcesz wypakować zawartość archiwum w bieżącym katalogu?"
-
-#, fuzzy, php-format
+msgstr "Czy na pewno chcesz wypakować zawartość archiwum do bieżącego katalogu?"
+
+#, php-format
 msgid "Are you sure you want to remove attachment \"%s\"?"
-msgstr "Jesteś pewien, że chcesz usunąć ten załącznik?"
-
-#, fuzzy, php-format
+msgstr "Jesteś pewien, że chcesz usunąć ten załącznik \"%s\"?"
+
+#, php-format
 msgid "Are you sure you want to delete \"%s\" language?"
-msgstr "Czy na pewno chcesz usunąć ten wpis?"
-
-#, fuzzy, php-format
+msgstr "Czy na pewno chcesz usunąć język \"%s\"?"
+
+#, php-format
 msgid "Are you sure you want to delete \"%s\" plugin?"
-msgstr "Czy na pewno chcesz usunąć zaznaczone wtyczki?"
-
-#, fuzzy
+msgstr "Czy na pewno chcesz usunąć wtyczkę \"%s\"?"
+
 msgid "Use this theme"
-msgstr "użyj wybranego motywu"
-
-#, fuzzy
+msgstr "Uzyj tego motywu"
+
 msgid "Remove this theme"
-msgstr "Usuń załącznik"
-
-#, fuzzy, php-format
+msgstr "Usuń ten motyw"
+
+#, php-format
 msgid "Are you sure you want to delete \"%s\" theme?"
-msgstr "Czy na pewno chcesz usunąć wybrany motyw?"
+msgstr "Czy na pewno chcesz usunąć motyw \"%s\"?"
 
 msgid "Zip file content"
@@ -2277,8 +2157,8 @@
 
 msgid "You have unsaved changes. Switch post format will loose these changes. Proceed anyway?"
-msgstr ""
+msgstr "Niektóre zmiany nie zostały zachowane. Zmiana formatu wpisu spowoduje że zostaną utracone. Kontynuować?"
 
 msgid "Loading enhanced uploader, please wait."
-msgstr ""
+msgstr "Proszę czekać, ładuję ulepszony uploader."
 
 msgid "You have unsaved changes."
@@ -2304,5 +2184,5 @@
 
 msgid "-- block format --"
-msgstr ""
+msgstr "-- format blokowy --"
 
 msgid "Paragraph"
@@ -2379,8 +2259,8 @@
 
 msgid "Activate enhanced uploader"
-msgstr ""
+msgstr "Włącz ulepszony uploader"
 
 msgid "Disable enhanced uploader"
-msgstr ""
+msgstr "Wyłącz ulepszony uploader"
 
 msgid "File successfully uploaded."
@@ -2409,8 +2289,8 @@
 
 msgid "Clean"
-msgstr ""
+msgstr "Wyczyść"
 
 msgid "Upload"
-msgstr ""
+msgstr "Załaduj"
 
 msgid "No file in queue."
@@ -2437,5 +2317,5 @@
 
 msgid "scheduled"
-msgstr "zaplanowany"
+msgstr "oczekujący"
 
 msgid "protected"
@@ -2457,20 +2337,17 @@
 
 msgid "admin"
-msgstr ""
-
-#, fuzzy
+msgstr "administrator"
+
 msgid "superadmin"
-msgstr "Super administrator"
-
-#, fuzzy
+msgstr "Super-administrator"
+
 msgid "Database error"
-msgstr "Rodzaj bazy danych"
+msgstr "Bład bazy danych"
 
 msgid "There seems to be no Session table in your database. Is Dotclear completly installed?"
-msgstr ""
-
-#, fuzzy
+msgstr "Nie można zlokalizować tabeli sesji w bazie danych. Jesteś pewny że Dotclear został zainstalowany w całości?"
+
 msgid "Languages"
-msgstr "Język?"
+msgstr "Języki"
 
 msgid "System"
@@ -2481,5 +2358,5 @@
 
 msgid "Updates"
-msgstr ""
+msgstr "Uaktualnienia"
 
 msgid "administrator"
@@ -2525,7 +2402,6 @@
 msgstr "Ta kategoria nie jest pusta."
 
-#, fuzzy
 msgid "Category URL must be unique."
-msgstr "Zarówno tytuł jak i adres kategorii muszą być unikalne"
+msgstr "Kategoria URL musi być unikalna."
 
 msgid "You must provide a category title"
@@ -2553,7 +2429,6 @@
 msgstr "Nie masz uprawnień do zmiany kategorii tego wpisu"
 
-#, fuzzy
 msgid "You are not allowed to mark this entry as selected"
-msgstr "Nie masz uprawnień do zmiany kategorii tego wpisu"
+msgstr "Nie masz uprawnień aby zaznaczyć ten wpis."
 
 msgid "You are not allowed to delete entries"
@@ -2569,7 +2444,6 @@
 msgstr "Brak zawartości wpisu"
 
-#, fuzzy
 msgid "Empty entry URL"
-msgstr "Edytuj wpis"
+msgstr "Usuń URL wejściowy"
 
 msgid "You are not allowed to update comments"
@@ -2624,11 +2498,9 @@
 msgstr "Brak adresu bloga"
 
-#, fuzzy
 msgid "No log message"
-msgstr "Brak nazwy bloga"
-
-#, fuzzy
+msgstr "Nie ma wpisu w logu"
+
 msgid "unknown"
-msgstr "teraz"
+msgstr "nieznany(-a)"
 
 msgid "No blog defined."
@@ -2640,5 +2512,5 @@
 
 msgid "You are not a super administrator."
-msgstr "Nie masz uprawień super administratora."
+msgstr "Nie masz uprawień Super-administratora."
 
 msgid "Permission denied."
@@ -2648,7 +2520,6 @@
 msgstr "Nie jesteś właścicielem pliku."
 
-#, fuzzy
 msgid "This file is not allowed."
-msgstr "Wysłanie tego pliku nie jest dozwolone."
+msgstr "Nie można wysłać tego pliku (format zabroniony)."
 
 msgid "New file already exists."
@@ -2658,17 +2529,17 @@
 msgstr "Plik nie istnieje w bazie danych."
 
-#, fuzzy, php-format
+#, php-format
 msgid "Extract destination directory %s already exists."
 msgstr "Docelowy katalog %s już istnieje."
 
 msgid "Embedded Audio Player"
-msgstr ""
+msgstr "Osadzony Odtwarzacz Audio"
 
 msgid "Embedded Video Player"
-msgstr ""
+msgstr "Osadzony Odtwarzacz Wideo"
 
 #, php-format
 msgid "%s: in [%s] and [%s]"
-msgstr ""
+msgstr "%s: w [%s] i [%s]"
 
 msgid "Empty module zip file."
@@ -2695,12 +2566,12 @@
 
 msgid "Cannot deactivate plugin."
-msgstr ""
+msgstr "Nie można wyłączyć wtyczki."
 
 msgid "Cannot activate plugin."
-msgstr ""
-
-#, fuzzy, php-format
+msgstr "Nie można włączyć wtyczki."
+
+#, php-format
 msgid "Invalid setting dcNamespace: %s"
-msgstr "Nieprawidłowy adres e-mail"
+msgstr "Nieprawidłowe ustawienie dcNamespace: %s"
 
 msgid "Unable to retrieve settings:"
@@ -2714,15 +2585,13 @@
 msgstr "Przestrzeń nazw nie została podana"
 
-#, fuzzy
 msgid "Unable to retrieve workspaces:"
-msgstr "Nie można odnaleźć ustawień:"
-
-#, fuzzy
+msgstr "Nie można odczytać przestrzeni roboczej:"
+
 msgid "Unable to retrieve namespaces:"
-msgstr "Nie można odnaleźć ustawień:"
-
-#, fuzzy, php-format
+msgstr "Nie można odczytać przestrzeni nazw:"
+
+#, php-format
 msgid "Invalid setting namespace: %s"
-msgstr "Nieprawidłowy adres e-mail"
+msgstr "Nieprawidłowe ustawienie przestrzeni nazw: %s"
 
 #, php-format
@@ -2741,58 +2610,47 @@
 msgstr "%s, błąd wysyłania sygnału ping:"
 
-#, fuzzy
 msgid "Digests file not found."
-msgstr "Wtyczki nie znaleziono"
-
-#, fuzzy
+msgstr "Nie znaleziono pliku digests."
+
 msgid "No file to download"
-msgstr "Plik nie został wysłany."
-
-#, fuzzy
+msgstr "Lista plików do pobrania jest pusta."
+
 msgid "Root directory is not writable."
-msgstr "Katalog cache %s nie jest zapisywalny."
-
-#, fuzzy
+msgstr "Główny katalog nie jest zapisywalny."
+
 msgid "An error occurred while downloading archive."
-msgstr "Podczas ściągania pliku wystąpił błąd."
-
-#, fuzzy
+msgstr "Wystąpił błąd podczas pobierania archiwum."
+
 msgid "Archive not found."
-msgstr "Wtyczki nie znaleziono"
-
-#, fuzzy
+msgstr "Nie odnaleziono archiwum."
+
 msgid "Unable to read current digests file."
-msgstr "Nie można czytać nowego pliku _define.php."
-
-#, fuzzy
+msgstr "Nie można odczytać bieżącego pliku digests."
+
 msgid "Downloaded file does not seem to be a valid archive."
-msgstr "Ten plik zip nie wydaje się być poprawnym modułem Dotclear."
-
-#, fuzzy
+msgstr "Pobrany plik nie jest poprawnym archiwum."
+
 msgid "Incomplete archive."
-msgstr "Rozpakuj archiwum"
-
-#, fuzzy
+msgstr "Archiwum jest niekompletne."
+
 msgid "Unable to read digests file."
-msgstr "Nie można zmienić nazwy pliku."
+msgstr "Nie można odczytac pliku digests."
 
 msgid "Invalid digests file."
-msgstr ""
-
-#, fuzzy, php-format
+msgstr "Nieprawidłowy plik digests."
+
+#, php-format
 msgid "Invalid dcWorkspace: %s"
-msgstr "Nieprawidłowy adres e-mail"
-
-#, fuzzy
+msgstr "Nieprawidłowy dcWorkspace: %s"
+
 msgid "Unable to retrieve prefs:"
-msgstr "Nie można odnaleźć ustawień:"
-
-#, fuzzy, php-format
+msgstr "Nie można odczytać ustawień:"
+
+#, php-format
 msgid "%s is not a valid pref id"
 msgstr "%s nie jest poprawnym ID ustawienia"
 
-#, fuzzy
 msgid "No workspace specified"
-msgstr "Przestrzeń nazw nie została podana"
+msgstr "Nie wskazano przestrzeni roboczej"
 
 msgid "SQLite Database Schema cannot be upgraded."
@@ -2842,14 +2700,12 @@
 msgstr "Katalog docelowy nie jest oznaczony jako niechciany."
 
-#, fuzzy
 msgid "File already exists."
-msgstr "Nowy plik już istnieje."
+msgstr "Wskazany plik już istnieje."
 
 msgid "Cannot write in this directory."
 msgstr "Nie można zapisywać do tego katalogu."
 
-#, fuzzy
 msgid "An error occurred while writing the file."
-msgstr "Podczas zapisywania pliku wystąpił błąd."
+msgstr "Wystąpił błąd podczas zapisywania pliku."
 
 msgid "Source file does not exist."
@@ -2879,9 +2735,9 @@
 #, php-format
 msgid "File %s is not compressed in the zip."
-msgstr ""
+msgstr "Pplk %s nie jest poprawnym plikiem archiwum."
 
 #, php-format
 msgid "Trying to unzip a folder name %s"
-msgstr ""
+msgstr "Rozpakowuję katalog %s"
 
 msgid "Unable to write destination file."
@@ -2906,14 +2762,13 @@
 msgstr "Nie można czytać katalogu"
 
-#, fuzzy
 msgid "Unable to connect to database"
-msgstr "Nie można połączyć z bazą danych. Sprawdź swoje ustawienia."
+msgstr "Nie można połączyć się z bazą danych."
 
 #, php-format
 msgid "<p>This either means that the username and password information in your <strong>config.php</strong> file is incorrect or we can't contact the database server at \"<em>%s</em>\". This could mean your host's database server is down.</p> <ul><li>Are you sure you have the correct username and password?</li><li>Are you sure that you have typed the correct hostname?</li><li>Are you sure that the database server is running?</li></ul><p>If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href=\"http://forum.dotclear.net/\">Dotclear Support Forums</a>.</p>"
-msgstr ""
+msgstr "<p>To oznacza że nazwa użytkownika i hasło w Twoim pliku <strong>config.php</strong> jest niepoprawna albo dostęp do bazy danych pod \"<em>%s</em>\" jest niemożliwy. To może również oznaczać że serwer bazy danych nie pracuje.</p> <ul><li>Jesteś pewny że podałeś prawidłową nazwę użytkownika i hasło?</li><li>Jesteś pewny że podałeś prawidłowo adres hosta?</li><li>Jesteś pewny że serwer bazy danych pracuje?</li></ul><p>Jeżeli nie zrozumiałeś znaczeń użytych w pytaniach powinieneś skontaktować się z administratorem. Jeżeli dalej będziesz potrzebował pomocy, zawsze możesz odwiedzić <a href=\"http://forum.dotclear.net/\">Dotclear Support Forums</a>.</p>"
 
 msgid "The following error was encountered while trying to read the database:"
-msgstr ""
+msgstr "Podczas odczytu z bazy danych wystąpił następujący błąd:"
 
 #~ msgid "login"
Index: locales/pl/plugins.po
===================================================================
--- locales/pl/plugins.po	(revision 261)
+++ locales/pl/plugins.po	(revision 558)
@@ -9,6 +9,6 @@
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2011-05-13 19:36+0200\n"
-"PO-Revision-Date: 2008-07-13 12:42+0200\n"
-"Last-Translator: Nnidŷu <nnidyu@asylumeternity.net>\n"
+"PO-Revision-Date: 2011-06-26 14:10+0100\n"
+"Last-Translator: \n"
 "Language-Team: Polish\n"
 "Language: \n"
@@ -62,8 +62,8 @@
 
 msgid "Delete junk comments older than"
-msgstr ""
+msgstr "Usuń śmieciowe komentarze starsze niż"
 
 msgid "days"
-msgstr ""
+msgstr "dni"
 
 msgid "IP Blacklist / Whitelist Filter"
@@ -182,5 +182,5 @@
 
 msgid "Ham"
-msgstr ""
+msgstr "Pożadane"
 
 msgid "Filter does not exist."
@@ -237,7 +237,6 @@
 msgstr "Konfiguracja filtra"
 
-#, fuzzy
 msgid "position"
-msgstr "Dyspozycja mediów"
+msgstr "pozycja"
 
 msgid "Syndication"
@@ -251,12 +250,11 @@
 
 msgid "manage blogroll"
-msgstr "zarządzaj odnośnikami"
+msgstr "zarządzaj polecanymi odnośnikami"
 
 msgid "Links"
 msgstr "Odnośniki"
 
-#, fuzzy
 msgid "All categories"
-msgstr "Dodaj kategorię"
+msgstr "Wszystkie kategorie"
 
 msgid "Home page only"
@@ -279,12 +277,11 @@
 
 msgid "Return to blogroll"
-msgstr "Powróć do linków"
+msgstr "Wróć do polecanych odnośników"
 
 msgid "Category has been successfully updated"
 msgstr "Kategoria została pomyślnie zaktualizowana"
 
-#, fuzzy
 msgid "Edit category"
-msgstr "Dodaj kategorię"
+msgstr "Edytuj kategorię"
 
 msgid "Link has been successfully updated"
@@ -399,7 +396,6 @@
 msgstr "Język"
 
-#, fuzzy
 msgid "select this link"
-msgstr "wybierz wszystkie odnośniki"
+msgstr "wybierz ten odnośnik"
 
 msgid "Delete selected links"
@@ -410,5 +406,5 @@
 
 msgid "The link list is empty."
-msgstr ""
+msgstr "Odnośnik jest pusty."
 
 msgid "Add a new link"
@@ -421,7 +417,6 @@
 msgstr "Importuj odnośniki"
 
-#, fuzzy
 msgid "OPML or XBEL File:"
-msgstr "Plik OPML lub XBEL:"
+msgstr "Plik w formacie OPML lub XBEL:"
 
 msgid "import"
@@ -452,11 +447,9 @@
 msgstr "Zastosuj kod"
 
-#, fuzzy
 msgid "Choose a predefined style"
 msgstr "Style predefiniowane"
 
-#, fuzzy
 msgid "For the following reasons, images cannot be created. You won't be able to change some background properties."
-msgstr "Ponieważ obrazy nie mogą być tworzone, nie będziesz mógł zmienić niektórych własności tła."
+msgstr "Z następujących przyczyn obrazy nie mogą zostać utworzone. Nie będziesz mógł zmienić niektórych własności tła."
 
 msgid "Theme configuration has been successfully updated."
@@ -473,8 +466,8 @@
 
 msgid "Main text font:"
-msgstr ""
+msgstr "Krój czcionki tekstu podstawowego:"
 
 msgid "Main text font size:"
-msgstr ""
+msgstr "Rozmiar czcionki tekstu podstawowego:"
 
 msgid "Main text color:"
@@ -482,5 +475,5 @@
 
 msgid "Text line height:"
-msgstr ""
+msgstr "Wysokość interlinii:"
 
 msgid "Links color:"
@@ -497,5 +490,5 @@
 
 msgid "Prelude color:"
-msgstr ""
+msgstr "Kolor wstępu:"
 
 msgid "Hide main title"
@@ -503,8 +496,8 @@
 
 msgid "Main title font:"
-msgstr ""
+msgstr "Krój czionki głównego tytułu:"
 
 msgid "Main title font size:"
-msgstr ""
+msgstr "Rozmiar czionki głównego tytułu:"
 
 msgid "Main title color:"
@@ -576,5 +569,5 @@
 
 msgid "Sidebar lines color:"
-msgstr ""
+msgstr "Kolor linii w sidebarze:"
 
 msgid "Sidebar links color:"
@@ -585,14 +578,14 @@
 
 msgid "Sidebar focus links color:"
-msgstr ""
+msgstr "Kolor wybranych odnośników w sidebarze:"
 
 msgid "Date title font:"
-msgstr ""
+msgstr "Krój czcionki w dacie w tytule:"
 
 msgid "Date title font size:"
-msgstr ""
+msgstr "Rozmiar czcionki w dacie w tytule:"
 
 msgid "Date title color:"
-msgstr ""
+msgstr "Kolor daty w tytule:"
 
 msgid "Entry title font:"
@@ -642,19 +635,18 @@
 
 msgid "Copy this code:"
-msgstr ""
+msgstr "Skopiuj ten kod:"
 
 msgid "default"
-msgstr ""
+msgstr "domyślny"
 
 msgid "At least one of the following functions is not available: imagecreatetruecolor, imagepng & imagecreatefrompng."
-msgstr ""
-
-#, fuzzy
+msgstr "Przynajmniej jedna z następujących funkcji nie jest dostępna: imagecreatetruecolor, imagepng & imagecreatefrompng."
+
 msgid "The 'public' directory does not exist."
-msgstr "Ta strona nie istnieje."
+msgstr "NIe odnaleziono katalogu \"public\""
 
 #, php-format
 msgid "The '%s' directory cannot be modified."
-msgstr ""
+msgstr "Katalog '%s' nie może zostać zmieniony."
 
 msgid "Unable to create images."
@@ -665,5 +657,5 @@
 
 msgid "Uploaded image is not 800 pixels wide."
-msgstr ""
+msgstr "Załadowany obraz nie ma szerokości 800px."
 
 msgid "Unable to open image."
@@ -671,26 +663,24 @@
 
 msgid "Checks trackback source for a link to the post"
-msgstr ""
+msgstr "Sprawdza zródło odnośnika w poście"
 
 msgid "Import/Export"
 msgstr "Import/Eksport"
 
-#, fuzzy
 msgid "Flat file export"
-msgstr "Plik nie jest pełnym eksportem."
+msgstr "Eksport do pojedynczego pliku"
 
 msgid "Exports a blog or a full Dotclear installation to flat file."
-msgstr ""
-
-#, fuzzy
+msgstr "Eksportuje blog lub pełną instalację do pojedynczego pliku."
+
 msgid "Export file not found."
-msgstr "Eksportuj całą zawartość"
+msgstr "Nie znaleniono pliku z eksportowanymi danymi."
 
 msgid "Export a blog"
 msgstr "Eksportuj blog"
 
-#, fuzzy, php-format
+#, php-format
 msgid "This will create an export of your current blog: %s"
-msgstr "Zaimportuje kanał (RSS lub Atom) jako nową zawartość w aktualnym blogu: %s."
+msgstr "Utwórz eksport Twojego aktualnego blogu: %s."
 
 msgid "Export"
@@ -698,5 +688,5 @@
 
 msgid "You may also want to download your media directory as a zip file"
-msgstr ""
+msgstr "Możesz również ściągnąć katalog z mediami w formacie zip"
 
 msgid "Export all content"
@@ -704,92 +694,83 @@
 
 msgid "Congratulation!"
-msgstr ""
-
-#, fuzzy
+msgstr "Gratulacje!"
+
 msgid "Your blog has been successfully imported. Welcome on Dotclear 2!"
-msgstr "odnośniki zostały pomyślnie zaimportowane"
+msgstr "Twój blog został zaimportowany pomyślnie. Witaj w Dotclear 2!"
 
 msgid "Why don't you blog this now?"
-msgstr ""
-
-#, fuzzy
+msgstr "A może umieściłbyś to teraz na blogu?"
+
 msgid "or"
-msgstr "więcej"
+msgstr "lub"
 
 msgid "visit your dashboard"
-msgstr ""
+msgstr "odwiedź swój panel"
 
 msgid "Dotclear 1.2 import"
-msgstr ""
+msgstr "Import Dotclear 1.2"
 
 msgid "Import a Dotclear 1.2 installation into your current blog."
-msgstr ""
-
-#, fuzzy, php-format
+msgstr "Importuj instalację Dotclear 1.2 do bieżącego bloga."
+
+#, php-format
 msgid "This will import your Dotclear 1.2 content as new content in the current blog: %s."
-msgstr "Zaimportuje kopię zapasową pojedynczego bloga jako nową zawartość w aktualnym blogu: %s."
+msgstr "Importuj zawartość Twojego Dotclear-a 1.2 jako nową treść w aktualnym blogu: %s."
 
 msgid "Please note that this process will empty your categories, blogroll, entries and comments on the current blog."
-msgstr ""
+msgstr "Proszę zauważyć, że ten proces usunie Twoje kategorie, polecane odnośniki oraz wpisy i komentarze na bieżącym blogu."
 
 msgid "Depending on the size of your blog, it could take a few minutes."
-msgstr ""
-
-#, fuzzy
+msgstr "Zależnie od wielkości bloga, może to zająć nawet do kilku minut."
+
 msgid "General information"
-msgstr "Informacja"
-
-#, fuzzy
+msgstr "Ogólne informacje"
+
 msgid "Import my blog now"
-msgstr "Eksportuj blog"
+msgstr "Zaimportuj mój blog teraz"
 
 msgid "We first need some information about your old Dotclear 1.2 installation."
-msgstr ""
-
-#, fuzzy
+msgstr "Najpierw potrzebujemy kilku informacji o Twojej starej instalacji Dotclear 1.2"
+
 msgid "Entries import options"
-msgstr "Limit wpisów:"
+msgstr "Opcje importu wpisów:"
 
 msgid "Number of entries to import at once:"
-msgstr ""
-
-#, fuzzy
+msgstr "Ile wpisów naraz zaimportować :"
+
 msgid "Importing users"
-msgstr "Importuj odnośniki"
+msgstr "Importuj użytkowników"
 
 msgid "Importing categories"
-msgstr ""
-
-#, fuzzy
+msgstr "Importowanie kategorii"
+
 msgid "Importing blogroll"
-msgstr "Importuj pojedynczy blog"
-
-#, fuzzy, php-format
+msgstr "Import polecanych odnośników"
+
+#, php-format
 msgid "Importing entries from %d to %d / %d"
-msgstr "Indeksowanie wpisów od %d do %d."
+msgstr "Importowanie wpisów od %d do %d / %d"
 
 msgid "Please read carefully"
-msgstr ""
+msgstr "Prosze przeczytać uważnie"
 
 msgid "Every newly imported user has received a random password and will need to ask for a new one by following the \"I forgot my password\" link on the login page (Their registered email address has to be valid.)"
-msgstr ""
+msgstr "Każdy nowo zaimportowany użytkownik otrzymał losowo wygenerowane hasło i będzie musiał poprosić o przysłanie go przy użyciu linku \"Zapomniałem hasła\" na stronie logowania (adres e-mail zarejestrowanego użytkownika musi być prawidłowy.)"
 
 #, php-format
 msgid "Please note that Dotclear 2 has a new URL layout. You can avoid broken links by installing <a href=\"%s\">DC1 redirect</a> plugin and activate it in your blog configuration."
-msgstr ""
-
-#, fuzzy
+msgstr "Proszę zauważyć że Dotclear 2 używa innej konstrukcji dla odnośników. Możesz uniknąć nie działających linków poprzez zainstalowanie dodatku <a href=\"%s\">DC1 redirect</a> i aktywowanie go w konfiguracji bloga."
+
 msgid "next step"
-msgstr "następna strona"
+msgstr "następny krok"
 
 msgid "Dotclear tables not found"
-msgstr ""
-
-#, fuzzy
+msgstr "Nie znaleziono tabel Dotclear"
+
 msgid "Feed import"
-msgstr "importuj"
+msgstr "Implort kanałów"
 
 msgid "Imports a feed as new entries."
-msgstr ""
+msgstr "Importuje treść kanału jako nowe wpisy."
 
 msgid "Cannot retrieve feed URL."
@@ -816,12 +797,11 @@
 
 msgid "Flat file import"
-msgstr ""
+msgstr "Import pojedynczego pliku"
 
 msgid "Imports a blog or a full Dotclear installation from flat file."
-msgstr ""
-
-#, fuzzy
+msgstr "Importuje blog lub pełną instalację Dotclear-a z pojedynczego pliku."
+
 msgid "Single blog successfully imported."
-msgstr "Zawartość pomyślnie zaimportowana."
+msgstr "Zaimportowano pojedynczy blog."
 
 msgid "Are you sure you want to import a full backup file?"
@@ -848,50 +828,48 @@
 
 msgid "WordPress import"
-msgstr ""
+msgstr "Import WordPress-a"
 
 msgid "Import a WordPress installation into your current blog."
-msgstr ""
-
-#, fuzzy, php-format
+msgstr "Importuj instalację WordPress-a do Twojego aktualnego bloga."
+
+#, php-format
 msgid "This will import your WordPress content as new content in the current blog: %s."
-msgstr "Zaimportuje kanał (RSS lub Atom) jako nową zawartość w aktualnym blogu: %s."
+msgstr "Importuj zawartość Twojego WordPress-a jako nową treść w aktualnym blogu: %s."
 
 msgid "We first need some information about your old WordPress installation."
-msgstr ""
+msgstr "Na wstępie potrzebujemy kliku informacji na temat Twojej starej instalacji WordPress-a"
 
 msgid "WordPress and Dotclear's handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like \"One category, several tags.\" Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix."
-msgstr ""
+msgstr "Mechanizmy kategorii w WordPress-ie i Dotclear-u różnią się dość mocno. Możesz przypisać kilka kategorii do pojedynczego posta w WordPress-ie. W świecie Dotclear-a, widzimy to raczej jako \"Jedna kategoria, kilka tagów\". Z tego powodu Dotclear może importować jedną kategorię na wpis i wybiera zawsze tą z najniższym numerem. Jeżeli nie chcesz utracić żadnej z kategorii, możesz zaimportować je jako tagi z opcjonalnym przedrostkiem."
 
 msgid "On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised <i>\"Uncategorized\"</i>. If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized."
-msgstr ""
+msgstr "Z drugiej strony, w WordPress-ie wpis nie może być pozbawiony kategorii i domyślna instalacja posiada podstawową kategorię nazwaną <i>\"Uncategorized\"</i>. Jeżeli nie zmieniłeś nazwy tej kategorii, możesz zignorować to podczas importu Twojego bloga, ponieważ Dotclear pozwala na zachowanie niekategoryzowanych wpisów."
 
 msgid "Ignore the first category:"
-msgstr ""
+msgstr "Ignoruj pierwszą kategorię:"
 
 msgid "Import lowest numbered category on posts:"
-msgstr ""
+msgstr "Importuj kategorię z najniższym numerem w postach:"
 
 msgid "Import all categories as tags:"
-msgstr ""
+msgstr "Importuj wszystkie kategorie jako tagi:"
 
 msgid "Prefix such tags with:"
-msgstr ""
-
-#, fuzzy
+msgstr "Dodaj do takich tagów przedrostek:"
+
 msgid "Content filters"
-msgstr "Wróć do filtrów"
+msgstr "Filtry treści"
 
 msgid "You may want to process your post and/or comment content with the following filters."
-msgstr ""
+msgstr "Możesz przetworzyć swój wpis i/lub komentarz z pomocą następujących filtrów:"
 
 msgid "Post content formatter:"
-msgstr ""
-
-#, fuzzy
+msgstr "Formater treści wpisów:"
+
 msgid "Comment content formatter:"
-msgstr "Kolor tekstu komentarza:"
+msgstr "Formater treści komentarza:"
 
 msgid "WordPress tables not found"
-msgstr ""
+msgstr "Nie znaleziono tabel WordPressa"
 
 msgid "No file to read."
@@ -908,8 +886,8 @@
 
 msgid "The backup file does not appear to be well formed."
-msgstr ""
+msgstr "Nieznany format pliku zapasowego."
 
 msgid "Please wait..."
-msgstr ""
+msgstr "Proszę czekać..."
 
 msgid "Import"
@@ -926,8 +904,8 @@
 
 msgid "Templates cache directory emptied."
-msgstr ""
+msgstr "Katalog cache szablonów został opróżniony."
 
 msgid "Logs deleted."
-msgstr ""
+msgstr "Logi usunięto."
 
 #, php-format
@@ -952,8 +930,8 @@
 
 msgid "Optimize database room"
-msgstr "Optymizuj objętość bazy danych."
+msgstr "Optymalizuj objętość bazy danych."
 
 msgid "Vacuum tables"
-msgstr "Opróżnij tabele"
+msgstr "Optymalizuj"
 
 msgid "Counters"
@@ -975,28 +953,26 @@
 msgstr "indeksuj wszystkie komentarze"
 
-#, fuzzy
 msgid "Vacuum logs"
-msgstr "Opróżnij tabele"
-
-#, fuzzy
+msgstr "Oczyść logi"
+
 msgid "Delete all logs"
-msgstr "Usuń wszystkie elementy oznaczone jako spam"
+msgstr "Usuń wszystkie logi"
 
 msgid "Empty templates cache directory"
-msgstr ""
+msgstr "Opróżnij katalog cache szablonów"
 
 msgid "Empty directory"
-msgstr ""
+msgstr "Opróżnij katalog"
 
 msgid "New page"
 msgstr "Nowa strona"
 
-#, fuzzy, php-format
+#, php-format
 msgid "%d page"
-msgstr "Edytuj stronę"
-
-#, fuzzy, php-format
+msgstr "%d strona"
+
+#, php-format
 msgid "%d pages"
-msgstr "Edytuj stronę"
+msgstr "%d stron"
 
 msgid "manage pages"
@@ -1007,5 +983,5 @@
 
 msgid "This page's comments feed"
-msgstr ""
+msgstr "Kanał komentarzy dla tej strony"
 
 msgid "You must provide a valid email address."
@@ -1015,7 +991,6 @@
 msgstr "Tytuł strony"
 
-#, fuzzy
 msgid "Page position"
-msgstr "Dyspozycja mediów"
+msgstr "Pozycja strony"
 
 msgid "Publication date"
@@ -1025,14 +1000,12 @@
 msgstr "Brak stron"
 
-#, fuzzy
 msgid "select this page"
-msgstr "Usuń ten tag"
-
-#, fuzzy
+msgstr "wybierz tą stronę"
+
 msgid "Are you sure you want to delete selected pages?"
-msgstr "Jesteś pewien, że chcesz usunąć wybrane odnośniki?"
+msgstr "Jesteś pewien, że chcesz usunąć wybraną stronę?"
 
 msgid "Selected pages action:"
-msgstr ""
+msgstr "Wybierz akcję dla zaznaczonych stron:"
 
 msgid "This page does not exist."
@@ -1057,18 +1030,15 @@
 msgstr "Strona została pomyślnie utworzona."
 
-#, fuzzy
 msgid "View page"
-msgstr "zobacz stronę"
-
-#, fuzzy
+msgstr "Zobacz stronę"
+
 msgid "Preview page"
-msgstr "zobacz stronę"
+msgstr "Podgląd strony"
 
 msgid "Page status:"
 msgstr "Stan strony:"
 
-#, fuzzy
 msgid "Page position:"
-msgstr "Pozycja panelu bocznego"
+msgstr "Pozycja strony:"
 
 msgid "Page lang:"
@@ -1109,5 +1079,5 @@
 
 msgid "Check all"
-msgstr ""
+msgstr "Zaznacz wszystkie"
 
 msgid "Pings:"
@@ -1138,9 +1108,8 @@
 
 msgid "used in %e - frequency %p%"
-msgstr ""
-
-#, fuzzy
+msgstr "użyty w %e - popularność %p%"
+
 msgid "entry"
-msgstr "wyśrodkowanie"
+msgstr "wpis"
 
 msgid "entries"
@@ -1148,13 +1117,11 @@
 
 msgid "Enter tags separated by coma"
-msgstr ""
-
-#, fuzzy
+msgstr "Wpisz tagi oddzielone przecinkiem"
+
 msgid "Add tags"
-msgstr "dodaj tagi"
-
-#, fuzzy
+msgstr "Dodaj tagi"
+
 msgid "Remove tags"
-msgstr "usuń tagi"
+msgstr "Usuń tagi"
 
 msgid "Add tags to entries"
@@ -1174,20 +1141,17 @@
 
 msgid "short"
-msgstr ""
+msgstr "krótki"
 
 msgid "extended"
-msgstr ""
-
-#, fuzzy
+msgstr "rozszerzony"
+
 msgid "Tags list format:"
-msgstr "Tagi do dodania:"
-
-#, fuzzy
+msgstr "Format listy tagów:"
+
 msgid "This tag's comments Atom feed"
-msgstr "Kanał RSS komentarzy dla tagu."
-
-#, fuzzy
+msgstr "Kanał Atom dla komentarzy z tym tagiem"
+
 msgid "This tag's entries Atom feed"
-msgstr "Kanał RSS wpisów dla tagu."
+msgstr "Kanał Atom dla wpisów z tym tagiem"
 
 msgid "Limit (empty means no limit):"
@@ -1204,5 +1168,5 @@
 
 msgid "Link to all tags:"
-msgstr ""
+msgstr "Odnośnik do wszystkich tagów:"
 
 msgid "Edit tag"
@@ -1250,5 +1214,4 @@
 msgstr "Dokument został zapisany"
 
-#, fuzzy
 msgid "An error occurred:"
 msgstr "Wystąpił błąd:"
@@ -1283,16 +1246,13 @@
 msgstr "Pliki JavaScript"
 
-#, fuzzy
 msgid "Preferences successfully updated"
-msgstr "Strona została pomyślnie zaktualizowana."
-
-#, fuzzy
+msgstr "Ustawienia zostały zaktualizowane"
+
 msgid "Preferences definition successfully updated"
-msgstr "Definicja ustawień pomyślnie zaktualizowana"
+msgstr "Definicja ustawień została pomyślnie zaktualizowana"
 
 msgid "user preferences"
-msgstr ""
-
-#, fuzzy
+msgstr "ustawienia użytkownika"
+
 msgid "global preferences"
 msgstr "ustawienia globalne"
@@ -1347,9 +1307,8 @@
 
 msgid "Uncategorized"
-msgstr ""
-
-#, fuzzy
+msgstr "Bez kategorii"
+
 msgid "Tag:"
-msgstr "Tagi:"
+msgstr "Tag:"
 
 msgid "Last comments"
@@ -1404,45 +1363,41 @@
 
 msgid "Extra sidebar"
-msgstr "Pasek ekstra"
-
-msgid "update sidebars"
+msgstr "Pasek dodatkowy"
+
+msgid "Update sidebars"
 msgstr "zaktualizuj paski boczne"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "resetuj paski boczne"
 
 msgid "Widget templates tags"
-msgstr ""
+msgstr "Tagi gadżetów do szablonu"
 
 msgid "If you are allowed to edit your theme templates, you can directly add widgets as templates tags, with their own configuration."
-msgstr ""
+msgstr "Jeżeli możesz edytować Twoje szablony, możesz bezpośrednio dodać do nich gadżety (w formie tagów szablonu), podając jednocześnie ich konfigurację."
 
 msgid "To add a widget in your template, you need to write code like this:"
-msgstr ""
-
-#, fuzzy
+msgstr "Aby dodać gadżet w Twoim szablonie, musisz napisać następujący kod:"
+
 msgid "Widget ID"
-msgstr "Widgety"
-
-#, fuzzy
+msgstr "ID gadżetu"
+
 msgid "Setting name"
-msgstr "Nazwa usługi:"
+msgstr "Nazwa ustawienia:"
 
 msgid "Setting value"
-msgstr ""
+msgstr "Wartość"
 
 msgid "Here are the following available widgets for your blog:"
-msgstr ""
-
-#, fuzzy
+msgstr "Oto gadżety dostępne na Twoim blogu:"
+
 msgid "Widget ID:"
-msgstr "Widgety"
+msgstr "ID gadżetu:"
 
 msgid "No setting for this widget"
-msgstr ""
-
-#, fuzzy
+msgstr "Brak ustawień dla tego gadżetu"
+
 msgid "Setting name:"
-msgstr "Nazwa usługi:"
+msgstr "Nazwa ustawienia:"
 
 msgid "No widget."
Index: locales/pl/public.po
===================================================================
--- locales/pl/public.po	(revision 221)
+++ locales/pl/public.po	(revision 516)
@@ -9,6 +9,6 @@
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2008-10-13 05:22+0200\n"
-"PO-Revision-Date: 2007-08-31 14:50+0200\n"
-"Last-Translator: Nnidŷu <nnidyu@asylumeternity.net>\n"
+"PO-Revision-Date: 2011-06-26 14:11+0100\n"
+"Last-Translator: \n"
 "Language-Team: Polish\n"
 "Language: \n"
@@ -85,11 +85,11 @@
 
 msgid "Your search for <em>%1$s</em> returned no result."
-msgstr ""
+msgstr "Przy wyszukiwaniu frazy <em>%1$s</em> nie znaleziono nic."
 
 msgid "Your search for <em>%1$s</em> returned <strong>%2$s</strong> result."
-msgstr ""
+msgstr "Przy wyszukiwaniu frazy <em>%1$s</em> znaleziono <strong>%2$s</strong> wynik."
 
 msgid "Your search for <em>%1$s</em> returned <strong>%2$s</strong> results."
-msgstr ""
+msgstr "Przy wyszukiwaniu frazy <em>%1$s</em> znaleziono <strong>%2$s</strong> wyników."
 
 msgid "Home"
@@ -108,7 +108,6 @@
 msgstr "Kategorie"
 
-#, fuzzy
 msgid "Subcategories"
-msgstr "Kategorie"
+msgstr "Podkategorie"
 
 msgid "Archives"
@@ -127,22 +126,18 @@
 msgstr "Kanał RSS komentarzy"
 
-#, fuzzy
 msgid "This blog's comments Atom feed"
-msgstr "Kanał RSS dla komentarzy na tym blogu"
-
-#, fuzzy
+msgstr "Kanał Atom z komentarzami na tym blogu"
+
 msgid "This category's entries Atom feed"
-msgstr "Kanał RSS dla wpisów w tej kategorii"
-
-#, fuzzy
+msgstr "Kanał Atom z wpisami w tej kategorii"
+
 msgid "This category's comments Atom feed"
-msgstr "Kanał RSS dla komentarzy w tej kategorii"
+msgstr "Kanał Atom z komentarzami w tej kategorii"
 
 msgid "This post's comments feed"
 msgstr "Kanał RSS dla komentarzy do tego wpisu"
 
-#, fuzzy
 msgid "This post's comments Atom feed"
-msgstr "Kanał RSS dla komentarzy do tego wpisu"
+msgstr "Kanał Atom z komentarzami do tego wpisu"
 
 msgid "Attachments"
@@ -162,5 +157,5 @@
 
 msgid "Your comment has been submitted and will be reviewed for publication."
-msgstr "Twój komentarz został wysłany i będzie poddany moderacji."
+msgstr "Twój komentarz został wysłany i zostanie poddany moderacji."
 
 msgid "Add a comment"
@@ -183,8 +178,8 @@
 
 msgid "Comments can be formatted using a simple wiki syntax."
-msgstr ""
+msgstr "Komentarze mogą być formatowane przy użyciu prostej składni wiki."
 
 msgid "HTML code is displayed as text and web addresses are automatically converted."
-msgstr "Kod HTML jest wyświetlany jako tekst a adresy stron są automatycznie konwertowane."
+msgstr "Kod HTML jest wyświetlany jako tekst a adresy stron są konwertowane automatycznie."
 
 msgid "Remember me on this blog"
@@ -218,7 +213,6 @@
 msgstr "Dokument, którego szukasz nie istnieje"
 
-#, fuzzy
 msgid "Powered by %s"
-msgstr "Napędzane przez"
+msgstr "Napędzane przez %s"
 
 msgid "Subscribe to"
Index: locales/pt-br/main.po
===================================================================
--- locales/pt-br/main.po	(revision 261)
+++ locales/pt-br/main.po	(revision 558)
@@ -398,5 +398,5 @@
 msgstr "Nenhum usuário"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "mudar as permissões"
 
@@ -782,5 +782,5 @@
 msgstr "como indesejável"
 
-msgid "delete"
+msgid "Delete"
 msgstr "suprimir"
 
@@ -1020,5 +1020,5 @@
 msgstr "Nome de usuário incorrecto ou senha incorrecta"
 
-msgid "save"
+msgid "Save"
 msgstr "salvar"
 
@@ -1226,8 +1226,8 @@
 msgstr "Tem certeza de que você deseja suprimir %s ?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "cancelar"
 
-msgid "yes"
+msgid "Yes"
 msgstr "sim"
 
@@ -1498,5 +1498,5 @@
 msgstr "Escolha um ou vários blogs pelos quais os usuários seguintes vão ter permissões: %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "definir as permissões"
 
Index: locales/pt-br/plugins.po
===================================================================
--- locales/pt-br/plugins.po	(revision 261)
+++ locales/pt-br/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/pt/main.po
===================================================================
--- locales/pt/main.po	(revision 261)
+++ locales/pt/main.po	(revision 558)
@@ -391,5 +391,5 @@
 msgstr "Sem utilizadores"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "alterar as permissões"
 
@@ -760,5 +760,5 @@
 msgstr "marcar como lixo"
 
-msgid "delete"
+msgid "Delete"
 msgstr "apagar"
 
@@ -992,5 +992,5 @@
 msgstr "Utilizador ou password"
 
-msgid "save"
+msgid "Save"
 msgstr "gravar"
 
@@ -1176,8 +1176,8 @@
 msgstr "Tem a certeza que quer remover %s?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "cancelar"
 
-msgid "yes"
+msgid "Yes"
 msgstr "sim"
 
@@ -1437,5 +1437,5 @@
 msgstr "Escolha um ou mais blogs para o qual se pretende atribuir permissões para os utilizadores %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "definir permissões"
 
Index: locales/pt/plugins.po
===================================================================
--- locales/pt/plugins.po	(revision 261)
+++ locales/pt/plugins.po	(revision 558)
@@ -1382,8 +1382,8 @@
 msgstr "Extra da barra lateral"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "actualizar as barras laterais"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "reiniciar as barras laterais"
 
Index: locales/ro/main.po
===================================================================
--- locales/ro/main.po	(revision 261)
+++ locales/ro/main.po	(revision 558)
@@ -384,5 +384,5 @@
 msgstr ""
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr ""
 
@@ -745,5 +745,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -968,5 +968,5 @@
 msgstr ""
 
-msgid "save"
+msgid "Save"
 msgstr ""
 
@@ -1151,8 +1151,8 @@
 msgstr ""
 
-msgid "cancel"
-msgstr ""
-
-msgid "yes"
+msgid "Cancel"
+msgstr ""
+
+msgid "Yes"
 msgstr ""
 
@@ -1411,5 +1411,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/ro/plugins.po
===================================================================
--- locales/ro/plugins.po	(revision 261)
+++ locales/ro/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/ru/main.po
===================================================================
--- locales/ru/main.po	(revision 261)
+++ locales/ru/main.po	(revision 558)
@@ -390,5 +390,5 @@
 msgstr "Нет пользователей"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "изменить права доступа"
 
@@ -759,5 +759,5 @@
 msgstr "отметить как нежелательный"
 
-msgid "delete"
+msgid "Delete"
 msgstr "удалить"
 
@@ -989,5 +989,5 @@
 msgstr "Имя пользователя и пароль"
 
-msgid "save"
+msgid "Save"
 msgstr "сохранить"
 
@@ -1172,8 +1172,8 @@
 msgstr "Вы уверены, что хотите удалить %s ?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "отмена"
 
-msgid "yes"
+msgid "Yes"
 msgstr "да"
 
@@ -1432,5 +1432,5 @@
 msgstr "Выберите один или более блогов, для которых вы хотите изменить права доступа для пользователей %s."
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "установить права доступа"
 
Index: locales/ru/plugins.po
===================================================================
--- locales/ru/plugins.po	(revision 261)
+++ locales/ru/plugins.po	(revision 558)
@@ -1371,8 +1371,8 @@
 msgstr "Экстра сайдбар"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "Обновить сайдбары"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "Переустановить сайдбары"
 
Index: locales/sr/main.po
===================================================================
--- locales/sr/main.po	(revision 261)
+++ locales/sr/main.po	(revision 559)
@@ -390,5 +390,5 @@
 msgstr "Nijedan korisnik"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "promenite prava"
 
@@ -462,6 +462,6 @@
 msgstr "Vous utilisez actuellement \"%s\""
 
-msgid "use selected theme"
-msgstr "utiliser le thème sélectionné"
+msgid "Use selected theme"
+msgstr "Utiliser le thème sélectionné"
 
 msgid "delete selected theme"
@@ -771,5 +771,5 @@
 msgstr "indésirable"
 
-msgid "delete"
+msgid "Delete"
 msgstr "supprimer"
 
@@ -1004,5 +1004,5 @@
 msgstr "Korisnik ili lozinka je pogrešna"
 
-msgid "save"
+msgid "Save"
 msgstr "Sadržati"
 
Index: locales/sr/plugins.po
===================================================================
--- locales/sr/plugins.po	(revision 261)
+++ locales/sr/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/sv/main.po
===================================================================
--- locales/sv/main.po	(revision 261)
+++ locales/sv/main.po	(revision 558)
@@ -384,5 +384,5 @@
 msgstr ""
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr ""
 
@@ -745,5 +745,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr ""
 
@@ -968,5 +968,5 @@
 msgstr ""
 
-msgid "save"
+msgid "Save"
 msgstr ""
 
@@ -1151,8 +1151,8 @@
 msgstr ""
 
-msgid "cancel"
-msgstr ""
-
-msgid "yes"
+msgid "Cancel"
+msgstr ""
+
+msgid "Yes"
 msgstr ""
 
@@ -1411,5 +1411,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr ""
 
Index: locales/sv/plugins.po
===================================================================
--- locales/sv/plugins.po	(revision 261)
+++ locales/sv/plugins.po	(revision 558)
@@ -1364,8 +1364,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/te/main.po
===================================================================
--- locales/te/main.po	(revision 261)
+++ locales/te/main.po	(revision 558)
@@ -388,5 +388,5 @@
 msgstr "వాడుకరులు లేరు"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "అనుమతులని మార్చండి"
 
@@ -767,5 +767,5 @@
 msgstr ""
 
-msgid "delete"
+msgid "Delete"
 msgstr "తొలగించు"
 
@@ -1002,5 +1002,5 @@
 msgstr "తప్పుడు వాడుకరిపేరు లేదా సంకేతపదం"
 
-msgid "save"
+msgid "Save"
 msgstr "భద్రపరచు"
 
@@ -1186,8 +1186,8 @@
 msgstr "%sని మీరు నిజంగానే తొలగించాలనుకుంటున్నారా?"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "రద్దుచేయి"
 
-msgid "yes"
+msgid "Yes"
 msgstr "అవును"
 
@@ -1448,5 +1448,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "అనుమతులు ఇవ్వండి"
 
Index: locales/te/plugins.po
===================================================================
--- locales/te/plugins.po	(revision 261)
+++ locales/te/plugins.po	(revision 558)
@@ -1374,8 +1374,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/tr/main.po
===================================================================
--- locales/tr/main.po	(revision 261)
+++ locales/tr/main.po	(revision 558)
@@ -390,5 +390,5 @@
 msgstr "Kullanıcı yok"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "izinleri değiştir"
 
@@ -753,5 +753,5 @@
 msgstr "spam işaretle"
 
-msgid "delete"
+msgid "Delete"
 msgstr "sil"
 
@@ -983,5 +983,5 @@
 msgstr "Kullanıcı adı ve parola"
 
-msgid "save"
+msgid "Save"
 msgstr "kaydet"
 
@@ -1167,8 +1167,8 @@
 msgstr ""
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "iptal"
 
-msgid "yes"
+msgid "Yes"
 msgstr "evet"
 
@@ -1427,5 +1427,5 @@
 msgstr ""
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "izinleri ayarla"
 
Index: locales/tr/plugins.po
===================================================================
--- locales/tr/plugins.po	(revision 261)
+++ locales/tr/plugins.po	(revision 558)
@@ -1370,8 +1370,8 @@
 msgstr ""
 
-msgid "update sidebars"
-msgstr ""
-
-msgid "reset sidebars"
+msgid "Update sidebars"
+msgstr ""
+
+msgid "Reset sidebars"
 msgstr ""
 
Index: locales/zh-cn/main.po
===================================================================
--- locales/zh-cn/main.po	(revision 261)
+++ locales/zh-cn/main.po	(revision 558)
@@ -388,5 +388,5 @@
 msgstr "没有用户"
 
-msgid "change permissions"
+msgid "Change permissions"
 msgstr "改变权限"
 
@@ -757,5 +757,5 @@
 msgstr "标记为垃圾评论"
 
-msgid "delete"
+msgid "Delete"
 msgstr "删除"
 
@@ -989,5 +989,5 @@
 msgstr "用户名和密码"
 
-msgid "save"
+msgid "Save"
 msgstr "保存"
 
@@ -1173,8 +1173,8 @@
 msgstr "您确定要移除 %s 吗？"
 
-msgid "cancel"
+msgid "Cancel"
 msgstr "取消"
 
-msgid "yes"
+msgid "Yes"
 msgstr "是"
 
@@ -1434,5 +1434,5 @@
 msgstr "选择一个或者多个您想要赋予用户 %s 权限的博客。"
 
-msgid "set permissions"
+msgid "Set permissions"
 msgstr "设置权限"
 
Index: locales/zh-cn/plugins.po
===================================================================
--- locales/zh-cn/plugins.po	(revision 261)
+++ locales/zh-cn/plugins.po	(revision 558)
@@ -1380,8 +1380,8 @@
 msgstr "额外的侧边栏"
 
-msgid "update sidebars"
+msgid "Update sidebars"
 msgstr "更新侧边栏"
 
-msgid "reset sidebars"
+msgid "Reset sidebars"
 msgstr "重置侧边栏"
 
Index: plugins/aboutConfig/_define.php
===================================================================
--- plugins/aboutConfig/_define.php	(revision 270)
+++ plugins/aboutConfig/_define.php	(revision 589)
@@ -16,6 +16,5 @@
 	/* Description*/		"Manage every blog configuration directive",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'0.3',
-	/* Permissions */		null
+	/* Version */			'0.4'
 );
 ?>
Index: plugins/aboutConfig/index.php
===================================================================
--- plugins/aboutConfig/index.php	(revision 270)
+++ plugins/aboutConfig/index.php	(revision 589)
@@ -12,4 +12,14 @@
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
 
+# Local navigation
+if (!empty($_POST['gs_nav'])) {
+	http::redirect($p_url.$_POST['gs_nav']);
+	exit;
+}
+if (!empty($_POST['ls_nav'])) {
+	http::redirect($p_url.$_POST['ls_nav']);
+	exit;
+}
+
 # Local settings update
 if (!empty($_POST['s']) && is_array($_POST['s']))
@@ -76,5 +86,5 @@
 	return
 	'<tr>'.
-	'<td><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
+	'<td scope="raw"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
 	'<td>'.$field.'</td>'.
 	'<td>'.$s['type'].'</td>'.
@@ -88,6 +98,22 @@
   <?php echo dcPage::jsPageTabs($part); ?>
   <style type="text/css">
-  .ns-name { background: #dfdfdf; color: #333; padding-top: 0.3em; padding-bottom: 0.3em; font-size: 1.1em; }
+  table.settings { border: 1px solid #999; margin-bottom: 2em; }
+  table.settings th { background: #f5f5f5; color: #444; padding-top: 0.3em; padding-bottom: 0.3em; }
+  p.anchor-nav {float: right; }
   </style>
+	<script type="text/javascript">
+	//<![CDATA[
+	$(function() {
+		$("#gs_submit").hide();
+		$("#ls_submit").hide();
+		$("#gs_nav").change(function() {
+			window.location = $("#gs_nav option:selected").val();
+		})
+		$("#ls_nav").change(function() {
+			window.location = $("#ls_nav option:selected").val();
+		})
+	});
+	//]]>
+	</script>
 </head>
 
@@ -102,18 +128,22 @@
 }
 ?>
-<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; about:config</h2>
+<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; <span class="page-title">about:config</span></h2>
 
 <div id="local" class="multi-part" title="<?php echo __('blog settings'); ?>">
-<form action="plugin.php" method="post">
-<table>
-<tr>
-  <th class="nowrap">Setting ID</th>
-  <th><?php echo __('Value'); ?></th>
-  <th><?php echo __('Type'); ?></th>
-  <th class="maximal"><?php echo __('Description'); ?></th>
-</tr>
-<?php
+
+<?php 
+$table_header = '<table class="settings" id="%s"><caption>%s</caption>'.
+'<thead>'.
+'<tr>'."\n".
+'  <th class="nowrap">Setting ID</th>'."\n".
+'  <th>'.__('Value').'</th>'."\n".
+'  <th>'.__('Type').'</th>'."\n".
+'  <th class="maximalx">'.__('Description').'</th>'."\n".
+'</tr>'."\n".
+'</thead>'."\n".
+'<tbody>';
+$table_footer = '</tbody></table>';
+
 $settings = array();
-
 foreach ($core->blog->settings->dumpNamespaces() as $ns => $namespace) {
 	foreach ($namespace->dumpSettings() as $k => $v) {
@@ -121,19 +151,35 @@
 	}
 }
-
 ksort($settings);
-
+if (count($settings) > 0) {
+	$ns_combo = array();
+	foreach ($settings as $ns => $s) {
+		$ns_combo[$ns] = '#l_'.$ns;
+	}
+	echo 
+		'<form action="plugin.php" method="post">'.
+		'<p class="anchor-nav">'.
+		'<label for="ls_nav" class="classic">'.__('Goto:').'</label> '.form::combo('ls_nav',$ns_combo).
+		' <input type="submit" value="'.__('Ok').'" id="ls_submit" />'.
+		'<input type="hidden" name="p" value="aboutConfig" />'.
+		$core->formNonce().'</p></form>';
+}
+?>
+
+<form action="plugin.php" method="post">
+
+<?php
 foreach ($settings as $ns => $s)
 {
 	ksort($s);
-	echo '<tr><td colspan="4" class="ns-name">namespace: <strong>'.$ns.'</strong></td></tr>';
-	
+	echo sprintf($table_header,'l_'.$ns,$ns);
 	foreach ($s as $k => $v)
 	{
 		echo settingLine($k,$v,$ns,'s',!$v['global']);
 	}
-}
-?>
-</table>
+	echo $table_footer;
+}
+?>
+
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="aboutConfig" />
@@ -143,12 +189,5 @@
 
 <div id="global" class="multi-part" title="<?php echo __('global settings'); ?>">
-<form action="plugin.php" method="post">
-<table>
-<tr>
-  <th class="nowrap">Setting ID</th>
-  <th><?php echo __('Value'); ?></th>
-  <th><?php echo __('Type'); ?></th>
-  <th class="maximal"><?php echo __('Description'); ?></th>
-</tr>
+
 <?php
 $settings = array();
@@ -162,16 +201,34 @@
 ksort($settings);
 
+if (count($settings) > 0) {
+	$ns_combo = array();
+	foreach ($settings as $ns => $s) {
+		$ns_combo[$ns] = '#g_'.$ns;
+	}
+	echo 
+		'<form action="plugin.php" method="post">'.
+		'<p class="anchor-nav">'.
+		'<label for="gs_nav" class="classic">'.__('Goto:').'</label> '.form::combo('gs_nav',$ns_combo).
+		' <input type="submit" value="'.__('Ok').'" id="gs_submit" />'.
+		'<input type="hidden" name="p" value="aboutConfig" />'.
+		$core->formNonce().'</p></form>';
+}
+?>
+
+<form action="plugin.php" method="post">
+
+<?php
 foreach ($settings as $ns => $s)
 {
 	ksort($s);
-	echo '<tr><td colspan="4" class="ns-name">namespace: <strong>'.$ns.'</strong></td></tr>';
-	
+	echo sprintf($table_header,'g_'.$ns,$ns);
 	foreach ($s as $k => $v)
 	{
 		echo settingLine($k,$v,$ns,'gs',false);
 	}
-}
-?>
-</table>
+	echo $table_footer;
+}
+?>
+
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="aboutConfig" />
Index: plugins/akismet/_define.php
===================================================================
--- plugins/akismet/_define.php	(revision 270)
+++ plugins/akismet/_define.php	(revision 464)
@@ -17,6 +17,8 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	/* Permissions */		'usage,contentadmin',
-	/* Priority */			200
+	array(
+		'permissions' =>	'usage,contentadmin',
+		'priority' =>		200
+	)
 );
 ?>
Index: plugins/akismet/class.dc.filter.akismet.php
===================================================================
--- plugins/akismet/class.dc.filter.akismet.php	(revision 270)
+++ plugins/akismet/class.dc.filter.akismet.php	(revision 536)
@@ -136,5 +136,5 @@
 		
 		$res =
-		'<form action="'.html::escapeURL($url).'" method="post">'.
+		'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
 		'<p><label for="ak_key" class="classic">'.__('Akismet API key:').' '.
 		form::field('ak_key',12,128,$ak_key).'</label>';
Index: plugins/antispam/_admin.php
===================================================================
--- plugins/antispam/_admin.php	(revision 270)
+++ plugins/antispam/_admin.php	(revision 324)
@@ -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/antispam/_define.php
===================================================================
--- plugins/antispam/_define.php	(revision 270)
+++ plugins/antispam/_define.php	(revision 464)
@@ -17,6 +17,8 @@
 	/* Author */			"Alain Vagner",
 	/* Version */			'1.3.1',
-	/* Permissions */		'usage,contentadmin',
-	/* Priority */			10
+	array(
+		'permissions' =>	'usage,contentadmin',
+		'priority' =>		10
+	)
 );
 ?>
Index: plugins/antispam/filters/class.dc.filter.ip.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.ip.php	(revision 270)
+++ plugins/antispam/filters/class.dc.filter.ip.php	(revision 536)
@@ -123,8 +123,7 @@
 		'<div class="multi-part" id="tab_'.$type.'" title="'.$title.'">'.
 
-		'<form action="'.html::escapeURL($url).'" method="post">'.
-		'<fieldset><legend>'.__('Add an IP address').'</legend><p>'.
+		'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
 		form::hidden(array('ip_type'),$type).
-		'<label class="classic" for="addip_'.$type.'">'.__('Add an IP address').' '.
+		'<label class="classic" for="addip_'.$type.'">'.__('Add an IP address: ').' '.
 		form::field(array('addip', 'addip_'.$type),18,255).
 		'</label>';
@@ -136,6 +135,7 @@
 		$res .=
 		$core->formNonce().
-		'<input type="submit" value="'.__('Add').'"/></p>'.
-		'</fieldset></form>';
+		'</p>'.
+		'<p><input type="submit" value="'.__('Add').'"/></p>'.
+		'</form>';
 
 		$rs = $this->getRules($type);
@@ -149,5 +149,5 @@
 			$res .=
 			'<form action="'.html::escapeURL($url).'" method="post">'.
-			'<fieldset><legend>' . __('IP list') . '</legend>'.
+			'<h3>' . __('IP list') . '</h3>'.
 			'<div style="'.$this->style_list.'">';
 
@@ -178,5 +178,5 @@
 			form::hidden(array('ip_type'),$type).
 			'</p>'.
-			'</fieldset></form>';
+			'</form>';
 		}
 
Index: plugins/antispam/filters/class.dc.filter.iplookup.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 270)
+++ plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 536)
@@ -86,5 +86,6 @@
 		'<p><label for="bls">'.__('Add here a coma separated list of servers.').
 		form::textarea('bls',40,3,html::escapeHTML($bls),'maximal').
-		'<input type="submit" value="'.__('Save').'" /></label></p>'.
+		'</p>'.
+		'<p><input type="submit" value="'.__('Save').'" /></label></p>'.
 		$this->core->formNonce().'</p>'.
 		'</fieldset>'.
Index: plugins/antispam/filters/class.dc.filter.words.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.words.php	(revision 270)
+++ plugins/antispam/filters/class.dc.filter.words.php	(revision 536)
@@ -119,7 +119,6 @@
 
 		$res .=
-		'<form action="'.html::escapeURL($url).'" method="post">'.
-		'<fieldset><legend>'.__('Add a word').'</legend>'.
-		'<p><label class="classic" for="swa">'.__('Add a word').' '.form::field('swa',20,128).'</label>';
+		'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
+		'<p><label class="classic" for="swa">'.__('Add a word ').' '.form::field('swa',20,128).'</label>';
 
 		if ($core->auth->isSuperAdmin()) {
@@ -130,6 +129,6 @@
 		$res .=
 		$core->formNonce().
-		'<input type="submit" value="'.__('Add').'"/></p>'.
-		'</fieldset>'.
+		'</p>'.
+		'<p><input type="submit" value="'.__('Add').'"/></p>'.
 		'</form>';
 
@@ -142,6 +141,6 @@
 		{
 			$res .=
-			'<form action="'.html::escapeURL($url).'" method="post">'.
-			'<fieldset><legend>' . __('List') . '</legend>'.
+			'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
+			'<h3>' . __('List of bad words') . '</h3>'.
 			'<div style="'.$this->style_list.'">';
 
@@ -167,5 +166,5 @@
 			$core->formNonce().
 			'<input class="submit delete" type="submit" value="' . __('Delete selected words') . '"/></p>'.
-			'</fieldset></form>';
+			'</form>';
 		}
 
Index: plugins/antispam/inc/lib.dc.antispam.php
===================================================================
--- plugins/antispam/inc/lib.dc.antispam.php	(revision 270)
+++ plugins/antispam/inc/lib.dc.antispam.php	(revision 472)
@@ -75,5 +75,5 @@
 		if (($count = self::countSpam($core)) > 0) {
 			$str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
-			$icons['comments'][0] .= '</a> <br /><a href="comments.php?status=-2">'.sprintf($str,$count);
+			$icons['comments'][0] .= '</a> <br /><a href="comments.php?status=-2"><span>'.sprintf($str,$count).'</span>';
 		}
 	}
@@ -83,5 +83,5 @@
 		if (($count = self::countSpam($core)) > 0) {
 			$str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
-			return '</a> <br /><a href="comments.php?status=-2">'.sprintf($str,$count);
+			return '</a> <br /><a href="comments.php?status=-2"><span>'.sprintf($str,$count).'</span>';
 		} else {
 			return '';
Index: plugins/antispam/index.php
===================================================================
--- plugins/antispam/index.php	(revision 270)
+++ plugins/antispam/index.php	(revision 565)
@@ -110,10 +110,9 @@
 <body>
 <?php
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.$page_name.'</h2>';
 
 if ($filter_gui !== false)
 {
-	echo '<p><a href="'.$p_url.'">'.__('Return to filters').'</a></p>';
-	printf('<h3>'.__('%s configuration').'</h3>',$filter->name);
+	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <a href="'.$p_url.'">'.$page_name.'</a>'.
+		' &rsaquo; <span class="page-title">'.sprintf(__('%s configuration'),$filter->name).'</span></h2>';
 
 	echo $filter_gui;
@@ -121,4 +120,6 @@
 else
 {
+	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.$page_name.'</span></h2>';
+
 	# Information
 	$spam_count = dcAntispam::countSpam($core);
@@ -127,6 +128,6 @@
 
 	echo
-	'<form action="'.$p_url.'" method="post">'.
-	'<fieldset><legend>'.__('Information').'</legend>';
+	'<form action="'.$p_url.'" method="post" class="fieldset">'.
+	'<h3>'.__('Information').'</h3>';
 
 	if (!empty($_GET['del'])) {
@@ -150,13 +151,14 @@
 	}
 	if ($moderationTTL != null && $moderationTTL >=0) {
-		echo '<p>'.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $moderationTTL).'</p>';
-	}
-	echo '</fieldset></form>';
+		echo '<p>'.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $moderationTTL).' '.
+		__('You can modify this duration in ').
+		'<a href="blog_pref.php"> '.__('Blog preferences').'</a></p>';
+	}
+	echo '</form>';
 
 
 	# Filters
 	echo
-	'<form action="'.$p_url.'" method="post">'.
-	'<fieldset><legend>'.__('Available spam filters').'</legend>';
+	'<form action="'.$p_url.'" method="post" class="fieldset">';
 
 	if (!empty($_GET['upd'])) {
@@ -166,4 +168,5 @@
 	echo
 	'<table class="dragable">'.
+	'<caption>'.__('Available spam filters').'</caption>'.
 	'<thead><tr>'.
 	'<th>'.__('Order').'</th>'.
@@ -191,5 +194,5 @@
 		'<td class="nowrap">'.form::checkbox(array('filters_active[]'),$fid,$f->active, '', '', false, 'title="'.__('Active').'"').'</td>'.
 		'<td class="nowrap">'.form::checkbox(array('filters_auto_del[]'),$fid,$f->auto_delete, '', '', false, 'title="'.__('Auto Del.').'"').'</td>'.
-		'<td class="nowrap">'.$f->name.'</td>'.
+		'<td class="nowrap" scope="raw">'.$f->name.'</td>'.
 		'<td class="maximal">'.$f->description.'</td>'.
 		'<td class="status">'.$gui_link.'</td>'.
@@ -202,5 +205,5 @@
 	$core->formNonce().
 	'<input type="submit" name="filters_upd" value="'.__('Save').'" /></p>'.
-	'</fieldset></form>';
+	'</form>';
 
 
@@ -212,10 +215,9 @@
 
 		echo
-		'<fieldset><legend>'.__('Syndication').'</legend>'.
+		'<h3>'.__('Syndication').'</h3>'.
 		'<ul class="spaminfo">'.
 		'<li class="feed"><a href="'.$spam_feed.'">'.__('Junk comments RSS feed').'</a></li>'.
 		'<li class="feed"><a href="'.$ham_feed.'">'.__('Published comments RSS feed').'</a></li>'.
-		'</ul>'.
-		'</fieldset>';
+		'</ul>';
 	}
 }
@@ -224,3 +226,2 @@
 </body>
 </html>
-
Index: plugins/attachments/_admin.php
===================================================================
--- plugins/attachments/_admin.php	(revision 416)
+++ plugins/attachments/_admin.php	(revision 416)
@@ -0,0 +1,75 @@
+<?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; }
+
+$core->addBehavior ('adminPostFormSidebar',array('attachmentAdmin','adminPostFormSidebar'));
+$core->addBehavior ('adminPostAfterForm',array('attachmentAdmin','adminPostAfterForm'));
+
+class attachmentAdmin
+{
+	public static function adminPostFormSidebar($post) 
+	{
+		if ($post !== null)
+		{
+			$core =& $GLOBALS['core'];
+			$post_media = $core->media->getPostMedia($post->post_id);
+			echo
+			'<h3 class="clear">'.__('Attachments').'</h3>';
+			foreach ($post_media as $f)
+			{
+				$ftitle = $f->media_title;
+				if (strlen($ftitle) > 18) {
+					$ftitle = substr($ftitle,0,16).'...';
+				}
+				echo
+				'<div class="media-item">'.
+				'<a class="media-icon" href="media_item.php?id='.$f->media_id.'">'.
+				'<img src="'.$f->media_icon.'" alt="" title="'.$f->basename.'" /></a>'.
+				'<ul>'.
+				'<li><a class="media-link" href="media_item.php?id='.$f->media_id.'"'.
+				'title="'.$f->basename.'">'.$ftitle.'</a></li>'.
+				'<li>'.$f->media_dtstr.'</li>'.
+				'<li>'.files::size($f->size).' - '.
+				'<a href="'.$f->file_url.'">'.__('open').'</a>'.'</li>'.
+				
+				'<li class="media-action"><a class="attachment-remove" id="attachment-'.$f->media_id.'" '.
+				'href="post_media.php?post_id='.$post->post_id.'&amp;media_id='.$f->media_id.'&amp;remove=1">'.
+				'<img src="images/check-off.png" alt="'.__('remove').'" /></a>'.
+				'</li>'.
+				
+				'</ul>'.
+				'</div>';
+			}
+			unset($f);
+			
+			if (empty($post_media)) {
+				echo '<p>'.__('No attachment.').'</p>';
+			} else {
+			}
+			echo '<p><a class="button" href="media.php?post_id='.$post->post_id.'">'.__('Add files to this entry').'</a></p>';
+		}
+	}
+	
+	public static function adminPostAfterForm($post) {
+		if ($post !== null)
+		{
+			$core =& $GLOBALS['core'];
+			echo
+				'<form action="post_media.php" id="attachment-remove-hide" method="post">'.
+				'<div>'.form::hidden(array('post_id'),$post->post_id).
+				form::hidden(array('media_id'),'').
+				form::hidden(array('remove'),1).
+				$core->formNonce().'</div></form>';
+		}
+	}
+}
+?>
Index: plugins/attachments/_define.php
===================================================================
--- plugins/attachments/_define.php	(revision 464)
+++ plugins/attachments/_define.php	(revision 464)
@@ -0,0 +1,24 @@
+<?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; }
+
+$this->registerModule(
+	/* Name */		"attachments",
+	/* Description*/	"Manage post attachments",
+	/* Author */		"Dotclear Team",
+	/* Version */		'1.0',
+	array(
+		'permissions' =>	'contentadmin,pages',
+		'priority' =>		999
+	)
+);
+?>
Index: plugins/attachments/_public.php
===================================================================
--- plugins/attachments/_public.php	(revision 464)
+++ plugins/attachments/_public.php	(revision 464)
@@ -0,0 +1,248 @@
+<?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; }
+
+# Attachments
+$core->tpl->addBlock('Attachments',array('attachmentTpl','Attachments'));
+$core->tpl->addBlock('AttachmentsHeader',array('attachmentTpl','AttachmentsHeader'));
+$core->tpl->addBlock('AttachmentsFooter',array('attachmentTpl','AttachmentsFooter'));
+$core->tpl->addValue('AttachmentMimeType',array('attachmentTpl','AttachmentMimeType'));
+$core->tpl->addValue('AttachmentType',array('attachmentTpl','AttachmentType'));
+$core->tpl->addValue('AttachmentFileName',array('attachmentTpl','AttachmentFileName'));
+$core->tpl->addValue('AttachmentSize',array('attachmentTpl','AttachmentSize'));
+$core->tpl->addValue('AttachmentTitle',array('attachmentTpl','AttachmentTitle'));
+$core->tpl->addValue('AttachmentThumbnailURL',array('attachmentTpl','AttachmentThumbnailURL'));
+$core->tpl->addValue('AttachmentURL',array('attachmentTpl','AttachmentURL'));
+$core->tpl->addValue('MediaURL',array('attachmentTpl','MediaURL'));
+$core->tpl->addBlock('AttachmentIf',array('attachmentTpl','AttachmentIf'));
+
+$core->tpl->addValue('EntryAttachmentCount',array('attachmentTpl','EntryAttachmentCount'));
+
+$core->addBehavior('tplIfConditions',array('attachmentBehavior','tplIfConditions'));
+
+class attachmentTpl {
+	
+	/*dtd
+	<!ELEMENT tpl:Attachments - - -- Post Attachments loop -->
+	*/
+	public static function Attachments($attr,$content)
+	{
+		$res =
+		"<?php\n".
+		'if ($_ctx->posts !== null && $core->media) {'."\n".
+			'$_ctx->attachments = new ArrayObject($core->media->getPostMedia($_ctx->posts->post_id));'."\n".
+		"?>\n".
+		
+		'<?php foreach ($_ctx->attachments as $attach_i => $attach_f) : '.
+		'$GLOBALS[\'attach_i\'] = $attach_i; $GLOBALS[\'attach_f\'] = $attach_f;'.
+		'$_ctx->file_url = $attach_f->file_url; ?>'.
+		$content.
+		'<?php endforeach; $_ctx->attachments = null; unset($attach_i,$attach_f,$_ctx->file_url); ?>'.
+		
+		"<?php } ?>\n";
+		
+		return $res;
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentsHeader - - -- First attachments result container -->
+	*/
+	public static function AttachmentsHeader($attr,$content)
+	{
+		return
+		"<?php if (\$attach_i == 0) : ?>".
+		$content.
+		"<?php endif; ?>";
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentsFooter - - -- Last attachments result container -->
+	*/
+	public static function AttachmentsFooter($attr,$content)
+	{
+		return
+		"<?php if (\$attach_i+1 == count(\$_ctx->attachments)) : ?>".
+		$content.
+		"<?php endif; ?>";
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentsIf - - -- Test on attachment fields -->
+	<!ATTLIST tpl:AttachmentIf
+	is_image	(0|1)	#IMPLIED	-- test if attachment is an image (value : 1) or not (value : 0)
+	has_thumb	(0|1)	#IMPLIED	-- test if attachment has a square thumnail (value : 1) or not (value : 0)
+	is_mp3	(0|1)	#IMPLIED	-- test if attachment is a mp3 file (value : 1) or not (value : 0)
+	is_flv	(0|1)	#IMPLIED	-- test if attachment is a flv file (value : 1) or not (value : 0)
+	>
+	*/
+	public static function AttachmentIf($attr,$content)
+	{
+		$if = array();
+		
+		$operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
+		
+		if (isset($attr['is_image'])) {
+			$sign = (boolean) $attr['is_image'] ? '' : '!';
+			$if[] = $sign.'$attach_f->media_image';
+		}
+		
+		if (isset($attr['has_thumb'])) {
+			$sign = (boolean) $attr['has_thumb'] ? '' : '!';
+			$if[] = $sign.'isset($attach_f->media_thumb[\'sq\'])';
+		}
+		
+		if (isset($attr['is_mp3'])) {
+			$sign = (boolean) $attr['is_mp3'] ? '==' : '!=';
+			$if[] = '$attach_f->type '.$sign.' "audio/mpeg3"';
+		}
+		
+		if (isset($attr['is_flv'])) {
+			$sign = (boolean) $attr['is_flv'] ? '' : '!';
+			$if[] = $sign.
+				'($attach_f->type == "video/x-flv" || '.
+				'$attach_f->type == "video/mp4" || '.
+				'$attach_f->type == "video/x-m4v")';
+		}
+		
+		if (count($if) != 0) {
+			return '<?php if('.implode(' '.$operator.' ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
+		} else {
+			return $content;
+		}
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentMimeType - O -- Attachment MIME Type -->
+	*/
+	public static function AttachmentMimeType($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return '<?php echo '.sprintf($f,'$attach_f->type').'; ?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentType - O -- Attachment type -->
+	*/
+	public static function AttachmentType($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return '<?php echo '.sprintf($f,'$attach_f->media_type').'; ?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentFileName - O -- Attachment file name -->
+	*/
+	public static function AttachmentFileName($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return '<?php echo '.sprintf($f,'$attach_f->basename').'; ?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentSize - O -- Attachment size -->
+	<!ATTLIST tpl:AttachmentSize
+	full	CDATA	#IMPLIED	-- if set, size is rounded to a human-readable value (in KB, MB, GB, TB)
+	>
+	*/
+	public static function AttachmentSize($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		if (!empty($attr['full'])) {
+			return '<?php echo '.sprintf($f,'$attach_f->size').'; ?>';
+		}
+		return '<?php echo '.sprintf($f,'files::size($attach_f->size)').'; ?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentTitle - O -- Attachment title -->
+	*/
+	public static function AttachmentTitle($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return '<?php echo '.sprintf($f,'$attach_f->media_title').'; ?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentThumbnailURL - O -- Attachment square thumbnail URL -->
+	*/
+	public static function AttachmentThumbnailURL($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return
+		'<?php '.
+		'if (isset($attach_f->media_thumb[\'sq\'])) {'.
+			'echo '.sprintf($f,'$attach_f->media_thumb[\'sq\']').';'.
+		'}'.
+		'?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:AttachmentURL - O -- Attachment URL -->
+	*/
+	public static function AttachmentURL($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return '<?php echo '.sprintf($f,'$attach_f->file_url').'; ?>';
+	}
+	
+	public static function MediaURL($attr)
+	{
+		$f = $GLOBALS['core']->tpl->getFilters($attr);
+		return '<?php echo '.sprintf($f,'$_ctx->file_url').'; ?>';
+	}
+	
+	/*dtd
+	<!ELEMENT tpl:EntryAttachmentCount - O -- Number of attachments for entry -->
+	<!ATTLIST tpl:EntryAttachmentCount
+	none	CDATA	#IMPLIED	-- text to display for "no attachment" (default: no attachment)
+	one	CDATA	#IMPLIED	-- text to display for "one attachment" (default: one attachment)
+	more	CDATA	#IMPLIED	-- text to display for "more attachment" (default: %s attachment, %s is replaced by the number of attachments)
+	>
+	*/
+	public static function EntryAttachmentCount($attr)
+	{
+		$none = 'no attachment';
+		$one = 'one attachment';
+		$more = '%d attachments';
+		
+		if (isset($attr['none'])) {
+			$none = addslashes($attr['none']);
+		}
+		if (isset($attr['one'])) {
+			$one = addslashes($attr['one']);
+		}
+		if (isset($attr['more'])) {
+			$more = addslashes($attr['more']);
+		}
+		
+		return
+		"<?php if (\$_ctx->posts->countMedia() == 0) {\n".
+		"  printf(__('".$none."'),(integer) \$_ctx->posts->countMedia());\n".
+		"} elseif (\$_ctx->posts->countMedia() == 1) {\n".
+		"  printf(__('".$one."'),(integer) \$_ctx->posts->countMedia());\n".
+		"} else {\n".
+		"  printf(__('".$more."'),(integer) \$_ctx->posts->countMedia());\n".
+		"} ?>";
+	}
+}
+
+class attachmentBehavior
+{
+	public static function tplIfConditions($tag,$attr,$content,$if)
+	{
+		if ($tag == "EntryIf" && isset($attr['has_attachment'])) {
+			$sign = (boolean) $attr['has_attachment'] ? '' : '!';
+			$if[] = $sign.'$_ctx->posts->countMedia()';
+		}
+	}
+}
+?>
Index: plugins/blogroll/_admin.php
===================================================================
--- plugins/blogroll/_admin.php	(revision 270)
+++ plugins/blogroll/_admin.php	(revision 324)
@@ -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/blogroll/_define.php
===================================================================
--- plugins/blogroll/_define.php	(revision 270)
+++ plugins/blogroll/_define.php	(revision 464)
@@ -17,5 +17,7 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.2',
-	/* Permissions */		'blogroll'
+	array(
+		'permissions' =>	'blogroll'
+	)
 );
 ?>
Index: plugins/blogroll/index.php
===================================================================
--- plugins/blogroll/index.php	(revision 270)
+++ plugins/blogroll/index.php	(revision 717)
@@ -163,5 +163,5 @@
 <html>
 <head>
-  <title>Blogroll</title>
+  <title><?php echo __('Blogroll'); ?></title>
   <?php echo dcPage::jsToolMan(); ?>
   <?php echo dcPage::jsConfirmClose('links-form','add-link-form','add-category-form'); ?>
@@ -215,5 +215,5 @@
 
 <body>
-<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; Blogroll</h2>
+<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; <span class="page-title"><?php echo __('Blogroll'); ?></span></h2>
 
 <?php
@@ -311,21 +311,21 @@
 '<fieldset class="two-cols"><legend>'.__('Add a new link').'</legend>'.
 '<p class="col"><label for="link_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').' '.
-form::field('link_title',30,255,$link_title,'',2).
+form::field('link_title',30,255,$link_title).
 '</label></p>'.
 
 '<p class="col"><label for="link_href" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('URL:').' '.
-form::field('link_href',30,255,$link_href,'',3).
+form::field('link_href',30,255,$link_href).
 '</label></p>'.
 
 '<p class="col"><label for="link_desc">'.__('Description:').' '.
-form::field('link_desc',30,255,$link_desc,'',4).
+form::field('link_desc',30,255,$link_desc).
 '</label></p>'.
 
 '<p class="col"><label for="link_lang">'.__('Language:').' '.
-form::field('link_lang',5,5,$link_lang,'',5).
+form::field('link_lang',5,5,$link_lang).
 '</label></p>'.
 '<p>'.form::hidden(array('p'),'blogroll').
 $core->formNonce().
-'<input type="submit" name="add_link" value="'.__('Save').'" tabindex="6" /></p>'.
+'<input type="submit" name="add_link" value="'.__('Save').'" /></p>'.
 '</fieldset>'.
 '</form>'.
@@ -337,8 +337,8 @@
 '<fieldset><legend>'.__('Add a new category').'</legend>'.
 '<p><label for="cat_title" class=" classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').' '.
-form::field('cat_title',30,255,$cat_title,'',7).'</label> '.
+form::field('cat_title',30,255,$cat_title).'</label> '.
 form::hidden(array('p'),'blogroll').
 $core->formNonce().
-'<input type="submit" name="add_cat" value="'.__('Save').'" tabindex="8" /></p>'.
+'<input type="submit" name="add_cat" value="'.__('Save').'" /></p>'.
 '</fieldset>'.
 '</form>'.
@@ -355,5 +355,5 @@
 	'<p>'.form::hidden(array('p'),'blogroll').
 	$core->formNonce().
-	'<input type="submit" name="import_links" value="'.__('import').'" tabindex="10" /></p>'.
+	'<input type="submit" name="import_links" value="'.__('Import').'" /></p>'.
 	'</fieldset>'.
 	'</form>';
@@ -398,6 +398,6 @@
 		form::hidden(array('p'),'blogroll').
 		$core->formNonce().
-		'<input type="submit" name="cancel_import" value="'.__('cancel').'" tabindex="10" />&nbsp;'.
-		'<input type="submit" name="import_links_do" value="'.__('import').'" tabindex="11" /></p>'.
+		'<input type="submit" name="cancel_import" value="'.__('Cancel').'" />&nbsp;'.
+		'<input type="submit" name="import_links_do" value="'.__('Import').'" /></p>'.
 		'</div>';
 	}
Index: plugins/blowupConfig/_define.php
===================================================================
--- plugins/blowupConfig/_define.php	(revision 270)
+++ plugins/blowupConfig/_define.php	(revision 464)
@@ -17,5 +17,7 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	/* Permissions */		'admin'
+	array(
+		'permissions' =>	'admin'
+	)
 );
 ?>
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 683)
@@ -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');
 	}
@@ -218,5 +223,5 @@
 echo
 '<h2>'.html::escapeHTML($core->blog->name).
-' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; '.__('Blowup configuration').'</h2>'.
+' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Blowup configuration').'</span></h2>'.
 '<p><a class="back" href="blog_theme.php">'.__('back').'</a></p>';
 
@@ -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 696)
@@ -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',
@@ -53,7 +53,7 @@
 		'roadrunner-1' => 'Road Runner 1',
 		'roadrunner-2' => 'Road Runner 2',
-		'typo' => 'Typo',
+		'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: lugins/dcRevisions/_admin.php
===================================================================
--- plugins/dcRevisions/_admin.php	(revision 721)
+++ 	(revision )
@@ -1,28 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-# 
-# Copyright (c) 2011 Tomtom and contributors
-# http://blog.zenstyle.fr/
-# 
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-if (!defined('DC_CONTEXT_ADMIN')) { return; }
-
-$core->addBehavior('adminPostForm',array('dcRevisionsBehaviors','adminPostForm'));
-$core->addBehavior('adminPostHeaders',array('dcRevisionsBehaviors','adminPostHeaders'));
-$core->addBehavior('adminBeforePostUpdate',array('dcRevisionsBehaviors','adminBeforeUpdate'));
-$core->addBehavior('adminBeforePageUpdate',array('dcRevisionsBehaviors','adminBeforeUpdate'));
-
-$core->rest->addFunction('getPatch',array('dcRevisionsRestMethods','getPatch'));
-
-$core->blog->revisions = new dcRevisions($core);
-
-if (isset($_GET['id']) && isset($_GET['patch']) && preg_match('/post.php\?id=[0-9]+(.*)$/',$_SERVER['REQUEST_URI'])) {
-	$core->blog->revisions->setPatch($_GET['id'],$_GET['patch']);
-}
-
-?>
Index: lugins/dcRevisions/_define.php
===================================================================
--- plugins/dcRevisions/_define.php	(revision 721)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2011 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-$this->registerModule(
-		/* Name */			"dcRevisions",
-		/* Description*/		"Allows entries's versionning",
-		/* Author */			"Tomtom (http://blog.zenstyle.fr)",
-		/* Version */			'0.1',
-		/* Permissions */		'usage,contentadmin'
-);
-
-?>
Index: lugins/dcRevisions/_install.php
===================================================================
--- plugins/dcRevisions/_install.php	(revision 721)
+++ 	(revision )
@@ -1,65 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2011 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-if (!defined('DC_CONTEXT_ADMIN')) { return; }
-
-$m_version = $core->plugins->moduleInfo('dcRevisions','version');
-$i_version = $core->getVersion('dcrevisions');
-
-if (version_compare($i_version,$m_version,'>=')) {
-	return;
-}
-
-$core->blog->settings->addNamespace('dcrevisions');
-$core->blog->settings->dcrevisions->put(
-	'enable',
-	false,
-	'boolean','Enable revisions',false,true
-);
-
-# --INSTALL AND UPDATE PROCEDURES--
-$s = new dbStruct($core->con,$core->prefix);
-
-$s->revision
-	->revision_id				('bigint',0,false)
-	->post_id					('bigint',0,false)
-	->user_id					('varchar',32,false)
-	->blog_id					('varchar',32,false)
-	->revision_dt				('timestamp',0,false,'now()')
-	->revision_tz				('varchar',128,false,"'UTC'")
-	->revision_type			('varchar',50,true,null)
-	->revision_excerpt_diff		('text',0,true,null)
-	->revision_excerpt_xhtml_diff	('text',0,true,null)
-	->revision_content_diff		('text',0,true,null)
-	->revision_content_xhtml_diff	('text',0,true,null)
-	;
-
-$s->revision->primary('pk_revision','revision_id');
-
-$s->revision->index('idx_revision_post_id','btree','post_id');
-
-$s->revision->reference('fk_revision_post','post_id','post','post_id','cascade','cascade');
-$s->revision->reference('fk_revision_blog','blog_id','blog','blog_id','cascade','cascade');
-
-$si = new dbStruct($core->con,$core->prefix);
-
-try {
-	$changes = $si->synchronize($s);
-} catch (Exception $e) {
-	$core->error->add($e);
-}
-
-$core->setVersion('dcrevisions',$m_version);
-
-return true;
-
-?>
Index: lugins/dcRevisions/_prepend.php
===================================================================
--- plugins/dcRevisions/_prepend.php	(revision 721)
+++ 	(revision )
@@ -1,19 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRrevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2011 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-$__autoload['dcRevisions'] = dirname(__FILE__).'/inc/class.dc.revisions.php';
-$__autoload['dcRevisionsRestMethods'] = dirname(__FILE__).'/_services.php';
-$__autoload['dcRevisionsBehaviors'] = dirname(__FILE__).'/inc/class.dc.revisions.behaviors.php';
-$__autoload['dcRevisionsExtensions'] = dirname(__FILE__).'/inc/class.dc.revisions.extensions.php';
-$__autoload['dcRevisionsList'] = dirname(__FILE__).'/inc/class.dc.revisions.list.php';
-
-?>
Index: lugins/dcRevisions/_services.php
===================================================================
--- plugins/dcRevisions/_services.php	(revision 721)
+++ 	(revision )
@@ -1,90 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2011 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-class dcRevisionsRestMethods
-{
-	public static function getPatch()
-	{
-		global $core;
-		
-		$pid = isset($_GET['pid']) ? $_GET['pid'] : null;
-		$rid = isset($_GET['rid']) ? $_GET['rid'] : null;
-		
-		if ($pid === null) {
-			throw new Exception(__('No post ID'));
-		}
-		if ($rid === null) {
-			throw new Exception(__('No revision ID'));
-		}
-		
-		$p = $core->blog->getPosts(array('post_id' => $pid));
-		$o = array(
-			'post_excerpt_xhtml' => $p->post_excerpt_xhtml,
-			'post_content_xhtml' => $p->post_content_xhtml
-		);
-		
-		$n = $core->blog->revisions->getPatch($pid,$rid);
-		unset($n['post_excerpt']);
-		unset($n['post_content']);
-		
-		$rsp = new xmlTag();
-		
-		foreach ($o as $k => $v) {
-			$rsp->insertNode(self::buildNode($v,$n[$k],2,$k));
-		}
-		
-		return $rsp;
-	}
-	
-	public static function buildNode($src,$dst,$ctx,$root)
-	{
-		$udiff = diff::uniDiff($src,$dst,$ctx);
-		$tdiff = new tidyDiff(htmlspecialchars($udiff),true);
-		
-		$rev = new xmlTag($root);
-		
-		foreach ($tdiff->getChunks() as $k => $chunk) {
-			foreach ($chunk->getLines() as $line) {
-				switch ($line->type) {
-					case 'context':
-						$node = new xmlTag('context');
-						$node->oline = $line->lines[0];
-						$node->nline = $line->lines[1];
-						$node->insertNode($line->content);
-						$rev->insertNode($node);
-						break;
-					case 'delete':
-						$node = new xmlTag('delete');
-						$node->oline = $line->lines[0];
-						$c = str_replace(array('\0','\1'),array('<del>','</del>'),$line->content);
-						$node->insertNode($c);
-						$rev->insertNode($node);
-						break;
-					case 'insert':
-						$node = new xmlTag('insert');
-						$node->nline = $line->lines[1];
-						$c = str_replace(array('\0','\1'),array('<ins>','</ins>'),$line->content);
-						$node->insertNode($c);
-						$rev->insertNode($node);
-						break;
-				}
-			}
-			if ($k < count($tdiff->getChunks()) - 1) {
-				$node = new xmlTag('skip');
-				$rev->insertNode($node);
-			}
-		}
-		return $rev;
-	}
-}
-
-?>
Index: lugins/dcRevisions/inc/class.dc.revisions.behaviors.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.behaviors.php	(revision 721)
+++ 	(revision )
@@ -1,72 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2010 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-class dcRevisionsBehaviors
-{
-	public static function adminPostForm($post)
-	{
-		global $core;
-		
-		$id = isset($post) && !$post->isEmpty() ? $post->post_id : null;
-		$page = isset($_GET['page']) ? $_GET['page'] : 1;
-		$url = sprintf('post.php?id=%1$s&amp;patch=%2$s',$id,'%s');
-		
-		$params = array(
-			'post_id' => $id
-		);
-		
-		$rs = $core->blog->revisions->getRevisions($params);
-		
-		if (is_null($id)) {
-			$rs = staticRecord::newFromArray(array());
-			$rs->core = $core;
-		}
-		
-		$list = new dcRevisionsList($rs);
-		
-		echo '<div class="area" id="revisions-area"><label>'.__('Revisions:').'</label>'.
-		$list->display($url).
-		'</div>';
-	}
-	
-	public static function adminPostHeaders()
-	{
-		return
-		'<script type="text/javascript">'."\n".
-		"//<![CDATA[\n".
-		dcPage::jsVar('dotclear.msg.excerpt',__('Excerpt')).
-		dcPage::jsVar('dotclear.msg.content',__('Content')).
-		dcPage::jsVar('dotclear.msg.current',__('Current')).
-		dcPage::jsVar('dotclear.msg.content_identical',__('Content identical')).
-		dcPage::jsVar('dotclear.msg.confirm_apply_patch',
-			__('(CAUTION: This operation will replace all the content by the previous one)').' '.
-			__('Are you sure to want apply this patch on this entry?')
-		).
-		"\n//]]>\n".
-		"</script>\n".
-		'<script type="text/javascript" src="index.php?pf=dcRevisions/js/_revision.js"></script>'."\n".
-		'<link rel="stylesheet" type="text/css" href="index.php?pf=dcRevisions/style.css" />';
-	}
-	
-	public static function adminBeforeUpdate($cur,$post_id)
-	{
-		global $core;
-		
-		try {
-			$core->blog->revisions->addRevision($cur,$post_id);
-		} catch (Exception $e) {
-			$core->error->add($e->getMessage());
-		}
-	}
-}
-
-?>
Index: lugins/dcRevisions/inc/class.dc.revisions.extensions.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.extensions.php	(revision 338)
+++ 	(revision )
@@ -1,73 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2010 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-class dcRevisionsExtensions
-{
-	public static function getDate($rs,$format = null)
-	{
-		$format === null ? $format = $rs->core->blog->settings->system->date_format : $format;
-		
-		return dt::dt2str($format,$rs->revision_dt,$rs->revision_tz);
-	}
-	
-	public static function getTime($rs,$format = null)
-	{	
-		$format === null ? $format = $rs->core->blog->settings->system->time_format : $format;
-
-		return dt::dt2str($format,$rs->revision_dt,$rs->revision_tz);
-	}
-	
-	public static function getAuthorCN($rs)
-	{
-		return dcUtils::getUserCN($rs->user_id, $rs->user_name,
-		$rs->user_firstname, $rs->user_displayname);
-	}
-	
-	public static function getAuthorLink($rs)
-	{
-		$res = '%1$s';
-		$url = $rs->user_url;
-		if ($url) {
-			$res = '<a href="%2$s">%1$s</a>';
-		}
-		
-		return sprintf($res,html::escapeHTML($rs->getAuthorCN()),html::escapeHTML($url));
-	}
-	
-	public static function canPatch($rs)
-	{
-		# If user is super admin, true
-		if ($rs->core->auth->isSuperAdmin()) {
-			return true;
-		}
-		
-		# If user is admin or contentadmin, true
-		if ($rs->core->auth->check('contentadmin',$rs->core->blog->id)) {
-			return true;
-		}
-		
-		# No user id in result ? false
-		if (!$rs->exists('user_id')) {
-			return false;
-		}
-		
-		# If user is usage and owner of the entrie
-		if ($rs->core->auth->check('usage',$rs->core->blog->id)
-		&& $rs->user_id == $rs->core->auth->userID()) {
-			return true;
-		}
-		
-		return false;
-	}
-}
-
-?>
Index: lugins/dcRevisions/inc/class.dc.revisions.list.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.list.php	(revision 721)
+++ 	(revision )
@@ -1,86 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2010 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-class dcRevisionsList
-{
-	protected $rs = null;
-	
-	public function __construct($rs)
-	{
-		$this->rs = $rs;
-		$this->core = $rs->core;
-	}
-	
-	public function display($url)
-	{
-		$res = '';
-		
-		if (!$this->rs->isEmpty()) {
-			$html_block =
-				'<table id="revisions-list" summary="'.__('Revisions').'" class="clear maximal" style="display: none;">'.
-				'<thead>'.
-				'<tr>'.
-				'<th>'.__('Id').'</th>'.
-				'<th class="nowrap">'.__('Author').'</th>'.
-				'<th class="nowrap">'.__('Date').'</th>'.
-				'<th class="nowrap">'.__('Status').'</th>'.
-				'<th class="nowrap">'.__('Actions').'</th>'.
-				'</tr>'.
-				'</thead>'.
-				'<tbody>%s</tbody>'.
-				'</table>';
-				
-			$res .= sprintf($html_block,$this->getLines($url));
-		}
-		else {
-			$res .= '<p style="display:none">'.__('No revision').'</p>';
-		}
-		
-		return $res;
-	}
-	
-	private function getLines($url)
-	{
-		$res = '';
-		$p_img = '<img src="%1$s" alt="%2$s" title="%2$s" />';
-		$p_link = '<a href="%1$s" title="%3$s" class="patch"><img src="%2$s" alt="%3$s" /></a>';
-		
-		while ($this->rs->fetch()) {
-			$res .= 
-				'<tr class="line wide'.(!$this->rs->canPatch() ? ' offline' : '').'" id="r'.$this->rs->revision_id.'">'."\n".
-				'<td class="maximal nowrap rid">'.
-					'<strong>'.sprintf(__('Revision #%s'),$this->rs->revision_id).'</strong>'.
-				"</td>\n".
-				'<td class="minimal nowrap">'.
-					$this->rs->getAuthorLink().
-				"</td>\n".
-				'<td class="minimal nowrap">'.
-					$this->rs->getDate().' - '.$this->rs->getTime().
-				"</td>\n".
-				'<td class="minimal nowrap status">'.
-					sprintf(
-						$p_img,
-						('images/'.($this->rs->canPatch() ? 'check-on.png' : 'locker.png')),
-						($this->rs->canPatch() ? __('Revision allowed') : __('Revision blocked'))
-					).
-				"</td>\n".
-				'<td class="minimal nowrap status">'.
-					($this->rs->canPatch() ? sprintf($p_link,sprintf($url,$this->rs->revision_id),'index.php?pf=dcRevisions/images/apply.png',__('Apply patch')) : '').
-				"</td>\n".
-				"</tr>\n";
-		}
-		
-		return $res;
-	}
-}
-
-?>
Index: lugins/dcRevisions/inc/class.dc.revisions.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.php	(revision 721)
+++ 	(revision )
@@ -1,254 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2010 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-
-class dcRevisions
-{
-	public function __construct($core)
-	{
-		$this->core = $core;
-	}
-	
-	public function getRevisions($params,$count_only = false)
-	{
-		if ($count_only) {
-			$f = 'COUNT(revision_id)';
-		}
-		else {
-			$f = 'R.revision_id, R.post_id, R.user_id, R.revision_type, '.
-			'R.revision_dt, R.revision_tz, R.revision_excerpt_diff, '.
-			'R.revision_excerpt_xhtml_diff, R.revision_content_diff, '.
-			'R.revision_content_xhtml_diff, U.user_url, U.user_name, '.
-			'U.user_firstname, U.user_displayname';
-		}
-		
-		$strReq = 'SELECT '.$f.' FROM '.$this->core->prefix.'revision R '.
-		'LEFT JOIN '.$this->core->prefix.'user U ON R.user_id = U.user_id ';
-		
-		if (!empty($params['from'])) {
-			$strReq .= $params['from'].' ';
-		}
-		
-		$strReq .= "WHERE R.blog_id = '".$this->core->con->escape($this->core->blog->id)."' ";
-		
-		if (!empty($params['post_id'])) {
-			if (is_array($params['post_id'])) {
-				array_walk($params['post_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}'));
-			} else {
-				$params['post_id'] = array((integer) $params['post_id']);
-			}
-			$strReq .= 'AND R.post_id '.$this->core->con->in($params['post_id']);
-		}
-		
-		if (!empty($params['revision_id'])) {
-			if (is_array($params['revision_id'])) {
-				array_walk($params['revision_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}'));
-			} else {
-				$params['revision_id'] = array((integer) $params['revision_id']);
-			}
-			$strReq .= 'AND R.revision_id '.$this->core->con->in($params['revision_id']);
-		}
-		
-		if (isset($params['post_type'])) {
-			if (is_array($params['post_type']) && !empty($params['post_type'])) {
-				$strReq .= 'AND R.revision_type '.$this->core->con->in($params['revision_type']);
-			} elseif ($params['post_type'] != '') {
-				$strReq .= "AND R.revision_type = '".$this->core->con->escape($params['revision_type'])."' ";
-			}
-		}
-		
-		if (!empty($params['sql'])) {
-			$strReq .= $params['sql'].' ';
-		}
-		
-		if (!$count_only) {
-			if (!empty($params['order'])) {
-				$strReq .= 'ORDER BY '.$this->core->con->escape($params['order']).' ';
-			} else {
-				$strReq .= 'ORDER BY revision_dt DESC ';
-			}
-		}
-		
-		if (!$count_only && !empty($params['limit'])) {
-			$strReq .= $this->core->con->limit($params['limit']);
-		}
-		
-		$rs = $this->core->con->select($strReq);
-		$rs->core = $this->core;
-		$rs->extend('dcRevisionsExtensions');
-		
-		return $rs;
-	}
-	
-	public function addRevision($pcur,$post_id)
-	{
-		$rs = $this->core->con->select(
-			'SELECT MAX(revision_id) '.
-			'FROM '.$this->core->prefix.'revision' 
-		);
-		$revision_id = $rs->f(0) + 1; 
-		
-		$rs = $this->core->blog->getPosts(array('post_id' => $post_id));
-		
-		$old = array(
-			'post_excerpt' => $rs->post_excerpt,
-			'post_excerpt_xhtml' => $rs->post_excerpt_xhtml,
-			'post_content' => $rs->post_content,
-			'post_content_xhtml' => $rs->post_content_xhtml
-		);
-		$new = array(
-			'post_excerpt' => $pcur->post_excerpt,
-			'post_excerpt_xhtml' => $pcur->post_excerpt_xhtml,
-			'post_content' => $pcur->post_content,
-			'post_content_xhtml' => $pcur->post_content_xhtml
-		);
-		
-		$diff = $this->getDiff($new,$old);
-		
-		$insert = false;
-		foreach ($diff as $k => $v) {
-			if ($v !== '') {
-				$insert = true;
-			}
-		}
-		
-		if ($insert) {
-			$rcur = $this->core->con->openCursor($this->core->prefix.'revision');
-			$rcur->revision_id = $revision_id;
-			$rcur->post_id = $post_id;
-			$rcur->user_id = $this->core->auth->userID();
-			$rcur->blog_id = $this->core->blog->id;
-			$rcur->revision_dt = date('Y-m-d H:i:s');
-			$rcur->revision_tz = $this->core->auth->getInfo('user_tz');
-			$rcur->revision_type = $pcur->post_type;
-			$rcur->revision_excerpt_diff = $diff['post_excerpt'];
-			$rcur->revision_excerpt_xhtml_diff = $diff['post_excerpt_xhtml'];
-			$rcur->revision_content_diff = $diff['post_content'];
-			$rcur->revision_content_xhtml_diff = $diff['post_content_xhtml'];
-	 
-			$this->core->con->writeLock($this->core->prefix.'revision');
-			$rcur->insert();
-			$this->core->con->unlock();
-		}
-	}
-	
-	public function getDiff($n,$o)
-	{
-		$diff = array(
-			'post_excerpt' => '',
-			'post_excerpt_xhtml' => '',
-			'post_content' => '',
-			'post_content_xhtml' => ''
-		);
-		
-		try {
-			foreach ($diff as $k => $v) {
-				$diff[$k] = diff::uniDiff($n[$k],$o[$k]);
-			}
-		
-			return $diff;
-		}
-		catch (Exception $e)
-		{
-			$this->core->error->add($e->getMessage());
-		}
-	}
-	
-	public function setPatch($pid,$rid)
-	{
-		if (!$this->canPatch($rid)) {
-			throw new Exception(__('You are not allowed to patch this entry with this revision'));
-		}
-		
-  		try
-		{
-			$patch = $this->getPatch($pid,$rid);
-
-			$p = $this->core->blog->getPosts(array('post_id' => $pid));
-
-			$cur = $this->core->con->openCursor($this->core->prefix.'post');
-
-			$cur->post_title = $p->post_title;
-			$cur->cat_id = $p->cat_id ? $p->cat_id : null;
-			$cur->post_dt = $p->post_dt ? date('Y-m-d H:i:00',strtotime($p->post_dt)) : '';
-			$cur->post_format = $p->post_format;
-			$cur->post_password = $p->post_password;
-			$cur->post_lang = $p->post_lang;
-			$cur->post_notes = $p->post_notes;
-			$cur->post_status = $p->post_status;
-			$cur->post_selected = (integer) $p->post_selected;
-			$cur->post_open_comment = (integer) $p->post_open_comment;
-			$cur->post_open_tb = (integer) $p->post_open_tb;
-
-			$cur->post_excerpt = $patch['post_excerpt'];
-			$cur->post_excerpt_xhtml = $patch['post_excerpt_xhtml'];
-			$cur->post_content = $patch['post_content'];
-			$cur->post_content_xhtml = $patch['post_content_xhtml'];
-
-			# --BEHAVIOR-- adminBeforePostUpdate
-			$this->core->callBehavior('adminBeforePostUpdate',$cur,$pid);
-			
-			$this->core->auth->sudo(array($this->core->blog,'updPost'),$pid,$cur);
-			
-			# --BEHAVIOR-- adminAfterPostUpdate
-			$this->core->callBehavior('adminAfterPostUpdate',$cur,$pid);
-			
-			http::redirect('post.php?id='.$pid.'&upd=1');
-		}
-		catch (Exception $e)
-		{
-			$this->core->error->add($e->getMessage());
-		}
-	}
-	
-	public function getPatch($pid,$rid)
-	{
-		$params = array(
-			'post_id' => $pid
-		);
-		
-		$p = $this->core->blog->getPosts($params);
-		$r = $this->getRevisions($params);
-		
-		$patch = array(
-			'post_excerpt' => $p->post_excerpt,
-			'post_excerpt_xhtml' => $p->post_excerpt_xhtml,
-			'post_content' => $p->post_content,
-			'post_content_xhtml' => $p->post_content_xhtml
-		);
-
-		while ($r->fetch()) {
-			foreach ($patch as $k => $v) {
-				if ($k === 'post_excerpt') { $f = 'revision_excerpt_diff'; }
-				if ($k === 'post_excerpt_xhtml') { $f = 'revision_excerpt_xhtml_diff'; }
-				if ($k === 'post_content') { $f = 'revision_content_diff'; }
-				if ($k === 'post_content_xhtml') { $f = 'revision_content_xhtml_diff'; }
-				
-				$patch[$k] = diff::uniPatch($v,$r->{$f});
-			}
-
-			if ($r->revision_id === $rid) {
-				break;
-			}
-		}
-		
-		return $patch;
-	}
-	
-	protected function canPatch($ird)
-	{
-		$r = $this->getRevisions(array('revision_id' => $rid));
-		
-		return ($r->canPatch());
-	}
-}
-
-?>
Index: lugins/dcRevisions/js/_revision.js
===================================================================
--- plugins/dcRevisions/js/_revision.js	(revision 721)
+++ 	(revision )
@@ -1,155 +1,0 @@
-/*
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2010 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-*/
-dotclear.revisionExpander = function() {
-	$('#revisions-list tr.line').each(function() {
-		var img = document.createElement('img');
-		img.src = dotclear.img_plus_src;
-		img.alt = dotclear.img_plus_alt;
-		img.className = 'expand';
-		$(img).css('cursor','pointer');
-		img.line = this;
-		img.onclick = function() {
-			dotclear.viewRevisionContent(this,this.line);
-		};
-		$(this).find('td.rid').prepend(img);
-	});
-};
-
-dotclear.viewRevisionContent = function(img,line) {
-	var revisionId = line.id.substr(1);
-	var postId = $("#id").val();
-	var tr = document.getElementById('re' + revisionId);
-	if (!tr ){
-		tr = document.createElement('tr');
-		tr.id = 're' + revisionId;
-		var td = document.createElement('td');
-		td.colSpan = 5;
-		td.className = 'expand';
-		tr.appendChild(td);
-		img.src = dotclear.img_minus_src;
-		img.alt = dotclear.img_minus_alt;
-		$.get(
-			'services.php',{
-				f: 'getPatch',
-				pid: postId,
-				rid: revisionId
-			},
-			function(data){
-				var rsp = $(data).children('rsp')[0];
-				if(rsp.attributes[0].value == 'ok'){
-					var excerpt_nodes = $(rsp).find('post_excerpt_xhtml').children();
-					var content_nodes = $(rsp).find('post_content_xhtml').children();
-					if (excerpt_nodes.size() == 0 && content_nodes.size() == 0) {
-						$(td).append('<strong>' + dotclear.msg.content_identical + '</strong>');
-					}
-					else {
-						var excerpt = $(rsp).find('post_excerpt_xhtml');
-						var content = $(rsp).find('post_content_xhtml');
-						var table = '<table class="preview-rev">';
-						table += dotclear.viewRevisionRender(excerpt_nodes,dotclear.msg.excerpt,revisionId);
-						table += dotclear.viewRevisionRender(content_nodes,dotclear.msg.content,revisionId);
-						table += '</table>';
-						$(td).append(table);
-					}
-				}
-				else {
-					alert($(rsp).find('message').text());
-				}
-			}
-		);
-		$(line).toggleClass('expand');
-		line.parentNode.insertBefore(tr,line.nextSibling);
-	}
-	else if (tr.style.display=='none') {
-		$(tr).toggle();
-		$(line).toggleClass('expand');
-		img.src = dotclear.img_minus_src;
-		img.alt = dotclear.img_minus_alt
-	}
-	else {
-		$(tr).toggle();
-		$(line).toggleClass('expand');
-		img.src = dotclear.img_plus_src;
-		img.alt = dotclear.img_plus_alt;
-	}
-};
-
-dotclear.viewRevisionRender = function(nodes,title,revisionId){
-	var res = lines = previous = '';
-		
-	nodes.each(function(k) {
-		var name = this.nodeName;
-		var content = $(this).text();
-		
-		var ol = $(this).attr('oline') != undefined ? $(this).attr('oline') : '';
-		var nl = $(this).attr('nline') != undefined ? $(this).attr('nline') : '';
-		
-		if (name == 'skip') {
-			ol = nl = '&hellip;';
-		}
-		
-		var class = '';
-		
-		if (name == 'skip') {
-			class = ' skip';
-		}
-		if (name == 'context') {
-			class = ' context';
-		}
-		if (name == 'insert') {
-			class = ' insert';
-		}
-		if (name == 'delete') {
-			class = ' delete';
-		}
-		
-		if (name != previous && (previous == '' || previous == 'context')) {
-			class += ' first';
-		}
-		var next = nodes.size() > k+1 ? nodes.get(k+1).nodeName : '';
-		if (name != next && next != 'insert' && next != 'delete') {
-			class += ' last';
-		}
-		
-		previous = name;
-		
-		lines += '<tr><td class="minimal col-line">'+ol+
-		'</td><td class="minimal col-line">'+nl+
-		'</td><td class="'+class+'">'+content+
-		'</td></tr>';
-	});
-	
-	if (lines != '') {
-		res = '<thead><tr class="rev-header"><th colspan="3">'+title+'</th></tr>'+
-		'<tr class="rev-number"><th class="minimal nowrap">'+dotclear.msg.current+
-		'</th><th class="minimal nowrap">r'+revisionId+
-		'</th><th class="maximal"></th></tr></thead><tbody>'+
-		lines + '</tbody>';
-	}
-	
-	return res;
-};
-
-$(function() {
-	$('#edit-entry').onetabload(function() {
-		$('#revisions-area label').toggleWithLegend(
-			$('#revisions-area').children().not('label'),{
-				cookie:'dcx_post_revisions',
-				fn:dotclear.revisionExpander()
-			}
-		);
-		$('#revisions-list tr.line a.patch').click(function() {
-			return window.confirm(dotclear.msg.confirm_apply_patch);
-		});
-	});
-});
Index: lugins/dcRevisions/style.css
===================================================================
--- plugins/dcRevisions/style.css	(revision 721)
+++ 	(revision )
@@ -1,82 +1,0 @@
-/*
-# -- BEGIN LICENSE BLOCK ----------------------------------
-# This file is part of dcRevisions, a plugin for Dotclear.
-#
-# Copyright (c) 2011 Tomtom and contributors
-# http://blog.zenstyle.fr/
-#
-# Licensed under the GPL version 2.0 license.
-# A copy of this license is available in LICENSE file or at
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# -- END LICENSE BLOCK ------------------------------------
-*/
-#revisions-area { padding-bottom: 1em; }
-table#revisions-list { display: none; overflow: scroll; }
-table.preview-rev {
-	border-spacing: 0px;
-	border-collapse: separate;
-	overflow: scroll;
-}
-table.preview-rev, table.preview-rev tr, table.preview-rev th, table.preview-rev td  { border: none; }
-table.preview-rev thead {
-	border: 1px dotted #aaa;
-	background-color: #f3f3f3;
-}
-table.preview-rev tbody {
-	border: 1px dotted #aaa;
-}
-table.preview-rev thead tr.rev-header th, table.preview-rev thead tr.rev-number th {
-	border: 1px dotted #aaa;
-	text-align: center;
-}
-table.preview-rev td { font: normal 11px monospace; }
-table.preview-rev td.center { text-align: center; }
-table.preview-rev td.col-line {
-	background-color: #eceade;
-	color: #aaa;
-	border-right: 1px solid #ccc;
-	border-bottom: 1px solid #aaa;
-	border-left: 1px solid #ccc;
-	text-align: right;
-}
-/* Insert line */
-table.preview-rev td.insert {
-	background-color: #dfd;
-	border-color: #0a0;
-	border-style: solid;
-	border-width: 0 1px 0 1px;
-}
-/* Delete line */
-table.preview-rev td.delete {
-	background-color: #fdd;
-	border-color: #c00;
-	border-style: solid;
-	border-width: 0 1px 0 1px;
-}
-/* Skip line */
-table.preview-rev td.skip {
-	background-color: #F7F7F7;
-	color: #D7D7D7;
-	border-color: #D7D7D7;
-	border-style: solid;
-}
-/* Common lines */
-table.preview-rev td.first {
-	border-width: 1px 1px 0 1px;
-}
-table.preview-rev td.last {
-	border-width: 0 1px 1px 1px;
-}
-table.preview-rev td.first.last {
-	border-width: 1px;
-}
-table.preview-rev td.delete del {
-	text-decoration: none;
-	background-color: #e99;
-	padding: 0.2em 0 0.2em 0;
-}
-table.preview-rev td.insert ins {
-	text-decoration: none;
-	background-color: #9e9;
-	padding: 0.2em 0 0.2em 0;
-}
Index: plugins/fairTrackbacks/_define.php
===================================================================
--- plugins/fairTrackbacks/_define.php	(revision 270)
+++ plugins/fairTrackbacks/_define.php	(revision 464)
@@ -17,6 +17,8 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	/* Permissions */		'usage,contentadmin',
-	/* Priority */			200
+	array(
+		'permissions' =>	'usage,contentadmin',
+		'priority' =>		200
+	)
 );
 ?>
Index: plugins/importExport/_admin.php
===================================================================
--- plugins/importExport/_admin.php	(revision 270)
+++ plugins/importExport/_admin.php	(revision 324)
@@ -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/_define.php
===================================================================
--- plugins/importExport/_define.php	(revision 270)
+++ plugins/importExport/_define.php	(revision 464)
@@ -17,6 +17,8 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'2.4',
-	/* Permissions */		'admin',
-	/* Priority */			10
+	array(
+		'permissions' => 'admin',
+		'priority' => 10
+	)
 );
 ?>
Index: plugins/importExport/inc/class.dc.export.flat.php
===================================================================
--- plugins/importExport/inc/class.dc.export.flat.php	(revision 270)
+++ plugins/importExport/inc/class.dc.export.flat.php	(revision 557)
@@ -157,7 +157,6 @@
 		'<p>'.sprintf(__('This will create an export of your current blog: %s'),
 		'<strong>'.html::escapeHTML($this->core->blog->name).'</strong>').'</p>'.
-		'<p><label for="file_name" class="classic">'.__('File name:').' '.
+		'<p><label for="file_name" class="classic">'.__('File name:').'</label>'.
 		form::field(array('file_name','file_name'),25,255,date('Y-m-d-').html::escapeHTML($this->core->blog->id.'-backup.txt')).
-		'</label> '.
 		'<input type="submit" value="'.__('Export').'" />'.
 		form::hidden(array('do'),'export_blog').
@@ -172,7 +171,6 @@
 			'<form action="'.$this->getURL(true).'" method="post">'.
 			'<fieldset><legend>'.__('Export all content').'</legend>'.
-			'<p><label for="file_name2" class="classic">'.__('File name:').' '.
+			'<p><label for="file_name2" class="classic">'.__('File name:').'</label>'.
 			form::field(array('file_name','file_name2'),25,255,date('Y-m-d-').'dotclear-backup.txt').
-			'</label> '.
 			'<input type="submit" value="'.__('Export all content').'" />'.
 			form::hidden(array('do'),'export_all').
Index: plugins/importExport/inc/class.dc.import.feed.php
===================================================================
--- plugins/importExport/inc/class.dc.import.feed.php	(revision 270)
+++ plugins/importExport/inc/class.dc.import.feed.php	(revision 557)
@@ -86,11 +86,11 @@
 		'<form action="'.$this->getURL(true).'" method="post">'.
 		
-		'<fieldset>'.
+		'<div class="fieldset">'.
 		$this->core->formNonce().
 		form::hidden(array('do'),1).
-		'<p><label for="feed_url">'.__('Feed URL:').' '.
-		form::field('feed_url',40,300,html::escapeHTML($this->feed_url)).'</label></p>'.
-		'<p><input type="submit" value="'.__('Send').'" /></p>'.
-		'</fieldset>'.
+		'<p><label for="feed_url">'.__('Feed URL:').'</label>'.
+		form::field('feed_url',40,300,html::escapeHTML($this->feed_url)).'</p>'.
+		'<p><input type="submit" value="'.__('Import').'" /></p>'.
+		'</div>'.
 		'</form>';
 	}
Index: plugins/importExport/inc/class.dc.import.flat.php
===================================================================
--- plugins/importExport/inc/class.dc.import.flat.php	(revision 270)
+++ plugins/importExport/inc/class.dc.import.flat.php	(revision 557)
@@ -160,11 +160,11 @@
 		'<form action="'.$this->getURL(true).'" method="post" enctype="multipart/form-data">'.
 		
-		'<fieldset>'.
+		'<div class="fieldset">'.
 		$this->core->formNonce().
 		form::hidden(array('do'),1).
 		form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
-		'<p><label for="up_single_file">'.__('Upload a backup file').' '.
+		'<p><label for="up_single_file">'.__('Upload a backup file').'</label>'.
 		'<input type="file" id="up_single_file" name="up_single_file" size="20" />'.
-		'</label></p>';
+		'</p>';
 		
 		$public_files = $this->getPublicFiles();
@@ -178,6 +178,6 @@
 		
 		echo
-		'<p><input type="submit" value="'.__('Send').'" /></p>'.
-		'</fieldset>'.
+		'<p><input type="submit" value="'.__('Import').'" /></p>'.
+		'</div>'.
 		'</form>';
 		
@@ -189,25 +189,25 @@
 			'<div>'.form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).'</div>'.
 			
-			'<fieldset>'.
+			'<div class="fieldset">'.
 			$this->core->formNonce().
 			form::hidden(array('do'),1).
 			form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
-			'<p><label for="up_full_file">'.__('Upload a backup file').' '.
+			'<p><label for="up_full_file">'.__('Upload a backup file').'</label>'.
 			'<input type="file" id="up_full_file" name="up_full_file" size="20" />'.
-			'</label></p>';
+			'</p>';
 			
 			echo
-			'<p><label for="public_full_file">'.__('or pick up a local file in your public directory').' '.
+			'<p><label for="public_full_file">'.__('or pick up a local file in your public directory').'</label>'.
 			form::combo('public_full_file',$public_files, '', '', '', $empty).
-			'</label></p>';
+			'</p>';
 			
 			echo
-			'<p><strong>'.__('Warning: This will reset all the content of your database, except users.').'</strong></p>'.
-			
-			'<p><label for="your_pwd">'.__('Your password:').
-			form::password('your_pwd',20,255).'</label></p>'.
-			
-			'<p><input type="submit" value="'.__('Send').'" /></p>'.
-			'</fieldset>'.
+			'<p class="form-note warning"><strong>'.__('Warning: This will reset all the content of your database, except users.').'</strong></p>'.
+			
+			'<p><label for="your_pwd" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label>'.
+			form::password('your_pwd',20,255).'</p>'.
+			
+			'<p><input type="submit" value="'.__('Import').'" /></p>'.
+			'</div>'.
 			'</form>';
 		}
Index: plugins/importExport/inc/flat/class.dc.import.php
===================================================================
--- plugins/importExport/inc/flat/class.dc.import.php	(revision 270)
+++ plugins/importExport/inc/flat/class.dc.import.php	(revision 298)
@@ -371,4 +371,8 @@
 	private function insertPref($pref)
 	{
+		if ($this->prefExists($pref->pref_ws,$pref->pref_id,$pref->user_id)) {
+			return;
+		}
+		
 		$this->cur_pref->clean();
 		
@@ -751,4 +755,21 @@
 		$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/importExport/index.php
===================================================================
--- plugins/importExport/index.php	(revision 270)
+++ plugins/importExport/index.php	(revision 696)
@@ -17,5 +17,5 @@
 $modules['i'] = new ArrayObject(array(
 	'dcImportFlat' => dirname(__FILE__).'/inc/class.dc.import.flat.php',
-	'dcImportFeed' => dirname(__FILE__).'/inc/class.dc.import.feed.php',
+	'dcImportFeed' => dirname(__FILE__).'/inc/class.dc.import.feed.php'
 ));
 $modules['e'] = new ArrayObject(array(
@@ -97,5 +97,5 @@
 {
 	echo '<h2><a href="'.$p_url.'">'.__('Import/Export').'</a>'.
-	' &rsaquo; '.html::escapeHTML($current_module->name).'</h2>';
+	' &rsaquo; <span class="page-title">'.html::escapeHTML($current_module->name).'</span></h2>';
 	
 	echo '<div id="ie-gui">';
@@ -105,5 +105,5 @@
 else
 {
-	echo '<h2>'.__('Import/Export').'</h2>';
+	echo '<h2 class="page-title">'.__('Import/Export').'</h2>';
 	echo '<h3>'.__('Import').'</h3>';
 	
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 270)
+++ plugins/maintenance/_admin.php	(revision 324)
@@ -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/maintenance/_define.php
===================================================================
--- plugins/maintenance/_define.php	(revision 270)
+++ plugins/maintenance/_define.php	(revision 464)
@@ -16,6 +16,5 @@
 	/* Description*/		"Maintain your database",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.1',
-	/* Permissions */		null
+	/* Version */			'1.1'
 );
 ?>
Index: plugins/maintenance/index.php
===================================================================
--- plugins/maintenance/index.php	(revision 270)
+++ plugins/maintenance/index.php	(revision 500)
@@ -69,5 +69,5 @@
 
 <body>
-<h2><?php echo __('Maintenance'); ?></h2>
+<h2 class="page-title"><?php echo __('Maintenance'); ?></h2>
 
 <?php
Index: plugins/pages/_admin.php
===================================================================
--- plugins/pages/_admin.php	(revision 270)
+++ plugins/pages/_admin.php	(revision 324)
@@ -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/pages/_define.php
===================================================================
--- plugins/pages/_define.php	(revision 270)
+++ plugins/pages/_define.php	(revision 464)
@@ -17,6 +17,8 @@
 	/* Author */		"Olivier Meunier",
 	/* Version */		'1.1.1',
-	/* Permissions */	'contentadmin,pages',
-	999
+	array(
+		'permissions' =>	'contentadmin,pages',
+		'priority' =>	999
+	)
 );
 ?>
Index: plugins/pages/list.php
===================================================================
--- plugins/pages/list.php	(revision 270)
+++ plugins/pages/list.php	(revision 578)
@@ -147,4 +147,5 @@
 	$combo_action[__('publish')] = 'publish';
 	$combo_action[__('unpublish')] = 'unpublish';
+	$combo_action[__('schedule')] = 'schedule';
 	$combo_action[__('mark as pending')] = 'pending';
 }
@@ -176,5 +177,5 @@
 <body>
 <?php
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Pages').'</h2>'.
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Pages').'</span></h2>'.
 '<p class="top-add"><a class="button add" href="'.$p_url.'&amp;act=page">'.__('New page').'</a></p>';
 
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 270)
+++ plugins/pages/page.php	(revision 559)
@@ -320,18 +320,15 @@
 
 echo '<h2>'.html::escapeHTML($core->blog->name).
-' &rsaquo; <a href="'.$p_url.'">'.__('Pages').'</a> &rsaquo; '.$page_title;
+' &rsaquo; <a href="'.$p_url.'">'.__('Pages').'</a> &rsaquo; <span class="page-title">'.$page_title; 
+	if ($post_id) {
+		echo ' &ldquo;'.$post_title.'&rdquo;';
+	}
+echo	'</span></h2>';
 
 if ($post_id && $post->post_status == 1) {
-	echo ' - <a id="post-preview" href="'.$post->getURL().'" class="button">'.__('View page').'</a>';
-} elseif ($post_id) {
-	$preview_url =
-	$core->blog->url.$core->url->getBase('pagespreview').'/'.
-	$core->auth->userID().'/'.
-	http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
-	'/'.$post->post_url;
-	echo ' - <a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview page').'</a>';
-}
-
-echo '</h2>';
+	echo '<p><a href="'.$post->getURL().'" onclick="window.open(this.href);return false;" title="'.$post_title.' ('.__('new window').')'.'">'.__('Go to this page on the site').' <img src="images/outgoing-blue.png" alt="" /></a></p>';
+}
+
+echo '';
 
 if ($post_id)
@@ -361,38 +358,87 @@
 	echo '<div class="multi-part" title="'.__('Edit page').'" id="edit-entry">';
 	echo '<form action="'.html::escapeURL($redir_url).'" method="post" id="entry-form">';
+
+	echo '<div id="entry-wrapper">';
+	echo '<div id="entry-content"><div class="constrained">';
+	
+	echo
+	'<p class="col"><label for="post_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
+	form::field('post_title',20,255,html::escapeHTML($post_title),'maximal').
+	'</label></p>'.
+	
+	'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'</label> '.
+	form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)).
+	'</p>'.
+	
+	'<p class="area"><label class="required" '.
+	'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
+	form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content)).
+	'</p>';
+	
+	echo
+	'<p class="area" id="notes-area"><label for="post_notes">'.__('Notes:').'</label>'.
+	form::textarea('post_notes',50,5,html::escapeHTML($post_notes)).
+	'</p>';
+
+	# --BEHAVIOR-- adminPageForm
+	$core->callBehavior('adminPageForm',isset($post) ? $post : null);
+	
+	echo
+	'<p>'.
+	($post_id ? form::hidden('id',$post_id) : '').
+	'<input type="submit" value="'.__('Save').' (s)" '.
+	'accesskey="s" name="save" /> ';
+
+	if ($post_id) {
+		$preview_url =
+		$core->blog->url.$core->url->getBase('pagespreview').'/'.
+		$core->auth->userID().'/'.
+		http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
+		'/'.$post->post_url;
+		echo '<a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview').'</a>';
+	}
+	
+	echo
+	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
+	$core->formNonce().
+	'</p>';
+	
+	echo '</div></div>';		// End #entry-content
+	echo '</div>';		// End #entry-wrapper
+
 	echo '<div id="entry-sidebar">';
 	
 	echo
 	'<p><label for="post_status">'.__('Page status:').
-	form::combo('post_status',$status_combo,$post_status,'',3,!$can_publish).
+	form::combo('post_status',$status_combo,$post_status,'','',!$can_publish).
 	'</label></p>'.
 	
 	'<p><label for="post_dt">'.__('Published on:').
-	form::field('post_dt',16,16,$post_dt,'',3).'</label></p>'.
+	form::field('post_dt',16,16,$post_dt).'</label></p>'.
 	
 	'<p><label for="post_format">'.__('Text formating:').
-	form::combo('post_format',$formaters_combo,$post_format,'',3).
+	form::combo('post_format',$formaters_combo,$post_format).
 	($post_id && $post_format != 'xhtml' ? '<a href="'.html::escapeURL($redir_url).'&amp;id='.$post_id.'&amp;xconv=1">'.__('Convert to XHTML').'</a>' : '').
 	'</label></p>'.
 	
-	'<p><label for="post_open_comment" class="classic">'.form::checkbox('post_open_comment',1,$post_open_comment,'',3).' '.
+	'<p><label for="post_open_comment" class="classic">'.form::checkbox('post_open_comment',1,$post_open_comment).' '.
 	__('Accept comments').'</label></p>'.
-	'<p><label for="post_open_tb" class="classic">'.form::checkbox('post_open_tb',1,$post_open_tb,'',3).' '.
+	'<p><label for="post_open_tb" class="classic">'.form::checkbox('post_open_tb',1,$post_open_tb).' '.
 	__('Accept trackbacks').'</label></p>'.
 	
 	'<p><label for="post_position" class="classic">'.__('Page position:').' '.
-	form::field('post_position',3,3,(string) $post_position,'',3).
+	form::field('post_position',3,3,(string) $post_position).
 	'</label></p>'.
 	
 	'<p><label for="post_lang">'.__('Page lang:').
-	form::combo('post_lang',$lang_combo,$post_lang,'',5).'</label></p>'.
+	form::combo('post_lang',$lang_combo,$post_lang).'</label></p>'.
 	
 	'<p><label for="post_password">'.__('Page password:').
-	form::field('post_password',10,32,html::escapeHTML($post_password),'maximal',3).
+	form::field('post_password',10,32,html::escapeHTML($post_password),'maximal').
 	'</label></p>'.
 	
 	'<div class="lockable">'.
 	'<p><label for="post_url">'.__('Basename:').
-	form::field('post_url',10,255,html::escapeHTML($post_url),'maximal',3).
+	form::field('post_url',10,255,html::escapeHTML($post_url),'maximal').
 	'</label></p>'.
 	'<p class="form-note warn">'.
@@ -443,38 +489,4 @@
 	echo '</div>';		// End #entry-sidebar
 	
-	echo '<div id="entry-content"><fieldset class="constrained">';
-	
-	echo
-	'<p class="col"><label for="post_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
-	form::field('post_title',20,255,html::escapeHTML($post_title),'maximal',2).
-	'</label></p>'.
-	
-	'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'</label> '.
-	form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt),'',2).
-	'</p>'.
-	
-	'<p class="area"><label class="required" '.
-	'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
-	form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content),'',2).
-	'</p>';
-	
-	echo
-	'<p class="area" id="notes-area"><label for="post_notes">'.__('Notes:').'</label>'.
-	form::textarea('post_notes',50,5,html::escapeHTML($post_notes),'',2).
-	'</p>';
-
-	# --BEHAVIOR-- adminPageForm
-	$core->callBehavior('adminPageForm',isset($post) ? $post : null);
-	
-	echo
-	'<p>'.
-	($post_id ? form::hidden('id',$post_id) : '').
-	'<input type="submit" value="'.__('Save').' (s)" tabindex="4" '.
-	'accesskey="s" name="save" /> '.
-	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
-	$core->formNonce().
-	'</p>';
-	
-	echo '</fieldset></div>';		// End #entry-content
 	echo '</form>';
 	echo '</div>';
@@ -566,5 +578,5 @@
 	
 	'<form action="comment.php" method="post" id="comment-form">'.
-	'<fieldset class="constrained">'.
+	'<div class="constrained">'.
 	'<p><label for="comment_author" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Name:').
 	form::field('comment_author',30,255,html::escapeHTML($core->auth->getInfo('user_cn'))).
@@ -586,5 +598,5 @@
 	$core->formNonce().
 	'<input type="submit" name="add" value="'.__('Save').'" /></p>'.
-	'</fieldset>'.
+	'</div>'.
 	'</form>'.
 	'</div>';
Index: plugins/pings/_admin.php
===================================================================
--- plugins/pings/_admin.php	(revision 270)
+++ plugins/pings/_admin.php	(revision 324)
@@ -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/pings/_define.php
===================================================================
--- plugins/pings/_define.php	(revision 270)
+++ plugins/pings/_define.php	(revision 464)
@@ -17,5 +17,7 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	/* Permissions */		'usage,contentadmin'
+	array(
+		'permissions' =>	'usage,contentadmin'
+	)
 );
 ?>
Index: plugins/pings/index.php
===================================================================
--- plugins/pings/index.php	(revision 270)
+++ plugins/pings/index.php	(revision 500)
@@ -51,5 +51,5 @@
 <body>
 <?php
-echo '<h2>'.__('Pings configuration').'</h2>';
+echo '<h2 class="page-title">'.__('Pings configuration').'</h2>';
 
 if (!empty($_GET['up'])) {
Index: plugins/simpleMenu/_admin.php
===================================================================
--- plugins/simpleMenu/_admin.php	(revision 683)
+++ plugins/simpleMenu/_admin.php	(revision 683)
@@ -0,0 +1,32 @@
+<?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; }
+
+$core->addBehavior('adminDashboardIcons','simpleMenu_dashboard');
+$core->addBehavior('adminDashboardFavs','simpleMenu_dashboard_favs');
+function simpleMenu_dashboard($core,$icons)
+{
+	$icons['simpleMenu'] = new ArrayObject(array(__('Simple menu'),'plugin.php?p=simpleMenu','index.php?pf=simpleMenu/icon.png'));
+}
+function simpleMenu_dashboard_favs($core,$favs)
+{
+	$favs['simpleMenu'] = new ArrayObject(array('simpleMenu','Simple menu','plugin.php?p=simpleMenu',
+		'index.php?pf=simpleMenu/icon-small.png','index.php?pf=simpleMenu/icon.png',
+		'usage,contentadmin',null,null));
+}
+
+$_menu['Plugins']->addItem(__('Simple menu'),'plugin.php?p=simpleMenu','index.php?pf=simpleMenu/icon-small.png',
+                preg_match('/plugin.php\?p=simpleMenu(&.*)?$/',$_SERVER['REQUEST_URI']),
+                $core->auth->check('usage,contentadmin',$core->blog->id));
+
+require dirname(__FILE__).'/_widgets.php';
+?>
Index: plugins/simpleMenu/_define.php
===================================================================
--- plugins/simpleMenu/_define.php	(revision 685)
+++ plugins/simpleMenu/_define.php	(revision 685)
@@ -0,0 +1,23 @@
+<?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; }
+
+$this->registerModule(
+	/* Name */			"simpleMenu",
+	/* Description*/		"Simple menu for Dotclear",
+	/* Author */			"Franck Paul",
+	/* Version */			'1.0',
+	array(
+		'permissions' =>	'admin'
+	)
+);
+?>
Index: plugins/simpleMenu/_install.php
===================================================================
--- plugins/simpleMenu/_install.php	(revision 683)
+++ plugins/simpleMenu/_install.php	(revision 683)
@@ -0,0 +1,29 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of simpleMenu, a plugin for 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; }
+
+$version = $core->plugins->moduleInfo('simpleMenu','version');
+if (version_compare($core->getVersion('simpleMenu'),$version,'>=')) {
+	return;
+}
+
+# Menu par défaut
+$blog_url = html::stripHostURL($core->blog->url);
+$menu_default = array(
+	array('label' => 'Home', 'descr' => 'Recent posts', 'url' => $blog_url),
+	array('label' => 'Archives', 'descr' => '', 'url' => $blog_url.$core->url->getBase('archive'))
+);
+$core->blog->settings->system->put('simpleMenu',serialize($menu_default),'string','simpleMenu default menu',false,true);
+
+$core->setVersion('simpleMenu',$version);
+return true;
+?>
Index: plugins/simpleMenu/_public.php
===================================================================
--- plugins/simpleMenu/_public.php	(revision 683)
+++ plugins/simpleMenu/_public.php	(revision 683)
@@ -0,0 +1,116 @@
+<?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; }
+
+require dirname(__FILE__).'/_widgets.php';
+
+# Simple menu template functions
+$core->tpl->addValue('SimpleMenu',array('tplSimpleMenu','simpleMenu'));
+
+class tplSimpleMenu
+{
+	# Template function
+	public static function simpleMenu($attr)
+	{
+		$class = isset($attr['class']) ? trim($attr['class']) : '';
+		$id = isset($attr['id']) ? trim($attr['id']) : '';
+		$description = isset($attr['description']) ? trim($attr['description']) : '';
+		
+		if (!preg_match('#^(title|span)$#',$description)) {
+			$description = '';
+		}
+		
+		return '<?php echo tplSimpleMenu::displayMenu('.
+				"'".addslashes($class)."',".
+				"'".addslashes($id)."',".
+				"'".addslashes($description)."'".
+			'); ?>';
+	}
+	
+	# Widget function
+	public static function simpleMenuWidget($w)
+	{
+		global $core, $_ctx;
+		
+		if ($w->homeonly && $core->url->type != 'default') {
+			return;
+		}
+
+		$menu = tplSimpleMenu::displayMenu('','','title');
+		if ($menu == '') {
+			return;
+		}
+
+		return '<div class="simple-menu">'.($w->title ? '<h2>'.html::escapeHTML($w->title).'</h2>' : '').$menu.'</div>';
+	}
+	
+	public static function displayMenu($class='',$id='',$description='')
+	{
+		$ret = '';
+
+		$menu = $GLOBALS['core']->blog->settings->system->get('simpleMenu');
+		$menu = @unserialize($menu);
+
+		if (is_array($menu)) 
+		{
+			// Current relative URL
+			$url = $_SERVER['REQUEST_URI'];
+			$abs_url = http::getHost().$url;
+		
+			// Home recognition var
+			$home_url = html::stripHostURL($GLOBALS['core']->blog->url);
+			$home_directory = dirname($home_url);
+			if ($home_directory != '/')
+				$home_directory = $home_directory.'/';
+
+			// Menu items loop
+			foreach ($menu as $i => $m) {
+				# $href = lien de l'item de menu
+				$href = $m['url'];
+				$href = html::escapeHTML($href);
+
+				# Active item test
+				$active = false;
+				if (($url == $href) || 
+					($abs_url == $href) || 
+					($_SERVER['URL_REQUEST_PART'] == $href) || 
+					(($_SERVER['URL_REQUEST_PART'] == '') && (($href == $home_url) || ($href == $home_directory)))) {
+					$active = true;
+				}
+				$title = $span = '';
+				if ($m['descr']) {
+					if ($description == 'title') {
+						$title = ' title="'.__($m['descr']).'"';
+					} else {
+						$span = ' <span>'.__($m['descr']).'</span>';
+					}
+				}
+				$ret .= '<li class="li'.($i+1).
+							($active ? ' active' : '').
+							($i == 0 ? ' li-first' : '').
+							($i == count($menu)-1 ? ' li-last' : '').
+						'">'.
+						'<a href="'.$href.'"'.$title.'>'.__($m['label']).$span.'</a>'.
+						'</li>';
+			}
+			
+			// Final rendering
+			if ($ret) {
+				$ret = '<ul '.($id ? 'id="'.$id.'"' : '').' class="simple-menu'.($class ? ' '.$class : '').'">'."\n".$ret."\n".'</ul>';
+			}
+		}
+
+		return $ret;
+	}
+}
+
+?>
Index: plugins/simpleMenu/_widgets.php
===================================================================
--- plugins/simpleMenu/_widgets.php	(revision 587)
+++ plugins/simpleMenu/_widgets.php	(revision 587)
@@ -0,0 +1,25 @@
+<?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('initWidgets',array('simpleMenuWidgets','initWidgets'));
+
+class simpleMenuWidgets
+{
+	public static function initWidgets($w)
+	{
+		$w->create('simplemenu',__('Simple menu'),array('tplSimpleMenu','simpleMenuWidget'));
+		$w->simplemenu->setting('title',__('Title:'),__('Menu'));
+		$w->simplemenu->setting('homeonly',__('Home page only'),1,'check');
+	}
+}
+?>
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 683)
+++ plugins/simpleMenu/index.php	(revision 683)
@@ -0,0 +1,572 @@
+<?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; }
+
+dcPage::check('admin');
+
+$page_title = __('Simple menu');
+
+# Url de base
+$p_url = 'plugin.php?p=simpleMenu';
+
+# Url du blog
+$blog_url = html::stripHostURL($core->blog->url);
+
+# Liste des catégories
+$categories_combo = array();
+$categories_label = array();
+try {
+	$rs = $core->blog->getCategories(array('post_type'=>'post'));
+	while ($rs->fetch()) {
+		$categories_combo[] = new formSelectOption(
+			str_repeat('&nbsp;&nbsp;',$rs->level-1).($rs->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($rs->cat_title),
+			$rs->cat_url
+		);
+		$categories_label[$rs->cat_url] = html::escapeHTML($rs->cat_title);
+	}
+} catch (Exception $e) { }
+
+# Liste des langues utilisées
+$langs_combo = array();
+try {
+	$rs = $core->blog->getLangs(array('order'=>'asc'));
+	if ($rs->count() > 1)
+	{
+		$all_langs = l10n::getISOcodes(0,1);
+		while ($rs->fetch()) {
+			$lang_name = isset($all_langs[$rs->post_lang]) ? $all_langs[$rs->post_lang] : $rs->post_lang;
+			$langs_combo[$lang_name] = $rs->post_lang;
+		}
+		unset($all_langs);
+	}
+	unset($rs);
+} catch (Exception $e) { }
+
+# Liste des mois d'archive
+$months_combo = array();
+try {
+	$rs = $core->blog->getDates(array('type'=>'month'));
+	$months_combo[__('All months')] = '-';
+	$first_year = $last_year = 0;
+	while ($rs->fetch()) {
+		$months_combo[dt::str('%B %Y',$rs->ts())] = $rs->year().$rs->month();
+		if (($first_year == 0) || ($rs->year() < $first_year)) $first_year = $rs->year();
+		if (($last_year == 0) || ($rs->year() > $last_year)) $last_year = $rs->year();
+	}
+	unset($rs);
+} catch (Exception $e) { }
+
+# Liste des pages -- Doit être pris en charge plus tard par le plugin ?
+$pages_combo = array();
+try {
+	$rs = $core->blog->getPosts(array('post_type'=>'page'));
+	while ($rs->fetch()) {
+		$pages_combo[$rs->post_title] = $rs->getURL();
+	}
+	unset($rs);
+} catch (Exception $e) { }
+
+# Liste des tags -- Doit être pris en charge plus tard par le plugin ?
+$tags_combo = array();
+try {
+	$rs = $core->meta->getMetadata(array('meta_type' => 'tag'));
+	$tags_combo[__('All tags')] = '-';
+	while ($rs->fetch()) {
+		$tags_combo[$rs->meta_id] = $rs->meta_id;
+	}
+	unset($rs);
+} catch (Exception $e) { }
+
+# Liste des types d'item de menu
+$items = new ArrayObject();
+$items['home'] = new ArrayObject(array(__('Home'),false));
+
+if (count($langs_combo) > 1) {
+	$items['lang'] = new ArrayObject(array(__('Language'),true));
+}
+if (count($categories_combo)) {
+	$items['category'] = new ArrayObject(array(__('Category'),true));
+}
+if (count($months_combo) > 1) {
+	$items['archive'] = new ArrayObject(array(__('Archive'),true));
+}
+if ($core->plugins->moduleExists('pages')) {
+	if(count($pages_combo))
+		$items['pages'] = new ArrayObject(array(__('Page'),true));
+}
+if ($core->plugins->moduleExists('tags')) {
+	if (count($tags_combo) > 1)
+		$items['tags'] = new ArrayObject(array(__('Tags'),true));
+}
+
+# --BEHAVIOR-- adminSimpleMenuAddType
+# Should add an item to $items[<id>] as an array(<label>,<optional step (true or false)>)
+$core->callBehavior('adminSimpleMenuAddType',$items);
+
+$items['special'] = new ArrayObject(array(__('User defined'),false));
+
+$items_combo = array();
+foreach ($items as $k => $v) {
+	$items_combo[$v[0]] = $k;
+}
+
+# Lecture menu existant
+$menu = $core->blog->settings->system->get('simpleMenu');
+$menu = @unserialize($menu);
+if (!is_array($menu)) {
+	$menu = array();
+}
+
+# Récupération paramètres postés
+$item_type = isset($_POST['item_type']) ? $_POST['item_type'] : '';
+$item_select = isset($_POST['item_select']) ? $_POST['item_select'] : '';
+$item_label = isset($_POST['item_label']) ? $_POST['item_label'] : '';
+$item_descr = isset($_POST['item_descr']) ? $_POST['item_descr'] : '';
+$item_url = isset($_POST['item_url']) ? $_POST['item_url'] : '';
+
+# Traitement
+$step = (!empty($_GET['add']) ? (integer) $_GET['add'] : 0);
+if (($step > 4) || ($step < 0)) $step = 0;
+if ($step) {
+
+	# Récupération libellés des choix
+	$item_type_label = isset($items[$item_type]) ? $items[$item_type][0] : '';
+
+	switch ($step) {
+		case 1:
+			// First step, menu item type to be selected
+			$item_type = $item_select = '';
+			break;
+		case 2:
+			if ($items[$item_type][1]) {
+				// Second step (optional), menu item sub-type to be selected
+				$item_select = '';
+				break;
+			}
+		case 3:
+			// Third step, menu item attributes to be changed or completed if necessary
+			$item_select_label = '';
+			$item_label = __('Label');
+			$item_descr = __('Description');
+			$item_url = $blog_url;
+			switch ($item_type) {
+				case 'home':
+					$item_label = __('Home');
+					$item_descr = __('Recent posts');
+					break;
+				case 'lang':
+					$item_select_label = array_search($item_select,$langs_combo);
+					$item_label = $item_select_label;
+					$item_descr = sprintf(__('Switch to %s language'),$item_select_label);
+					$item_url .= $core->url->getBase('lang').$item_select;
+					break;
+				case 'category':
+					$item_select_label = $categories_label[$item_select];
+					$item_label = $item_select_label;
+					$item_descr = __('Recent Posts from this category');
+					$item_url .= $core->url->getBase('category').'/'.$item_select;
+					break;
+				case 'archive':
+					$item_select_label = array_search($item_select,$months_combo);
+					if ($item_select == '-') {
+						$item_label = __('Archives');
+						$item_descr = $first_year.($first_year != $last_year ? ' - '.$last_year : '');
+						$item_url .= $core->url->getBase('archive');
+					} else {
+						$item_label = $item_select_label;
+						$item_descr = sprintf(__('Posts from %s'),$item_select_label);
+						$item_url .= $core->url->getBase('archive').'/'.substr($item_select,0,4).'/'.substr($item_select,-2);
+					}
+					break;
+				case 'pages':
+					$item_select_label = array_search($item_select,$pages_combo);
+					$item_label = $item_select_label;
+					$item_descr = '';
+					$item_url = html::stripHostURL($item_select);
+					break;
+				case 'tags':
+					$item_select_label = array_search($item_select,$tags_combo);
+					if ($item_select == '-') {
+						$item_label = __('All tags');
+						$item_descr = '';
+						$item_url .= $core->url->getBase('tags');
+					} else {
+						$item_label = $item_select_label;
+						$item_descr = sprintf(__('Recent posts for %s tag'),$item_select_label);
+						$item_url .= $core->url->getBase('tag').'/'.$item_select;
+					}
+					break;
+				case 'special':
+					break;
+				default:
+					# --BEHAVIOR-- adminSimpleMenuBeforeEdit
+					# Should modify if necessary $item_label, $item_descr and $item_url
+					# Should set if necessary $item_select_label (displayed on further admin step only)
+					$core->callBehavior('adminSimpleMenuBeforeEdit',$item_type,$item_select,
+						array(&$item_label,&$item_descr,&$item_url,&$item_select_label));
+					break;
+			}
+			break;
+		case 4:
+			// Fourth step, menu item to be added
+			try {
+				if (($item_label != '') && ($item_url != '')) 
+				{
+					// Add new item menu in menu array
+					$menu[] = array(
+						'label' => $item_label,
+						'descr' => $item_descr,
+						'url' => $item_url
+					);
+					// Save menu in blog settings
+					$core->blog->settings->system->put('simpleMenu',serialize($menu));
+					$core->blog->triggerBlog();
+				
+					// All done successfully, return to menu items list
+					http::redirect($p_url.'&added=1');
+				} else {
+					throw new Exception(__('Label and URL of menu item are mandatory.'));
+				}
+			}
+			catch (Exception $e) {
+				$core->error->add($e->getMessage());
+			}
+			break;
+	}
+} else {
+	
+	# Remove selected menu items
+	if (!empty($_POST['removeaction']))
+	{
+		try {
+	 		if (!empty($_POST['items_selected'])) {
+				foreach ($_POST['items_selected'] as $k => $v) {
+					$menu[$v]['label'] = '';
+				}
+				$newmenu = array();
+				foreach ($menu as $k => $v) {
+					if ($v['label']) {
+						$newmenu[] = array(
+							'label' => $v['label'],
+							'descr' => $v['descr'],
+							'url' => $v['url']);
+					}
+				}
+				$menu = $newmenu;
+				// Save menu in blog settings
+				$core->blog->settings->system->put('simpleMenu',serialize($menu));
+				$core->blog->triggerBlog();
+				
+				// All done successfully, return to menu items list
+				http::redirect($p_url.'&removed=1');
+			} else {
+				throw new Exception(__('No menu items selected.'));
+			}
+		}
+		catch (Exception $e) {
+			$core->error->add($e->getMessage());
+		}
+	}
+
+	# Update menu items
+	if (!empty($_POST['updateaction']))
+	{
+		try {
+			foreach ($_POST['items_label'] as $k => $v) {
+				if (!$v) throw new Exception(__('Label is mandatory.'));
+			}
+			foreach ($_POST['items_url'] as $k => $v) {
+				if (!$v) throw new Exception(__('URL is mandatory.'));
+			}
+			$newmenu = array();
+			for ($i = 0; $i < count($_POST['items_label']); $i++)
+			{
+				$newmenu[] = array(
+					'label' => $_POST['items_label'][$i],
+					'descr' => $_POST['items_descr'][$i],
+					'url' => $_POST['items_url'][$i]);
+			}
+			$menu = $newmenu;
+			// Save menu in blog settings
+			$core->blog->settings->system->put('simpleMenu',serialize($menu));
+			$core->blog->triggerBlog();
+
+			// All done successfully, return to menu items list
+			http::redirect($p_url.'&updated=1');
+		}
+		catch (Exception $e) {
+			$core->error->add($e->getMessage());
+		}
+	}
+	
+	# Order menu items
+	$order = array();
+	if (empty($_POST['im_order']) && !empty($_POST['order'])) {
+		$order = $_POST['order'];
+		asort($order);
+		$order = array_keys($order);
+	} elseif (!empty($_POST['im_order'])) {
+		$order = $_POST['im_order'];
+		if (substr($order,-1) == ',') {
+			$order = substr($order,0,strlen($order)-1);
+		}
+		$order = explode(',',$order);
+	}
+
+	if (!empty($_POST['updateaction']) && !empty($order))
+	{
+		try {
+			$newmenu = array();
+			foreach ($order as $i => $k) {
+				$newmenu[] = array(
+					'label' => $menu[$k]['label'],
+					'descr' => $menu[$k]['descr'],
+					'url' => $menu[$k]['url']);
+			}
+			$menu = $newmenu;
+			// Save menu in blog settings
+			$core->blog->settings->system->put('simpleMenu',serialize($menu));
+			$core->blog->triggerBlog();
+
+			// All done successfully, return to menu items list
+			http::redirect($p_url.'&neworder=1');
+		} 
+		catch (Exception $e) {
+			$core->error->add($e->getMessage());
+		}
+	}
+	
+}
+
+# Display
+?>
+
+<html>
+<head>
+	<title><?php echo $page_title; ?></title>
+	<?php
+		echo
+			dcPage::jsToolMan().
+			# --BEHAVIOR-- adminPageHeaders
+			$core->callBehavior('adminPageHeaders');
+	?>
+	<?php 
+		$core->auth->user_prefs->addWorkspace('accessibility'); 
+		$user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
+	?>
+	<?php if (!$user_dm_nodragdrop) : ?>
+	<script type="text/javascript">
+	//<![CDATA[
+
+	var dragsort = ToolMan.dragsort();
+	$(function() {
+		dragsort.makeTableSortable($("#menuitemslist").get(0),
+		dotclear.sortable.setHandle,dotclear.sortable.saveOrder);
+
+		$('.checkboxes-helpers').each(function() {
+			dotclear.checkboxesHelpers(this);
+		});
+	});
+
+	dotclear.sortable = {
+		setHandle: function(item) {
+			var handle = $(item).find('td.handle').get(0);
+			while (handle.firstChild) {
+				handle.removeChild(handle.firstChild);
+			}
+
+			item.toolManDragGroup.setHandle(handle);
+			handle.className = handle.className+' handler';
+		},
+
+		saveOrder: function(item) {
+			var group = item.toolManDragGroup;
+			var order = document.getElementById('im_order');
+			group.register('dragend', function() {
+				order.value = '';
+				items = item.parentNode.getElementsByTagName('tr');
+
+				for (var i=0; i<items.length; i++) {
+					order.value += items[i].id.substr(2)+',';
+				}
+			});
+		}
+	};
+	//]]>
+	</script>
+	<?php endif; ?>
+	<!--
+	<link rel="stylesheet" type="text/css" href="index.php?pf=simpleMenu/style.css" />
+	-->
+</head>
+
+<body>
+
+<?php
+
+if (!empty($_GET['added'])) {
+	echo '<p class="message">'.__('Menu item has been successfully added.').'</p>';
+}
+if (!empty($_GET['removed'])) {
+	echo '<p class="message">'.__('Menu items have been successfully removed.').'</p>';
+}
+if (!empty($_GET['neworder'])) {
+	echo '<p class="message">'.__('Menu items have been successfully updated.').'</p>';
+}
+if (!empty($_GET['updated'])) {
+	echo '<p class="message">'.__('Menu items have been successfully updated.').'</p>';
+}
+
+if ($step) 
+{
+	// Formulaire d'ajout d'un item
+	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <a href="'.$p_url.'">'.$page_title.'</a> &rsaquo; <span class="page-title">'.__('Add item').'</span></h2>';
+	
+	switch ($step) {
+		case 1:
+			// Selection du type d'item
+			echo '<form id="additem" action="'.$p_url.'&add=2" method="post">';
+			echo '<fieldset><legend>'.__('Select type').'</legend>';
+			echo '<p class="field"><label for"item_type" class="classic">'.__('Type of item menu:').'</label>'.form::combo('item_type',$items_combo,'').'</p>';
+			echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue…').'" />'.'</p>';
+			echo '</fieldset>';
+			echo '</form>';
+			break;
+		case 2:
+			if ($items[$item_type][1]) {
+				// Choix à faire
+				echo '<form id="additem" action="'.$p_url.'&add=3" method="post">';
+				echo '<fieldset><legend>'.$item_type_label.'</legend>';
+				switch ($item_type) {
+					case 'lang':
+						echo '<p class="field"><label for"item_select" class="classic">'.__('Select language:').'</label>'.
+							form::combo('item_select',$langs_combo,'');
+						break;
+					case 'category':
+						echo '<p class="field"><label for"item_select" class="classic">'.__('Select category:').'</label>'.
+							form::combo('item_select',$categories_combo,'');
+						break;
+					case 'archive':
+						echo '<p class="field"><label for"item_select" class="classic">'.__('Select month (if necessary):').'</label>'.
+							form::combo('item_select',$months_combo,'');
+						break;
+					case 'pages':
+						echo '<p class="field"><label for"item_select" class="classic">'.__('Select page:').'</label>'.
+							form::combo('item_select',$pages_combo,'');
+						break;
+					case 'tags':
+						echo '<p class="field"><label for"item_select" class="classic">'.__('Select tag (if necessary):').'</label>'.
+							form::combo('item_select',$tags_combo,'');
+						break;
+					default:
+						echo
+							# --BEHAVIOR-- adminSimpleMenuSelect
+							# Optional step once $item_type known : should provide a field using 'item_select' as id
+							$core->callBehavior('adminSimpleMenuSelect',$item_type,'item_select');
+				}
+				echo form::hidden('item_type',$item_type);
+				echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue…').'" /></p>';
+				echo '</fieldset>';
+				echo '</form>';
+				break;
+			}
+		case 3:
+			// Libellé et description
+			echo '<form id="additem" action="'.$p_url.'&add=4" method="post">';
+			echo '<fieldset><legend>'.$item_type_label.($item_select_label != '' ? ' ('.$item_select_label.')' : '').'</legend>';
+			echo '<p class="field"><label for"item_label" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
+				__('Label of item menu:').'</label>'.form::field('item_label',20,255,$item_label).'</p>';
+			echo '<p class="field"><label for"item_descr" class="classic">'.
+				__('Description of item menu:').'</label>'.form::field('item_descr',30,255,$item_descr).'</p>';
+			echo '<p class="field"><label for"item_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
+				__('URL of item menu:').'</label>'.form::field('item_url',40,255,$item_url).'</p>';
+			echo form::hidden('item_type',$item_type).form::hidden('item_select',$item_select);
+			echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Add this item').'" /></p>';
+			echo '</fieldset>';
+			echo '</form>';
+			break;
+	}
+}
+
+// Liste des items
+if (!$step) {
+	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.$page_title.'</span></h2>';
+}
+
+if (!$step) {
+	echo '<form id="menuitemsappend" action="'.$p_url.'&add=1" method="post">';
+	echo '<p>'.$core->formNonce().'<input class="add" type="submit" name="appendaction" value="'.__('Add an item').'" /></p>';
+	echo '</form>';
+}
+
+if (count($menu)) {
+	if (!$step) {
+		echo '<form id="menuitems" action="'.$p_url.'" method="post">';
+	}
+	// Entête table
+	echo 
+		'<table class="maximal dragable">'.
+		'<caption>'.__('Menu items list').'</caption>'.
+		'<thead>'.
+		'<tr>';
+	if (!$step) {
+		echo '<th scope="col"></th>';
+		echo '<th scope="col"></th>';
+	}
+	echo
+		'<th scope="col">'.__('Label').'</th>'.
+		'<th scope="col">'.__('Description').'</th>'.
+		'<th scope="col">'.__('URL').'</th>'.
+		'</tr>'.
+		'</thead>'.
+		'<tbody id="menuitemslist">';
+	$count = 0;
+	foreach ($menu as $i => $m) {
+		echo '<tr class="line" id="l_'.$i.'">';
+		if (!$step) {
+			$count++;
+			echo '<td class="handle minimal">'.form::field(array('order['.$i.']'),2,3,$count,'position','',false,'title="'.sprintf(__('position of %s'),__($m['label'])).'"').
+				form::hidden(array('dynorder[]','dynorder-'.$i),$i).'</td>';
+			echo '<td class="minimal">'.form::checkbox(array('items_selected[]','ims-'.$i),$i).'</td>';
+			echo '<td class="nowrap" scope="row">'.form::field(array('items_label[]','iml-'.$i),20,255,__($m['label'])).'</td>';
+			echo '<td class="nowrap">'.form::field(array('items_descr[]','imd-'.$i),30,255,__($m['descr'])).'</td>';
+			echo '<td class="nowrap">'.form::field(array('items_url[]','imu-'.$i),40,255,$m['url']).'</td>';
+		} else {
+			echo '<td class="nowrap" scope="row">'.__($m['label']).'</td>';
+			echo '<td class="nowrap">'.__($m['descr']).'</td>';
+			echo '<td class="nowrap">'.$m['url'].'</td>';
+		}
+		echo '</tr>';
+	}
+	echo '</tbody>'.
+		'</table>';
+	if (!$step) {
+		echo '<div class="two-cols">';
+		echo '<p class="col">'.form::hidden('im_order','').$core->formNonce();
+		echo '<input type="submit" name="updateaction" value="'.__('Update menu').'" />'.'</p>';
+		echo '<p class="col right">'.'<input type="submit" class="delete" name="removeaction" '.
+				'value="'.__('Delete selected menu items').'" '.
+				'onclick="return window.confirm(\''.html::escapeJS(__('Are you sure you want to remove selected menu items?')).'\');" />'.
+			'</p>';
+		echo '</div>';
+		echo '</form>';
+	}
+} else {
+	echo
+		'<p>'.__('Currently no menu items').'</p>';
+}
+
+dcPage::helpBlock('simpleMenu');
+?>
+
+</body>
+</html>
Index: plugins/simpleMenu/locales/en/help/help.html
===================================================================
--- plugins/simpleMenu/locales/en/help/help.html	(revision 553)
+++ plugins/simpleMenu/locales/en/help/help.html	(revision 553)
@@ -0,0 +1,31 @@
+<html>
+<head>
+  <title>Simple Menu</title>
+</head>
+
+<body>
+
+<h3>Simple Menu</h3>
+<p>Simple Menu allows you to display on your blog a single level menu, if your theme supports it.</p>
+<dl>
+  <dt>Menu items list</dt>
+  <dd>Here are displayed your menu items. 
+  You can reorder this list by dragging its items upwards or downwards. You can also modify label, description and URL of each item.
+  Once done, clic on "Update menu".</dd>
+    
+  <dt>Delete selected menu items</dt>
+  <dd>Allows you to delete menu items by checking the boxes next to each of them.</dd>
+  
+  <dt>Add a new menu item</dt>
+  <dd>First select the type of item. Then clic on "Continue…". Then, if necessary, you may have to define a sub-type (category, page, etc). If so, do it and clic on "Continue…". Then finally you can modify proposals done for label, description (not mandatory) and URL of the menu item. Once done, clic on "Add this item".</dd>
+  <dd>
+    <ul>
+      <li><strong>Label : </strong>Type here the anchor text. For example "Archives". This field is mandatory.</li>
+      <li><strong>Description : </strong>Type here a short description for the menu item (will be displayed under Label depending on theme selected). For example "Archives from 2004 to 2011".</li>
+      <li><strong>URL : </strong>Type here the item's destination. This field is mandatory.</li>
+	</ul>
+  </dd>
+
+</dl>
+</body>
+</html>
Index: plugins/simpleMenu/locales/en/resources.php
===================================================================
--- plugins/simpleMenu/locales/en/resources.php	(revision 553)
+++ plugins/simpleMenu/locales/en/resources.php	(revision 553)
@@ -0,0 +1,18 @@
+<?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 (!isset($__resources['help']['simpleMenu']))
+{
+	$__resources['help']['simpleMenu'] = dirname(__FILE__).'/help/help.html';
+}
+
+?>
Index: plugins/simpleMenu/locales/fr/help/help.html
===================================================================
--- plugins/simpleMenu/locales/fr/help/help.html	(revision 553)
+++ plugins/simpleMenu/locales/fr/help/help.html	(revision 553)
@@ -0,0 +1,31 @@
+<html>
+<head>
+  <title>Menu simple</title>
+</head>
+
+<body>
+
+<h3>Menu simple</h3>
+<p>Menu simple vous permet d’afficher un menu limité à un seul niveau sur votre blog, si votre thème le supporte.</p>
+<dl>
+  <dt>Liste des items de menu</dt>
+  <dd>Ici sont affichés les items de votre menu. 
+  Vous pouvez les ordonner en déplaçant les lignes vers le haut ou vers le bas. Vous pouvez également modifier le libellé, la description et l’URL de chacun des items.
+  Une fois terminé, cliquez sur « Mettre à jour le menu ».</dd>
+    
+  <dt>Supprimer les items de menu sélectionnés</dt>
+  <dd>Vous permet de supprimer les items de menu que vous souhaitez en cochant les cases pour chacun d’eux.</dd>
+  
+  <dt>Ajouter un item de menu</dt>
+  <dd>Tout d’abord sélectionnez le type d’item que vous désirez, puis cliquez sur « Continuer… ». Ensuite, si nécessaire, vous pouvez avoir à précisez votre choix (catégorie, page, etc). Dans ce cas, faites-le et cliquez sur « Continuer… ». Enfin vous pouvez modifier les propositions qui vous sont faites pour le libellé, la description (facultative) et l’URL de l’item de menu. Une fois effectué cliquer sur « Ajouter cet item ».</dd>
+  <dd>
+    <ul>
+      <li><strong>Libelllé : </strong>Indiquez ici le libellé. Par exemple "Archives". Ce champs est obligatoire.</li>
+      <li><strong>Description : </strong>Indiquez ici une courte description pour cet item (sera affiché sous le libellé en fonction du thème sélectionné). Par exemple "Archives de 2004 à 2011".</li>
+      <li><strong>URL : </strong>Indiquez ici la destination. Ce champs est obligatoire.</li>
+	</ul>
+  </dd>
+
+</dl>
+</body>
+</html>
Index: plugins/simpleMenu/locales/fr/main.po
===================================================================
--- plugins/simpleMenu/locales/fr/main.po	(revision 552)
+++ plugins/simpleMenu/locales/fr/main.po	(revision 552)
@@ -0,0 +1,125 @@
+msgid "Simple menu"
+msgstr "Menu simple"
+
+msgid "Simple menu for Dotclear"
+msgstr "Menu simple pour Dotclear"
+
+msgid "All months"
+msgstr "Tous les mois"
+
+msgid "Tags"
+msgstr "Mots-clés"
+
+msgid "User defined"
+msgstr "Saisie libre"
+
+msgid "Label"
+msgstr "Libellé"
+
+msgid "Description"
+msgstr "Description"
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Recent posts"
+msgstr "Billets récents"
+
+msgid "Switch to %s language"
+msgstr "Basculer vers le %s"
+
+msgid "Recent Posts from this category"
+msgstr "Billets récents de cette catégorie"
+
+msgid "Archives"
+msgstr "Archives"
+
+msgid "Posts from %s"
+msgstr "Billets de %s"
+
+msgid "All tags"
+msgstr "Tous les mots clés"
+
+msgid "Recent posts for %s tag"
+msgstr "Billets récent pour le mot-clé %s"
+
+msgid "Label and URL of menu item are mandatory."
+msgstr "Les libellés et URL sont obligatoires."
+
+msgid "No menu items selected."
+msgstr "Aucun item de menu sélectionné."
+
+msgid "Label is mandatory."
+msgstr "Le libellé est obligatoire."
+
+msgid "URL is mandatory."
+msgstr "l’URL est obligatoire."
+
+msgid "Menu item has been successfully added."
+msgstr "L'item de menu a été ajouté avec succès."
+
+msgid "Menu items have been successfully removed."
+msgstr "Le ou les items de menu ont été supprimés avec succès."
+
+msgid "Menu items have been successfully updated."
+msgstr "Le ou les items de menu ont été mis à jour avec succès."
+
+msgid "Add item"
+msgstr "Ajouter un item de menu"
+
+msgid "Select type"
+msgstr "Sélection du type"
+
+msgid "Type of item menu:"
+msgstr "Type d'item de menu :"
+
+msgid "Continue…"
+msgstr "Continuer…"
+
+msgid "Select language:"
+msgstr "Sélectionnez la langue :"
+
+msgid "Select category:"
+msgstr "Sélectionnez la catégorie :"
+
+msgid "Select month (if necessary):"
+msgstr "Sélectionnez le mois (si nécessaire) :"
+
+msgid "Select page:"
+msgstr "Sélectionnez la page :"
+
+msgid "Select tag (if necessary):"
+msgstr "Sélectionnez le mot clé (si nécessaire) :"
+
+msgid "Label of item menu:"
+msgstr "Libellé de l'item de menu :"
+
+msgid "Description of item menu:"
+msgstr "Description de l'item de menu :"
+
+msgid "URL of item menu:"
+msgstr "URL de l'item de menu :"
+
+msgid "Add this item"
+msgstr "Ajouter cet item"
+
+msgid "Menu items list"
+msgstr "Liste des items de menu"
+
+msgid "position of %s"
+msgstr "position de %s"
+
+msgid "Currently no menu items"
+msgstr "Aucun item de menu pour l'instant"
+
+msgid "Add an item"
+msgstr "Ajouter un item de menu"
+
+msgid "Update menu"
+msgstr "Mettre à jour le menu"
+
+msgid "Delete selected menu items"
+msgstr "Supprimer les items de menu sélectionnés"
+
+msgid "Are you sure you want to remove selected menu items?"
+msgstr "Êtes-vous sûr de vouloir supprimer les items de menu sélectionnés ?"
Index: plugins/simpleMenu/locales/fr/resources.php
===================================================================
--- plugins/simpleMenu/locales/fr/resources.php	(revision 553)
+++ plugins/simpleMenu/locales/fr/resources.php	(revision 553)
@@ -0,0 +1,18 @@
+<?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 (!isset($__resources['help']['simpleMenu']))
+{
+	$__resources['help']['simpleMenu'] = dirname(__FILE__).'/help/help.html';
+}
+
+?>
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 270)
+++ plugins/tags/_admin.php	(revision 720)
@@ -31,5 +31,5 @@
 
 $core->addBehavior('adminPreferencesForm',array('tagsBehaviors','adminUserForm'));
-$core->addBehavior('adminUserForm',array('tagsBehaviors','adminUserForm'));
+// $core->addBehavior('adminUserForm',array('tagsBehaviors','adminUserForm'));
 
 $core->addBehavior('adminBeforeUserCreate',array('tagsBehaviors','setTagListFormat'));
@@ -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));
@@ -82,5 +82,5 @@
 		echo
 		'<h3><label for="post_tags">'.__('Tags:').'</label></h3>'.
-		'<div class="p" id="tags-edit">'.form::textarea('post_tags',20,3,$value,'maximal',3).'</div>';
+		'<div class="p" id="tags-edit">'.form::textarea('post_tags',20,3,$value,'maximal').'</div>';
 	}
 	
@@ -227,5 +227,5 @@
 		{
 			echo
-			'<h2>'.__('Add tags to entries').'</h2>'.
+			'<h2 class="page-title">'.__('Add tags to entries').'</h2>'.
 			'<form action="posts_actions.php" method="post">'.
 			'<div><label for="new_tags" class="area">'.__('Tags to add:').'</label> '.
@@ -257,5 +257,5 @@
 			}
 			
-			echo '<h2>'.__('Remove selected tags from entries').'</h2>';
+			echo '<h2 class="page-title">'.__('Remove selected tags from entries').'</h2>';
 			
 			if (empty($tags)) {
Index: plugins/tags/_define.php
===================================================================
--- plugins/tags/_define.php	(revision 270)
+++ plugins/tags/_define.php	(revision 464)
@@ -17,5 +17,7 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	/* Permissions */		'usage,contentadmin'
+	array(
+		'permissions' =>	'usage,contentadmin'
+	)
 );
 ?>
Index: plugins/tags/_public.php
===================================================================
--- plugins/tags/_public.php	(revision 270)
+++ plugins/tags/_public.php	(revision 413)
@@ -44,4 +44,6 @@
 
 $core->addBehavior('templateBeforeBlock',array('behaviorsTags','templateBeforeBlock'));
+$core->addBehavior('tplSysIfConditions',array('behaviorsTags','tplSysIfConditions'));
+$core->addBehavior('publicBeforeDocument',array('behaviorsTags','addTplPath'));
 
 class behaviorsTags
@@ -70,4 +72,22 @@
 		}
 	}
+	
+	public static function tplIfConditions($tag, $attr,$content,$if)
+	{
+		if ($tag == 'Sys' && isset($attr['has_tag'])) {
+			$sign = '';
+			if (substr($attr['has_tag'],0,1) == '!') {
+				$sign = '!';
+				$attr['has_tag'] = substr($attr['has_tag'],1);
+			}
+			$if[] =  $sign."(\$core->tpl->tagExists('".addslashes($attr['has_tag'])."') )";
+		}
+	}
+	
+	public static function addTplPath($core)
+	{
+		$core->tpl->setPath($core->tpl->getPath(), dirname(__FILE__).'/default-templates');
+	}
+
 }
 
Index: plugins/tags/default-templates/tag.html
===================================================================
--- plugins/tags/default-templates/tag.html	(revision 413)
+++ plugins/tags/default-templates/tag.html	(revision 413)
@@ -0,0 +1,153 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+  <meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
+  
+  <title>{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
+  <meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+  <meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+  <meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+  
+  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+  <meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
+  <meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+  <meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+  <meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+  <meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+  <meta name="dc.type" content="text" />
+  <meta name="dc.format" content="text/html" />
+  
+  <link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+  <link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+  
+  <tpl:Entries no_content="1">
+    <tpl:EntriesHeader>
+      <tpl:Pagination>
+        <tpl:PaginationIf end="0">
+        <link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
+        </tpl:PaginationIf>
+        
+        <tpl:PaginationIf start="0">
+        <link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
+        </tpl:PaginationIf>
+      </tpl:Pagination>
+    </tpl:EntriesHeader>
+    
+    <link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
+  </tpl:Entries>
+  
+  <link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:TagFeedURL type="atom"}}" />
+  <link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
+  
+  {{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-tag">
+<div id="page">
+{{tpl:include src="_top.html"}}
+
+<div id="wrapper">
+
+<div id="main">
+  <div id="content">
+  
+  <div id="content-info">
+    <h2>{{tpl:lang Tag}} - {{tpl:TagID}}</h2>
+    
+    <p><a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}"
+    title="{{tpl:lang This tag's entries Atom feed}}" class="feed">{{tpl:lang Entries feed}}</a>
+    
+    <tpl:SysIf operator="or" comments_active="1" pings_active="1">
+    - <a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}/comments"
+    title="{{tpl:lang This tag's comments Atom feed}}" class="feed">{{tpl:lang Comments feed}}</a>
+    </tpl:SysIf>
+    </p>
+  </div>
+  
+  <tpl:Entries>
+    <div id="p{{tpl:EntryID}}" class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}}" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}">
+    <!-- # New day date -->
+    <tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader>
+    
+    <h2 class="post-title"><a
+    href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
+    
+    <p class="post-info">{{tpl:lang By}} {{tpl:EntryAuthorLink}}
+    {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
+    <tpl:EntryIf has_category="1">
+    - <a href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a>
+    </tpl:EntryIf>
+    </p>
+    
+    <tpl:EntryTags>
+    <tpl:TagsHeader><ul class="post-tags"></tpl:TagsHeader>
+    <li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li>
+    <tpl:TagsFooter></ul></tpl:TagsFooter>
+    </tpl:EntryTags>
+    
+    <!-- # --BEHAVIOR-- publicEntryBeforeContent -->
+    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
+    
+    <!-- # Entry with an excerpt -->
+    <tpl:EntryIf extended="1">
+      <div class="post-content">{{tpl:EntryExcerpt}}</div>
+      <p class="read-it"><a href="{{tpl:EntryURL}}"
+      title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue
+      reading}}</a>...</p>
+    </tpl:EntryIf>
+    
+    <!-- # Entry without excerpt -->
+    <tpl:EntryIf extended="0">
+      <div class="post-content">{{tpl:EntryContent}}</div>
+    </tpl:EntryIf>
+    
+    <!-- # --BEHAVIOR-- publicEntryAfterContent -->
+    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}
+    
+    <!-- # Number of comments, trackbacks and attachments -->
+    <tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+      <p class="post-info-co">
+    </tpl:EntryIf>
+    <tpl:EntryIf show_comments="1">
+      <a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
+    </tpl:EntryIf>
+    <tpl:EntryIf show_pings="1">
+      <a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
+    <tpl:EntryIf has_attachment="1">
+      <a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
+    <tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+      </p>
+    </tpl:EntryIf>
+    </div>
+    
+    <tpl:EntriesFooter>
+      <tpl:Pagination>
+        <p class="pagination"><tpl:PaginationIf end="0"><a href="{{tpl:PaginationURL offset="+1"}}" class="prev">&#171;
+        {{tpl:lang previous entries}}</a> - </tpl:PaginationIf>
+        {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
+        <tpl:PaginationIf start="0"> - <a href="{{tpl:PaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}}
+        &#187;</a></tpl:PaginationIf></p>
+      </tpl:Pagination>
+    </tpl:EntriesFooter>
+  </tpl:Entries>
+  </div>
+</div> <!-- End #main -->
+
+<div id="sidebar">
+  <div id="blognav">
+    {{tpl:Widgets type="nav"}}
+  </div> <!-- End #blognav -->
+  
+  <div id="blogextra">
+    {{tpl:Widgets type="extra"}}
+  </div> <!-- End #blogextra -->
+</div>
+
+</div> <!-- End #wrapper -->
+
+{{tpl:include src="_footer.html"}}
+</div> <!-- End #page -->
+</body>
+</html>
Index: plugins/tags/default-templates/tags.html
===================================================================
--- plugins/tags/default-templates/tags.html	(revision 413)
+++ plugins/tags/default-templates/tags.html	(revision 413)
@@ -0,0 +1,69 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+  <meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
+  
+  <title>{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}</title>
+  <meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+  <meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+  <meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+  
+  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+  <meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}" />
+  <meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+  <meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+  <meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+  <meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+  <meta name="dc.type" content="text" />
+  <meta name="dc.format" content="text/html" />
+  
+  <link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+  <link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+  
+  <link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
+  
+  {{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-tags">
+<div id="page">
+{{tpl:include src="_top.html"}}
+
+<div id="wrapper">
+
+<div id="main">
+  <div id="content">
+  
+  <div id="content-info">
+    <h2>{{tpl:lang Tags}}</h2>
+  </div>
+  
+  <div class="content-inner">  
+  <ul class="tags">
+    <tpl:Tags>
+      <li><a href="{{tpl:TagURL}}" class="tag{{tpl:TagRoundPercent}}">{{tpl:TagID}}</a></li>
+    </tpl:Tags>
+    </ul>
+  </div>
+  
+  </div>
+</div> <!-- End #main -->
+
+<div id="sidebar">
+  <div id="blognav">
+    {{tpl:Widgets type="nav"}}
+  </div> <!-- End #blognav -->
+  
+  <div id="blogextra">
+    {{tpl:Widgets type="extra"}}
+  </div> <!-- End #blogextra -->
+</div>
+
+</div> <!-- End #wrapper -->
+
+{{tpl:include src="_footer.html"}}
+</div> <!-- End #page -->
+</body>
+</html>
Index: plugins/tags/tag_posts.php
===================================================================
--- plugins/tags/tag_posts.php	(revision 270)
+++ plugins/tags/tag_posts.php	(revision 711)
@@ -93,5 +93,5 @@
 <html>
 <head>
-  <title>Tags</title>
+  <title><?php echo __('Tags'); ?></title>
   <link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />
   <script type="text/javascript" src="js/_posts_list.js"></script>
@@ -110,5 +110,5 @@
 
 <h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo;
-<?php echo __('Edit tag'); ?></h2>
+<span class="page-title"><?php echo __('Edit tag').' &ldquo;'.html::escapeHTML($tag).'&rdquo;'; ?></span></h2>
 
 <?php
@@ -125,12 +125,24 @@
 		echo
 		'<form action="'.$this_url.'" method="post">'.
-		'<p><label for="new_tag_id" class="classic">'.__('Rename this tag:').' '.
+		'<div class="fieldset"><h3>'.__('Actions for this tag').'</h3>'.
+		'<p><label for="new_tag_id">'.__('Edit tag name:').'</label>'.
 		form::field('new_tag_id',20,255,html::escapeHTML($tag)).
-		'</label> <input type="submit" value="'.__('Save').'" />'.
-		$core->formNonce().'</p>'.
+		'<input type="submit" value="'.__('Rename').'" />'.
+		$core->formNonce().
 		'</form>';
+		# Remove tag
+		if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) {
+			echo
+			'<form id="tag_delete" action="'.$this_url.'" method="post">'.
+			'<p class="no-margin">'.__('Delete this tag:').'</p>'.
+			'<input type="submit" class="delete" name="delete" value="'.__('Delete').'" />'.
+			$core->formNonce().
+			'</form>';
+		}
+		echo '</p></div>';
 	}
 	
 	# Show posts
+	echo '<h3>'.__('List of entries with this tag').'</h3>';
 	$post_list->display($page,$nb_per_page,
 	'<form action="posts_actions.php" method="post" id="form-entries">'.
@@ -150,13 +162,4 @@
 	'</div>'.
 	'</form>');
-	
-	# Remove tag
-	if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) {
-		echo
-		'<form id="tag_delete" action="'.$this_url.'" method="post">'.
-		'<p><input type="submit" class="delete" name="delete" value="'.__('Delete this tag').'" />'.
-		$core->formNonce().'</p>'.
-		'</form>';
-	}
 }
 ?>
Index: plugins/tags/tags.php
===================================================================
--- plugins/tags/tags.php	(revision 270)
+++ plugins/tags/tags.php	(revision 711)
@@ -15,5 +15,5 @@
 <html>
 <head>
-  <title>Tags</title>
+  <title><?php echo __('Tags'); ?></title>
   <link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />
 </head>
@@ -21,5 +21,5 @@
 <body>
 <h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo;
-<?php echo __('Tags'); ?></h2>
+<span class="page-title"><?php echo __('Tags'); ?></span></h2>
 
 <?php
Index: plugins/themeEditor/_define.php
===================================================================
--- plugins/themeEditor/_define.php	(revision 270)
+++ plugins/themeEditor/_define.php	(revision 464)
@@ -16,6 +16,5 @@
 	/* Description*/		"Theme Editor",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'0.9',
-	/* Permissions */		null
+	/* Version */			'0.9'
 );
 ?>
Index: plugins/themeEditor/index.php
===================================================================
--- plugins/themeEditor/index.php	(revision 270)
+++ plugins/themeEditor/index.php	(revision 500)
@@ -69,5 +69,5 @@
 <body>
 <?php echo '<h2>'.html::escapeHTML($core->blog->name).
-' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; '.__('Theme Editor').'</h2>'; ?>
+' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Theme Editor').'</span></h2>'; ?>
 
 <p><strong><?php echo sprintf(__('Your current theme on this blog is "%s".'),html::escapeHTML($T['name'])); ?></strong></p>
Index: plugins/userPref/_define.php
===================================================================
--- plugins/userPref/_define.php	(revision 3)
+++ plugins/userPref/_define.php	(revision 589)
@@ -16,6 +16,5 @@
 	/* Description*/		"Manage every user preference directive",
 	/* Author */			"Franck Paul",
-	/* Version */			'0.1',
-	/* Permissions */		null
+	/* Version */			'0.2'
 );
 ?>
Index: plugins/userPref/index.php
===================================================================
--- plugins/userPref/index.php	(revision 270)
+++ plugins/userPref/index.php	(revision 589)
@@ -12,4 +12,14 @@
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
 
+# Local navigation
+if (!empty($_POST['gp_nav'])) {
+	http::redirect($p_url.$_POST['gp_nav']);
+	exit;
+}
+if (!empty($_POST['lp_nav'])) {
+	http::redirect($p_url.$_POST['lp_nav']);
+	exit;
+}
+
 # Local prefs update
 if (!empty($_POST['s']) && is_array($_POST['s']))
@@ -72,5 +82,5 @@
 	return
 	'<tr>'.
-	'<td><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
+	'<td scope="raw"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
 	'<td>'.$field.'</td>'.
 	'<td>'.$s['type'].'</td>'.
@@ -84,6 +94,22 @@
   <?php echo dcPage::jsPageTabs($part); ?>
   <style type="text/css">
-  .ns-name { background: #ccc; color: #000; padding-top: 0.3em; padding-bottom: 0.3em; font-size: 1.1em; }
+	table.prefs { border: 1px solid #999; margin-bottom: 2em; }
+	table.prefs th { background: #f5f5f5; color: #444; padding-top: 0.3em; padding-bottom: 0.3em; }
+	p.anchor-nav {float: right; }
   </style>
+	<script type="text/javascript">
+	//<![CDATA[
+	$(function() {
+		$("#gp_submit").hide();
+		$("#lp_submit").hide();
+		$("#gp_nav").change(function() {
+			window.location = $("#gp_nav option:selected").val();
+		})
+		$("#lp_nav").change(function() {
+			window.location = $("#lp_nav option:selected").val();
+		})
+	});
+	//]]>
+	</script>
 </head>
 
@@ -98,18 +124,22 @@
 }
 ?>
-<h2><?php echo html::escapeHTML($core->auth->userID()); ?> &rsaquo; user:preferences</h2>
+<h2><?php echo html::escapeHTML($core->auth->userID()); ?> &rsaquo; <span class="page-title">user:preferences</span></h2>
 
 <div id="local" class="multi-part" title="<?php echo __('user preferences'); ?>">
-<form action="plugin.php" method="post">
-<table>
-<tr>
-  <th class="nowrap">Pref ID</th>
-  <th><?php echo __('Value'); ?></th>
-  <th><?php echo __('Type'); ?></th>
-  <th class="maximal"><?php echo __('Description'); ?></th>
-</tr>
-<?php
+
+<?php 
+$table_header = '<table class="prefs" id="%s"><caption>%s</caption>'.
+'<thead>'.
+'<tr>'."\n".
+'  <th class="nowrap">Setting ID</th>'."\n".
+'  <th>'.__('Value').'</th>'."\n".
+'  <th>'.__('Type').'</th>'."\n".
+'  <th class="maximalx">'.__('Description').'</th>'."\n".
+'</tr>'."\n".
+'</thead>'."\n".
+'<tbody>';
+$table_footer = '</tbody></table>';
+
 $prefs = array();
-
 foreach ($core->auth->user_prefs->dumpWorkspaces() as $ws => $workspace) {
 	foreach ($workspace->dumpPrefs() as $k => $v) {
@@ -117,19 +147,35 @@
 	}
 }
-
 ksort($prefs);
-
+if (count($prefs) > 0) {
+	$ws_combo = array();
+	foreach ($prefs as $ws => $s) {
+		$ws_combo[$ws] = '#l_'.$ws;
+	}
+	echo 
+		'<form action="plugin.php" method="post">'.
+		'<p class="anchor-nav">'.
+		'<label for="lp_nav" class="classic">'.__('Goto:').'</label> '.form::combo('lp_nav',$ws_combo).
+		' <input type="submit" value="'.__('Ok').'" id="lp_submit" />'.
+		'<input type="hidden" name="p" value="aboutConfig" />'.
+		$core->formNonce().'</p></form>';
+}
+?>
+
+<form action="plugin.php" method="post">
+
+<?php
 foreach ($prefs as $ws => $s)
 {
 	ksort($s);
-	echo '<tr><td colspan="4" class="ws-name">workspace: <strong>'.$ws.'</strong></td></tr>';
-	
+	echo sprintf($table_header,'l_'.$ws,$ws);
 	foreach ($s as $k => $v)
 	{
 		echo prefLine($k,$v,$ws,'s',!$v['global']);
 	}
-}
-?>
-</table>
+	echo $table_footer;
+}
+?>
+
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="userPref" />
@@ -139,12 +185,5 @@
 
 <div id="global" class="multi-part" title="<?php echo __('global preferences'); ?>">
-<form action="plugin.php" method="post">
-<table>
-<tr>
-  <th class="nowrap">Pref ID</th>
-  <th><?php echo __('Value'); ?></th>
-  <th><?php echo __('Type'); ?></th>
-  <th class="maximal"><?php echo __('Description'); ?></th>
-</tr>
+
 <?php
 $prefs = array();
@@ -158,16 +197,34 @@
 ksort($prefs);
 
+if (count($prefs) > 0) {
+	$ws_combo = array();
+	foreach ($prefs as $ws => $s) {
+		$ws_combo[$ws] = '#g_'.$ws;
+	}
+	echo 
+		'<form action="plugin.php" method="post">'.
+		'<p class="anchor-nav">'.
+		'<label for="gp_nav" class="classic">'.__('Goto:').'</label> '.form::combo('gp_nav',$ws_combo).
+		' <input type="submit" value="'.__('Ok').'" id="gp_submit" />'.
+		'<input type="hidden" name="p" value="aboutConfig" />'.
+		$core->formNonce().'</p></form>';
+}
+?>
+
+<form action="plugin.php" method="post">
+
+<?php
 foreach ($prefs as $ws => $s)
 {
 	ksort($s);
-	echo '<tr><td colspan="4" class="ws-name">workspace: <strong>'.$ws.'</strong></td></tr>';
-	
+	echo sprintf($table_header,'g_'.$ws,$ws);
 	foreach ($s as $k => $v)
 	{
 		echo prefLine($k,$v,$ws,'gs',false);
 	}
-}
-?>
-</table>
+	echo $table_footer;
+}
+?>
+
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="userPref" />
Index: plugins/widgets/_admin.php
===================================================================
--- plugins/widgets/_admin.php	(revision 270)
+++ plugins/widgets/_admin.php	(revision 324)
@@ -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: plugins/widgets/_default_widgets.php
===================================================================
--- plugins/widgets/_default_widgets.php	(revision 270)
+++ plugins/widgets/_default_widgets.php	(revision 665)
@@ -79,5 +79,5 @@
 # Default widgets
 global $__default_widgets;
-$__default_widgets = array('nav'=> new dcWidgets(), 'extra'=> new dcWidgets());
+$__default_widgets = array('nav'=> new dcWidgets(), 'extra'=> new dcWidgets(), 'custom'=> new dcWidgets());
 
 $__default_widgets['nav']->append($__widgets->search);
Index: plugins/widgets/_define.php
===================================================================
--- plugins/widgets/_define.php	(revision 270)
+++ plugins/widgets/_define.php	(revision 665)
@@ -15,8 +15,10 @@
 	/* Name */			"Widgets",
 	/* Description*/		"Widgets for your blog sidebars",
-	/* Author */			"Olivier Meunier",
-	/* Version */			'2',
-	/* Permissions */		'admin',
-	/* Priority */			1000000000
+	/* Author */			"Olivier Meunier & Dotclear Team",
+	/* Version */			'3',
+	array(
+		'permissions' =>	'admin',
+		'priority' =>		1000000000
+	)
 );
 ?>
Index: plugins/widgets/_install.php
===================================================================
--- plugins/widgets/_install.php	(revision 270)
+++ plugins/widgets/_install.php	(revision 665)
@@ -31,4 +31,9 @@
 	$settings->widgets->put('widgets_extra','','string','Extra widgets',false);
 }
+if ($settings->widgets->widgets_custom != null) {
+	$settings->widgets->put('widgets_custom',dcWidgets::load($settings->widgets->widgets_custom)->store());
+} else {
+	$settings->widgets->put('widgets_custom','','string','Custom widgets',false);
+}
 $core->setVersion('widgets',$version);
 return true;
Index: plugins/widgets/_public.php
===================================================================
--- plugins/widgets/_public.php	(revision 270)
+++ plugins/widgets/_public.php	(revision 671)
@@ -36,4 +36,5 @@
 	{
 		$wtype = 'widgets_'.$type;
+		$GLOBALS['core']->blog->settings->addNameSpace('widgets');
 		$widgets = $GLOBALS['core']->blog->settings->widgets->{$wtype};
 		
Index: plugins/widgets/_widgets_functions.php
===================================================================
--- plugins/widgets/_widgets_functions.php	(revision 270)
+++ plugins/widgets/_widgets_functions.php	(revision 475)
@@ -94,5 +94,5 @@
 			$rs->cat_url.'">'.
 			html::escapeHTML($rs->cat_title).'</a>'.
-			($w->postcount ? ' ('.$rs->nb_post.')' : '');
+			($w->postcount ? ' <span>('.$rs->nb_post.')</span>' : '');
 			
 			
Index: plugins/widgets/index.php
===================================================================
--- plugins/widgets/index.php	(revision 270)
+++ plugins/widgets/index.php	(revision 683)
@@ -14,5 +14,5 @@
 include dirname(__FILE__).'/_default_widgets.php';
 
-# Loading navigation and extra widgets
+# Loading navigation, extra widgets and custom widgets
 $widgets_nav = null;
 if ($core->blog->settings->widgets->widgets_nav) {
@@ -23,9 +23,14 @@
 	$widgets_extra = dcWidgets::load($core->blog->settings->widgets->widgets_extra);
 }
+$widgets_custom = null;
+if ($core->blog->settings->widgets->widgets_custom) {
+	$widgets_custom = dcWidgets::load($core->blog->settings->widgets->widgets_custom);
+}
 
 $append_combo = array(
 	'-' => 0,
 	__('navigation') => 'nav',
-	__('extra') => 'extra'
+	__('extra') => 'extra',
+	__('custom') => 'custom'
 );
 
@@ -36,5 +41,5 @@
 	$addw = array();
 	foreach ($_POST['addw'] as $k => $v) {
-		if (($v == 'extra' || $v == 'nav') && $__widgets->{$k} !== null ) {
+		if (($v == 'extra' || $v == 'nav' || $v == 'custom') && $__widgets->{$k} !== null ) {
 			$addw[$k] = $v;
 		}
@@ -49,4 +54,7 @@
 		if (!($widgets_extra instanceof dcWidgets)) {
 			$widgets_extra = new dcWidgets();
+		}
+		if (!($widgets_custom instanceof dcWidgets)) {
+			$widgets_custom = new dcWidgets();
 		}
 		
@@ -60,5 +68,7 @@
 					$widgets_extra->append($__widgets->{$k});
 					break;
-				
+				case 'custom':
+					$widgets_custom->append($__widgets->{$k});
+					break;
 			}
 		}
@@ -68,4 +78,5 @@
 			$core->blog->settings->widgets->put('widgets_nav',$widgets_nav->store());
 			$core->blog->settings->widgets->put('widgets_extra',$widgets_extra->store());
+			$core->blog->settings->widgets->put('widgets_custom',$widgets_custom->store());
 			$core->blog->triggerBlog();
 			http::redirect($p_url);
@@ -101,11 +112,16 @@
 			$_POST['w']['extra'] = array();
 		}
+		if (!isset($_POST['w']['custom'])) {
+			$_POST['w']['custom'] = array();
+		}
 		
 		$widgets_nav = dcWidgets::loadArray($_POST['w']['nav'],$__widgets);
 		$widgets_extra = dcWidgets::loadArray($_POST['w']['extra'],$__widgets);
+		$widgets_custom = dcWidgets::loadArray($_POST['w']['custom'],$__widgets);
 		
 		$core->blog->settings->addNamespace('widgets');
 		$core->blog->settings->widgets->put('widgets_nav',$widgets_nav->store());
 		$core->blog->settings->widgets->put('widgets_extra',$widgets_extra->store());
+		$core->blog->settings->widgets->put('widgets_custom',$widgets_custom->store());
 		$core->blog->triggerBlog();
 		
@@ -124,4 +140,5 @@
 		$core->blog->settings->widgets->put('widgets_nav','');
 		$core->blog->settings->widgets->put('widgets_extra','');
+		$core->blog->settings->widgets->put('widgets_custom','');
 		$core->blog->triggerBlog();
 		
@@ -163,5 +180,5 @@
 <body>
 <?php
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Widgets').'</h2>';
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Widgets').'</span></h2>';
 
 # All widgets
@@ -187,5 +204,5 @@
 '</div>'.
 '</fieldset>'.
-'<p><input type="submit" class="js-remove" name="append" value="'.__('add widgets to sidebars').'" />'.
+'<p><input type="submit" class="js-remove" name="append" value="'.__('Add widgets to sidebars').'" />'.
 $core->formNonce().'</p>'.
 '</form>';
@@ -204,9 +221,15 @@
 '</div>';
 
+# Custom sidebar
+echo
+'<div id="sidebarCustom" class="widgets">'.
+sidebarWidgets('dndcustom',__('Custom sidebar'),$widgets_custom,'custom',$__default_widgets['custom'],$j).
+'</div>';
+
 echo
 '<p id="sidebarsControl">'.
 $core->formNonce().
-'<input type="submit" name="wup" value="'.__('update sidebars').'" /> '.
-'<input type="submit" class="reset" name="wreset" value="'.__('reset sidebars').'" /></p>'.
+'<input type="submit" name="wup" value="'.__('Update sidebars').'" /> '.
+'<input type="submit" class="reset" name="wreset" value="'.__('Reset sidebars').'" /></p>'.
 '</form>';
 
Index: plugins/widgets/style.css
===================================================================
--- plugins/widgets/style.css	(revision 3)
+++ plugins/widgets/style.css	(revision 665)
@@ -18,4 +18,8 @@
 	width: 49%;
 	margin-left: 1%;
+}
+#sidebarCustom {
+	float: left;
+	width: 100%;
 }
 
Index: plugins/widgets/widgets.js
===================================================================
--- plugins/widgets/widgets.js	(revision 0)
+++ plugins/widgets/widgets.js	(revision 665)
@@ -10,7 +10,9 @@
 	var w_nav = document.getElementById('dndnav');
 	var w_ext = document.getElementById('dndextra');
+	var w_custom = document.getElementById('dndcustom');
 	
 	w_nav.className = 'hideControls';
 	w_ext.className = 'hideControls';
+	w_custom.className = 'hideControls';
 	
 	removeElements(document.getElementById('listWidgets'),'input');
@@ -18,9 +20,12 @@
 	removeElements(w_nav,'p');
 	removeElements(w_ext,'p');
+	removeElements(w_custom,'p');
 	hideElements(w_nav,'input');
 	hideElements(w_ext,'input');
+	hideElements(w_custom,'input');
 	
 	configControls(w_nav);
 	configControls(w_ext);
+	configControls(w_custom);
 	
 	dragdrop.makeListContainer(widgets,'div',setHandle);
@@ -30,4 +35,6 @@
 	dragdrop.makeListContainer(w_ext,'div',setHandle);
 	w_ext.onDragEnd = extraDragEnd;
+	dragdrop.makeListContainer(w_custom,'div',setHandle);
+	w_custom.onDragEnd = customDragEnd;
 	
 	// Helper to remove some elements
@@ -61,4 +68,9 @@
 	function extraDragEnd() {
 		formControls(this.parentNode,'extra');
+		configControls(this.parentNode);
+		removeEmptyMsg(this.parentNode);
+	}
+	function customDragEnd() {
+		formControls(this.parentNode,'custom');
 		configControls(this.parentNode);
 		removeEmptyMsg(this.parentNode);
Index: themes/ductile/_config.php
===================================================================
--- themes/ductile/_config.php	(revision 683)
+++ themes/ductile/_config.php	(revision 683)
@@ -0,0 +1,635 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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.'/admin');
+
+$img_url = $core->blog->settings->system->themes_url.'/'.$core->blog->settings->system->theme.'/img/';
+$img_url = http::concatURL($core->blog->url,$img_url);
+$img_path = dirname(__FILE__).'/img/';
+
+$tpl_path = dirname(__FILE__).'/tpl/';
+
+$standalone_config = (boolean) $core->themes->moduleInfo($core->blog->settings->system->theme,'standalone_config');
+
+$list_types = array(
+	__('Title') => 'title',
+	__('Short') => 'short',
+	__('Full') => 'full'
+);
+// Get all _entry-*.html in tpl folder of theme
+$list_types_templates = files::scandir($tpl_path);
+if (is_array($list_types_templates)) {
+	foreach ($list_types_templates as $v) {
+		if (preg_match('/^_entry\-(.*)\.html$/',$v,$m)) {
+			if (isset($m[1])) {
+				if (!in_array($m[1],$list_types)) {
+					// template not already in full list
+					$list_types[__($m[1])] = $m[1];
+				}
+			}
+		}
+	}
+}
+
+
+
+$contexts = array(
+	'default' => __('Home (first page)'),
+	'default-page' => __('Home (other pages)'),
+	'category' => __('Entries for a category'),
+	'tag' => __('Entries for a tag'),
+	'search' => __('Search result entries'),
+	'archive' => __('Month archive entries')
+);
+
+$fonts = array(
+	__('default') => '',
+	__('Ductile primary') => 'Ductile body',
+	__('Ductile secondary') => 'Ductile alternate',
+	__('Times New Roman') => 'Times New Roman',
+	__('Georgia') => 'Georgia',
+	__('Garamond') => 'Garamond',
+	__('Helvetica/Arial') => 'Helvetica/Arial',
+	__('Verdana') => 'Verdana',
+	__('Trebuchet MS') => 'Trebuchet MS',
+	__('Impact') => 'Impact',
+	__('Monospace') => 'Monospace'
+);
+
+function adjustFontSize($s)
+{
+	if (preg_match('/^([0-9.]+)\s*(%|pt|px|em|ex)?$/',$s,$m)) {
+		if (empty($m[2])) {
+			$m[2] = 'em';
+		}
+		return $m[1].$m[2];
+	}
+
+	return null;
+}
+
+$font_families = array(
+	// Theme standard
+	'Ductile body' => '"Century Schoolbook", "Century Schoolbook L", Georgia, serif',
+	'Ductile alternate' => '"Franklin gothic medium", "arial narrow", "DejaVu Sans Condensed", "helvetica neue", helvetica, sans-serif',
+
+	// Serif families
+	'Times New Roman' => 'Cambria, "Hoefler Text", Utopia, "Liberation Serif", "Nimbus Roman No9 L Regular", Times, "Times New Roman", serif',
+	'Georgia' => 'Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", Georgia, serif',
+	'Garamond' => '"Palatino Linotype", Palatino, Palladio, "URW Palladio L", "Book Antiqua", Baskerville, "Bookman Old Style", "Bitstream Charter", "Nimbus Roman No9 L", Garamond, "Apple Garamond", "ITC Garamond Narrow", "New Century Schoolbook", "Century Schoolbook", "Century Schoolbook L", Georgia, serif',
+
+	// Sans-serif families
+	'Helvetica/Arial' => 'Frutiger, "Frutiger Linotype", Univers, Calibri, "Gill Sans", "Gill Sans MT", "Myriad Pro", Myriad, "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif',
+	'Verdana' => 'Corbel, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "DejaVu Sans", "Bitstream Vera Sans", "Liberation Sans", Verdana, "Verdana Ref", sans-serif',
+	'Trebuchet MS' => '"Segoe UI", Candara, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif',
+
+	// Cursive families
+	'Impact' => 'Impact, Haettenschweiler, "Franklin Gothic Bold", Charcoal, "Helvetica Inserat", "Bitstream Vera Sans Bold", "Arial Black", sans-serif',
+
+	// Monospace families
+	'Monospace' => 'Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace'
+);
+
+function fontDef($c)
+{
+	global $font_families;
+	
+	return isset($font_families[$c]) ? '<span style="position:absolute;top:0;left:32em;">'.$font_families[$c].'</span>' : '';
+}
+
+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 '';
+}
+
+function computeContrastRatio($color,$background)
+{
+	// Compute contrast ratio between two colors
+	
+	$color = adjustColor($color);
+	if (($color == '') || (strlen($color) != 7)) return 0;
+	$background = adjustColor($background);
+	if (($background == '') || (strlen($background) != 7)) return 0;
+	
+	$l1 = (0.2126 * pow(hexdec(substr($color,1,2))/255,2.2)) +
+		(0.7152 * pow(hexdec(substr($color,3,2))/255,2.2)) +
+		(0.0722 * pow(hexdec(substr($color,5,2))/255,2.2));
+
+	$l2 = (0.2126 * pow(hexdec(substr($background,1,2))/255,2.2)) +
+	 	(0.7152 * pow(hexdec(substr($background,3,2))/255,2.2)) +
+		(0.0722 * pow(hexdec(substr($background,5,2))/255,2.2));
+
+	if ($l1 > $l2) {
+		$ratio = ($l1 + 0.05) / ($l2 + 0.05);
+	} else {
+		$ratio = ($l2 + 0.05) / ($l1 + 0.05);
+	}
+	return $ratio;
+}
+
+function contrastRatioLevel($ratio,$size,$bold)
+{
+	if ($size == '') {
+		return '';
+	}
+
+	// Eval font size in em (assume base font size in pixels equal to 16)
+	if (preg_match('/^([0-9.]+)\s*(%|pt|px|em|ex)?$/',$size,$m)) {
+		if (empty($m[2])) {
+			$m[2] = 'em';
+		}
+	} else {
+		return '';
+	}
+	switch ($m[2]) {
+		case '%':
+			$s = (float) $m[1] / 100;
+			break;
+		case 'pt':
+			$s = (float) $m[1] / 12;
+			break;
+		case 'px':
+			$s = (float) $m[1] / 16;
+			break;
+		case 'em':
+			$s = (float) $m[1];
+			break;
+		case 'ex':
+			$s = (float) $m[1] / 2;
+			break;
+		default:
+			return '';
+	}
+
+	$large = ((($s > 1.5) && ($bold == false)) || (($s > 1.2) && ($bold == true)));
+	
+	// Check ratio
+	if ($ratio > 7) {
+		return 'AAA';
+	} elseif (($ratio > 4.5) && $large) {
+		return 'AAA';
+	} elseif ($ratio > 4.5) {
+		return 'AA';
+	} elseif (($ratio > 3) && $large) {
+		return 'AA';
+	}
+	return '';
+}
+
+function contrastRatio($color,$background,$size='',$bold=false)
+{
+	if (($color != '') && ($background != '')) {
+		$ratio = computeContrastRatio($color,$background);
+		$level = contrastRatioLevel($ratio,$size,$bold);
+		return 
+			'<span style="position:absolute;top:0;left:23em;">'.
+			sprintf(__('ratio %.1f'),$ratio).
+			($level != '' ? ' '.sprintf(__('(%s)'),$level) : '').
+			'</span>';
+	}
+	return '';
+}
+
+$ductile_base = array(
+	// HTML
+	'subtitle_hidden' => null,
+	// CSS
+	'body_font' => null,
+	'alternate_font' => null,
+	'blog_title_w' => null,
+	'blog_title_s' => null,
+	'blog_title_c' => null,
+	'post_title_w' => null,
+	'post_title_s' => null,
+	'post_title_c' => null,
+	'post_link_w' => null,
+	'post_link_v_c' => null,
+	'post_link_f_c' => null,
+	'blog_title_w_m' => null,
+	'blog_title_s_m' => null,
+	'blog_title_c_m' => null,
+	'post_title_w_m' => null,
+	'post_title_s_m' => null,
+	'post_title_c_m' => null,
+	'post_simple_title_c' => null
+);
+
+$ductile_lists_base = array(
+	'default' => 'short',
+	'default-page' => 'short',
+	'category' => 'short',
+	'tag' => 'short',
+	'search' => 'short',
+	'archive' => 'short'
+);
+
+$ductile_counts_base = array(
+	'default' => null,
+	'category' => null,
+	'tag' => null,
+	'search' => null
+);
+
+$ductile_user = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_style');
+$ductile_user = @unserialize($ductile_user);
+if (!is_array($ductile_user)) {
+	$ductile_user = array();
+}
+$ductile_user = array_merge($ductile_base,$ductile_user);
+
+$ductile_lists = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_entries_lists');
+$ductile_lists = @unserialize($ductile_lists);
+if (!is_array($ductile_lists)) {
+	$ductile_lists = $ductile_lists_base;
+}
+
+$ductile_counts = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_entries_counts');
+$ductile_counts = @unserialize($ductile_counts);
+if (!is_array($ductile_counts)) {
+	$ductile_counts = $ductile_counts_base;
+}
+
+$ductile_stickers = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_stickers');
+$ductile_stickers = @unserialize($ductile_stickers);
+
+// If no stickers defined, add feed Atom one
+if (!is_array($ductile_stickers)) {
+	$ductile_stickers = array(array(
+		'label' => __('Subscribe'),
+		'url' => $core->blog->url.$core->url->getBase('feed').'/atom',
+		'image' => 'sticker-feed.png'
+		));
+}
+
+$ductile_stickers_full = array();
+// Get all sticker images already used
+if (is_array($ductile_stickers)) {
+	foreach ($ductile_stickers as $v) {
+		$ductile_stickers_full[] = $v['image'];
+	}
+}
+// Get all sticker-*.png in img folder of theme
+$ductile_stickers_images = files::scandir($img_path);
+if (is_array($ductile_stickers_images)) {
+	foreach ($ductile_stickers_images as $v) {
+		if (preg_match('/^sticker\-(.*)\.png$/',$v)) {
+			if (!in_array($v,$ductile_stickers_full)) {
+				// image not already used
+				$ductile_stickers[] = array(
+					'label' => null,
+					'url' => null,
+					'image' => $v);
+			}
+		}
+	}
+}
+
+$conf_tab = isset($_POST['conf_tab']) ? $_POST['conf_tab'] : 'html';
+
+if (!empty($_POST))
+{
+	try
+	{
+		# HTML
+		if ($conf_tab == 'html') {
+			$ductile_user['subtitle_hidden'] = (integer) !empty($_POST['subtitle_hidden']);
+
+			$ductile_stickers = array();
+			for ($i = 0; $i < count($_POST['sticker_image']); $i++) {
+				$ductile_stickers[] = array(
+					'label' => $_POST['sticker_label'][$i],
+					'url' => $_POST['sticker_url'][$i],
+					'image' => $_POST['sticker_image'][$i]
+				);
+			}
+
+			$order = array();
+			if (empty($_POST['ds_order']) && !empty($_POST['order'])) {
+				$order = $_POST['order'];
+				asort($order);
+				$order = array_keys($order);
+			}
+			if (!empty($order)) {
+				$new_ductile_stickers = array();
+				foreach ($order as $i => $k) {
+					$new_ductile_stickers[] = array(
+						'label' => $ductile_stickers[$k]['label'],
+						'url' => $ductile_stickers[$k]['url'],
+						'image' => $ductile_stickers[$k]['image']
+					);
+				}
+				$ductile_stickers = $new_ductile_stickers;
+			}
+			
+			for ($i = 0; $i < count($_POST['list_type']); $i++) {
+				$ductile_lists[$_POST['list_ctx'][$i]] = $_POST['list_type'][$i];
+			}
+	 		
+			for ($i = 0; $i < count($_POST['count_nb']); $i++) {
+				$ductile_counts[$_POST['count_ctx'][$i]] = $_POST['count_nb'][$i];
+			}
+	 		
+		}
+		
+		# CSS
+		if ($conf_tab == 'css') {
+			$ductile_user['body_font'] = $_POST['body_font'];
+			$ductile_user['alternate_font'] = $_POST['alternate_font'];
+
+			$ductile_user['blog_title_w'] = (integer) !empty($_POST['blog_title_w']);
+			$ductile_user['blog_title_s'] = adjustFontSize($_POST['blog_title_s']);
+			$ductile_user['blog_title_c'] = adjustColor($_POST['blog_title_c']);
+		
+			$ductile_user['post_title_w'] = (integer) !empty($_POST['post_title_w']);
+			$ductile_user['post_title_s'] = adjustFontSize($_POST['post_title_s']);
+			$ductile_user['post_title_c'] = adjustColor($_POST['post_title_c']);
+		
+			$ductile_user['post_link_w'] = (integer) !empty($_POST['post_link_w']);
+			$ductile_user['post_link_v_c'] = adjustColor($_POST['post_link_v_c']);
+			$ductile_user['post_link_f_c'] = adjustColor($_POST['post_link_f_c']);
+		
+			$ductile_user['post_simple_title_c'] = adjustColor($_POST['post_simple_title_c']);
+		
+			$ductile_user['blog_title_w_m'] = (integer) !empty($_POST['blog_title_w_m']);
+			$ductile_user['blog_title_s_m'] = adjustFontSize($_POST['blog_title_s_m']);
+			$ductile_user['blog_title_c_m'] = adjustColor($_POST['blog_title_c_m']);
+		
+			$ductile_user['post_title_w_m'] = (integer) !empty($_POST['post_title_w_m']);
+			$ductile_user['post_title_s_m'] = adjustFontSize($_POST['post_title_s_m']);
+			$ductile_user['post_title_c_m'] = adjustColor($_POST['post_title_c_m']);
+		}
+		
+		$core->blog->settings->addNamespace('themes');
+		$core->blog->settings->themes->put($core->blog->settings->system->theme.'_style',serialize($ductile_user));
+		$core->blog->settings->themes->put($core->blog->settings->system->theme.'_stickers',serialize($ductile_stickers));
+		$core->blog->settings->themes->put($core->blog->settings->system->theme.'_entries_lists',serialize($ductile_lists));
+		$core->blog->settings->themes->put($core->blog->settings->system->theme.'_entries_counts',serialize($ductile_counts));
+
+		// Blog refresh
+		$core->blog->triggerBlog();
+
+		// Template cache reset
+		$core->emptyTemplatesCache();
+		
+		echo
+		'<div class="message"><p>'.
+		__('Theme configuration upgraded.').
+		'</p></div>';
+	}
+	catch (Exception $e)
+	{
+		$core->error->add($e->getMessage());
+	}
+}
+
+// Legacy mode
+if (!$standalone_config) echo '</form>';
+
+# HTML Tab
+
+echo '<div class="multi-part" id="themes-list'.($conf_tab == 'html' ? '' : '-html').'" title="'.__('Content').'">';
+
+echo '<form id="theme_config" action="blog_theme.php?conf=1" method="post" enctype="multipart/form-data">';
+
+echo '<fieldset><legend>'.__('Header').'</legend>'.
+'<p class="field"><label for="subtitle_hidden">'.__('Hide blog description:').' '.
+form::checkbox('subtitle_hidden',1,$ductile_user['subtitle_hidden']).'</label>'.'</p>';
+if ($core->plugins->moduleExists('simpleMenu'))
+{
+	echo '<p>'.sprintf(__('To configure the top menu go to the <a href="%s">Simple Menu administration page</a>.'),'plugin.php?p=simpleMenu').'</p>';
+}
+echo '</fieldset>';
+
+echo '<fieldset><legend>'.__('Stickers').'</legend>';
+
+echo '<table class="dragable">'.'<caption>'.__('Stickers (footer)').'</caption>'.
+'<thead>'.
+'<tr>'.
+'<th scope="col">'.'</th>'.
+'<th scope="col">'.__('Image').'</th>'.
+'<th scope="col">'.__('Label').'</th>'.
+'<th scope="col">'.__('URL').'</th>'.
+'</tr>'.
+'</thead>'.
+'<tbody id="stickerslist">';
+$count = 0;
+foreach ($ductile_stickers as $i => $v) {
+	$count++;
+	echo 
+	'<tr class="line" id="l_'.$i.'">'.
+	'<td class="handle minimal">'.form::field(array('order['.$i.']'),2,3,$count,'position','',false).
+		form::hidden(array('dynorder[]','dynorder-'.$i),$i).'</td>'.
+	'<td>'.form::hidden(array('sticker_image[]'),$v['image']).'<img src="'.$img_url.$v['image'].'" /> '.'</td>'.
+	'<td scope="raw">'.form::field(array('sticker_label[]','dsl-'.$i),20,255,$v['label']).'</td>'.
+	'<td>'.form::field(array('sticker_url[]','dsu-'.$i),40,255,$v['url']).'</td>'.
+	'</tr>';
+}
+echo
+'</tbody>'.
+'</table>';
+
+echo '</fieldset>';
+
+echo '<fieldset><legend>'.__('Entries list types and limits').'</legend>';
+
+echo '<table id="entrieslist">'.'<caption>'.__('Entries lists').'</caption>'.
+'<thead>'.
+'<tr>'.
+'<th scope="col">'.__('Context').'</th>'.
+'<th scope="col">'.__('Entries list type').'</th>'.
+'<th scope="col">'.__('Number of entries').'</th>'.
+'</tr>'.
+'</thead>'.
+'<tbody>';
+foreach ($ductile_lists as $k => $v) {
+	echo 
+		'<tr>'.
+		'<td scope="raw">'.$contexts[$k].'</td>'.
+		'<td>'.form::hidden(array('list_ctx[]'),$k).form::combo(array('list_type[]'),$list_types,$v).'</td>';
+	if (array_key_exists($k,$ductile_counts)) {
+		echo '<td>'.form::hidden(array('count_ctx[]'),$k).form::field(array('count_nb[]'),2,3,$ductile_counts[$k]).'</td>';
+	} else {
+		echo '<td></td>';
+	}
+	echo
+		'</tr>';
+}
+echo
+'</tbody>'.
+'</table>';
+
+echo '</fieldset>';
+
+echo '<input type="hidden" name="conf_tab" value="html">';
+echo '<p class="clear">'.form::hidden('ds_order','').'<input type="submit" value="'.__('Save').'" />'.$core->formNonce().'</p>';
+echo '</form>';
+
+echo '</div>'; // Close tab
+
+# CSS tab
+
+echo '<div class="multi-part" id="themes-list'.($conf_tab == 'css' ? '' : '-css').'" title="'.__('Presentation').'">';
+
+echo '<form id="theme_config" action="blog_theme.php?conf=1" method="post" enctype="multipart/form-data">';
+
+echo '<h3>'.__('General settings').'</h3>';
+
+echo '<fieldset><legend>'.__('Fonts').'</legend>'.
+'<p class="field"><label for="body_font">'.__('Main:').' '.
+form::combo('body_font',$fonts,$ductile_user['body_font']).'</label>'.
+(!empty($ductile_user['body_font']) ? ' '.fontDef($ductile_user['body_font']) : '').
+'</p>'.
+
+'<p class="field"><label for="alternate_font">'.__('Secondary:').' '.
+form::combo('alternate_font',$fonts,$ductile_user['alternate_font']).'</label>'.
+(!empty($ductile_user['alternate_font']) ? ' '.fontDef($ductile_user['alternate_font']) : '').
+'</p>'.
+'</fieldset>';
+
+echo '<div class="two-cols">';
+echo '<div class="col">';
+
+echo '<fieldset><legend>'.__('Blog title').'</legend>'.
+'<p class="field"><label for="blog_title_w">'.__('In bold:').' '.
+form::checkbox('blog_title_w',1,$ductile_user['blog_title_w']).'</label>'.'</p>'.
+
+'<p class="field"><label for="blog_title_s">'.__('Font size (in em by default):').'</label> '.
+form::field('blog_title_s',7,7,$ductile_user['blog_title_s']).'</p>'.
+
+'<p class="field picker"><label for="blog_title_c">'.__('Color:').'</label> '.
+form::field('blog_title_c',7,7,$ductile_user['blog_title_c'],'colorpicker').
+contrastRatio($ductile_user['blog_title_c'],'#ffffff',
+	(!empty($ductile_user['blog_title_s']) ? $ductile_user['blog_title_s'] : '2em'),
+	$ductile_user['blog_title_w']).
+'</p>'.
+'</fieldset>';
+
+echo '</div>';
+echo '<div class="col">';
+
+echo '<fieldset><legend>'.__('Post title').'</legend>'.
+'<p class="field"><label for="post_title_w">'.__('In bold:').' '.
+form::checkbox('post_title_w',1,$ductile_user['post_title_w']).'</label>'.'</p>'.
+
+'<p class="field"><label for="post_title_s">'.__('Font size (in em by default):').'</label> '.
+form::field('post_title_s',7,7,$ductile_user['post_title_s']).'</p>'.
+
+'<p class="field picker"><label for="post_title_c">'.__('Color:').'</label> '.
+form::field('post_title_c',7,7,$ductile_user['post_title_c'],'colorpicker').
+contrastRatio($ductile_user['post_title_c'],'#ffffff',
+	(!empty($ductile_user['post_title_s']) ? $ductile_user['post_title_s'] : '2.5em'),
+	$ductile_user['post_title_w']).
+'</p>'.
+'</fieldset>';
+
+echo '</div>';
+echo '</div>';
+
+echo '<fieldset><legend>'.__('Titles without link').'</legend>'.
+
+'<p class="field picker"><label for="post_simple_title_c">'.__('Color:').'</label> '.
+form::field('post_simple_title_c',7,7,$ductile_user['post_simple_title_c'],'colorpicker').
+contrastRatio($ductile_user['post_simple_title_c'],'#ffffff',
+	'1.1em',	// H5 minimum size
+	false).
+'</p>'.
+'</fieldset>';
+
+echo '<fieldset><legend>'.__('Inside posts links').'</legend>'.
+'<p class="field"><label for="post_link_w">'.__('In bold:').' '.
+form::checkbox('post_link_w',1,$ductile_user['post_link_w']).'</label>'.'</p>'.
+
+'<p class="field picker"><label for="post_link_v_c">'.__('Normal and visited links color:').'</label> '.
+form::field('post_link_v_c',7,7,$ductile_user['post_link_v_c'],'colorpicker').
+contrastRatio($ductile_user['post_link_v_c'],'#ffffff',
+	'1em',
+	$ductile_user['post_link_w']).
+'</p>'.
+
+'<p class="field picker"><label for="post_link_f_c">'.__('Active, hover and focus links color:').'</label> '.
+form::field('post_link_f_c',7,7,$ductile_user['post_link_f_c'],'colorpicker').
+contrastRatio($ductile_user['post_link_f_c'],'#ebebee',
+	'1em',
+	$ductile_user['post_link_w']).
+'</p>'.
+'</fieldset>';
+
+echo '<h3>'.__('Mobile specific settings').'</h3>';
+
+echo '<div class="two-cols">';
+echo '<div class="col">';
+
+echo '<fieldset><legend>'.__('Blog title').'</legend>'.
+'<p class="field"><label for="blog_title_w_m">'.__('In bold:').' '.
+form::checkbox('blog_title_w_m',1,$ductile_user['blog_title_w_m']).'</label>'.'</p>'.
+
+'<p class="field"><label for="blog_title_s_m">'.__('Font size (in em by default):').'</label> '.
+form::field('blog_title_s_m',7,7,$ductile_user['blog_title_s_m']).'</p>'.
+
+'<p class="field picker"><label for="blog_title_c_m">'.__('Color:').'</label> '.
+form::field('blog_title_c_m',7,7,$ductile_user['blog_title_c_m'],'colorpicker').
+contrastRatio($ductile_user['blog_title_c_m'],'#d7d7dc',
+	(!empty($ductile_user['blog_title_s_m']) ? $ductile_user['blog_title_s_m'] : '1.8em'),
+	$ductile_user['blog_title_w_m']).
+'</p>'.
+'</fieldset>';
+
+echo '</div>';
+echo '<div class="col">';
+
+echo '<fieldset><legend>'.__('Post title').'</legend>'.
+'<p class="field"><label for="post_title_w_m">'.__('In bold:').' '.
+form::checkbox('post_title_w_m',1,$ductile_user['post_title_w_m']).'</label>'.'</p>'.
+
+'<p class="field"><label for="post_title_s_m">'.__('Font size (in em by default):').'</label> '.
+form::field('post_title_s_m',7,7,$ductile_user['post_title_s_m']).'</p>'.
+
+'<p class="field picker"><label for="post_title_c_m">'.__('Color:').'</label> '.
+form::field('post_title_c_m',7,7,$ductile_user['post_title_c_m'],'colorpicker').
+contrastRatio($ductile_user['post_title_c_m'],'#ffffff',
+	(!empty($ductile_user['post_title_s_m']) ? $ductile_user['post_title_s_m'] : '1.5em'),
+	$ductile_user['post_title_w_m']).
+'</p>'.
+'</fieldset>';
+
+echo '</div>';
+echo '</div>';
+
+echo '<input type="hidden" name="conf_tab" value="css">';
+echo '<p class="clear"><input type="submit" value="'.__('Save').'" />'.$core->formNonce().'</p>';
+echo '</form>';
+
+echo '</div>'; // Close tab
+
+dcPage::helpBlock('ductile');
+
+// Legacy mode
+if (!$standalone_config) echo '<form style="display:none">';
+?>
Index: themes/ductile/_define.php
===================================================================
--- themes/ductile/_define.php	(revision 716)
+++ themes/ductile/_define.php	(revision 716)
@@ -0,0 +1,22 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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*/		"Mediaqueries compliant elegant theme",
+	/* Author */			"Dotclear Team",
+	/* Version */			'1.0',
+	/* Properties */		array(
+								'standalone_config' => true
+							)
+);
+?>
Index: themes/ductile/_prepend.php
===================================================================
--- themes/ductile/_prepend.php	(revision 683)
+++ themes/ductile/_prepend.php	(revision 683)
@@ -0,0 +1,70 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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; }
+
+# Behaviors
+$GLOBALS['core']->addBehavior('adminPageHTMLHead',array('tplDuctileThemeAdmin','adminPageHTMLHead'));
+
+class tplDuctileThemeAdmin
+{
+	public static function adminPageHTMLHead()
+	{
+		global $core;
+		
+		echo "\n".'<!-- Header directives for Ductile configuration -->'."\n";
+		echo dcPage::jsToolMan();
+
+		// Need some more Js
+		$core->auth->user_prefs->addWorkspace('accessibility'); 
+		$user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
+		if (!$user_dm_nodragdrop) {
+			echo <<<EOT
+<script type="text/javascript">
+//<![CDATA[
+
+var dragsort = ToolMan.dragsort();
+$(function() {
+	dragsort.makeTableSortable($("#stickerslist").get(0),
+	dotclear.sortable.setHandle,dotclear.sortable.saveOrder);
+});
+
+dotclear.sortable = {
+	setHandle: function(item) {
+		var handle = $(item).find('td.handle').get(0);
+		while (handle.firstChild) {
+			handle.removeChild(handle.firstChild);
+		}
+
+		item.toolManDragGroup.setHandle(handle);
+		handle.className = handle.className+' handler';
+	},
+
+	saveOrder: function(item) {
+		var group = item.toolManDragGroup;
+		var order = document.getElementById('ds_order');
+		group.register('dragend', function() {
+			order.value = '';
+			items = item.parentNode.getElementsByTagName('tr');
+
+			for (var i=0; i<items.length; i++) {
+				order.value += items[i].id.substr(2)+',';
+			}
+		});
+	}
+};
+//]]>
+</script>
+EOT;
+		}
+	}
+}
+?>
Index: themes/ductile/_public.php
===================================================================
--- themes/ductile/_public.php	(revision 683)
+++ themes/ductile/_public.php	(revision 683)
@@ -0,0 +1,350 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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; }
+
+l10n::set(dirname(__FILE__).'/locales/'.$_lang.'/main');
+
+# Behaviors
+$core->addBehavior('publicHeadContent',array('tplDuctileTheme','publicHeadContent'));
+$core->addBehavior('publicInsideFooter',array('tplDuctileTheme','publicInsideFooter'));
+
+# Templates
+$core->tpl->addValue('ductileEntriesList',array('tplDuctileTheme','ductileEntriesList'));
+$core->tpl->addBlock('EntryIfContentIsCut',array('tplDuctileTheme','EntryIfContentIsCut'));
+$core->tpl->addValue('ductileNbEntryPerPage',array('tplDuctileTheme','ductileNbEntryPerPage'));
+
+class tplDuctileTheme
+{
+	public static function ductileNbEntryPerPage($attr)
+	{
+		global $core;
+
+		$nb = 0;
+		$s = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_entries_counts');
+		if ($s !== null) {
+			$s = @unserialize($s);
+			if (is_array($s)) {
+				if (isset($s[$core->url->type])) {
+					// Nb de billets par page défini par la config du thème
+					$nb = (integer) $s[$core->url->type];
+				} else {
+					if (($core->url->type == 'default-page') && (isset($s['default']))) {
+						// Les pages 2 et suivantes de la home ont le même nombre de billet que la première page
+						$nb = (integer) $s['default'];
+					}
+				}
+			}
+		}
+
+		if ($nb == 0) {
+			if (!empty($attr['nb'])) {
+				// Nb de billets par page défini par défaut dans le template
+				$nb = (integer) $attr['nb'];
+			}
+		}
+
+		if ($nb > 0)
+			return '<?php $_ctx->nb_entry_per_page = '.$nb.' ; ?>';
+	}
+	
+	public static function EntryIfContentIsCut($attr,$content)
+	{
+		global $core;
+		
+		if (empty($attr['cut_string']) || !empty($attr['full'])) {
+			return '';
+		}
+		
+		$urls = '0';
+		if (!empty($attr['absolute_urls'])) {
+			$urls = '1';
+		}
+
+		$short = $core->tpl->getFilters($attr);
+		$cut = $attr['cut_string'];
+		$attr['cut_string'] = 0;
+		$full = $core->tpl->getFilters($attr);
+		$attr['cut_string'] = $cut;
+
+		return '<?php if (strlen('.sprintf($full,'$_ctx->posts->getContent('.$urls.')').') > '.
+			'strlen('.sprintf($short,'$_ctx->posts->getContent('.$urls.')').')) : ?>'.
+			$content.
+			'<?php endif; ?>';
+	}	
+	
+	public static function ductileEntriesList($attr)
+	{
+		global $core;
+		$default = isset($attr['default']) ? trim($attr['default']) : 'short';
+
+		$model = '';
+		$s = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_entries_lists');
+		if ($s !== null) {
+			$s = @unserialize($s);
+			if (is_array($s)) {
+				if (isset($s[$core->url->type])) {
+					$model = $s[$core->url->type];
+				}
+			}
+		}
+
+		$local_attr = array('src' => '_entry-'.($model ? $model : $default).'.html');
+		return $core->tpl->includeFile($local_attr);
+	}
+
+	public static function publicInsideFooter($core)
+	{
+		$res = '';
+		$default = false;
+		$img_url = $core->blog->settings->system->themes_url.'/'.$core->blog->settings->system->theme.'/img/';
+
+		$s = $core->blog->settings->themes->get($core->blog->settings->system->theme.'_stickers');
+
+		if ($s === null) {
+			$default = true;
+		} else {
+			$s = @unserialize($s);
+			if (!is_array($s)) {
+				$default = true;
+			} else {
+				$s = array_filter($s,"tplDuctileTheme::cleanStickers");
+				if (count($s) == 0) {
+					$default = true;
+				} else {
+					$count = 1;
+					foreach ($s as $sticker) {
+						$res .= self::setSticker($count,($count == count($s)),$sticker['label'],$sticker['url'],$img_url.$sticker['image']);
+						$count++;
+					}
+				}
+			}
+		}
+
+		if ($default || $res == '') {
+			$res = self::setSticker(1,true,__('Subscribe'),$core->blog->url.$core->url->getBase('feed').'/atom',$img_url.'sticker-feed.png');
+		}
+
+		if ($res != '') {
+			$res = '<ul id="stickers">'."\n".$res.'</ul>'."\n";
+			echo $res;
+		}
+	}
+	
+	protected static function cleanStickers($s)
+	{
+		if (is_array($s)) {
+			if (isset($s['label']) && isset($s['url']) && isset($s['image'])) {
+				if ($s['label'] != null && $s['url'] != null && $s['image'] != null) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	
+	protected static function setSticker($position,$last,$label,$url,$image)
+	{
+		return '<li id="sticker'.$position.'"'.($last ? ' class="last"' : '').'>'."\n".
+			'<a href="'.$url.'">'."\n".
+			'<img alt="" src="'.$image.'" />'."\n".
+			'<span>'.$label.'</span>'."\n".
+			'</a>'."\n".
+			'</li>'."\n";
+	}
+
+	public static function publicHeadContent($core)
+	{
+		echo 
+			'<style type="text/css">'."\n".
+			'/* '.__('Additionnal style directives').' */'."\n".
+			self::ductileStyleHelper().
+			"</style>\n";
+			
+		echo
+			'<script type="text/javascript" src="'.
+			$core->blog->settings->system->themes_url.'/'.$core->blog->settings->system->theme.
+			'/ductile.js"></script>'."\n";
+	}
+	
+	public static function ductileStyleHelper()
+	{
+		$s = $GLOBALS['core']->blog->settings->themes->get($GLOBALS['core']->blog->settings->system->theme.'_style');
+
+		if ($s === null) {
+			return;
+		}
+
+		$s = @unserialize($s);
+		if (!is_array($s)) {
+			return;
+		}
+
+		$css = array();
+
+		# Properties
+		
+		# Blog description
+		$selectors = '#blogdesc';
+		if (isset($s['subtitle_hidden'])) self::prop($css,$selectors,'display',($s['subtitle_hidden'] ? 'none' : null));
+
+		# Main font
+		$selectors = 'body, .supranav li a span, #comments.me, a.comment-number';
+		if (isset($s['body_font'])) self::prop($css,$selectors,'font-family',self::fontDef($s['body_font']));
+
+		# Secondary font
+		$selectors = '#blogdesc, .supranav, #content-info, #subcategories, #comments-feed, #sidebar h2, #sidebar h3, #footer';
+		if (isset($s['alternate_font'])) self::prop($css,$selectors,'font-family',self::fontDef($s['alternate_font']));
+		
+		# Inside posts links font weight
+		$selectors = '.post-excerpt a, .post-content a';
+		if (isset($s['post_link_w'])) self::prop($css,$selectors,'font-weight',($s['post_link_w'] ? 'bold' : 'normal'));
+
+		# Inside posts links colors (normal, visited)
+		$selectors = '.post-excerpt a:link, .post-excerpt a:visited, .post-content a:link, .post-content a:visited';
+		if (isset($s['post_link_v_c'])) self::prop($css,$selectors,'color',$s['post_link_v_c']);
+
+		# Inside posts links colors (hover, active, focus)
+		$selectors = '.post-excerpt a:hover, .post-excerpt a:active, .post-excerpt a:focus, .post-content a:hover, .post-content a:active, .post-content a:focus';
+		if (isset($s['post_link_f_c'])) self::prop($css,$selectors,'color',$s['post_link_f_c']);
+
+		# Style directives
+		$res = '';
+		foreach ($css as $selector => $values) {
+			$res .= $selector." {\n";
+			foreach ($values as $k => $v) {
+				$res .= $k.':'.$v.";\n";
+			}
+			$res .= "}\n";
+		}
+
+		# Large screens
+		$css_large = array();
+
+		# Blog title font weight
+		$selectors = 'h1, h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus';
+		if (isset($s['blog_title_w'])) self::prop($css_large,$selectors,'font-weight',($s['blog_title_w'] ? 'bold' : 'normal'));
+		
+		# Blog title font size
+		$selectors = 'h1';
+		if (isset($s['blog_title_s'])) self::prop($css_large,$selectors,'font-size',$s['blog_title_s']);
+		
+		# Blog title color
+		$selectors = 'h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus';
+		if (isset($s['blog_title_c'])) self::prop($css_large,$selectors,'color',$s['blog_title_c']);
+
+		# Post title font weight
+		$selectors = 'h2.post-title, h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus';
+		if (isset($s['post_title_w'])) self::prop($css_large,$selectors,'font-weight',($s['post_title_w'] ? 'bold' : 'normal'));
+		
+		# Post title font size
+		$selectors = 'h2.post-title';
+		if (isset($s['post_title_s'])) self::prop($css_large,$selectors,'font-size',$s['post_title_s']);
+		
+		# Post title color
+		$selectors = 'h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus';
+		if (isset($s['post_title_c'])) self::prop($css_large,$selectors,'color',$s['post_title_c']);
+
+		# Simple title color (title without link)
+		$selectors = '#content-info h2, .post-title, .post h3, .post h4, .post h5, .post h6, .arch-block h3';
+		if (isset($s['post_simple_title_c'])) self::prop($css_large,$selectors,'color',$s['post_simple_title_c']);
+
+		# Style directives for large screens
+		if (count($css_large)) {
+			$res .= '@media only screen and (min-width: 481px) {'."\n";
+			foreach ($css_large as $selector => $values) {
+				$res .= $selector." {\n";
+				foreach ($values as $k => $v) {
+					$res .= $k.':'.$v.";\n";
+				}
+				$res .= "}\n";
+			}
+			$res .= "}\n";
+		}
+
+		# Small screens
+		$css_small = array();
+
+		# Blog title font weight
+		$selectors = 'h1, h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus';
+		if (isset($s['blog_title_w_m'])) self::prop($css_small,$selectors,'font-weight',($s['blog_title_w_m'] ? 'bold' : 'normal'));
+		
+		# Blog title font size
+		$selectors = 'h1';
+		if (isset($s['blog_title_s_m'])) self::prop($css_small,$selectors,'font-size',$s['blog_title_s_m']);
+		
+		# Blog title color
+		$selectors = 'h1 a:link, h1 a:visited, h1 a:hover, h1 a:visited, h1 a:focus';
+		if (isset($s['blog_title_c_m'])) self::prop($css_small,$selectors,'color',$s['blog_title_c_m']);
+
+		# Post title font weight
+		$selectors = 'h2.post-title, h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus';
+		if (isset($s['post_title_w_m'])) self::prop($css_small,$selectors,'font-weight',($s['post_title_w_m'] ? 'bold' : 'normal'));
+		
+		# Post title font size
+		$selectors = 'h2.post-title';
+		if (isset($s['post_title_s_m'])) self::prop($css_small,$selectors,'font-size',$s['post_title_s_m']);
+		
+		# Post title color
+		$selectors = 'h2.post-title a:link, h2.post-title a:visited, h2.post-title a:hover, h2.post-title a:visited, h2.post-title a:focus';
+		if (isset($s['post_title_c_m'])) self::prop($css_small,$selectors,'color',$s['post_title_c_m']);
+
+		# Style directives for small screens
+		if (count($css_small)) {
+			$res .= '@media only screen and (max-width: 480px) {'."\n";
+			foreach ($css_small as $selector => $values) {
+				$res .= $selector." {\n";
+				foreach ($values as $k => $v) {
+					$res .= $k.':'.$v.";\n";
+				}
+				$res .= "}\n";
+			}
+			$res .= "}\n";
+		}
+		
+		return $res;
+	}
+
+	protected static $fonts = array(
+		// Theme standard
+		'Ductile body' => '"Century Schoolbook", "Century Schoolbook L", Georgia, serif',
+		'Ductile alternate' => '"Franklin gothic medium", "arial narrow", "DejaVu Sans Condensed", "helvetica neue", helvetica, sans-serif',
+
+		// Serif families
+		'Times New Roman' => 'Cambria, "Hoefler Text", Utopia, "Liberation Serif", "Nimbus Roman No9 L Regular", Times, "Times New Roman", serif',
+		'Georgia' => 'Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liberation Serif", Georgia, serif',
+		'Garamond' => '"Palatino Linotype", Palatino, Palladio, "URW Palladio L", "Book Antiqua", Baskerville, "Bookman Old Style", "Bitstream Charter", "Nimbus Roman No9 L", Garamond, "Apple Garamond", "ITC Garamond Narrow", "New Century Schoolbook", "Century Schoolbook", "Century Schoolbook L", Georgia, serif',
+
+		// Sans-serif families
+		'Helvetica/Arial' => 'Frutiger, "Frutiger Linotype", Univers, Calibri, "Gill Sans", "Gill Sans MT", "Myriad Pro", Myriad, "DejaVu Sans Condensed", "Liberation Sans", "Nimbus Sans L", Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif',
+		'Verdana' => 'Corbel, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "DejaVu Sans", "Bitstream Vera Sans", "Liberation Sans", Verdana, "Verdana Ref", sans-serif',
+		'Trebuchet MS' => '"Segoe UI", Candara, "Bitstream Vera Sans", "DejaVu Sans", "Bitstream Vera Sans", "Trebuchet MS", Verdana, "Verdana Ref", sans-serif',
+
+		// Cursive families
+		'Impact' => 'Impact, Haettenschweiler, "Franklin Gothic Bold", Charcoal, "Helvetica Inserat", "Bitstream Vera Sans Bold", "Arial Black", sans-serif',
+
+		// Monospace families
+		'Monospace' => 'Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace'
+	);
+
+	protected static function fontDef($c)
+	{
+		return isset(self::$fonts[$c]) ? self::$fonts[$c] : null;
+	}
+
+	protected static function prop(&$css,$selector,$prop,$value)
+	{
+		if ($value) {
+			$css[$selector][$prop] = $value;
+		}
+	}
+}
+?>
Index: themes/ductile/ductile.js
===================================================================
--- themes/ductile/ductile.js	(revision 592)
+++ themes/ductile/ductile.js	(revision 592)
@@ -0,0 +1,77 @@
+$(function() {
+	var create_name = function(text) {
+
+		// Convert text to lower case.
+		var name = text.toLowerCase();
+
+		// Remove leading and trailing spaces, and any non-alphanumeric
+		// characters except for ampersands, spaces and dashes.
+		name = name.replace(/^\s+|\s+$|[^a-z0-9&\s-]/g, '');
+
+		// Replace '&' with 'and'.
+		name = name.replace(/&/g, 'and');
+
+		// Replaces spaces with dashes.
+		name = name.replace(/\s/g, '-');
+
+		// Squash any duplicate dashes.
+		name = name.replace(/(-)+\1/g, "$1");
+
+		return name;
+	};
+
+	var add_link = function() {
+
+		// Convert the h2 element text into a value that
+		// is safe to use in a name attribute.
+		var name = create_name($(this).text());
+
+		// Create a name attribute in the following sibling
+		// to act as a fragment anchor.
+		$(this).next().attr('name', name);
+
+		// Replace the h2.toggle element with a link to the
+		// fragment anchor.  Use the h2 text to create the
+		// link title attribute.
+		$(this).html(
+			'<a href="#' + name + '" title="Reveal ' +
+			$(this).text() + ' content">' +
+			$(this).html() + '</a>');
+	};
+
+	var toggle = function(event) {
+		event.preventDefault();
+
+		// Toggle the 'expanded' class of the h2.toggle
+		// element, then apply the slideToggle effect
+		// to all siblings.
+		$(this).toggleClass('expanded').
+			nextAll().slideToggle('fast');
+	};
+
+	var remove_focus = function() {
+	  // Use the blur() method to remove focus.
+	  $(this).blur();
+	};
+
+	$(document).ready (function () {
+		if ($(window).width() < 1024) {
+
+			// Set toggle class to each #sidebar h2
+			$("#sidebar div div h2").addClass('toggle');
+			
+			// Hide all h2.toggle siblings
+			$('#sidebar div div h2').nextAll().hide();
+
+			// Add a link to each h2.toggle element.
+			$('h2.toggle').each(add_link);
+
+			// Add a click event handler to all h2.toggle elements.
+			$('h2.toggle').click(toggle);
+
+			// Remove the focus from the link tag when accessed with a mouse.
+			$('h2.toggle a').mouseup(remove_focus);
+		}
+	})
+
+});
Index: themes/ductile/ie.css
===================================================================
--- themes/ductile/ie.css	(revision 633)
+++ themes/ductile/ie.css	(revision 633)
@@ -0,0 +1,167 @@
+/* -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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 ----------------------------------------- */
+
+
+@charset "UTF-8";
+/* special Internet Explorer, 8 and before */
+
+.nobig {
+	display: none;
+	}
+#sn-bottom {
+	display: none;
+	}
+/* layout */
+#wrapper {
+	padding: 0 13%;
+	}
+#stickers {
+	padding-right: 13%;
+	}	
+#main {
+	width : 100%;
+	}
+#blognav, #blogextra {
+	margin : 0;
+	width: 48%; 
+	float:left;
+	}
+
+/* header - prelude */
+#prelude {
+	position: absolute;
+	margin: 0;
+	top: 0;
+	left: 3px;
+	color: #fff;
+	font-size: .875em;
+	list-style-type: none;
+	}
+#prelude li {
+	display: inline;
+	text-transform: none !important;
+	}
+#prelude a, #prelude a:hover, #prelude a:visited {
+	position:absolute;
+	left:0;
+	top:-500px;
+	width:1px;
+	height:1px;
+	overflow:hidden;
+	background-image: none !important;
+	}
+#prelude a:active, #prelude a:focus {
+	position:static;
+	width:auto;
+	height:auto;
+	}
+/* header - top */
+#top {
+	padding-top: 24px;
+	}
+#logo {
+	float:left; 
+	margin:0 1.5em 0 1em;	
+	}
+#logo a {
+	border: none;
+	background: transparent;
+	text-decoration: none;
+	}
+h1 {
+	font-size: 2em;
+	padding-right: 240px;
+	padding-bottom: 4px;
+	margin-left: 32px;
+	}
+/* header - menu */
+.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;
+	min-height: 2.5em;
+ 	}
+.supranav li a span {
+	display: block;
+	}
+/* post */
+.post-title {
+	font-size: 2.5em;
+	font-weight: normal;
+	}
+.post-title a {
+	font-style: italic;
+	font-weight: normal;
+	}
+/* stickers */
+#stickers {
+	position: absolute;
+	top: 0;
+	right: 0;
+	font-size: .75em;
+	}
+#stickers li {
+	display: block;
+	float: left;
+	text-align: center;
+	width: 60px;
+	padding: 0;
+	}
+#stickers li span {
+	display: block;
+	text-align: center;
+	}
+#stickers li a:hover,
+#stickers li a:active,
+#stickers li a:focus {
+	background-color: #fff;
+	}
+#stickers a:hover, #stickers a:focus {
+	color: #666;
+	background: #fff;
+	}
+/* sidebar */
+#blognav {
+	margin-right: 4%;
+	}
+#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:first-child p {
+	margin: .33em 0;
+	}
+/* special archive */
+.dc-archive #content {
+	margin: 0 17em 0 0;
+	}
Index: themes/ductile/locales/en/help/help.html
===================================================================
--- themes/ductile/locales/en/help/help.html	(revision 683)
+++ themes/ductile/locales/en/help/help.html	(revision 683)
@@ -0,0 +1,81 @@
+<html>
+<head>
+
+<title>Ductile Configuration</title>
+</head>
+
+<body>
+<p>By modifying the configuration of the Ductile theme, you can personalise your theme very easily</p>
+
+<h3>Personalisation of the content</h3>
+<p>On this tab you can personalize the content of your blog.</p>
+<dl>
+  <dt>Header</dt>
+    <dd>Check the box "Hide blog's description" in order not to display the blog's description usually displayed under the title.</dd>
+
+<p>If the plugin "Simple menu" is installed and active, you can click on the designated link to configure the header's menu. (main menu?)</p>
+
+  <dt>Stickers</dt>
+    <dd>The stickers will be displayed at the top of the screen as small images on large screens and at the bottom of the page on very small screens. All images which file name correspond to the sticker-*.png scheme and placed in the sub-folder img of the theme are listed. You can indicate for each a label and the corresponding url. (Leave on of both fields empty to not display it.)<br />
+You can also modify the display order with a drag and drop if javascript is activated and if you have not disabled it in your preferences. If javascript is deactivated, a field allows you to indicate the order of display (1 to n).</dd>
+
+  <dt>Types and limits for lists of posts</dt>
+
+    <dd>Some of the display contexts of your blog present under the form of a list of posts. It's the case for example for the home page or for the monthly archives. For each of the context listed in the table, you can specify if the content of each displayed post should be as a title only, a short form (content of the extract field of first 300 characters) or their full form. NB. On the home page, the first post always displays in full.<br />
+Moreover, for some of those contexts, you can also specify the number of posts displayed per page. If you leave this field empty, the value specified in the general settings of the blog that will be used.</dd>
+
+</dl>
+
+<h3>Personalisation of the presentation</h3>
+<p>On this tab you can personalize some presentation elements of your blog.</p>
+
+<h4>General parameters</h4>
+
+<p>These parameters will be used on all display widths of the blog.</p>
+<dl>
+  <dt>Fonts</dt>
+    <dd>You can choose here the principal font family which will be used for most of the texts. You can also specify a second font family (secondary) which will be used for some titles of the second level and comments. The option "default" allows to leave the original choice.</dd>
+
+  <dt>Blog title</dt>
+
+    <dd>You can specify here if the blog title must be displayed in bold, its size, (default is em, recognized units are %, pt, px, em and ex) as well as the color, using the format #rrggbb with rr, gg and bb chosen within 0 and ff.<br />
+Empty one or all fields to cancel your choice and go back to the default.</dd>
+
+
+  <dt>Post titles</dt>
+    <dd>You can indicate here if the post titles should be displayed in bold, their size (default is em, recognized units are %, pt, px, em and ex) as well as their color using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.<br />
+Empty one or all fields to cancel your choice and go back to your original one.</dd>
+
+  <dt>Titles without a link</dt>
+    <dd>You can specify here the color of titles without a link (essentially : the title of a post when it is displayed by itself, sub-titles within posts, the active item in the horizontal menu) by using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.<br />
+Empty one or all fields to cancel your choice and go back to the default.</dd>
+
+  <dt>Links within posts</dt>
+    <dd>You can indicate here if the links contained in your posts should be displayed in bold or not and define their color at a normal state as well as a "visited" state, their color when active, or when they're hovered upon or take focus, by using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.<br />
+Empty one or all fields to cancel your choice and go back to the default.</dd>
+
+<h4>Specific parameters for mobile phones</h4>
+
+<p>These parameters are used only when the display width is less than 480 pixels (for example on mobile phones). If they are specified, they will replace, the equivalent parameters specified in the general parameters above.</p>
+
+  <dt>Blog title</dt>
+
+    <dd>You can specify here if the blog title must be displayed in bold, its size, (default is em, recognized units are %, pt, px, em and ex) as well as the color, using the format #rrggbb with rr, gg and bb chosen within 0 and ff.<br />
+Empty one or all fields to cancel your choice and go back to the default.</dd>
+
+
+  <dt>Post titles</dt>
+    <dd>You can indicate here if the post titles should be displayed in bold, their size (default is em, recognized units are %, pt, px, em and ex) as well as their color using the Color Picker available by clicking on the picker icon or by specifying the color in the format #rrggbb with rr, gg, and bb chosen within 0 and ff.<br />
+Empty one or all fields to cancel your choice and go back to the default.</dd>
+
+<h3>Accessibility and contrast between colors</h3>
+
+<p>After a color has been chosen, the contrast ratio will be displayed near the field and specified, when that is the case, that this contrast is in conformité with the recommandations of WCAG 2.0. In order to be valid, the contrast between the background color and the font color should have the following values:</p>
+<ul>
+<li>At least 4,5:1 for text of a normal size for level AA ;</li>
+<li>At least 7:1 for texts of a normal size for level AAA ;</li>
+<li>At least 3:1 for texts of a magnified size (150 % or 120 % bold) for level AA ;</li>
+<li>At least 4,5:1 for texts of a magnified size (150 % or 120 % bold) for level AAA.</li>
+</ul>
+</body>
+</html>
Index: themes/ductile/locales/en/main.po
===================================================================
--- themes/ductile/locales/en/main.po	(revision 655)
+++ themes/ductile/locales/en/main.po	(revision 655)
@@ -0,0 +1,5 @@
+msgid "toDay"
+msgstr "to"
+
+msgid "FromDay"
+msgstr "From"
Index: themes/ductile/locales/en/resources.php
===================================================================
--- themes/ductile/locales/en/resources.php	(revision 628)
+++ themes/ductile/locales/en/resources.php	(revision 628)
@@ -0,0 +1,18 @@
+<?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 (!isset($__resources['help']['ductile']))
+{
+	$__resources['help']['ductile'] = dirname(__FILE__).'/help/help.html';
+}
+
+?>
Index: themes/ductile/locales/fr/admin.po
===================================================================
--- themes/ductile/locales/fr/admin.po	(revision 683)
+++ themes/ductile/locales/fr/admin.po	(revision 683)
@@ -0,0 +1,140 @@
+msgid "Theme configuration upgraded."
+msgstr "Configuration du thème mise à jour."
+
+msgid "Content"
+msgstr "Contenu"
+
+msgid "Header"
+msgstr "Entête"
+
+msgid "Hide blog description:"
+msgstr "Cacher la description du blog :"
+
+msgid "To configure the top menu go to the <a href=\"%s\">Simple Menu administration page</a>."
+msgstr "Pour configurer le menu allez à la <a href=\"%s\">page d'administration de l'extension Menu Simple</a>."
+
+msgid "Stickers"
+msgstr "Étiquettes"
+
+msgid "Stickers (footer)"
+msgstr "Étiquettes (pied de page)"
+
+msgid "Entries list types and limits"
+msgstr "Types et limites des listes de billets"
+
+msgid "Entries lists"
+msgstr "Listes de billets"
+
+msgid "Context"
+msgstr "Contexte"
+
+msgid "Entries list type"
+msgstr "Type de liste de billets"
+
+msgid "Number of entries"
+msgstr "Nombre de billets"
+
+msgid "Home (first page)"
+msgstr "Page d'accueil (première page)"
+
+msgid "Home (other pages)"
+msgstr "Page d'accueil (pages suivantes)"
+
+msgid "Entries for a category"
+msgstr "Billets d'une catégorie"
+
+msgid "Entries for a tag"
+msgstr "Billets pour un mot-clé"
+
+msgid "Search result entries"
+msgstr "Billets résultants d'une recherche"
+
+msgid "Month archive entries"
+msgstr "Billets d'une archive mensuelle"
+
+msgid "Title"
+msgstr "Titre"
+
+msgid "Short"
+msgstr "Court"
+
+msgid "Full"
+msgstr "Complet"
+
+msgid "Presentation"
+msgstr "Présentation"
+
+msgid "General settings"
+msgstr "Paramètres généraux"
+
+msgid "Mobile specific settings"
+msgstr "Paramètres spécifiques pour les mobiles"
+
+msgid "Blog title"
+msgstr "Titre du blog"
+
+msgid "In bold:"
+msgstr "En gras :"
+
+msgid "Font size (in em by default):"
+msgstr "Taille de police (en em par défaut) :"
+
+msgid "Color:"
+msgstr "Couleur :"
+
+msgid "Post title"
+msgstr "Titre des billets"
+
+msgid "Titles without link"
+msgstr "Titres sans lien"
+
+msgid "Inside posts links"
+msgstr "Liens dans les billets"
+
+msgid "Normal and visited links color:"
+msgstr "Couleur des liens normaux et visités :"
+
+msgid "Active, hover and focus links color:"
+msgstr "Couleur des liens actifs, survolés et ayant le focus :"
+
+msgid "Fonts"
+msgstr "Polices de caractère"
+
+msgid "Main:"
+msgstr "Principale :"
+
+msgid "Secondary:"
+msgstr "Secondaire :"
+
+msgid "Ductile primary"
+msgstr "Principale de Ductile"
+
+msgid "Ductile secondary"
+msgstr "Secondaire de Ductile"
+
+msgid "Times New Roman"
+msgstr "Times New Roman"
+
+msgid "Georgia"
+msgstr "Georgia"
+
+msgid "Garamond"
+msgstr "Garamond"
+
+msgid "Helvetica/Arial"
+msgstr "Helvetica/Arial"
+
+msgid "Verdana"
+msgstr "Verdana"
+
+msgid "Trebuchet MS"
+msgstr "Trebuchet MS"
+
+msgid "Impact"
+msgstr "Impact"
+
+msgid "Monospace"
+msgstr "Monospace"
+
+msgid "ratio %.1f"
+msgstr "ratio %.1f"
Index: themes/ductile/locales/fr/help/help.html
===================================================================
--- themes/ductile/locales/fr/help/help.html	(revision 683)
+++ themes/ductile/locales/fr/help/help.html	(revision 683)
@@ -0,0 +1,95 @@
+<html>
+<head>
+  <title>Configuration du thème Ductile</title>
+</head>
+
+<body>
+
+<p>En modifiant la configuration du thème Ductile, vous pouvez personnaliser votre thème très facilement.</p>
+
+<h3>Personnalisation du contenu</h3>
+
+<p>Sur cet onglet vous pouvez personnaliser le contenu de votre blog.</p>
+
+<h4>Entête</h4>
+
+<p>Cochez la case qui suit « Cacher la description du blog » pour ne pas afficher la description du blog habituellement affichée sous le titre.</p>
+<p>Vous pouvez, si l'extension « Menu Simple » est installée et active, cliquer sur le lien indiqué pour paramétrer le menu affiché en entête.</p>
+
+<h4>Étiquettes (« stickers »)</h4>
+
+<p>Les étiquettes s'afficheront en haut de l'écran sous forme d'imagettes sur les écrans larges et en bas de la page sous forme de boutons sur les tout petits écrans. Toutes les images dont le nom de fichier correspond au schéma <code>sticker-*.png</code> et se trouvant dans le sous-répertoire <code>img</code> du thème sont listées. Vous pourrez indiquer pour chacune un libellé et l'URL correspondante. (Laissez l'un de ces deux champs vide pour ne pas l'afficher.)</p>
+
+<p>Vous pouvez également modifier l'ordre d'affichage par tiré-lâché si javascript est actif et que vous ne l'avez pas interdit dans vos préférences. Si javascript est désactivé, un champ supplémentaire permet d'indiquer l'ordre d'affichage (de 1 à n).</p>
+
+<h4>Types et limites des listes de billets</h4>
+
+<p>Certains contextes d'affichage de votre blog se présentent sous la forme d'une liste de billets. C'est le cas par exemple pour la page d'accueil ou bien pour les archives mensuelles. Pour chacun des contextes listés dans le tableau vous pouvez préciser si le contenu de chacun des billets affichés doit l'être sous la forme d'un titre uniquement, d'une forme réduite (contenu du champ Extrait ou les 300 premiers caractères) ou sous leur forme complète. À noter : à l'accueil, le premier billet s'affiche systématiquement en entier.</p>
+
+<p>De plus, pour certains de ces contextes, vous pouvez également indiquer le nombre de billets affichés par page. Si vous laissez ce champ vide c'est la valeur précisée dans les paramètres du blog qui sera utilisée.</p>
+
+<h3>Personnalisation de la présentation</h3>
+
+<p>Sur cet onglet vous pouvez personnaliser quelques éléments de présentation de votre blog.</p>
+
+<h4>Paramètres généraux</h4>
+
+<p>Ces paramètres seront utilisés quelle que soit la largeur d'affichage du blog.</p>
+
+<h5>Polices de caractères</h5>
+
+<p>Vous pouvez ici choisir la famille principale de police de caractères qui sera utilisée pour l'essentiel des textes. Vous pouvez également sélectionner une seconde famille (secondaire) qui sera utilisée pour certains titres de second niveau et les commentaires. L'option « Par défaut » permet de laisser le choix prévu à l'origine.</p>
+
+<h5>Titre du blog</h5>
+
+<p>Vous pouvez indiquer ici si le titre du blog doit être affiché en gras ou pas, sa taille (en <em>em</em> par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que sa couleur en utilisant le <em>Color Picker</em> disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format <code>#rrggbb</code> avec rr, gg et bb compris entre 0 et ff.</p>
+
+<p>Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.</p>
+
+<h5>Titre des billets</h5>
+
+<p>Vous pouvez indiquer ici si les titres des billets doivent être affichés en gras ou pas, leur taille (en <em>em</em> par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que leur couleur en utilisant le <em>Color Picker</em> disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format <code>#rrggbb</code> avec rr, gg et bb compris entre 0 et ff.</p>
+
+<p>Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.</p>
+
+<h5>Titres sans lien</h5>
+
+<p>Vous pouvez indiquer ici la couleur des titres sans lien (essentiellement : le titre du billet lorsqu'il est affiché seul, les intertitres au sein des billets, l'item actif du menu horizontal) en utilisant le <em>Color Picker</em> disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format <code>#rrggbb</code> avec rr, gg et bb compris entre 0 et ff.</p>
+
+<p>Videz le champ pour annuler votre choix et revenir à celui défini à l'origine.</p>
+
+<h5>Liens dans les billets</h5>
+
+<p>Vous pouvez indiquer ici si les liens cités dans les billets doivent être affichés en gras ou non et définir leur couleur à l'état normal et déjà visités, leur couleur à l'état actif, ou lorsqu'ils sont survolés ou prennent le focus en utilisant le <em>Color Picker</em> disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format <code>#rrggbb</code> avec rr, gg et bb compris entre 0 et ff.</p>
+
+<p>Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.</p>
+
+<h4>Paramètres spécifiques pour les mobiles</h4>
+
+<p>Ces paramètres seront utilisés uniquement lorsque la largeur de l'affichage sera inférieure à 480 pixels (par exemple sur les mobiles). Ils viendront remplacer, s'il sont précisés, les paramètres de même nature décrits dans la partie générale ci-dessus.</p>
+
+<h5>Titre du blog</h5>
+
+<p>Vous pouvez indiquer ici si le titre du blog doit être affiché en gras ou pas, sa taille (en <em>em</em> par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que sa couleur en utilisant le <em>Color Picker</em> disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format <code>#rrggbb</code> avec rr, gg et bb compris entre 0 et ff.</p>
+
+<p>Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.</p>
+
+<h5>Titres des billets</h5>
+
+<p>Vous pouvez indiquer ici si les titres des billets doivent être affichés en gras ou pas, leur taille (en <em>em</em> par défaut, les unités reconnues sont %, pt, px, em et ex) ainsi que leur couleur en utilisant le <em>Color Picker</em> disponible en cliquant sur la pipette ou en précisant directement la couleur en utilisant le format <code>#rrggbb</code> avec rr, gg et bb compris entre 0 et ff.</p>
+
+<p>Videz un ou tous les champs pour annuler votre choix et revenir à celui défini à l'origine.</p>
+
+<h3>Accessibilité des contrastes de couleurs</h3>
+
+<p>Après l'enregistrement du choix d'une couleur, le ratio de contraste s'affiche à côté du champ et précise, quand c'est le cas, que ce contraste est conforme aux recommandations des <a href="http://www.w3.org/Translations/WCAG20-fr/">WCAG 2.0</a>. Pour être conforme, le contraste entre la couleur de fond et la couleur des caractères doit présenter les valeurs suivantes :</p>
+
+<ul>
+	<li>Au moins 4,5:1 pour les textes de taille courante pour le niveau AA ;</li>
+	<li>Au moins 7:1 pour les textes de taille courante pour le niveau AAA ;</li>
+	<li>Au moins 3:1 pour les textes de taille agrandie (150 % ou 120 % gras) pour le niveau AA ;</li>
+	<li>Au moins 4,5:1 pour les textes de taille agrandie (150 % ou 120 % gras) pour le niveau AAA.</li>
+</ul>
+
+</body>
+</html>
Index: themes/ductile/locales/fr/main.po
===================================================================
--- themes/ductile/locales/fr/main.po	(revision 683)
+++ themes/ductile/locales/fr/main.po	(revision 683)
@@ -0,0 +1,41 @@
+msgid "Additionnal style directives"
+msgstr "Directives CSS supplémentaires"
+
+msgid "reactions"
+msgstr "réactions"
+
+msgid "Add ping"
+msgstr "Ajouter un rétrolien"
+
+msgid "Suggestions:"
+msgstr "Suggestions :"
+
+msgid "Go to homepage"
+msgstr "Aller à l'accueil"
+
+msgid "Use search form"
+msgstr "Faire une recherche"
+
+msgid "Explore archives"
+msgstr "Explorer les archives"
+
+msgid "toDay"
+msgstr "au"
+
+msgid "FromDay"
+msgstr "Du"
+
+msgid "From"
+msgstr "De"
+
+msgid "By category"
+msgstr "Par catégorie"
+
+msgid "By date"
+msgstr "Par date"
+
+msgid "By tag"
+msgstr "Par tag"
+
+msgid "URL you've tried has typos, or the page has been deleted or moved."
+msgstr "L'adresse URL est erronée ou bien la page a été supprimée ou déplacée."
Index: themes/ductile/locales/fr/resources.php
===================================================================
--- themes/ductile/locales/fr/resources.php	(revision 628)
+++ themes/ductile/locales/fr/resources.php	(revision 628)
@@ -0,0 +1,18 @@
+<?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 (!isset($__resources['help']['ductile']))
+{
+	$__resources['help']['ductile'] = dirname(__FILE__).'/help/help.html';
+}
+
+?>
Index: themes/ductile/mediaqueries.css
===================================================================
--- themes/ductile/mediaqueries.css	(revision 699)
+++ themes/ductile/mediaqueries.css	(revision 699)
@@ -0,0 +1,389 @@
+@charset "UTF-8";
+/* -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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 ----------------------------------------- */
+
+/* seuils retenus :
+< 480px: tout en une colonne, sidebar et stickers en bas
+> 480px: stickers en haut
+> 640px: sidebar toujours en bas mais divisé en deux colonnes
+> 1024px: passage à deux colonnes, sidebar à droite
+> 1280px: décalage du post-info vers la gauche
+> 1600px: marges plus grandes */
+
+/* --------------------------------------------------------------------
+	Moins de 480px (téléphones)
+-------------------------------------------------------------------- */
+@media only screen and (max-width:480px) {
+	.nosmall {
+		display: none !important;
+		}
+	h1 {
+		font-size: 1.8em;
+		}
+	h1 a {
+		display: block;
+		padding: 6px 8px;
+		background: #f4f4f5;
+		background-image: -webkit-gradient(linear, left top, left bottom, from( #f4f4f5), to(#d7d7dC));
+		background: -webkit-linear-gradient(top,  #f4f4f5,  #d7d7dC);
+		background: -moz-linear-gradient(top,  #f4f4f5,  #d7d7dC);
+		background: -o-linear-gradient(top,  #f4f4f5,  #d7d7dC);
+		background: -ms-linear-gradient(top,  #f4f4f5,  #d7d7dC);
+		background: linear-gradient(top,  #f4f4f5,  #d7d7dC);
+		border-right: 1px solid #aaa;
+		border-bottom: 1px solid #ccc;
+		}
+	.supranav, #prelude {
+		border: none;
+		margin: 8px 0 0;
+		background: #fff;
+		padding-left: 0;
+		}
+	.supranav li a, #prelude li a {
+		border-right: 0;
+		display: block;
+		padding: 4px 8px;
+		border-bottom: 1px solid #ccc;
+		text-decoration: none;
+		white-space: nowrap;
+		margin-bottom: 4px;
+		}
+	#gotop li {
+		border-top: 1px solid #ccc;
+		text-transform: none;
+		padding-top: 6px;
+		}
+	#prelude {
+		margin: .5em 0 !important;
+		}
+	#prelude li a {
+		background: transparent url(img/menumobile.png) no-repeat right center;
+		 }
+	#sn-bottom li a {
+		background: transparent url(img/menumobile.png) no-repeat right top;
+		}
+	#gotop li a {
+		background: transparent url(img/menumobile.png) no-repeat right -150px;
+		}
+	.post-title {
+		font-size: 1.5em;
+		font-weight: bold;
+		font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+		}
+	.post-title a {
+		font-style: normal;
+		font-weight: bold;
+		}
+	#other-criteria .arch-block, #more-criteria .arch-block {
+		margin-left: 0 !important;
+		}
+	#stickers {
+		margin: 0;
+		padding: 0;
+		border-bottom: 1px solid #fff;
+		}
+	#stickers li {
+		position: relative;
+		padding: .5em 0;
+		margin-left: 0;
+		border-style: solid;
+		border-width: 1px 0 0 0;
+		overflow: hidden;
+		}
+	#stickers img {
+		position: absolute;
+		top: -2px;
+		clip: rect(0 32px 36px 0);
+		clip: rect(0, 32px, 36px, 0);
+		}
+	#stickers span {
+		margin-left: 40px;
+		}
+	#stickers a {
+		text-decoration: none;
+		}
+	ul, ol, dd {
+		padding: 0;
+		}
+	.post ul, .post ol, .post dd {
+		margin-left: 1em !important;
+		}
+}
+
+/* --------------------------------------------------------------------
+	Autres (plus de 480px)
+-------------------------------------------------------------------- */
+@media only screen and (min-width: 481px) {
+	.nobig {
+		display: none;
+		}
+	#prelude {
+		position: absolute;
+		margin: 0;
+		padding: 0 0 0 4px;
+		top: 0;
+		left: 3px;
+		color: #fff;
+		list-style-type: none;
+		}
+	#prelude li {
+		display: inline;
+		text-transform: none !important;
+		}
+	#prelude a, #prelude a:hover, #prelude a:visited {
+		position:absolute;
+		left:0;
+		top:-500px;
+		width:1px;
+		height:1px;
+		overflow:hidden;
+		background-image: none !important;
+		}
+	#prelude a:active, #prelude a:focus {
+		position:static;
+		width:auto;
+		height:auto;
+		}
+	#top {
+		padding-top: 24px;
+		}
+ 	#logo {
+		float:left; 
+		margin: 0 32px 0 24px;	
+		}
+	#logo a {
+		border: none;
+		background: transparent;
+		text-decoration: none;
+		}
+	h1 {
+		font-size: 2em;
+		padding-right: 240px;
+		padding-bottom: 4px;
+		margin-left: 32px;
+		}
+	#sn-bottom {
+		display: none;
+		}
+	.supranav {
+		margin: 36px 0 0;
+		border-bottom: 1px solid #ccc;
+		padding: 0 0 0 4px;
+		}
+	.supranav li {
+		display: inline;
+		padding: 8px 0;
+		padding-left: 4px;
+		}
+	.supranav li a {
+		display: inline-block;
+		vertical-align: top;
+		padding: 8px 32px 8px 28px;
+		border-right: 1px solid #ccc;
+		min-height: 2.5em;
+		-webkit-border-radius: 0 0 0 4px;
+		-moz-border-radius: 0 0 0 4px;
+		-o-border-radius: 0 0 0 4px;
+		-ms-border-radius: 0 0 0 4px;
+		-khtml-border-radius: 0 0 0 4px;
+		border-radius: 0 0 0 4px;	
+	 	}
+	.supranav li a span {
+		display: block;
+		}
+	.post-title {
+		font-size: 2.5em;
+		font-weight: normal;
+		}
+	.post-title a {
+		font-style: italic;
+		font-weight: normal;
+		}
+	#blogcustom {
+		padding: 0 1em;
+		}
+	#stickers {
+		position: absolute;
+		top: 0;
+		right: 0;
+		padding-right: 3%;
+		font-size: .75em;
+		}
+	#stickers li {
+		display: block;
+		float: left;
+		text-align: center;
+		width: 60px;
+		padding: 0;
+		}
+	#stickers span {
+		display: block;
+		text-align: center;
+		position: absolute;
+		top: -500px;
+		}
+	#stickers a:hover, #stickers a:focus {
+		background: #fff !important;
+		}
+	#stickers a:hover span, #stickers a:focus span {
+		color: #686867;
+		position: static;
+		top: 0;
+		}
+	.comment-info { 
+		clear: left;
+		float: left;
+		width: 10em;
+		}
+	.comment-content {
+		margin-left: 11.5em;
+		}
+}
+
+/* ------------------------------------------------------ special redimensionnement paysage */
+@media screen and (max-width:640px) and (orientation: landscape) { 
+  body { 
+   -webkit-text-size-adjust: 70%; 
+  } 
+}
+
+/* ------------------------------------------------------ règles communes < 640px */
+@media only screen and (max-width:639px) {
+	body {
+		-webkit-text-size-adjust: none;
+		}
+	#wrapper {
+		padding: 0 2%;
+		}
+	img {
+		max-width: 97%;
+		height: auto;
+		width: auto\9; /* pour ie8 */
+		}
+}
+
+/* ------------------------------------------------------ spécifique 640px à 1024px */
+@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%;
+		}
+}
+
+/* ------------------------------------------------------ spécifique 840px à 1024px */
+@media only screen and (min-width: 840px) and (max-width: 1023px) {
+	#wrapper {
+		padding: 0 13%;
+		}
+	#stickers {
+		padding-right: 13%;
+		}	
+}
+
+/* ------------------------------------------------------ 
+	au-delà de 1024px on passe à deux colonnes
+------------------------------------------------------ */
+@media only screen and (min-width: 1024px) {
+	#wrapper {
+		padding: 0 7%;
+		}
+	#main {
+		width : 100%;
+		margin : 0 -17em 0 0;
+		float : left;
+		display: inline;
+		}
+	#content {
+		margin : 0 20em 0 0;
+		padding : 0 0 2em 0;
+		}
+	#sidebar {
+		width : 17em;
+		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:first-child p {
+		margin: .33em 0;
+		}
+	.dc-archive #content {
+		margin: 0 17em 0 0;
+		}
+}
+
+/* ------------------------------------------------------ 
+	au-delà de 1280px on décale le post-info à gauche
+------------------------------------------------------- */
+@media only screen and (min-width: 1280px) {
+	#content {
+		margin : 0 20em 0 220px;
+		}
+	.full .post-attr,
+	.simple .post-attr {
+		margin-left: -220px;
+		margin-top: 0; 
+		float: left; 
+		width: 180px; 
+		text-align: right;
+		}
+	.post-attr a, .post-info, .post-tags {
+		padding-right: 0 !important;
+		}
+	#content-info, .navlinks, .pagination {
+		margin-left: -220px !important;
+		}
+	.dc-archive #content-info {
+		margin-left: 0 !important;
+		}
+	#content-info a.feed { 
+		white-space: nowrap;
+		}	
+}
+
+/* ------------------------------------------------------ au-delà de 1600px */
+@media only screen and (min-width: 1600px) {
+	#wrapper {
+		padding: 0 10%;
+		}
+	#stickers {
+		padding-right: 10%;
+		}
+}
Index: themes/ductile/rebase.css
===================================================================
--- themes/ductile/rebase.css	(revision 683)
+++ themes/ductile/rebase.css	(revision 683)
@@ -0,0 +1,107 @@
+@charset "UTF-8";
+/* -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# Copyright (c) 2007-2011 - Kozlika http://www.kozlika.org
+# 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 ----------------------------------------- */
+
+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 702)
+++ themes/ductile/style.css	(revision 702)
@@ -0,0 +1,1077 @@
+@charset "UTF-8";
+/* -- BEGIN LICENSE BLOCK ---------------------------------------
+# This file is part of Ductile, a theme for Dotclear
+#
+# Copyright (c) 2011 - 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 ----------------------------------------- */
+
+/* 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
+Titres non cliquables: #14709e
+Liens: #666 courant, #ad3f4c titre billet et Lire la suite
+Fond formulaire comm: #eef
+Fond sidebar: #ededed
+
+Thanks to:
+Colorzilla wysiwyg gradient editor http://www.colorzilla.com/gradient-editor/
+Micro clearfix by Nicolas Gallagher http://nicolasgallagher.com/
+*/
+
+/* -----------------------------------------------------------------
+	1. STRUCTURE - IMPORTS
+------------------------------------------------------------------ */
+
+@import url(rebase.css);
+@import url(mediaqueries.css);
+
+/* ------------------------------------------------------- body */
+body {
+	background: #fff;
+	font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	color: #222;
+	}
+
+/* ------------------------------------------------------------
+	2. LIENS & Complément balises HTML
+------------------------------------------------------------- */
+del {
+	color: #800000;
+	}
+blockquote {
+	border-left: 4px solid #ccc;
+	padding: 1px 1em .5em;
+	background: #f9f9f9;
+	}
+code, pre {
+	background: #efefef;
+	border-right: 1px solid #aaa;
+	border-bottom: 1px solid #aaa;
+	font-size: .81em;
+	}
+pre {
+	white-space: normal;
+	}
+a {
+	color: #686867;
+	}
+a:hover, a:focus {
+	background-color: #ebebee;
+	text-decoration: none;
+	}
+ul ul {
+	margin-top: 0;
+	}
+h2, h2 a {
+	font-weight: normal;
+	margin-top: .75em;
+	}
+table {
+	border: 1px solid #999;
+	border-collapse: collapse;
+	}
+td, th, tr {
+	padding: 2px 8px;
+	border: 1px solid #CCC;
+	border-collapse: collapse;
+	}
+thead th, tbody th {
+	color: #555;
+	background: #f0f0f5;
+	text-align: left;
+	font-weight: normal;
+	}
+tbody tr:hover, tbody th:hover {
+	background: #eee; 
+	}
+table caption {
+	color: #14709e;
+	text-align: left;
+	margin-bottom: .33em;
+	font-weight: bold;
+	}
+
+/* ------------------------------------------------------------
+	3. PAGE
+------------------------------------------------------------- */
+
+#page {
+	position: relative;
+	}
+
+/* ------------------------------------------------------------
+	4. HAUT DE PAGE
+------------------------------------------------------------- */
+#header {
+	position: relative;
+	text-shadow: 0 1px 1px rgba(0,0,0,.2);
+	line-height: 1;
+	}
+#logo a img, #stickers a img {
+	border: none;
+	}
+h1 {
+	font-variant: small-caps;
+	}
+h1 a {
+	text-decoration: none;
+	color: #333;
+	}
+#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: #686867;
+	text-shadow: none;
+	}
+.supranav, #prelude {
+	list-style-type: none;
+	line-height: 1.25;
+	font-size: .875em;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	}
+.supranav li, #prelude li {
+	text-transform: uppercase;
+	vertical-align: top;
+	}
+.supranav {
+	clear: both;
+	}
+.supranav li a {
+	text-decoration: none;
+	white-space: nowrap;
+	margin-bottom: 4px;
+	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;
+	color: #14709e;
+	}
+.supranav li a span {
+	display: block;
+	text-transform: none;
+	text-shadow: none;
+	font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	font-style:italic;
+	}
+
+/* ------------------------------------------------------------
+	5. WRAPPER MAIN CONTENT
+------------------------------------------------------------- */
+#wrapper {
+	clear: both;
+	position: relative;
+	}
+#content {
+	padding-bottom: 2em;
+	}
+
+/* ------------------------------------------------------- content-info */
+#content-info {
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	font-size: .875em;
+	}
+#content-info h2 {
+	color: #14709e;
+	margin-top: 1em;
+	margin-bottom: .33em;
+	}
+#subcategories {
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	padding-top: 1em;
+	font-size: .875em;
+	}
+#subcategories h3, #subcategories ul {
+	display: inline;
+	padding-right: 1em;
+	}
+#subcategories h3 {
+	font-size: 1.1em;
+	font-variant: small-caps;
+	}
+#content-info p, 
+#content-info ul, 
+#subcategories ul {
+	margin: .5em 0;
+	padding: 0;
+	list-style-type: none;
+	}
+#subcategories li {
+	margin: 0;
+	display: inline;
+	padding-right: 1em;
+	}
+.feed-info {
+	color: #fff;
+	}
+.feed-info a {
+	font-size: .875em;
+	padding-top: .1em;
+	padding-bottom: .1em;
+	}
+/* ------------------------------------------------------- pagination, navlinks */
+.navlinks, 
+.pagination {
+	margin: 2em 0 1em 0;
+	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%);
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	-o-border-radius: 4px;
+	-ms-border-radius: 4px;
+	-khtml-border-radius: 4px;
+	border-radius: 4px;
+	border-right: 1px solid #aaa;
+	border-bottom: 1px solid #ccc;
+	}
+.navlinks a, 
+.pagination a {
+	color: #333;
+	}
+
+/* ------------------------------------------------------------
+	6. BILLETS
+------------------------------------------------------------- */
+.post {
+	background: transparent url(img/filet.png) repeat-x left bottom;
+	position: relative;
+	padding-bottom: 1.5em;
+	}
+	.day-date {
+	display: none;
+	}
+.post-title {
+	margin-bottom: .33em;
+	color: #14709e;
+	line-height: 1.17;
+	}
+.post-title a {
+	text-decoration: none;
+	color: #ad3f4c;
+	}
+.post-icon { 	/* for entry short */
+	display: block;
+	float: left;
+	margin: .33em 1em .66em 0;
+	padding: 4px;
+	border: 1px solid #999;
+	-moz-box-shadow: 2px 2px 3px #ccc;
+	-webkit-box-shadow: 2px 2px 3px #ccc;
+	-o-box-shadow: 2px 2px 3px #ccc;
+	box-shadow: 2px 2px 3px #ccc;
+	}
+.short .post-content p { 	/* for entry short */
+	margin-top: 0;
+	}
+.post h3,
+.post h4, 
+.post h5,
+.post h6 {
+	font-weight: normal;
+	color: #14709e;
+	}
+.post h3, .post h5 {
+	font-variant: small-caps;
+	}
+.post-content img, .post-excerpt img {
+	border: 1px solid #ccc;
+	max-width: 96%;
+	padding: 4px;
+	}
+img.smiley {
+	border: none;
+	padding: 0;
+	}
+.post-info, 
+.post-tags, 
+.post-info-co, 
+.read-it {
+	line-height: 1.2;	
+	margin: .33em 0;
+	}
+.post-attr {
+	margin-bottom: 1em;
+	}
+.post-info, 
+.post-tags {
+	font-size: .875em;
+	margin: 0;
+	background: #fff;
+	display: inline;
+	padding: 0 .66em 0 0;
+	}
+.post-date, .post-attr a {
+	white-space: nowrap;
+	}
+.post-cat {
+	padding-left: 24px;
+	background: transparent no-repeat -62px center url(img/post-info.png);
+	}
+.permalink a {
+	padding-left: 20px;
+	background: transparent no-repeat left bottom url(img/post-info.png);
+	}
+.post-tags li:first-child {
+	padding-left: 20px;
+	background: transparent no-repeat -124px top url(img/post-info.png);
+	}
+.post-tags li {
+	display: inline;
+	}
+.post-tags li:after {
+	content: ", ";
+ }
+.post-tags li:last-child:after {
+	content:"";
+	}
+.post-content {
+	padding-bottom: 9px;
+	}
+.post-content ul, .post-excerpt ul {
+	list-style-type: square;
+	margin-left: 1em;
+	}
+.post ol {
+	margin-left: 1em;
+	}
+.footnotes {
+	font-size: .875em;
+	}
+.footnotes h4 {
+	font-variant: normal;
+	font-weight: bold;
+	}
+.read-it {
+	text-align: right;
+	margin: 0 0 .5em 0;
+	}
+.read-it a {
+	color: #ad3f4c;
+	padding-left: .5em;
+	}
+.post-info-co {
+	position: absolute;
+	bottom: 0;
+	margin: 0;
+	background: #fff;
+	font-size: 0.875em;
+	font-style: italic;
+	padding-right: .5em;
+	max-width: 80%;
+	}
+.post-info-co a {
+	text-decoration: none;
+	padding-right: 1em;
+	padding-left: 20px;
+	}
+.post-info-co a.comment_count {
+	background: url(img/info-co.png) no-repeat left .25em;
+	}
+.post-info-co a.ping_count {
+	background: url(img/info-co.png) no-repeat left center;
+	}
+.post-info-co a.attach_count {
+	background: url(img/info-co.png) no-repeat left -126px;
+	}
+#attachments {
+	font-size: .875em;
+	border-bottom: 1px solid #999;
+	margin: 0 0 2em;
+	}
+#attachments h3 {
+	font-variant: small-caps;
+	font-weight: normal;
+	color: #686867;
+	}
+#attachments ul {
+	list-style-type: none;
+	margin: 0 0 1em;
+	padding: 0;
+	}
+#attachments ul li {
+	padding-left: 28px;
+	background: transparent url(img/download.png) no-repeat left -2px;
+	}
+
+/* ------------------------------------------------------------
+	7. COMMENTAIRES, PINGS
+------------------------------------------------------------- */
+
+/* ------------------------------------------------------- commentaires et rétroliens */
+#comments, 
+#ping-url, 
+#comment-form,
+#comments-feed { 
+	color: #333;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	font-size: .875em;
+	clear: both;
+	}
+#comment-form, #ping-url {
+	padding: 1em;
+	background: #eef;
+	margin-top: 1em;
+	color: #333;
+	border: 1px solid #ddf;
+	}
+#pr {
+	padding: 1em;
+	border: 1px dashed #14709e;
+	margin-bottom: 1em;
+	}
+#comments h3, 
+#ping-url h3, 
+#pr h3, 
+#comment-form h3 { 
+	margin-top: 2em;
+	color: #666;
+	}
+#comment-form h3, #ping-url h3 {
+	margin-top: 0;
+	}
+#comments > ul { 
+	margin-left: 0;
+	padding-left: 0;
+	list-style-type: none;
+	}
+.comment, .ping {
+	clear: left;
+	margin-left: 0;
+	border-top: 1px solid #bbb;
+	}
+.comment-info { 
+	padding-bottom: .2em;
+	line-height: 1.25;
+	color: #686867;
+	font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif;	
+	}
+#comments .me { 
+	font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	color: #14709e;
+	}
+.comment-number {
+	font-size: 2em;
+	font-weight: normal;
+	font-style: italic;
+	text-decoration: none;
+	font-family: "New Century Schoolbook","Century Schoolbook", "Century Schoolbook L", Georgia, serif;
+	color: #ad3f4c;
+	display: block;
+	width: 2em;
+	}
+.comment .comment-number {
+	background: transparent url(img/info-co.png) right .25em no-repeat;
+	}
+.ping .comment-number {
+	background: transparent url(img/info-co.png) right center no-repeat;
+	}
+#comments-feed {
+	border-top: 1px solid #bbb;
+	margin-top: 1.5em;
+	padding-top: 1em;
+	}
+
+/* ------------------------------------------------------- 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;
+	padding: 4px;
+	background: #fff;
+	-webkit-border-radius: 3px; 
+	-moz-border-radius: 3px;
+	-o-border-radius: 3px;
+	-ms-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	border-radius: 3px;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	}
+.field textarea {
+	padding: .5em 1em;
+	}
+.field input:focus, 
+.field textarea:focus {
+	background: #fff;
+	}
+#comment-form input[type=submit], 
+#comment-form input[type=reset] {
+	color: #eee;
+	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);
+	background: rgb(119,119,119);
+	border: solid 1px #686867;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	-o-border-radius: 5px;
+	-ms-border-radius: 5px;
+	-khtml-border-radius: 5px;
+	border-radius: 5px;
+	-webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	-moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	-o-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	box-shadow: 0 1px 2px rgba(0,0,0,.2);
+	background-image: -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: -moz-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%);
+	background: linear-gradient(top, rgba(119,119,119,1) 0%,rgba(85,85,85,1) 100%);
+	}
+#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: rgb(85,85,85);
+	background-image: -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: -moz-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%);
+	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;
+	}
+#comments-feed { 
+	margin-top: 2em; 
+	}
+
+/* ------------------------------------------------------------
+	8. SIDEBAR
+------------------------------------------------------------- */
+
+#sidebar {
+	font-size: 0.875em;
+	}
+#sidebar img {
+	max-width: 100%;
+	}
+#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 h2.toggle {
+	background: url(img/minus-plus.png) no-repeat left -82px;
+	padding-left: 16px;
+	}
+#sidebar h2.expanded {
+	background: url(img/minus-plus.png) no-repeat left 6px;
+	}
+#sidebar h2.toggle a {
+	text-decoration: none;
+	}
+#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: 0;
+	}
+#sidebar li {
+	padding-left: 16px;
+	background: transparent url(img/squares.png) no-repeat -133px .5em;
+	}
+#sidebar ul li ul li {
+	background: transparent url(img/squares.png) no-repeat -70px center;
+	}
+#sidebar ul li ul li ul li {
+	background: transparent url(img/squares.png) no-repeat 0 center;
+	}
+#sidebar .syndicate li {
+	background-image: none;
+	padding-left: 0;
+	}
+#blognav > div, 
+#blogextra > div {
+	background: #ededed;
+	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);
+	}
+.category-current {
+	font-weight: bold;
+	}
+	
+/* ------------------------------------------------------- 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;
+	}
+#q {
+	float: left;
+	width: 78%;
+	font-size: 100%;
+	padding-left: 2px;
+	}
+#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;
+	font-size: .875em;
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	}
+#footer p {
+	padding: .66em 2em;
+	margin: 0;
+	text-align: right;
+	}
+#footer a {
+	color: #fff;
+	}
+#footer a:hover, 
+#footer a:focus {
+	background-color: #333;
+	}
+#blogcustom {
+	clear: both;
+	background-color: #ededed;
+	color: #333;
+	border-bottom: 1px solid #999;
+	}
+#blogcustom h2 {
+	font-size: 1.2em;
+	}
+#blogcustom a:link, #blogcustom a:visited {
+	color: #666;
+	}
+#blogcustom > div {
+	display: inline-block;
+	vertical-align: top;
+	width: 294px;
+	padding: 12px;
+	}
+#blogcustom div.feed {
+	background-image: none;
+	}
+#blogcustom img {
+	max-width: 100%;
+	}
+#blogcustom ul {
+	padding: .66em 1em 0;
+	margin: 0;
+	text-align: left;
+	line-height: 1.75;
+	}
+#blogcustom li {
+	padding-left: 0;
+	margin-left: 0;
+	}
+#blogcustom .syndicate ul,
+#blogcustom .tags ul {
+	list-style-type: none;
+	padding-left: 0;
+	}
+#stickers {
+	list-style-type: none;
+	margin: 0;
+	}
+/* ------------------------------------------------------------
+	10. CLASSES COMMUNES
+------------------------------------------------------------- */
+/* ------------------------------------------------------- RSS */
+.feed {
+	padding-left: 22px;
+	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,
+#blogcustom .tags ul li, 
+#blogcustom .tags 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;
+	}
+hr.hidden {
+	background: #fff;
+	color: #fff;
+	border-color: #fff;
+	margin: 0;
+	}
+/* ------------------------------------------------------------
+	11. PAGES SPECIFIQUES
+------------------------------------------------------------- */
+
+.dc-home { }
+.dc-post { }
+.dc-category { }
+
+/* ---------------------------------------------------------------- archives */
+.arch-block {
+	display: inline-block;
+	margin: 0 0 2em 4em;
+	vertical-align: top;
+	}
+.arch-block:first-child {
+	margin-left: 0;
+	}
+.arch-block h3 {
+	margin-bottom: 1em;
+	font-size: 1.2em;
+	font-style: italic;
+	font-weight: normal;
+	text-transform: lowercase;
+	color: #14709e;
+	}
+.arch-block h4 {
+	font-family: "Franklin gothic medium","arial narrow","DejaVu Sans Condensed","helvetica neue",helvetica,sans-serif;
+	font-weight: normal;
+	font-size: 1.1em;
+	margin-bottom: 0;
+	margin-top: 0;
+	}
+.arch-block ul {
+	list-style-type: none;
+	margin: 0;
+	padding: 0;
+	}
+.arch-block ul ul {
+	margin-left: 20px;
+	}
+#time-criteria h3:first-child {
+	margin-top: 0;
+	}
+#by-date {
+	margin-right: 0;
+	margin-bottom: 1em;
+	margin-top: 2em;
+	}
+#by-date h3 {
+	margin-bottom: 0;
+	}
+.fromto {
+	margin-top: 0;
+	margin-bottom: 1.5em;
+	font-size: .875em;
+	font-style: italic;
+	}
+#by-date div {
+	display: inline-block;
+	vertical-align: top;
+	margin: 0;
+	width: 10em;
+	}
+#by-date ul {
+	margin-bottom: 1.5em;
+	}
+#by-date span {
+	font-size: .875em;
+	}
+#by-cat ul {
+	background: transparent url(img/vline.png) repeat-y;
+	}
+#by-cat ul ul {
+	margin: .5em 0 0 .5em;
+	}
+#by-cat ul li {
+	padding: .2em .2em .2em 20px;
+	background: transparent url(img/hline.png) no-repeat left .82em;
+	}
+#by-cat ul li:last-child {
+	background-image: url(img/last-hline.png);
+	}
+#by-tag {
+	width: 18em;
+	}
+#by-tag ul li {
+	display: inline;
+	padding-right: 1em;
+	}
+#by-tag .tag0 {
+	color: #909090;
+	font-size: 90%;
+	}
+#by-tag .tag10 {
+	color: #828282;
+	font-size: 92%;
+	}
+#by-tag .tag20 {
+	color: #737373;
+	font-size: 94%;
+	}
+#by-tag .tag30 {
+	color: #656565;
+	font-size: 96%;
+	}
+#by-tag .tag40 {
+	color: #484848;
+	font-size: 98%;
+	}
+#by-tag .tag50 {
+	color: #3A3A3A;
+	font-size: 100%;
+	}
+#by-tag .tag60 {
+	color: #2B2B2B;
+	font-size: 102%;
+	}
+#by-tag .tag70 {
+	color: #1D1D1D;
+	font-size: 104%;
+	}
+#by-tag .tag80 {
+	color: #0E0E0E;
+	font-size: 106%;
+	}
+#by-tag .tag90 {
+	color: #030303;
+	font-size: 108%;
+	}
+#by-tag .tag100 {
+	color: #000;
+	font-size: 110%;
+	}
+.dc-archive #search {
+	padding: 4px 8px;
+	}
+.dc-archive #blogextra div {
+	background-color: transparent;
+	margin-bottom: 1em;
+	padding: 4px;
+	border: 1px solid #ccc;
+	-webkit-box-shadow: none;
+	-moz-box-shadow: none;
+	-o-box-shadow: none;
+	box-shadow: none;
+	}
+.dc-archive #blogextra h2 {
+	margin-bottom: .33em;
+	}	
+.dc-archive-month .title h2.post-title {
+	font-size: 1.3em;
+	}
+/* ---------------------------------------------------------------- 404 */
+.dc-404 #content-info {
+	padding-bottom: 200px;
+	background: transparent url(img/404.png) no-repeat bottom center;
+	}
+.dc-404 .content-inner ul {
+	margin-left: 0;
+	padding-left: 0;
+	list-style-type: none;
+	}
+.dc-404 .content-inner h3 {
+	font-size: 1.1em;
+	font-variant: small-caps;
+	}
+/* ---------------------------------------------------------------- search */
+.dc-search #content-info em {
+	color: #14709e;
+	}
+/* ---------------------------------------------------
+  12. ET POUR FINIR NE PAS OUBLIER LES CLEARERS
+--------------------------------------------------- */
+.post, 
+.pagination,
+.navlinks,
+.footnotes, 
+#attachments,
+.read-it, 
+.post-info-co, 
+#comments, #footer,
+.clearer {
+	clear: both;
+	}
+.post-content:before, .post-content:after {
+	content: "";
+	display: table;
+	}
+.post-content:after {
+	clear: both;
+	}
+.post:before, .post:after {
+	content: "";
+	display: table;
+	}
+.post:after {
+	clear:both;
+	}
Index: themes/ductile/tpl/404.html
===================================================================
--- themes/ductile/tpl/404.html	(revision 683)
+++ themes/ductile/tpl/404.html	(revision 683)
@@ -0,0 +1,60 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX,NOARCHIVE"}}" />
+	
+	<title>{{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}}</title>
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Document not found}} - {{tpl:BlogName encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-404">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<div id="content-info">
+						<h2>{{tpl:lang Document not found}}</h2>
+						<p>{{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}</p>
+					</div>
+					
+					<div class="content-inner">
+						<h3>{{tpl:lang Suggestions:}}</h3>
+						<ul>
+							<li><a href="{{tpl:BlogURL}}">{{tpl:lang Go to homepage}}</a></li>
+							<li><a href="#search">{{tpl:lang Use search form}}</a></li>
+							<li><a href="{{tpl:BlogURL}}archive">{{tpl:lang Explore archives}}</a></li>
+						</ul>
+					</div> <!-- End #content-inner -->
+					
+				</div> <!-- End #content -->
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/_entry-full.html
===================================================================
--- themes/ductile/tpl/_entry-full.html	(revision 701)
+++ themes/ductile/tpl/_entry-full.html	(revision 701)
@@ -0,0 +1,54 @@
+<div id="p{{tpl:EntryID}}" class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}} full" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}">
+	<!-- # New day date -->
+	<tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader>
+	
+	<h2 class="post-title"><a href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
+	
+	<div class="post-attr">
+		<p class="post-info">
+			<span class="post-author">{{tpl:lang By}} {{tpl:EntryAuthorLink}}, </span>
+			<span class="post-date">{{tpl:EntryDate}}. </span>
+			<tpl:EntryIf has_category="1">
+				<span class="post-cat"><tpl:EntryCategoriesBreadcrumb><a 
+				href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a> › </tpl:EntryCategoriesBreadcrumb><a 
+				href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a></span>
+			</tpl:EntryIf>
+		</p>
+		
+		<tpl:EntryTags>
+			<tpl:TagsHeader>
+				<ul class="post-tags">
+			</tpl:TagsHeader>
+				<li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li> 
+			<tpl:TagsFooter>
+				</ul>
+			</tpl:TagsFooter>
+		</tpl:EntryTags>
+	</div>    
+	
+	<!-- # --BEHAVIOR-- publicEntryBeforeContent -->
+	{{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
+	
+	<tpl:EntryIf extended="1">
+		<div class="post-excerpt">{{tpl:EntryExcerpt}}</div>
+	</tpl:EntryIf>
+	<div class="post-content">{{tpl:EntryContent}}</div>
+	
+	<!-- # --BEHAVIOR-- publicEntryAfterContent -->
+	{{tpl:SysBehavior behavior="publicEntryAfterContent"}}
+	
+	<!-- # Number of comments, trackbacks and attachments -->
+	<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+		<p class="post-info-co">
+	</tpl:EntryIf>
+	<tpl:EntryIf show_comments="1">
+			<a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
+	</tpl:EntryIf>
+	<tpl:EntryIf show_pings="1">
+			<a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
+	<tpl:EntryIf has_attachment="1">
+			<a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
+	<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+		</p>
+	</tpl:EntryIf>
+</div>
Index: themes/ductile/tpl/_entry-short.html
===================================================================
--- themes/ductile/tpl/_entry-short.html	(revision 701)
+++ themes/ductile/tpl/_entry-short.html	(revision 701)
@@ -0,0 +1,77 @@
+<div id="p{{tpl:EntryID}}" class="post short {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}}" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}">
+	<!-- # New day date -->
+	<tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader>
+	
+	<h2 class="post-title"><a href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
+	
+	<div class="post-attr">
+		<p class="post-info">
+			<span class="post-author">{{tpl:lang By}} {{tpl:EntryAuthorLink}}, </span>
+			<span class="post-date">{{tpl:EntryDate}}. </span>
+			<tpl:EntryIf has_category="1">
+				<span class="post-cat"><tpl:EntryCategoriesBreadcrumb><a 
+				href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a> › </tpl:EntryCategoriesBreadcrumb><a 
+				href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a></span>
+			</tpl:EntryIf>
+		</p>
+		
+		<tpl:EntryTags>
+			<tpl:TagsHeader>
+				<ul class="post-tags">
+			</tpl:TagsHeader>
+				<li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li> 
+			<tpl:TagsFooter>
+				</ul>
+			</tpl:TagsFooter>
+		</tpl:EntryTags>
+	</div>    
+	
+	<!-- # --BEHAVIOR-- publicEntryBeforeContent -->
+	{{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
+	
+	<!-- # Entry with an excerpt -->
+	<tpl:EntryIf extended="1">
+		<div class="post-content">
+			{{tpl:EntryFirstImage size="t" class="post-icon"}}
+			{{tpl:EntryExcerpt}}
+		</div>
+		<p class="read-it"><a href="{{tpl:EntryURL}}"
+		 title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue reading}}</a>
+		</p>
+	</tpl:EntryIf>
+	
+	<!-- # Entry without excerpt -->
+	<tpl:EntryIf extended="0">
+		<div class="post-content">
+			{{tpl:EntryFirstImage size="t" class="post-icon"}}
+			<p>
+				{{tpl:EntryContent encode_html="1" remove_html="1" cut_string="300"}}
+				<tpl:EntryIfContentIsCut encode_html="1" remove_html="1" cut_string="300">
+				&nbsp;[…]
+				</tpl:EntryIfContentIsCut>
+			</p>
+		</div>
+		<tpl:EntryIfContentIsCut encode_html="1" remove_html="1" cut_string="300">
+			<p class="read-it"><a href="{{tpl:EntryURL}}"
+			 title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue reading}}</a></p>
+		</tpl:EntryIfContentIsCut>
+	</tpl:EntryIf>
+	
+	<!-- # --BEHAVIOR-- publicEntryAfterContent -->
+	{{tpl:SysBehavior behavior="publicEntryAfterContent"}}
+	
+	<!-- # Number of comments, trackbacks and attachments -->
+	<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+		<p class="post-info-co">
+	</tpl:EntryIf>
+	<tpl:EntryIf show_comments="1">
+			<a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
+	</tpl:EntryIf>
+	<tpl:EntryIf show_pings="1">
+			<a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
+	<tpl:EntryIf has_attachment="1">
+			<a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
+	<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+		</p>
+	</tpl:EntryIf>
+</div>
Index: themes/ductile/tpl/_entry-title.html
===================================================================
--- themes/ductile/tpl/_entry-title.html	(revision 683)
+++ themes/ductile/tpl/_entry-title.html	(revision 683)
@@ -0,0 +1,40 @@
+<div id="p{{tpl:EntryID}}" class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}} title" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}">
+	<!-- # New day date -->
+	<tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader>
+
+	<h2 class="post-title"><a href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
+	
+	<div class="post-attr">
+		<p class="post-info">
+			<span class="post-author">{{tpl:lang By}} {{tpl:EntryAuthorLink}}, </span>
+			<span class="post-date">{{tpl:EntryDate}}. </span>
+			<tpl:EntryIf has_category="1">
+				<tpl:EntryCategoriesBreadcrumb>
+					<span class="post-breadcrumb-cat"><a href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a></span> ›
+				</tpl:EntryCategoriesBreadcrumb>
+				<span class="post-cat"><a href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a></span>
+			</tpl:EntryIf>
+		</p>
+	</div>    
+	
+	<!-- # --BEHAVIOR-- publicEntryBeforeContent -->
+	{{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
+	
+	<!-- # --BEHAVIOR-- publicEntryAfterContent -->
+	{{tpl:SysBehavior behavior="publicEntryAfterContent"}}
+	
+	<!-- # Number of comments, trackbacks and attachments -->
+	<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+		<p class="post-info-co">
+	</tpl:EntryIf>
+	<tpl:EntryIf show_comments="1">
+			<a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
+	</tpl:EntryIf>
+	<tpl:EntryIf show_pings="1">
+			<a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
+	<tpl:EntryIf has_attachment="1">
+			<a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
+	<tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
+		</p>
+	</tpl:EntryIf>
+</div>
Index: themes/ductile/tpl/_footer.html
===================================================================
--- themes/ductile/tpl/_footer.html	(revision 688)
+++ themes/ductile/tpl/_footer.html	(revision 688)
@@ -0,0 +1,15 @@
+<ul id="gotop" class="supranav nobig"><li><a href="#top">Haut de page</a></li></ul>
+
+{{tpl:SimpleMenu id="sn-bottom" class="supranav nobig"}}
+
+<div id="footer">
+	<div id="blogcustom">
+		{{tpl:Widgets type="custom"}}
+	</div> <!-- End #custom widgets -->
+
+	{{tpl:SysBehavior behavior="publicInsideFooter"}}
+
+	<p>{{tpl:SysPoweredBy}}</p>
+</div>
+
+{{tpl:SysBehavior behavior="publicFooterContent"}}
Index: themes/ductile/tpl/_head.html
===================================================================
--- themes/ductile/tpl/_head.html	(revision 683)
+++ themes/ductile/tpl/_head.html	(revision 683)
@@ -0,0 +1,16 @@
+<!-- media queries -->
+<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+<!-- compat media queries -->
+<!--[if lt IE 9]>
+	<script src="http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js"></script>
+	<link rel="stylesheet" type="text/css" href="{{tpl:BlogThemeURL}}/ie.css" media="screen" />
+<![endif]-->
+
+<link rel="stylesheet" type="text/css" href="{{tpl:BlogThemeURL}}/style.css" media="screen" />
+<link rel="stylesheet" type="text/css" href="{{tpl:BlogThemeURL}}/../default/print.css" media="print" />
+
+<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/_pagination.html
===================================================================
--- themes/ductile/tpl/_pagination.html	(revision 683)
+++ themes/ductile/tpl/_pagination.html	(revision 683)
@@ -0,0 +1,14 @@
+<tpl:Pagination>
+	<p class="pagination">
+		<tpl:PaginationIf end="0">
+			<a href="{{tpl:PaginationURL offset="+1"}}" class="prev">&#171;
+			{{tpl:lang previous entries}}</a> - 
+		</tpl:PaginationIf>
+		
+		{{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
+		
+		<tpl:PaginationIf start="0"> - <a href="{{tpl:PaginationURL offset="-1"}}" class="next">
+			{{tpl:lang next entries}} &#187;</a>
+		</tpl:PaginationIf>
+	</p>
+</tpl:Pagination>
Index: themes/ductile/tpl/_sidebar.html
===================================================================
--- themes/ductile/tpl/_sidebar.html	(revision 683)
+++ themes/ductile/tpl/_sidebar.html	(revision 683)
@@ -0,0 +1,9 @@
+<div id="sidebar">
+	<div id="blognav">
+		{{tpl:Widgets type="nav"}}
+	</div> <!-- End #blognav -->
+	
+	<div id="blogextra">
+		{{tpl:Widgets type="extra"}}
+	</div> <!-- End #blogextra -->
+</div>
Index: themes/ductile/tpl/_simple-entry.html
===================================================================
--- themes/ductile/tpl/_simple-entry.html	(revision 702)
+++ themes/ductile/tpl/_simple-entry.html	(revision 702)
@@ -0,0 +1,179 @@
+<div id="p{{tpl:EntryID}}" class="post simple">
+	<h2 class="post-title">{{tpl:EntryTitle encode_html="1"}}</h2>
+	
+	<div class="post-attr">
+		<p class="post-info">
+			<span class="post-author">{{tpl:lang By}} {{tpl:EntryAuthorLink}}, </span>
+			<span class="post-date">{{tpl:EntryDate}}. </span>
+			<span class="permalink"><a href="{{tpl:EntryURL}}">{{tpl:lang Permalink}}</a></span>
+			<tpl:EntryIf has_category="1">
+				<span class="post-cat"><tpl:EntryCategoriesBreadcrumb><a 
+				href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a> › </tpl:EntryCategoriesBreadcrumb><a 
+				href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a></span>
+			</tpl:EntryIf>
+		</p>
+		
+		<tpl:EntryTags>
+			<tpl:TagsHeader>
+				<ul class="post-tags">
+			</tpl:TagsHeader>
+				<li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li> 
+			<tpl:TagsFooter>
+				</ul>
+			</tpl:TagsFooter>
+		</tpl:EntryTags>
+	</div>    
+	
+	<!-- # --BEHAVIOR-- publicEntryBeforeContent -->
+	{{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
+	
+	<!-- # Entry with an excerpt -->
+	<tpl:EntryIf extended="1">
+		<div class="post-excerpt">{{tpl:EntryExcerpt}}</div>
+	</tpl:EntryIf>
+	
+	<div class="post-content">{{tpl:EntryContent}}</div>
+	
+	<!-- # --BEHAVIOR-- publicEntryAfterContent -->
+	{{tpl:SysBehavior behavior="publicEntryAfterContent"}}
+</div>
+
+<!-- # Attachments -->
+<tpl:Attachments>
+	<tpl:AttachmentsHeader>
+		<div id="attachments">
+			<h3>{{tpl:lang Attachments}}</h3>
+			<ul>
+	</tpl:AttachmentsHeader>
+				<li class="{{tpl:AttachmentType}}">
+					<tpl:AttachmentIf is_mp3="1">
+						{{tpl:include src="_mp3_player.html"/}} - 
+					</tpl:AttachmentIf>
+					<tpl:AttachmentIf is_flv="1">
+						{{tpl:include src="_flv_player.html"/}}
+					</tpl:AttachmentIf>
+					<tpl:AttachmentIf is_flv="0">
+						<a href="{{tpl:AttachmentURL}}"
+						 title="{{tpl:AttachmentFileName}} ({{tpl:AttachmentSize}})">{{tpl:AttachmentTitle}}</a>
+					</tpl:AttachmentIf>
+				</li>
+	<tpl:AttachmentsFooter>
+			</ul>
+		</div>
+	</tpl:AttachmentsFooter>
+</tpl:Attachments>
+
+<!-- # Comments -->
+<tpl:EntryIf show_comments="1">
+	<tpl:Comments with_pings="1">
+		<tpl:CommentsHeader>
+			<div id="comments">
+				<h3>{{tpl:EntryCommentCount count_all="1" one="%s" more="%s"}} {{tpl:lang reactions}}</h3>
+				<ul>
+		</tpl:CommentsHeader>
+					<tpl:CommentIf is_ping="0">
+						<li id="c{{tpl:CommentID}}" class="comment {{tpl:CommentIfMe}} {{tpl:CommentIfOdd}} {{tpl:CommentIfFirst}}">
+					</tpl:CommentIf>
+					<tpl:CommentIf is_ping="1">
+						<li id="c{{tpl:PingID}}" class="ping {{tpl:PingIfOdd}} {{tpl:PingIfFirst}}">
+					</tpl:CommentIf>
+							<p class="comment-info"><a href="#c{{tpl:CommentID}}" class="comment-number">{{tpl:CommentOrderNumber}}</a>
+								{{tpl:lang From}} {{tpl:CommentAuthorLink}} - {{tpl:CommentDate format="%d"}}/{{tpl:CommentDate format="%m"}}/{{tpl:CommentDate format="%Y"}}, {{tpl:CommentTime}}
+							</p>
+							<div class="comment-content">
+								<!-- # --BEHAVIOR-- publicCommentBeforeContent -->
+								{{tpl:SysBehavior behavior="publicCommentBeforeContent"}}
+								
+								{{tpl:CommentContent}}
+								
+								<!-- # --BEHAVIOR-- publicCommentAfterContent -->
+								{{tpl:SysBehavior behavior="publicCommentAfterContent"}}
+							</div>
+						</li>
+		<tpl:CommentsFooter>
+					</ul>
+				</div>
+		</tpl:CommentsFooter>
+	</tpl:Comments>
+</tpl:EntryIf>
+
+<tpl:EntryIf operator="or" comments_active="1" pings_active="1">
+	<p id="comments-feed"><a class="feed" href="{{tpl:BlogFeedURL type="atom"}}/comments/{{tpl:EntryID}}"
+		 title="{{tpl:lang This post's comments Atom feed}}">{{tpl:lang This post's comments feed}}</a></p>
+</tpl:EntryIf>
+
+<tpl:EntryIf comments_active="1">    
+	<tpl:SysIfFormError>
+		<p class="error" id="pr">{{tpl:SysFormError}}</p>
+	</tpl:SysIfFormError>
+	
+	<tpl:SysIfCommentPublished>
+		<p class="message" id="pr">{{tpl:lang Your comment has been published.}}</p>
+	</tpl:SysIfCommentPublished>
+	
+	<tpl:SysIfCommentPending>
+		<p class="message" id="pr">{{tpl:lang Your comment has been submitted and will be reviewed for publication.}}</p>
+	</tpl:SysIfCommentPending>
+	
+	<!-- # Comment form -->
+	<form action="{{tpl:EntryURL}}#pr" method="post" id="comment-form">
+		<tpl:IfCommentPreview>
+			<div id="pr">
+				<h3>{{tpl:lang Your comment}}</h3>
+				<div class="comment-preview">{{tpl:CommentPreviewContent}}</div>
+				<p class="buttons"><input type="submit" class="submit" value="{{tpl:lang send}}" /></p>
+			</div>
+		</tpl:IfCommentPreview>
+		
+		<h3>{{tpl:lang Add a comment}}</h3>
+		<fieldset>
+			<!-- # --BEHAVIOR-- publicCommentFormBeforeContent -->
+			{{tpl:SysBehavior behavior="publicCommentFormBeforeContent"}}
+			
+			<p class="field"><label for="c_name">{{tpl:lang Name or nickname}}&nbsp;:</label>
+				<input name="c_name" id="c_name" type="text" size="30" maxlength="255"
+				 value="{{tpl:CommentPreviewName encode_html="1"}}" />
+			</p>
+			
+			<p class="field"><label for="c_mail">{{tpl:lang Email address}}&nbsp;:</label>
+				<input name="c_mail" id="c_mail" type="text" size="30" maxlength="255"
+				 value="{{tpl:CommentPreviewEmail encode_html="1"}}" />
+			</p>
+			
+			<p class="field"><label for="c_site">{{tpl:lang Website}} ({{tpl:lang optional}})&nbsp;:</label>
+				<input name="c_site" id="c_site" type="text" size="30" maxlength="255"
+				 value="{{tpl:CommentPreviewSite encode_html="1"}}" />
+			</p>
+			
+			<p style="display:none">
+				<input name="f_mail" type="text" size="30" maxlength="255" value="" />
+			</p>
+			
+			<p class="field"><label for="c_content">{{tpl:lang Comment}}&nbsp;:</label>
+				<textarea name="c_content" id="c_content" cols="35"
+				 rows="7">{{tpl:CommentPreviewContent raw="1" encode_html="1"}}</textarea>
+			</p>
+			
+			<p class="form-help">{{tpl:CommentHelp}}</p>
+			
+			<!-- # --BEHAVIOR-- publicCommentFormAfterContent -->
+			{{tpl:SysBehavior behavior="publicCommentFormAfterContent"}}
+		</fieldset>
+		
+		<fieldset>
+			<p class="buttons">
+				<input type="submit" class="preview" name="preview" value="{{tpl:lang preview}}" />
+				<tpl:IfCommentPreview>
+					<input type="submit" class="submit" value="{{tpl:lang send}}" />
+				</tpl:IfCommentPreview>
+			</p>
+		</fieldset>
+	</form>
+</tpl:EntryIf>
+  
+<tpl:EntryIf pings_active="1">
+	<div id="ping-url">
+		<h3>{{tpl:lang Add ping}}</h3>
+		<p>{{tpl:lang Trackback URL}}&nbsp;: {{tpl:EntryPingLink}}</p>
+	</div>
+</tpl:EntryIf>
Index: themes/ductile/tpl/_top.html
===================================================================
--- themes/ductile/tpl/_top.html	(revision 683)
+++ themes/ductile/tpl/_top.html	(revision 683)
@@ -0,0 +1,20 @@
+<div id="header">
+	
+	<div id="top">
+		<p id="logo" class="nosmall"><a href="{{tpl:BlogURL}}"><img src="{{tpl:BlogThemeURL}}/img/logo.png" alt="{{tpl:lang Home}}" /></a></p>
+		<h1><span><a href="{{tpl:BlogURL}}">{{tpl:BlogName encode_html="1"}}</a></span></h1>
+		<p id="blogdesc" class="nosmall">{{tpl:BlogDescription}}</p>
+	</div>
+	
+	<ul id="prelude">
+		<li class="nosmall"><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>
+	
+	<!-- # --BEHAVIOR-- publicTopAfterContent -->
+	{{tpl:SysBehavior behavior="publicTopAfterContent"}}
+	
+	{{tpl:SimpleMenu id="sn-top" class="supranav nosmall"}}
+
+</div>
Index: themes/ductile/tpl/archive.html
===================================================================
--- themes/ductile/tpl/archive.html	(revision 683)
+++ themes/ductile/tpl/archive.html	(revision 683)
@@ -0,0 +1,145 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
+	
+	<title>{{tpl:lang Archives}} - {{tpl:BlogName encode_html="1"}}</title>
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Archives}} - {{tpl:BlogName encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	
+	<tpl:Archives>
+		<link rel="chapter" href="{{tpl:ArchiveURL}}" title="{{tpl:ArchiveDate encode_html="1"}}" />
+	</tpl:Archives>
+	
+	<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
+	<tpl:Categories>
+		<link rel="section" href="{{tpl:CategoryURL}}" title="{{tpl:CategoryTitle encode_html="1"}}" />
+	</tpl:Categories>
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-archive">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<div id="content-info">
+						<h2>{{tpl:lang Archives}}</h2>
+					</div>
+					
+					<div class="content-inner">
+						
+						<div id="time-criteria"><!-- entries sorted by date -->
+							<div id="by-date" class="arch-block">
+								<h3>{{tpl:lang By date}}</h3>
+								<p class="fromto">{{tpl:lang FromDay}} <tpl:Entries no_content="1" order="asc" lastn="1"><a href="{{tpl:EntryURL}}">{{tpl:EntryDate format="%e %B %Y"}}</a></tpl:Entries> {{tpl:lang toDay}} <tpl:Entries no_content="1" order="desc" lastn="1"><a href="{{tpl:EntryURL}}">{{tpl:EntryDate format="%e %B %Y"}}</a></tpl:Entries></p>
+								<tpl:Archives order="asc">
+									<tpl:ArchivesYearHeader>
+										<div>
+											<h4>{{tpl:ArchiveDate format="%Y"}}</h4>
+											<ul>
+									</tpl:ArchivesYearHeader>
+												<li><a href="{{tpl:ArchiveURL}}" title="{{tpl:ArchiveDate encode_html="1"}}">{{tpl:ArchiveDate encode_html="1" format="%B"}}</a>
+													<span>({{tpl:ArchiveEntriesCount}})</span></li>
+									<tpl:ArchivesYearFooter>
+											</ul>
+										</div>
+									</tpl:ArchivesYearFooter>
+								</tpl:Archives>
+							</div>
+						</div>
+						
+						<div id="other-criteria"><!-- entries sorted by others criterias -->	
+							<tpl:Categories level="1">
+								<tpl:CategoriesHeader>
+									<div id="by-cat" class="arch-block">
+										<h3>{{tpl:lang By category}}</h3>
+										<ul>
+								</tpl:CategoriesHeader>
+											<li><a href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a>
+								<tpl:CategoryFirstChildren>
+									<tpl:CategoriesHeader>
+												<ul>
+									</tpl:CategoriesHeader>
+														<li><a href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a></li>				
+									<tpl:CategoriesFooter>
+												</ul>
+									</tpl:CategoriesFooter>
+								</tpl:CategoryFirstChildren>			
+											</li>
+								<tpl:CategoriesFooter>
+										</ul>
+									</div>
+								</tpl:CategoriesFooter>
+							</tpl:Categories>
+							
+							<tpl:Tags sortby="count" order="desc">
+								<tpl:TagsHeader>
+									<div id="by-tag" class="arch-block">
+										<h3>{{tpl:lang By tag}}</h3>
+										<ul>
+								</tpl:TagsHeader>
+											<li><a href="{{tpl:TagURL}}" class="tag{{tpl:TagRoundPercent}}">{{tpl:TagID}}</a></li>
+								<tpl:TagsFooter>
+										</ul>	
+									</div>
+								</tpl:TagsFooter>
+							</tpl:Tags>
+						</div>
+						
+						<div id="more-arch"><!-- others things -->		
+							<div class="arch-block">
+								<tpl:Entries type="page" no_content="1">
+									<tpl:EntriesHeader>
+										<h3>{{tpl:lang Pages}}</h3>
+										<ul>
+									</tpl:EntriesHeader>
+											<li><a href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></li>
+									<tpl:EntriesFooter>
+										</ul>
+									</tpl:EntriesFooter>
+								</tpl:Entries>
+							</div>
+						</div>
+					</div> <!-- End .content-inner -->
+					
+				</div> <!-- End #content -->
+			</div> <!-- End #main -->
+			
+			<div id="sidebar">
+				<div id="blognav">
+					<tpl:Widget id="search">
+					</tpl:Widget>
+				</div> <!-- End #blognav -->
+				
+				<div id="blogextra">
+					{{tpl:Widgets type="extra"}}
+				</div> <!-- End #blogextra -->
+				
+			</div> <!-- End #sidebar -->
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/archive_month.html
===================================================================
--- themes/ductile/tpl/archive_month.html	(revision 683)
+++ themes/ductile/tpl/archive_month.html	(revision 683)
@@ -0,0 +1,77 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
+	
+	<title>{{tpl:lang Archives}} - {{tpl:ArchiveDate}} - {{tpl:BlogName encode_html="1"}}</title>
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Archives}} - {{tpl:ArchiveDate}} - {{tpl:BlogName encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="up" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	<tpl:ArchiveNext><link rel="next" href="{{tpl:ArchiveURL}}" title="{{tpl:ArchiveDate encode_html="1"}}" /></tpl:ArchiveNext>
+	<tpl:ArchivePrevious><link rel="prev" href="{{tpl:ArchiveURL}}" title="{{tpl:ArchiveDate encode_html="1"}}" /></tpl:ArchivePrevious>
+	
+	<tpl:Entries no_content="1">
+		<link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
+	</tpl:Entries>
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-archive-month">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<p class="navlinks topnl">
+						<tpl:ArchivePrevious><a href="{{tpl:ArchiveURL}}" class="prev">&#171; {{tpl:ArchiveDate encode_html="1"}}</a> - </tpl:ArchivePrevious>
+						{{tpl:ArchiveDate}}
+						<tpl:ArchiveNext> - <a href="{{tpl:ArchiveURL}}" class="next">{{tpl:ArchiveDate encode_html="1"}} &#187;</a></tpl:ArchiveNext>
+					</p>
+					
+					<div id="content-info">
+						<h2>{{tpl:ArchiveDate}} <span>({{tpl:ArchiveEntriesCount}})</span></h2>
+					</div>
+					
+					<div class="content-inner">
+						<tpl:Entries>
+							{{tpl:ductileEntriesList default="short"}}
+						</tpl:Entries>
+					</div>
+					
+					<p class="navlinks">
+						<tpl:ArchivePrevious><a href="{{tpl:ArchiveURL}}" class="prev">&#171; {{tpl:ArchiveDate encode_html="1"}}</a> - </tpl:ArchivePrevious>
+						{{tpl:ArchiveDate}}
+						<tpl:ArchiveNext> - <a href="{{tpl:ArchiveURL}}" class="next">{{tpl:ArchiveDate encode_html="1"}} &#187;</a></tpl:ArchiveNext>
+					</p>
+					
+				</div>
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/category.html
===================================================================
--- themes/ductile/tpl/category.html	(revision 683)
+++ themes/ductile/tpl/category.html	(revision 683)
@@ -0,0 +1,113 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
+	
+	<title>{{tpl:CategoryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
+	<meta name="description" lang="{{tpl:BlogLanguage}}" content="{{tpl:CategoryDescription cut_string="180" remove_html="1"}}" />
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:CategoryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
+	<meta name="dc.description" lang="{{tpl:BlogLanguage}}" content="{{tpl:CategoryDescription remove_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	{{tpl:ductileNbEntryPerPage}}
+	<tpl:Entries no_content="1">
+		<tpl:EntriesHeader>
+			<tpl:Pagination>
+				<tpl:PaginationIf end="0">
+					<link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
+				</tpl:PaginationIf>
+				
+				<tpl:PaginationIf start="0">
+					<link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
+				</tpl:PaginationIf>
+			</tpl:Pagination>
+		</tpl:EntriesHeader>
+		
+		<link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
+	</tpl:Entries>
+	
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:CategoryFeedURL type="atom"}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-category">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<div id="content-info">
+						<h2>
+							<tpl:CategoryParents>
+								<a href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a> &rsaquo; 
+							</tpl:CategoryParents>
+							{{tpl:CategoryTitle encode_html="1"}}
+						</h2>
+						{{tpl:CategoryDescription}}
+						
+						<tpl:CategoryIf has_entries="1">
+							<p class="feed-info">
+								<a type="application/atom+xml" href="{{tpl:CategoryFeedURL type="atom"}}"
+								 title="{{tpl:lang This category's entries Atom feed}}" class="feed">{{tpl:lang Entries feed}}</a>
+								
+								<tpl:SysIf operator="or" comments_active="1" pings_active="1">
+									 - <a type="application/atom+xml" href="{{tpl:CategoryFeedURL type="atom"}}/comments"
+									 title="{{tpl:lang This category's comments Atom feed}}" class="feed">{{tpl:lang Comments feed}}</a>
+								</tpl:SysIf>
+							</p>
+						</tpl:CategoryIf>
+						
+						<tpl:CategoryFirstChildren>
+							<tpl:CategoriesHeader>
+								<div id="subcategories">
+									<h3>{{tpl:lang Subcategories}}</h3>
+									<ul>
+							</tpl:CategoriesHeader>
+										<li class="post-cat"><a href="{{tpl:CategoryURL}}">{{tpl:CategoryTitle encode_html="1"}}</a></li>
+							<tpl:CategoriesFooter>
+									</ul>
+								</div>
+							</tpl:CategoriesFooter>
+						</tpl:CategoryFirstChildren>
+					</div>
+
+					<div class="content-inner">					
+						{{tpl:ductileNbEntryPerPage}}
+						<tpl:Entries>
+							{{tpl:ductileEntriesList default="short"}}
+						
+							<tpl:EntriesFooter>
+								{{tpl:include src="_pagination.html"}}
+							</tpl:EntriesFooter>
+						</tpl:Entries>
+					</div> <!-- End #content-inner -->
+				</div> <!-- End #content -->
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/home.html
===================================================================
--- themes/ductile/tpl/home.html	(revision 683)
+++ themes/ductile/tpl/home.html	(revision 683)
@@ -0,0 +1,98 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
+	
+	<title>{{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
+	<meta name="description" lang="{{tpl:BlogLanguage}}" content="{{tpl:BlogDescription cut_string="180" encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
+	<meta name="dc.description" lang="{{tpl:BlogLanguage}}" content="{{tpl:BlogDescription encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="contents" title="{{tpl:lang Archives}}" href="{{tpl:BlogArchiveURL}}" />
+	<tpl:Categories>
+		<link rel="section" href="{{tpl:CategoryURL}}" title="{{tpl:CategoryTitle encode_html="1"}}" />
+	</tpl:Categories>
+	
+	{{tpl:ductileNbEntryPerPage nb="8"}}
+	<tpl:Entries no_content="1">
+		<tpl:EntriesHeader>
+			<tpl:Pagination>
+				<tpl:PaginationIf end="0">
+					<link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
+				</tpl:PaginationIf>
+				
+				<tpl:PaginationIf start="0">
+					<link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
+				</tpl:PaginationIf>
+			</tpl:Pagination>
+		</tpl:EntriesHeader>
+		
+		<link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
+	</tpl:Entries>
+	
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
+	<link rel="EditURI" type="application/rsd+xml" title="RSD" href="{{tpl:BlogRSDURL}}" />
+	<link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-home <tpl:SysIf current_mode="default">dc-home-first</tpl:SysIf>">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					{{tpl:ductileNbEntryPerPage nb="8"}}
+					<tpl:Entries>
+						
+						<!-- First page -->
+						<tpl:SysIf current_mode="default">
+							<tpl:LoopPosition start="1" length="1">
+								{{tpl:include src="_entry-full.html"}}
+							</tpl:LoopPosition>
+							
+							<tpl:LoopPosition start="2">
+								{{tpl:ductileEntriesList default="short"}}
+							</tpl:LoopPosition>
+						</tpl:SysIf>
+						
+						<!-- Next pages -->
+						<tpl:SysIf current_mode="!default">
+							{{tpl:ductileEntriesList default="short"}}
+						</tpl:SysIf>  	
+						
+						<!-- Pagination -->
+						<tpl:EntriesFooter>
+							{{tpl:include src="_pagination.html"}}
+						</tpl:EntriesFooter>
+						
+					</tpl:Entries>
+					
+				</div> <!-- End #content -->
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/page.html
===================================================================
--- themes/ductile/tpl/page.html	(revision 683)
+++ themes/ductile/tpl/page.html	(revision 683)
@@ -0,0 +1,63 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
+	
+	<title>{{tpl:EntryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}}</title>
+	<meta name="description" lang="{{tpl:EntryLang}}" content="{{tpl:EntryContent full="1" encode_html="1" remove_html="1" cut_string="180"}}" />
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:EntryAuthorCommonName encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:EntryDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" content="{{tpl:EntryTitle encode_html="1"}}" />
+	<meta name="dc.description" lang="{{tpl:EntryLang}}" content="{{tpl:EntryContent full="1" encode_html="1" remove_html="1" cut_string="180"}}" />
+	<meta name="dc.creator" content="{{tpl:EntryAuthorCommonName encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:EntryLang}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:EntryDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
+	
+	{{tpl:include src="_head.html"}}
+	
+	<script type="text/javascript" src="{{tpl:BlogThemeURL}}/../default/js/post.js"></script>
+	<script type="text/javascript">
+		//<![CDATA[
+		var post_remember_str = '{{tpl:lang Remember me on this blog}}';
+		//]]>
+	</script>
+</head>
+
+<body class="dc-page">
+	<div id="page">
+		{{tpl:EntryPingData}}
+		
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					{{tpl:include src="_simple-entry.html"}}
+					
+				</div>
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/post.html
===================================================================
--- themes/ductile/tpl/post.html	(revision 683)
+++ themes/ductile/tpl/post.html	(revision 683)
@@ -0,0 +1,84 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
+	
+	<title>{{tpl:EntryTitle encode_html="1"}} - {{tpl:BlogName encode_html="1"}}</title>
+	<meta name="description" lang="{{tpl:EntryLang}}" content="{{tpl:EntryContent full="1" encode_html="1" remove_html="1" cut_string="180"}}" />
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:EntryAuthorCommonName encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:EntryDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" content="{{tpl:EntryTitle encode_html="1"}}" />
+	<meta name="dc.description" lang="{{tpl:EntryLang}}" content="{{tpl:EntryContent full="1" encode_html="1" remove_html="1" cut_string="180"}}" />
+	<meta name="dc.creator" content="{{tpl:EntryAuthorCommonName encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:EntryLang}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:EntryDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	<tpl:EntryNext><link rel="next" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" /></tpl:EntryNext>
+	<tpl:EntryPrevious><link rel="prev" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" /></tpl:EntryPrevious>
+	
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:BlogFeedURL type="atom"}}" />
+	
+	{{tpl:include src="_head.html"}}
+	
+	<script type="text/javascript" src="{{tpl:BlogThemeURL}}/../default/js/post.js"></script>
+	<script type="text/javascript">
+		//<![CDATA[
+		var post_remember_str = '{{tpl:lang Remember me on this blog}}';
+		//]]>
+	</script>
+</head>
+
+<body class="dc-post">
+	<div id="page">
+		{{tpl:EntryPingData}}
+		
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<p class="navlinks topnl">
+						<tpl:EntryPrevious><a href="{{tpl:EntryURL}}"
+						 title="{{tpl:EntryTitle encode_html="1"}}" class="prev">&#171; {{tpl:EntryTitle encode_html="1"
+						 cut_string="50"}}</a></tpl:EntryPrevious>
+						<tpl:EntryNext> <span>-</span> <a href="{{tpl:EntryURL}}"
+						 title="{{tpl:EntryTitle encode_html="1"}}" class="next">{{tpl:EntryTitle encode_html="1"
+						 cut_string="50"}} &#187;</a></tpl:EntryNext>
+					</p>
+					
+					{{tpl:include src="_simple-entry.html"}}
+					
+					<p class="navlinks">
+						<tpl:EntryPrevious><a href="{{tpl:EntryURL}}"
+						 title="{{tpl:EntryTitle encode_html="1"}}" class="prev">&#171; {{tpl:EntryTitle encode_html="1"
+						 cut_string="50"}}</a></tpl:EntryPrevious>
+						<tpl:EntryNext> <span>-</span> <a href="{{tpl:EntryURL}}"
+						 title="{{tpl:EntryTitle encode_html="1"}}" class="next">{{tpl:EntryTitle encode_html="1"
+						 cut_string="50"}} &#187;</a></tpl:EntryNext>
+					</p>
+					
+				</div>
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/search.html
===================================================================
--- themes/ductile/tpl/search.html	(revision 683)
+++ themes/ductile/tpl/search.html	(revision 683)
@@ -0,0 +1,100 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX,NOARCHIVE"}}" />
+	
+	<title>{{tpl:lang Search}} - {{tpl:SysSearchString encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Search}} - {{tpl:SysSearchString encode_html="1"}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	{{tpl:ductileNbEntryPerPage}}
+	<tpl:Entries no_content="1">
+		<tpl:EntriesHeader>
+			<tpl:Pagination>
+				<tpl:PaginationIf end="0">
+					<link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
+				</tpl:PaginationIf>
+				
+				<tpl:PaginationIf start="0">
+					<link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
+				</tpl:PaginationIf>
+			</tpl:Pagination>
+		</tpl:EntriesHeader>
+		
+		<link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
+	</tpl:Entries>
+	
+	<link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-search">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<div id="content-info">
+						<h2>{{tpl:lang Search}}</h2>
+						<tpl:SysIf search_count="==0">
+							<p>{{tpl:SysSearchString encode_html="1" string="Your search for <em>%1$s</em> returned no result."}}</p>
+						</tpl:SysIf>
+						<tpl:SysIf search_count="==1">
+							<p>{{tpl:SysSearchString encode_html="1" string="Your search for <em>%1$s</em> returned <strong>%2$s</strong> result."}}</p>
+						</tpl:SysIf>
+						<tpl:SysIf search_count="&gt;1">
+							<p>{{tpl:SysSearchString encode_html="1" string="Your search for <em>%1$s</em> returned <strong>%2$s</strong> results."}}</p>
+						</tpl:SysIf>
+					</div>
+					
+					<div class="content-inner">
+						{{tpl:ductileNbEntryPerPage}}
+						<tpl:Entries type="post,page">
+						
+							{{tpl:ductileEntriesList default="short"}}
+						
+							<tpl:EntriesFooter>
+								<tpl:Pagination>
+									<p class="pagination">
+										<tpl:PaginationIf end="0">
+											<a href="{{tpl:PaginationURL offset="+1"}}" class="prev">&#171; {{tpl:lang previous entries}}</a> - 
+										</tpl:PaginationIf>
+										 {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
+										<tpl:PaginationIf start="0">
+											 - <a href="{{tpl:PaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}} &#187;</a>
+										</tpl:PaginationIf>
+									</p>
+								</tpl:Pagination>
+							</tpl:EntriesFooter>
+						</tpl:Entries>
+					</div> <!-- End #content-inner -->
+				</div> <!-- End #content -->
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/tag.html
===================================================================
--- themes/ductile/tpl/tag.html	(revision 683)
+++ themes/ductile/tpl/tag.html	(revision 683)
@@ -0,0 +1,89 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
+	
+	<title>{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	{{tpl:ductileNbEntryPerPage}}
+	<tpl:Entries no_content="1">
+		<tpl:EntriesHeader>
+			<tpl:Pagination>
+				<tpl:PaginationIf end="0">
+					<link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
+				</tpl:PaginationIf>
+				
+				<tpl:PaginationIf start="0">
+					<link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
+				</tpl:PaginationIf>
+			</tpl:Pagination>
+		</tpl:EntriesHeader>
+		
+		<link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
+	</tpl:Entries>
+	
+	<link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:TagFeedURL type="atom"}}" />
+	<link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-tag">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<div id="content-info">
+						<h2>{{tpl:lang Tag}} - {{tpl:TagID}}</h2>
+						<p><a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}"
+							title="{{tpl:lang This tag's entries Atom feed}}" class="feed">{{tpl:lang Entries feed}}</a>
+							<tpl:SysIf operator="or" comments_active="1" pings_active="1">
+								 - <a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}/comments"
+								title="{{tpl:lang This tag's comments Atom feed}}" class="feed">{{tpl:lang Comments feed}}</a>
+							</tpl:SysIf>
+						</p>
+					</div>
+
+					<div class"content-inner">
+						{{tpl:ductileNbEntryPerPage}}
+						<tpl:Entries>
+							{{tpl:ductileEntriesList default="short"}}
+						
+							<tpl:EntriesFooter>
+								{{tpl:include src="_pagination.html"}}
+							</tpl:EntriesFooter>
+						
+						</tpl:Entries>
+					</div> <!-- End #content-inner -->
+				</div> <!-- End #content -->
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
Index: themes/ductile/tpl/tags.html
===================================================================
--- themes/ductile/tpl/tags.html	(revision 683)
+++ themes/ductile/tpl/tags.html	(revision 683)
@@ -0,0 +1,61 @@
+<!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="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
+	
+	<title>{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}</title>
+	<meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	
+	<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
+	<meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}" />
+	<meta name="dc.language" content="{{tpl:BlogLanguage}}" />
+	<meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
+	<meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
+	<meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
+	<meta name="dc.type" content="text" />
+	<meta name="dc.format" content="text/html" />
+	
+	<link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
+	<link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
+	
+	<link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
+	
+	{{tpl:include src="_head.html"}}
+</head>
+
+<body class="dc-tags">
+	<div id="page">
+		{{tpl:include src="_top.html"}}
+		
+		<div id="wrapper">
+			
+			<div id="main">
+				<div id="content">
+					
+					<div id="content-info">
+						<h2>{{tpl:lang Tags}}</h2>
+					</div>
+					
+					<div class="content-inner">  
+						<ul class="tags">
+							<tpl:Tags>
+								<li><a href="{{tpl:TagURL}}" class="tag{{tpl:TagRoundPercent}}">{{tpl:TagID}}</a></li>
+							</tpl:Tags>
+						</ul>
+					</div>
+					
+				</div>
+			</div> <!-- End #main -->
+			
+			{{tpl:include src="_sidebar.html"}}
+			
+		</div> <!-- End #wrapper -->
+		
+		{{tpl:include src="_footer.html"}}
+	</div> <!-- End #page -->
+</body>
+</html>
