Index: .hgsubstate
===================================================================
--- .hgsubstate	(revision 1709)
+++ .hgsubstate	(revision 1742)
@@ -1,1 +1,1 @@
-7f6890267d808320431acd04f4dae19dcb027a80 inc/libs/clearbricks
+33139a996922b7a21b658961f8052c869bea60a1 inc/libs/clearbricks
Index: README.md
===================================================================
--- README.md	(revision 1578)
+++ README.md	(revision 1743)
@@ -50,5 +50,5 @@
     * iconv
     * simplexml
-    * mysql, postgresql or sqlite
+    * mysql, mysqli, postgresql or sqlite
  * A database server (MySQL or PostgreSQL) or SQLite.
 
Index: admin/_charte.html
===================================================================
--- admin/_charte.html	(revision 1748)
+++ admin/_charte.html	(revision 1748)
@@ -0,0 +1,358 @@
+<!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="fr" lang="fr">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW" />
+	<meta name="GOOGLEBOT" content="NOSNIPPET" />
+	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+	<title>Bibliothèque de styles - Dotclear - 2.6</title>
+	<link rel="icon" type="image/png" href="images/favicon.png" />
+	<!--[if lt IE 9]>
+	<script type="text/javascript" src="js/ie7/IE9.js"></script>
+	<link rel="stylesheet" type="text/css" href="style/iesucks.css" />
+	<![endif]-->
+	<link rel="stylesheet" href="style/default.css" type="text/css" media="screen" />
+	<style type="text/css">
+		#content > h2 {padding-top: 2.5em;}
+		#content > h3, #content > h4 {padding-top: 2em;}
+		#content > h2:first-child {padding-top: 0;}
+	</style>
+	<script type="text/javascript" src="js/jquery/jquery.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.biscuit.js"></script>
+	<script type="text/javascript" src="js/jquery/jquery.bgFade.js"></script>
+	<script type="text/javascript" src="js/common.js"></script>
+	<script type="text/javascript" src="js/prelude.js"></script>
+	<script type="text/javascript">
+	//<![CDATA[
+	dotclear.nonce = '5f7602a68cd19a8613d2dda9b510e1e0e85b417a';
+	dotclear.img_plus_src = 'images/expand.png';
+	dotclear.img_plus_alt = 'dévoiler';
+	dotclear.img_minus_src = 'images/hide.png';
+	dotclear.img_minus_alt = 'cacher';
+	dotclear.img_menu_on = 'images/menu_on.png';
+	dotclear.img_menu_off = 'images/menu_off.png';
+	dotclear.msg.help = 'Aide pour cette page';
+	dotclear.msg.help_hide = 'Masquer';
+	dotclear.msg.to_select = 'Sélectionner :';
+	dotclear.msg.no_selection = 'aucun';
+	dotclear.msg.select_all = 'tous';
+	dotclear.msg.invert_sel = 'Inverser la sélection';
+	dotclear.msg.website = 'Site web :';
+	dotclear.msg.email = 'Email :';
+	dotclear.msg.ip_address = 'Adresse IP :';
+	dotclear.msg.error = 'Erreur :';
+	dotclear.msg.entry_created = 'Billet créé avec succès.';
+	dotclear.msg.edit_entry = 'Modifier le billet';
+	dotclear.msg.view_entry = 'voir le billet';
+	dotclear.msg.confirm_delete_posts = 'Êtes-vous certain de vouloir supprimer les billets sélectionnés (%s) ?';
+	dotclear.msg.confirm_delete_categories = 'Êtes-vous certain de vouloir supprimer les categories sélectionnées (%s) ?';
+	dotclear.msg.confirm_delete_post = 'Êtes-vous certain de vouloir supprimer ce billet ?';
+	dotclear.msg.click_to_unlock = 'Cliquez ici pour déverrouiller ce champ';
+	dotclear.msg.confirm_spam_delete = 'Êtes-vous sûr de vouloir supprimer tous les indésirables ?';
+	dotclear.msg.confirm_delete_comments = 'Êtes-vous certain de vouloir supprimer les commentaires sélectionnés (%s) ?';
+	dotclear.msg.confirm_delete_comment = 'Êtes-vous certain de vouloir supprimer ce commentaire ?';
+	dotclear.msg.cannot_delete_users = 'Les utilisateurs ayant écrit des entrées ne peuvent être supprimés.';
+	dotclear.msg.confirm_delete_user = 'Êtes-vous certain de vouloir supprimer les utilisateurs sélectionnés (%s) ?';
+	dotclear.msg.confirm_delete_category = 'Êtes-vous certain de vouloir supprimer la catégorie \"%s\" ?';
+	dotclear.msg.confirm_reorder_categories = 'Êtes-vous certain de vouloir réinitialiser l\'ordre des catégories ?';
+	dotclear.msg.confirm_delete_media = 'Êtes-vous certain de vouloir supprimer le média \"%s\" ?';
+	dotclear.msg.confirm_extract_current = 'Êtes-vous certain de vouloir extraire l\'archive dans le répertoire actuel ?';
+	dotclear.msg.confirm_remove_attachment = 'Êtes-vous certain de vouloir supprimer l\'annexe \"%s\" ?';
+	dotclear.msg.confirm_delete_lang = 'Êtes-vous certain de vouloir supprimer la langue \"%s\" ?';
+	dotclear.msg.confirm_delete_plugin = 'Êtes-vous certain de vouloir supprimer le plugin \"%s\" ?';
+	dotclear.msg.use_this_theme = 'Utiliser ce thème';
+	dotclear.msg.remove_this_theme = 'Supprimer ce thème';
+	dotclear.msg.confirm_delete_theme = 'Êtes-vous certain de vouloir supprimer le thème \"%s\" ?';
+	dotclear.msg.confirm_delete_backup = 'Êtes-vous certain de vouloir supprimer cette sauvegarde ?';
+	dotclear.msg.zip_file_content = 'Contenu du fichier zip';
+	dotclear.msg.xhtml_validator = 'Vérifier la validité XHTML';
+	dotclear.msg.xhtml_valid = 'Le contenu XHTML est valide.';
+	dotclear.msg.xhtml_not_valid = 'Il y a des erreurs XHTML.';
+	dotclear.msg.confirm_change_post_format = 'Vous avez des modifications non sauvegardées. Changer de format vous fera perdre ces modifications. Continuer ?';
+	dotclear.msg.confirm_change_post_format_noconvert = 'Attention : le changement de syntaxe ne transformera pas les balises des contenus déjà saisis. Pensez à les réadapter après cette opération. Confirmez-vous ce changement de syntaxe ?';
+	dotclear.msg.load_enhanced_uploader = 'Chargement de l\'interface avancée.';
+
+	//]]>
+	</script>
+	<script type="text/javascript">
+	//<![CDATA[
+	dotclear.unfolded_sections = {'dcx_post_lang':true,'dc_favorites_menu':true,'dc_system_menu':true};
+
+	//]]>
+	</script>
+	<link rel="stylesheet" type="text/css" href="style/jsToolBar/jsToolBar.css" />
+	<script type="text/javascript" src="js/jsToolBar/jsToolBar.js"></script>
+	<script type="text/javascript" src="js/jsToolBar/jsToolBar.wysiwyg.js"></script>
+	<script type="text/javascript" src="js/jsToolBar/jsToolBar.dotclear.js"></script>
+	<script type="text/javascript">
+	//<![CDATA[
+	jsToolBar.prototype.dialog_url = 'popup.php'; jsToolBar.prototype.iframe_css = 'body{font: 12px "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;color : #000;background: #f9f9f9;margin: 0;padding : 2px;border: none;}pre, code, kbd, samp {font-family:"Courier New",Courier,monospace;font-size : 1.1em;}code {color : #666;font-weight : bold;}body > p:first-child {margin-top: 0;}'; jsToolBar.prototype.base_url = 'http://localhost'; jsToolBar.prototype.switcher_visual_title = 'visuel'; jsToolBar.prototype.switcher_source_title = 'source'; jsToolBar.prototype.legend_msg = 'Vous pouvez utiliser les raccourcis suivants pour formater votre texte.'; jsToolBar.prototype.elements.blocks.options.none = '-- aucun --'; jsToolBar.prototype.elements.blocks.options.nonebis = '-- format bloc --'; jsToolBar.prototype.elements.blocks.options.p = 'Paragraphe'; jsToolBar.prototype.elements.blocks.options.h1 = 'Titre de niveau 1'; jsToolBar.prototype.elements.blocks.options.h2 = 'Titre de niveau 2'; jsToolBar.prototype.elements.blocks.options.h3 = 'Titre de niveau 3'; jsToolBar.prototype.elements.blocks.options.h4 = 'Titre de niveau 4'; jsToolBar.prototype.elements.blocks.options.h5 = 'Titre de niveau 5'; jsToolBar.prototype.elements.blocks.options.h6 = 'Titre de niveau 6'; jsToolBar.prototype.elements.strong.title = 'Forte emphase'; jsToolBar.prototype.elements.em.title = 'Emphase'; jsToolBar.prototype.elements.ins.title = 'Insertion'; jsToolBar.prototype.elements.del.title = 'Suppression'; jsToolBar.prototype.elements.quote.title = 'Citation en ligne'; jsToolBar.prototype.elements.code.title = 'Code'; jsToolBar.prototype.elements.br.title = 'Passage à la ligne'; jsToolBar.prototype.elements.blockquote.title = 'Bloc de citation'; jsToolBar.prototype.elements.pre.title = 'Texte préformaté'; jsToolBar.prototype.elements.ul.title = 'Liste à puces'; jsToolBar.prototype.elements.ol.title = 'Liste numérotée'; jsToolBar.prototype.elements.link.title = 'Lien'; jsToolBar.prototype.elements.link.href_prompt = 'URL ?'; jsToolBar.prototype.elements.link.hreflang_prompt = 'Langue ?'; jsToolBar.prototype.elements.img.title = 'Image externe'; jsToolBar.prototype.elements.img.src_prompt = 'URL ?'; jsToolBar.prototype.elements.img_select.title = 'Sélecteur de média'; jsToolBar.prototype.elements.post_link.title = 'Lien vers une entrée'; 
+	//]]>
+	</script>
+	<script type="text/javascript" src="js/_index.js"></script>
+</head>
+
+<body id="dotclear-admin" class="no-js">
+	<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>
+			<li><a href="#qx">Aller à la recherche</a></li>
+		</ul>
+		<div id="top"><h1><a href="./_charte.html">Bibliothèque de styles - Dotclear - 2.6+</a></h1></div>
+		<div id="info-boxes">
+			<div id="info-box1">
+				<p>Informations sur les styles disponibles dans l'admin pour les développeurs de plugins</p>
+			</div>
+			<div id="info-box2">Octobre 2013</div>
+		</div>	
+	</div><!-- /header -->
+
+	<div id="wrapper" class="clearfix">
+		<div id="main">
+			<div id="content" class="clearfix">
+
+				<h2><span class="page-title">Typographie</span></h2>
+				<h3 id="texte">Textes</h3>
+					<p>La font-size de base est à 1.2rem (la valeur <code>1rem</code> correspond à 10px). Si vous utilisez l'unité <code>rem</code> pensez à faire précéder la déclaration par son équivalent 
+					en pixels pour rester compatible avec Internet Explorer. L'interlignage courant est à 1.5.</p>
+					<p>La liste suivante est de class <code>nice</code>. Elle est semblable aux listes ordinaires mais avec des puces carrées.</p>
+					<ul class="nice">
+						<li>Les textes courants sont en Arial, Helvetica ou sans-serif. </li>
+						<li>Le code adopte la fonte Andale Mono, Courier New ou monospace.</li>
+						<li>Les liens ont des aspects différents au focus et au survol. Il faut conserver cette distinction, nécessaire à l'accessibilité et l'ergonomie.</li>
+					</ul>
+
+					<h3 id="titres">Titre h3</h3>
+						<p>Le titre de niveau h1 est réservé au titre du site-admin. Le titre de niveau h2 est réservé au breadcrumb/titre de la page courante. On utilise les titres de niveau h3 en premier niveau de titre à l'intérieur de pages, comme sur la page Inport/Export.</p>
+						<p>Il ne faut pas choisir un niveau de titre en fonction de son aspect mais respecter une hiérarchie cohérente. On peut obtenir visuellement l'aspect d'un titre h3 en donnant à l'élément la class <code>"as_h3"</code>.</p>
+					<h4>Titre de niveau h4</h4>
+						<p>On peut obtenir visuellement l'aspect d'un titre h4 en donnant à l'élément la class <code>"as_h4"</code>.</p>
+					<h5>Titre de niveau h5</h5>
+						<p>Le titre de niveau h5 est assez peu employé mais son style est prévu. Dans une admin de base, on utilise les niveaux
+						h5 pour certains éléments du sidebar du billet, mais un style particulier leur est alors appliqué pour ressembler aux autres
+						items de ce sidebar.</p>
+					<div class="fieldset">
+						<h4 class="smart-title">Variante pour les titres</h4>
+							<p>On peut utiliser une variante aux titres qui regroupent des actions (voir la page de la Médiathèque) ou servent de titre à une boîte encadrée, comme ici où les présentes explications sont placées dans une div de class <code>fieldset</code>.</p>
+							<p>On peut utiliser, quel que soit le niveau hx de cet intertitre la class <code>smart-title</code> pour obtenir l'effet ci-dessus.</p>
+					</div>
+
+				<h2><span class="page-title">Layouts</span></h2>
+
+				<h3 id="onglets">Onglets</h3>
+					<div class="part-tabs">
+						<ul>
+							<li id="part-tabs-toto" class="part-tabs-active"><a href="#ancre-1">Titre de l'onglet 1</a></li>
+							<li id="part-tabs-titi"><a href="#ancre-2">Titre de l'onglet 2</a></li>
+						</ul>
+					</div>
+					<p class="multi-part">La classe <code>multi-part</code> (qui doit obligatoirement être donnée à la div du contenu de chaque onglet afin que le script jQuery fonctionne) aligne son bord gauche avec celui premier onglet.</p>
+				<hr />
+
+				<h3 id="multi-colonnage">Multi-colonnage</h3>
+				<h4>Two-cols 50/50</h4>
+					<div class="two-cols clearfix">
+						<div class="col">
+							<p>La div englobante porte la class <code>two-cols</code>, chacune de ses div porte la class <code>col</code>.
+							Sans autre précision les deux colonnes sont d'égale largeur.</p>
+						</div>
+						<div class="col">
+							<p>Attention : ces colonnes sont construites avec des flottants, il faut donc penser à mettre une class <code>clear</code> à l'élément suivant ou ajouter la class <code>clearfix</code> à la div <code>class="two-cols"</code>.</p>
+						</div>
+					</div>
+				<h4>Two-cols 70/30</h4>
+					<div class="two-cols clearfix">
+						<div class="col70">
+							<p><span class="step">col70</span> La div englobante porte la class <code>two-cols</code>, chacune de ses div porte la class <code>col</code>.
+							Pour obtenir des colonnes inégales, on dispose des classes <code>col70</code> et <code>col30</code>.</p>
+						</div>
+						<div class="col30">
+							<p><span class="step">col30</span> Penser à mettre une class <code>clear</code> à l'élément suivant ou ajouter la class <code>clearfix</code> à la div <code>class="two-cols"</code>.</p>
+						</div>
+					</div>
+				<h4>Two-boxes</h4>
+					<div>
+						<div class="two-boxes odd">
+							<div class="box">
+								<p><span class="step">1</span> Les boîtes de class <code>two-boxes</code> ont une règle de <code>display:inline-block;</code>. Elles se rangent alternativement à gauche et à droite.</p>
+							</div>
+						</div><!--
+						--><div class="two-boxes even">
+							<div class="box">
+								<p><span class="step">2</span> S'il n'y a que deux boîtes, une autre class n'est pas nécessaire. S'il y en a plusieurs, il est conseillé
+								de leur attribuer alternativement les class <code>odd</code> et <code>even</code> pour que les marges se
+								placent correctement.</p>
+							</div>
+						</div><!--
+						--><div class="two-boxes odd">
+							<div class="box">
+								<p><span class="step">3</span> Attention, il faut soit ne pas retourner à la ligne entre la fermeture d'une boîte et l'ouverture de la suivante soit adopter la Méthode 2 mise en place ici expliquée chez <a href="http://www.alsacreations.com/astuce/lire/1432-display-inline-block-espaces-indesirables.html">Alsacréations</a>.</p>
+							</div>
+						</div>
+					</div>
+				<h4>Three-boxes</h4>
+					<div>
+						<div class="three-boxes">
+							<div class="box">
+								<p>Sur le même principe on peut utiliser des boîtes de class <code>three-boxes</code> pour répartir les contenus sur trois colonnes de 30% chacune (le reste est occupé par les marges).</p>
+							</div>
+						</div><!--
+						--><div class="three-boxes">
+							<div class="box">
+								<p>Comme pour les "two-boxes" il faut soit ne pas laisser d'espace ou de retour à la ligne entre les boîtes, soit adopter la méthode recommandée plus haut.</p>
+							</div>
+						</div><!--
+						--><div class="three-boxes">
+							<div class="box">
+								<p>Dans les "two-boxes" comme dans les "three-boxes", on peut placer à l'intérieur plusieurs autres div de class="box" qui s'afficheront les unes à côté des autres ou l'une en dessous de l'autre selon la place dont elles disposent.</p>
+							</div>
+						</div>
+					</div>
+
+				<h2><span class="page-title">Interactions</span></h2>
+
+				<h3 id="elements">Éléments de formulaire</h3>
+					<form class="two-cols clearfix" action="#">
+						<div class="col">
+							<p><label for="ex1">Label simple + input text :</label><input id="ex1" type="text" /></p>
+							<p class="form-note">p class="form-note".</p>
+							<p><label for="ex2" class="required"><abbr title="'.__('Required field').'">*</abbr> Label class="required" :</label> <input id="ex2" type="text" /></p>
+							<p><label for="ex3">Input class="maximal" :</label> <input id="ex3" type="text" class="maximal" /></p>
+							<p><label for="ex4" class="classic">Label class="classic" :</label> <input id="ex4" type="text" /></p>
+						</div>
+						<div class="col">
+							<p class="field"><label for="ex5">p.field label + input :</label><input id="ex5" type="text" /></p>
+							<p class="field"><label for="ex6">p.field label + select :</label>
+							<select id="ex6"><option value="opt2">Option 2</option><option selected="selected" value="opt2">Option 2</option></select>
+							</p>
+							<p><label class="classic" for="ex7"><input type="checkbox" checked="checked" id="ex7" value="1" name="ex7" />
+								Checkbox (label.classic)</label></p>
+							<p><label class="classic" for="ex8-1"><input type="radio" checked="checked" id="ex8-1" value="ex8-1" name="ex8-1" />
+							 Bouton radio 1 (label.classic)</label></p>
+							 <p><label class="classic" for="ex8-2"><input type="radio" id="ex8-2" value="ex8-2" name="ex8-2" />
+							 Bouton radio 2 (label.classic)</label></p>
+							 <p class="form-note">Les checkboxes et les boutons radio sont dans la balise &lt;label&gt;.</p>
+						</div>
+					</form>
+					<form action="#" class="clear">
+						<fieldset>
+						<legend>Légende de fieldset</legend>
+							<p>Attention: Les fieldsets ne doivent être utilisés que pour isoler un groupe de champs au sein d'un formulaire.</p>
+						</fieldset>
+					</form>
+
+				<h3 id="boutons">Boutons</h3>
+					<div class="clearfix">
+					<p><a class="button add">a.button.add</a> Se place en haut à droite (dans un p.top-add)</p>
+						<p><input type="button" value="Type button" /> <a href="#" class="button">a.button</a> <input type="reset" value="Type reset" /> <a href="#" class="button reset">a.reset</a></p>
+						<p><input type="submit" value="Type submit" /> <input type="submit" class="delete" value="Type submit class delete" /> <a href="#" class="button delete">a.button delete</a></p>
+						<p><input type="submit" value="Type submit class disabled" class="disabled" /></p>
+					</div>
+
+				<h3 id="messages">Messages</h3>
+				<h4 class="smart-title">Messages système</h4>
+					<p>Il existe quatre types de messages système auxquels correspondent des classes CSS : .error, .message, .success, .warning-msg. Ils s'affichent en haut de page, sous le titre/breadcrumb.</p>
+					<div class="message">
+						<p>Message simple. Le plus souvent horodaté dcPage::message</p>
+					</div>
+					<div class="success">
+						<p>Message de succès. Le plus souvent horodaté dcPage::success</p>
+					</div>
+					<div class="warning-msg">
+						<p>Message warning. Non horodaté dcPage::warning</p>
+					</div>
+					<div class="error">
+						<p>Message d'erreur. Non horodaté dcPage::error</p>
+					</div>
+					<p>La classe .static-msg peut être utilisée directement pour affichage en haut de page :</p>
+					<div class="static-msg">
+						<p>Comme le message simple mais sans effets de transition.</p>
+					</div>
+					<p>Un type de message réservé à Dotclear peut s'afficher en haut de la page :</p>
+					<div class="dc-update">
+						<h3>Dotclear 42 est disponible</h3>
+						<p><a class="button submit" href="#">Mettre à jour maintenant</a>
+						<a href="u#">Me le rappeler plus tard</a>
+						<a href="#" class="updt-info">information sur cette version</a></p>
+					</div>
+				<h4 class="smart-title">Messages contextuels</h4>
+					<p class="warn">Paragraphe de message d'alerte class warn ou warning.</p>
+					<p class="info">Paragraphe de message de class info.</p>
+					<p>Ces messages sont en display:inline-block. Le fond s'adapte à la longueur du message.</p>
+
+				<h2><span class="page-title">Navigation</span></h2>
+
+				<h3 id="direct">Selecteur d'accès direct</h3>
+					<p>Sur des pages longues et denses comme les pages about:config ou about:preferences, on peut utiliser un sélecteur pour faciliter l'accès direct aux sections.</p>
+					<p class="anchor-nav">
+						<label class="classic" for="lp_nav">Aller à : </label> 
+						<select id="lp_nav" name="lp_nav">
+							<option value="#l_accessibility">accessibility</option>
+							<option value="#l_dashboard">dashboard</option>
+							<option value="#l_dmhostingmonitor">dmhostingmonitor</option>
+							<option value="#l_dmpending">dmpending</option>
+							<option value="#l_favorites">favorites</option>
+							<option value="#l_filters">filters</option>
+							<option value="#l_interface">interface</option>
+							<option value="#l_lists">lists</option>
+							<option value="#l_toggles">toggles</option>
+						</select>
+						<input type="submit" id="lp_submit" value="Ok" style="display: none;" />
+						<input type="hidden" value="aboutConfig" name="p" />
+					</p>
+				<h3 id="prevnext">Navigation contextuelle</h3>
+					<p><a title="Titre du lien (nouvelle fenêtre)" onclick="window.open(this.href);return false;" href="http://fr.dotclear.org/blog" class="onblog_link">Lien vers le blog <img alt="" src="images/outgoing-blue.png" /></a></p>
+					<p class="nav_prevnext"><a title="Titre de l'élément précédente" href="post.php?id=4145">«&nbsp;Élément précédent</a> | <a title="Titre de l'élément suivant" href="#">Élément suivant&nbsp;»</a></p>
+
+			</div><!-- /content -->
+		</div><!-- /main -->
+		<div id="main-menu">
+			<form id="search-menu" action="search.php" method="get">
+				<p><label for="qx" class="hidden">Chercher : </label><input type="text" size="30" name="qx" id="qx" maxlength="255"  /><input type="submit" value="OK" /></p>
+			</form>
+			<div id="favorites-menu">
+				<h3>Typo</h3>
+				<ul>
+					<li><a href="#texte">Texte</a></li>
+					<li><a href="#titres">Titres hx</a></li>
+				</ul>
+			</div><!-- /favorites-menu -->
+			<div id="blog-menu">
+				<h3>Layouts</h3>
+				<ul>
+					<li><a href="#onglets">Onglets</a></li>
+					<li><a href="#multi">Multi-colonnage</a></li>
+				</ul>
+			</div><!-- /blog-menu -->
+			<div id="system-menu">
+				<h3>Interactions</h3>
+				<ul>
+					<li><a href="#elements">Éléments de formulaire</a></li>
+					<li><a href="#boutons">Boutons</a></li>
+					<li><a href="#messages">Messages</a></li>
+				</ul>
+			</div><!-- /system-menu -->
+			<div id="plugins-menu">
+				<h3>Navigation</h3>
+				<ul>
+					<li><a href="#direct">Accès direct</a></li>
+					<li><a href="#prevnext">Précédent, suivant</a></li>
+				</ul>
+			</div><!-- /plugins-menu -->
+		</div><!-- /main-menu -->
+
+		<div id="footer">
+			<a href="http://dotclear.org/" title="Merci de manger des clafoutis."><img src="style/dc_logos/w-dotclear90.png" alt="Merci d'utiliser Dotclear 2.6-dev." /></a>
+		</div><!-- /footer -->
+												<!-- 
+												                  .
+												               ,;:'`'::
+												            __||
+												      _____/LLLL\_
+												      \__________"|
+												    ~^~^~^~^~^~^~^~^~^~
+												 -->
+	</div><!-- /wrapper -->
+</body>
+</html>
Index: admin/blog_del.php
===================================================================
--- admin/blog_del.php	(revision 1399)
+++ admin/blog_del.php	(revision 1733)
@@ -61,7 +61,7 @@
 {
 	echo
-	'<p class="message">'.__('Warning').'</p>'.
+	'<div class="warning-msg"><p><strong>'.__('Warning').'</strong></p>'.
 	'<p>'.sprintf(__('You are about to delete the blog %s. Every entry, comment and category will be deleted.'),
-	'<strong>'.$blog_id.' ('.$blog_name.')</strong>').'</p>'.
+	'<strong>'.$blog_id.' ('.$blog_name.')</strong>').'</p></div>'.
 	'<p>'.__('Please give your password to confirm the blog deletion.').'</p>';
 	
Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 1698)
+++ admin/blog_pref.php	(revision 1746)
@@ -60,14 +60,8 @@
 
 # Language codes
-$langs = l10n::getISOcodes(1,1);
-foreach ($langs as $k => $v) {
-	$lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v);
-	$lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : '');
-}
+$lang_combo = dcAdminCombos::getAdminLangsCombo();
 
 # Status combo
-foreach ($core->getAllBlogStatus() as $k => $v) {
-	$status_combo[$v] = (string) $k;
-}
+$status_combo = dcAdminCombos::getBlogStatusescombo();
 
 # URL scan modes
@@ -327,9 +321,41 @@
 		echo
 		'<p><label for="blog_url" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Blog URL:').'</label>'.
-		form::field('blog_url',30,255,html::escapeHTML($blog_url)).'</p>'.
+		form::field('blog_url',50,255,html::escapeHTML($blog_url)).'</p>'.
 		
 		'<p><label for="url_scan">'.__('URL scan method:').'</label>'.
-		form::combo('url_scan',$url_scan_combo,$blog_settings->system->url_scan).'</p>'.
-		
+		form::combo('url_scan',$url_scan_combo,$blog_settings->system->url_scan).'</p>';
+		
+		# Test URL of blog by testing it's ATOM feed
+		$file = $blog_url.$core->url->getURLFor('feed','atom');
+		$path = '';
+		$status = '404';
+		$content = '';
+		$client = netHttp::initClient($file,$path);
+		if ($client !== false) {
+			$client->setTimeout(4);
+			$client->setUserAgent($_SERVER['HTTP_USER_AGENT']);
+			$client->get($path);
+			$status = $client->getStatus();
+			$content = $client->getContent();
+		}
+		if ($status != '200') {
+			// Might be 404 (URL not found), 670 (blog not online), ...
+			echo
+			'<p class="form-note warn">'.
+			sprintf(__('The URL of blog or the URL scan method might not be well set (<code>%s</code> return a <strong>%s</strong> status).'),
+					$file,$status).
+			'</p>';
+		} else {
+			if (substr($content,0,6) != '<?xml ') {
+				// Not well formed XML feed
+				echo
+				'<p class="form-note warn">'.
+				sprintf(__('The URL of blog or the URL scan method might not be well set (<code>%s</code> does not return an ATOM feed).'),
+						$file).
+				'</p>';
+			}
+		}
+
+		echo
 		'<p><label for="blog_status">'.__('Blog status:').'</label>'.
 		form::combo('blog_status',$status_combo,$blog_status).'</p>';
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 1662)
+++ admin/categories.php	(revision 1741)
@@ -114,15 +114,5 @@
 	dcPage::success(__('Categories have been successfully reordered.'));
 }
-
-$categories_combo = array();
-if (!$rs->isEmpty())
-{
-	while ($rs->fetch()) {
-		$catparents_combo[] = $categories_combo[] = new formSelectOption(
-			str_repeat('&nbsp;&nbsp;',$rs->level-1).($rs->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($rs->cat_title),
-			$rs->cat_id
-		);
-	}
-}
+$categories_combo = dcAdminCombos::getCategoriesCombo($rs);
 
 echo
@@ -139,5 +129,4 @@
 	echo
 	'<form action="categories.php" method="post" id="form-categories">'.
-	'<h3>'.__('List of blog\'s categories').'</h3>'.
 	'<div id="categories">';
 
@@ -180,5 +169,5 @@
 	'<p class="col right" id="mov-cat">'.
 	'<label for="mov_cat" class="classic">'.__('Category which will receive entries of deleted categories:').'</label> '.
-	form::combo('mov_cat',array_merge(array(__('(No cat)') => ''),$categories_combo),'','').
+	form::combo('mov_cat',$categories_combo,'','').
 	'</p>'.
 	'<p class="right">'.
Index: admin/comment.php
===================================================================
--- admin/comment.php	(revision 1553)
+++ admin/comment.php	(revision 1719)
@@ -26,8 +26,7 @@
 $comment_spam_status = '';
 
+
 # Status combo
-foreach ($core->blog->getAllCommentStatus() as $k => $v) {
-	$status_combo[$v] = (string) $k;
-}
+$status_combo = dcAdminCombos::getCommentStatusescombo();
 
 # Adding comment
Index: admin/comments.php
===================================================================
--- admin/comments.php	(revision 1528)
+++ admin/comments.php	(revision 1719)
@@ -28,10 +28,9 @@
 # Creating filter combo boxes
 # Filter form we'll put in html_block
-$status_combo = array(
-'-' => ''
-);
-foreach ($core->blog->getAllCommentStatus() as $k => $v) {
-	$status_combo[$v] = (string) $k;
-}
+$status_combo = array_merge(
+	array('-' => ''),
+	dcAdminCombos::getCommentStatusescombo()
+);
+
 
 $type_combo = array(
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 1699)
+++ admin/index.php	(revision 1741)
@@ -144,10 +144,10 @@
 		if ($feed)
 		{
-			$latest_news = '<h3>'.__('Latest news').'</h3><dl id="news">';
+			$latest_news = '<h3>'.__('Dotclear news').'</h3><dl id="news">';
 			$i = 1;
 			foreach ($feed->items as $item)
 			{
-				$dt = isset($item->link) ? '<a href="'.$item->link.'" title="'.$item->title.' '.__('(external link)').'">'.
-					$item->title.'</a>' : $item->title;
+				$dt = isset($item->link) ? '<a href="'.$item->link.'" title="'.$item->title.' ('.__('new window').')">'.
+					$item->title.' <img src="images/outgoing-blue.png" alt="" /></a>' : $item->title;
 			
 				if ($i < 3) {
@@ -179,5 +179,6 @@
 	
 		foreach ($__resources['doc'] as $k => $v) {
-			$doc_links .= '<li><a href="'.$v.'" title="'.$k.' '.__('(external link)').'">'.$k.'</a></li>';
+			$doc_links .= '<li><a href="'.$v.'" title="'.$k.' ('.__('new window').')">'.$k.
+			' <img src="images/outgoing-blue.png" alt="" /></a></li>';
 		}
 	
@@ -222,5 +223,5 @@
 		'<a href="update.php?hide_msg=1">'.__('Remind me later').'</a>'.
 		($version_info ? ' </p>'.
-		'<p><a href="'.$version_info.'" class="info">'.__('information about this version').'</a>' : '').'</p>'.
+		'<p><a href="'.$version_info.'" class="updt-info">'.__('information about this version').'</a>' : '').'</p>'.
 		'</div>';
 	}
@@ -257,15 +258,23 @@
 
 # Check cache directory
-if (!is_dir(DC_TPL_CACHE)) {
-	$err[] = '<p>'.sprintf(__('Cache directory %s does not exist.'),DC_TPL_CACHE).'</p>';
-} else if (!is_writable(DC_TPL_CACHE)) {
-	$err[] = '<p>'.sprintf(__('Cache directory %s is not writable.'),DC_TPL_CACHE).'</p>';
+if ( $core->auth->isSuperAdmin() ) {
+	if (!is_dir(DC_TPL_CACHE) || !is_writable(DC_TPL_CACHE)) {
+		$err[] = '<p>'.__("The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file.").'</p>';
+	}
+} else {
+	if (!is_dir(DC_TPL_CACHE) || !is_writable(DC_TPL_CACHE)) {
+		$err[] = '<p>'.__("The cache directory does not exist or is not writable. You should contact your administrator.").'</p>';
+	}
 }
 
 # Check public directory
-if (!is_dir($core->blog->public_path)) {
-	$err[] = '<p>'.sprintf(__('Directory %s does not exist.'),$core->blog->public_path).'</p>';
-} else if (!is_writable($core->blog->public_path)) {
-	$err[] = '<p>'.sprintf(__('Directory %s is not writable.'),$core->blog->public_path).'</p>';
+if ( $core->auth->isSuperAdmin() ) {
+	if (!is_dir($core->blog->public_path) || !is_writable($core->blog->public_path)) {
+		$err[] = '<p>'.__("There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting).").'</p>';
+	}
+} else {
+	if (!is_dir($core->blog->public_path) || !is_writable($core->blog->public_path)) {
+		$err[] = '<p>'.__("There is no writable root directory for the media manager. You should contact your administrator.").'</p>';
+	}
 }
 
@@ -293,25 +302,4 @@
 	echo '</ul></div>';
 }
-
-# Dashboard columns (processed first, as we need to know the result before displaying the icons.)
-$dashboardItems = '';
-
-# Dotclear updates notifications
-if ($core->auth->isSuperAdmin() && is_readable(DC_DIGESTS))
-{
-	$updater = new dcUpdate(DC_UPDATE_URL,'dotclear',DC_UPDATE_VERSION,DC_TPL_CACHE.'/versions');
-	$new_v = $updater->check(DC_VERSION);
-	$version_info = $new_v ? $updater->getInfoURL() : '';
-	
-	if ($updater->getNotify() && $new_v) {
-		$dashboardItems .=
-		'<div id="upg-notify" class="static-msg"><p>'.sprintf(__('Dotclear %s is available!'),$new_v).'</p> '.
-		'<ul><li><strong><a href="update.php">'.sprintf(__('Upgrade now'),$new_v).'</a></strong>'.
-		'</li><li><a href="update.php?hide_msg=1">'.__('Remind me later').'</a>'.
-		($version_info ? ' </li><li>'.sprintf(__('<a href=\"%s\">Information about this version</a>.'),$version_info) : '').
-		'</li></ul></div>';
-	}
-}
-
 # Errors modules notifications
 if ($core->auth->isSuperAdmin())
@@ -323,10 +311,12 @@
 	
 	if (count($list) > 0) {
-		$dashboardItems .=
-		'<div id="module-errors" class="error"><p>'.__('Some plugins are installed twice:').'</p> '.
+		echo 
+		'<div class="error" id="module-errors" class="error"><p>'.__('Some plugins are installed twice:').'</p> '.
 		'<ul>'.implode("\n",$list).'</ul></div>';
 	}
-	
-}
+}
+
+# Dashboard columns (processed first, as we need to know the result before displaying the icons.)
+$dashboardItems = '';
 
 foreach ($__dashboard_items as $i)
@@ -334,5 +324,5 @@
 	if ($i->count() > 0)
 	{
-		$dashboardItems .= '<div class="db-item">';
+		$dashboardItems .= '<div class="box">';
 		foreach ($i as $v) {
 			$dashboardItems .= $v;
@@ -343,5 +333,5 @@
 
 # Dashboard icons
-echo '<div id="dashboard-main"'.($dashboardItems ? '' : ' class="fullwidth"').'><div id="icons">';
+echo '<div id="dashboard-main"><div id="icons">';
 foreach ($__dashboard_icons as $i)
 {
@@ -356,16 +346,7 @@
 	{
 		# Getting categories
-		$categories_combo = array(__('(No cat)') => '');
-		try {
-			$categories = $core->blog->getCategories(array('post_type'=>'post'));
-			if (!$categories->isEmpty()) {
-				while ($categories->fetch()) {
-					$catparents_combo[] = $categories_combo[] = new formSelectOption(
-						str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-						$categories->cat_id
-					);
-				}
-			}
-		} catch (Exception $e) { }
+		$categories_combo = dcAdminCombos::getCategoriesCombo(
+			$core->blog->getCategories(array('post_type'=>'post'))
+		);
 	
 		echo
@@ -414,5 +395,5 @@
 	if ($i->count() > 0)
 	{
-		$dashboardContents .= '<div>';
+		$dashboardContents .= '<div class="box">';
 		foreach ($i as $v) {
 			$dashboardContents .= $v;
@@ -421,9 +402,18 @@
 	}
 }
-echo ($dashboardContents ? '<div id="dashboard-contents">'.$dashboardContents.'</div>' : '');
+
+$class = ' '.(($dashboardItems != '') && ($dashboardContents != '') ? 'two-boxes' : 'one-box');
+
+if ($dashboardContents != '' || $dashboardItems != '') {
+	echo 
+	'<hr />'.
+	'<div id="dashboard-boxes">';
+		echo ($dashboardContents ? '<div class="db-contents'.$class.'">'.$dashboardContents.'</div>' : '');
+		echo ($dashboardItems ? '<div class="db-items'.$class.'">'.$dashboardItems.'</div>' : '');
+	echo
+	'</div>';		
+}
 
 echo '</div>';
-
-echo ($dashboardItems ? '<div id="dashboard-items">'.$dashboardItems.'</div>' : '');
 
 dcPage::close();
Index: admin/install/check.php
===================================================================
--- admin/install/check.php	(revision 1179)
+++ admin/install/check.php	(revision 1743)
@@ -49,5 +49,5 @@
 	}
 	
-	if ($con->driver() == 'mysql')
+	if ($con->driver() == 'mysql' || $con->driver() == 'mysqli')
 	{
 		if (version_compare($con->version(),'4.1','<'))
Index: admin/install/wizard.php
===================================================================
--- admin/install/wizard.php	(revision 1399)
+++ admin/install/wizard.php	(revision 1744)
@@ -55,5 +55,5 @@
 }
 
-$DBDRIVER = !empty($_POST['DBDRIVER']) ? $_POST['DBDRIVER'] : 'mysql';
+$DBDRIVER = !empty($_POST['DBDRIVER']) ? $_POST['DBDRIVER'] : (function_exists('mysqli_connect') ? 'mysqli' : 'mysql');
 $DBHOST = !empty($_POST['DBHOST']) ? $_POST['DBHOST'] : '';
 $DBNAME = !empty($_POST['DBNAME']) ? $_POST['DBNAME'] : '';
@@ -179,5 +179,5 @@
 '<form action="wizard.php" method="post">'.
 '<p><label class="required" for="DBDRIVER"><abbr title="'.__('Required field').'">*</abbr> '.__('Database type:').'</label> '.
-form::combo('DBDRIVER',array('MySQL'=>'mysql','PostgreSQL'=>'pgsql'),$DBDRIVER).'</p>'.
+form::combo('DBDRIVER',array(__('MySQL (deprecated)')=>'mysql',__('MySQLi')=>'mysqli',__('PostgreSQL')=>'pgsql'),$DBDRIVER).'</p>'.
 '<p><label for="DBHOST">'.__('Database Host Name:').'</label> '.
 form::field('DBHOST',30,255,html::escapeHTML($DBHOST)).'</p>'.
Index: admin/js/_media.js
===================================================================
--- admin/js/_media.js	(revision 1461)
+++ admin/js/_media.js	(revision 1724)
@@ -1,124 +1,132 @@
+(function($) {
+	$.fn.enhancedUploader = function() {
+		return this.each(function() {
+			var me = $(this);
+
+			function enableButton(button) {
+				button.prop('disabled',false).removeClass('disabled');
+			}
+
+			function disableButton(button) {
+				button.prop('disabled',true).addClass('disabled');
+			}
+			
+			function displayMessageInQueue(n) {
+				var msg = '';
+				if (n==1) {
+					msg = dotclear.jsUpload.msg.file_in_queue;
+				} else if (n>1) {
+					msg = dotclear.jsUpload.msg.files_in_queue;
+					msg = msg.replace(/%d/,n);
+				} else {
+					msg = dotclear.jsUpload.msg.no_file_in_queue;
+				}
+				$('.queue-message',me).html(msg);
+			}
+			
+			$('.button.add').click(function(e) {
+				// Use the native click() of the file input.
+				$('#upfile').click();
+				e.preventDefault();
+			});
+			
+			$('.button.cancel', '#fileupload .fileupload-buttonbar').click(function(e) {
+				$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
+				disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+				displayMessageInQueue(0);
+			});
+			
+			$('.cancel').live('click', function(e) {
+				if ($('.fileupload-ctrl .files .template-upload', me).length==0) {
+					$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
+					disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+				}
+				displayMessageInQueue($('.files .template-upload',me).length);
+			});
+			
+			$('.button.clean', me).click(function(e) {
+				$('.fileupload-ctrl .files .template-download', me).slideUp(500, function() {
+					$(this).remove();
+				});
+				$(this).hide();
+				e.preventDefault();
+			});
+			
+			$(me).fileupload({
+				url: $(me).attr('action'),
+				autoUpload: false,
+				sequentialUploads: true,
+				uploadTemplateId: null,
+				downloadTemplateId: null,
+				uploadTemplate: template_upload,
+				downloadTemplate: template_download
+			}).bind('fileuploadadd', function(e, data) {
+				$('.button.cancel','#fileupload .fileupload-buttonbar').show();
+				enableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+			}).bind('fileuploadadded', function(e, data) {
+				displayMessageInQueue($('.files .template-upload',me).length);
+			}).bind('fileuploaddone', function(e, data) {
+				if (data.result.files[0].html !==undefined) {
+					$('.media-list p.clear').before(data.result.files[0].html);
+				}
+				$('.button.clean',me).show();
+			}).bind('fileuploadalways', function(e, data) {
+				displayMessageInQueue($('.files .template-upload',me).length);
+				if ($('.fileupload-ctrl .files .template-upload',me).length==0) {
+					$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
+					disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+				}
+			});
+			
+			var $container = $(me).parent();
+			var $msg,label;
+
+			if ($container.hasClass('enhanced_uploader')) {
+				$msg = dotclear.msg.enhanced_uploader_disable;
+				label = dotclear.jsUpload.msg.choose_files;
+				$(me).fileupload({disabled:false});
+				displayMessageInQueue(0);
+				disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+			} else {
+				$msg = dotclear.msg.enhanced_uploader_activate;
+				label = dotclear.jsUpload.msg.choose_file;
+			}
+
+			$('<p class="clear"><a class="enhanced-toggle" href="#">' + $msg + '</a></p>').click(function() {
+				if ($container.hasClass('enhanced_uploader')) {
+					$msg = dotclear.msg.enhanced_uploader_activate;
+					label = dotclear.jsUpload.msg.choose_file;
+					$('#upfile').attr('multiple', false);
+					enableButton($('.button.start','#fileupload .fileupload-buttonbar'));
+					
+					// when a user has clicked enhanced_uploader, and has added files
+					// We must remove files in table
+					$('.files .upload-file', me).remove();
+					$('.button.cancel,.button.clean','#fileupload .fileupload-buttonbar').hide();
+					$(me).fileupload({disabled:true});
+					$('.queue-message',me).html('').hide();
+				} else {
+					$msg = dotclear.msg.enhanced_uploader_disable;
+					label = dotclear.jsUpload.msg.choose_files;
+					$('#upfile').attr('multiple', true);
+					var startButton = $('.button.start','#fileupload .fileupload-buttonbar');
+					disableButton(startButton);
+					startButton.show();
+					$(me).fileupload({disabled:false});
+					$('.queue-message',me).show();
+					displayMessageInQueue(0);
+				}
+				$(this).find('a').text($msg);
+				$('.add-label', me).text(label);
+				
+				$container.toggleClass('enhanced_uploader');
+			}).appendTo(me);
+		});
+	};
+})(jQuery);
+
+
 $(function() {
-	if ($('#fileupload').length==0) {
-		return;
-	}
-
-	function enableButton(button) {
-		button.prop('disabled',false).removeClass('disabled');
-	}
-
-	function disableButton(button) {
-		button.prop('disabled',true).addClass('disabled');
-	}
-
-	function displayMessageInQueue(n) {
-		var msg = '';
-		if (n==1) {
-			msg = dotclear.jsUpload.msg.file_in_queue;
-		} else if (n>1) {
-			msg = dotclear.jsUpload.msg.files_in_queue;
-			msg = msg.replace(/%d/,n);
-		} else {
-			msg = dotclear.jsUpload.msg.no_file_in_queue;
-		}
-		$('.queue-message','#fileupload').html(msg);
-	}
-
-	$('.button.add').click(function(e) {
-		// Use the native click() of the file input.
-		$('#upfile').click();
-		e.preventDefault();
-	});
-
-	$('.button.cancel', '#fileupload .fileupload-buttonbar').click(function(e) {
-		$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
-		disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
-		displayMessageInQueue(0);
-	});
-
-	$('.cancel').live('click', function(e) {
-		if ($('.fileupload-ctrl .files .template-upload', '#fileupload').length==0) {
-			$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
-			disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
-		}
-		displayMessageInQueue($('.files .template-upload','#fileupload').length);
-	});
-
-	$('.button.clean', '#fileupload').click(function(e) {
-		$('.fileupload-ctrl .files .template-download', '#fileupload').slideUp(500, function() {
-			$(this).remove();
-		});
-		$(this).hide();
-		e.preventDefault();
-	});
-
-	$('#fileupload').fileupload({
-		url: $('#fileupload').attr('action'),
-		autoUpload: false,
-		sequentialUploads: true,
-		uploadTemplateId: null,
-		downloadTemplateId: null,
-		uploadTemplate: template_upload,
-		downloadTemplate: template_download
-	}).bind('fileuploadadd', function(e, data) {
-		$('.button.cancel','#fileupload .fileupload-buttonbar').show();
-		enableButton($('.button.start','#fileupload .fileupload-buttonbar'));
-	}).bind('fileuploadadded', function(e, data) {
-		displayMessageInQueue($('.files .template-upload','#fileupload').length);
-	}).bind('fileuploaddone', function(e, data) {
-		if (data.result.files[0].html !==undefined) {
-			$('.media-list p.clear').before(data.result.files[0].html);
-		}
-		$('.button.clean','#fileupload').show();
-	}).bind('fileuploadalways', function(e, data) {
-		displayMessageInQueue($('.files .template-upload','#fileupload').length);
-		if ($('.fileupload-ctrl .files .template-upload','#fileupload').length==0) {
-			$('.button.cancel','#fileupload .fileupload-buttonbar').hide();
-			disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
-		}
-	});
-
-	var $container = $('#fileupload').parent().parent();
-	var $msg,label;
-
-	if ($container.hasClass('enhanced_uploader')) {
-		$msg = dotclear.msg.enhanced_uploader_disable;
-		label = dotclear.jsUpload.msg.choose_files;
-		$('#fileupload').fileupload({disabled:false});
-		displayMessageInQueue(0);
-		disableButton($('.button.start','#fileupload .fileupload-buttonbar'));
-	} else {
-		$msg = dotclear.msg.enhanced_uploader_activate;
-		label = dotclear.jsUpload.msg.choose_file;
-	}
-
-	$('<p class="clear"><a class="enhanced-toggle" href="#">' + $msg + '</a></p>').click( function() {
-		if ($container.hasClass('enhanced_uploader')) {
-			$msg = dotclear.msg.enhanced_uploader_activate;
-			label = dotclear.jsUpload.msg.choose_file;
-			$('#upfile').attr('multiple', false);
-
-			// when a user has clicked enhanced_uploader, and has added files
-			// We must remove files in table
-			$('.files .upload-file', '#fileupload').remove();
-			$('.button.cancel,.button.clean','#fileupload .fileupload-buttonbar').hide();
-			$('#fileupload').fileupload({disabled:true});
-			$('.queue-message','#fileupload').html('').hide();
-		} else {
-			$msg = dotclear.msg.enhanced_uploader_disable;
-			label = dotclear.jsUpload.msg.choose_files;
-			$('#upfile').attr('multiple', true);
-			var startButton = $('.button.start','#fileupload .fileupload-buttonbar');
-			disableButton(startButton);
-			startButton.show();
-			$('#fileupload').fileupload({disabled:false});
-			$('.queue-message','#fileupload').show();
-			displayMessageInQueue(0);
-		}
-		$(this).find('a').text($msg);
-		$('.add-label', '#fileupload').text(label);
-
-		$container.toggleClass('enhanced_uploader');
-	}).appendTo($('#fileupload'));
+	$('#fileupload').enhancedUploader();
 
 	// Replace remove links by a POST on hidden form
Index: admin/js/ie7/ie7-hashchange.js
===================================================================
--- admin/js/ie7/ie7-hashchange.js	(revision 1700)
+++ admin/js/ie7/ie7-hashchange.js	(revision 1700)
@@ -0,0 +1,390 @@
+/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+// Script: jQuery hashchange event
+//
+// *Version: 1.3, Last updated: 7/21/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
+// GitHub       - http://github.com/cowboy/jquery-hashchange/
+// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
+// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
+// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
+//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
+// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
+// 
+// About: Known issues
+// 
+// While this jQuery hashchange event implementation is quite stable and
+// robust, there are a few unfortunate browser bugs surrounding expected
+// hashchange event-based behaviors, independent of any JavaScript
+// window.onhashchange abstraction. See the following examples for more
+// information:
+// 
+// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
+// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
+// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
+// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
+// 
+// Also note that should a browser natively support the window.onhashchange 
+// event, but not report that it does, the fallback polling loop will be used.
+// 
+// About: Release History
+// 
+// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
+//         "removable" for mobile-only development. Added IE6/7 document.title
+//         support. Attempted to make Iframe as hidden as possible by using
+//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
+//         support for the "shortcut" format $(window).hashchange( fn ) and
+//         $(window).hashchange() like jQuery provides for built-in events.
+//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
+//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
+//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
+//         file to address access denied issues when setting document.domain in
+//         IE6/7.
+// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
+//         from a page on another domain would cause an error in Safari 4. Also,
+//         IE6/7 Iframe is now inserted after the body (this actually works),
+//         which prevents the page from scrolling when the event is first bound.
+//         Event can also now be bound before DOM ready, but it won't be usable
+//         before then in IE6/7.
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
+//         where browser version is incorrectly reported as 8.0, despite
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
+// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
+//         window.onhashchange functionality into a separate plugin for users
+//         who want just the basic event & back button support, without all the
+//         extra awesomeness that BBQ provides. This plugin will be included as
+//         part of jQuery BBQ, but also be available separately.
+
+(function($,window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Reused string.
+  var str_hashchange = 'hashchange',
+    
+    // Method / object references.
+    doc = document,
+    fake_onhashchange,
+    special = $.event.special,
+    
+    // Does the browser support window.onhashchange? Note that IE8 running in
+    // IE7 compatibility mode reports true for 'onhashchange' in window, even
+    // though the event isn't supported, so also test document.documentMode.
+    doc_mode = doc.documentMode,
+    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
+  
+  // Get location.hash (or what you'd expect location.hash to be) sans any
+  // leading #. Thanks for making this necessary, Firefox!
+  function get_fragment( url ) {
+    url = url || location.href;
+    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
+  };
+  
+  // Method: jQuery.fn.hashchange
+  // 
+  // Bind a handler to the window.onhashchange event or trigger all bound
+  // window.onhashchange event handlers. This behavior is consistent with
+  // jQuery's built-in event handlers.
+  // 
+  // Usage:
+  // 
+  // > jQuery(window).hashchange( [ handler ] );
+  // 
+  // Arguments:
+  // 
+  //  handler - (Function) Optional handler to be bound to the hashchange
+  //    event. This is a "shortcut" for the more verbose form:
+  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
+  //    all bound window.onhashchange event handlers will be triggered. This
+  //    is a shortcut for the more verbose
+  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
+  //    the <hashchange event> section.
+  // 
+  // Returns:
+  // 
+  //  (jQuery) The initial jQuery collection of elements.
+  
+  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
+  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
+  $.fn[ str_hashchange ] = function( fn ) {
+    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
+  };
+  
+  // Property: jQuery.fn.hashchange.delay
+  // 
+  // The numeric interval (in milliseconds) at which the <hashchange event>
+  // polling loop executes. Defaults to 50.
+  
+  // Property: jQuery.fn.hashchange.domain
+  // 
+  // If you're setting document.domain in your JavaScript, and you want hash
+  // history to work in IE6/7, not only must this property be set, but you must
+  // also set document.domain BEFORE jQuery is loaded into the page. This
+  // property is only applicable if you are supporting IE6/7 (or IE8 operating
+  // in "IE7 compatibility" mode).
+  // 
+  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
+  // path of the included "document-domain.html" file, which can be renamed or
+  // modified if necessary (note that the document.domain specified must be the
+  // same in both your main JavaScript as well as in this file).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.domain = document.domain;
+  
+  // Property: jQuery.fn.hashchange.src
+  // 
+  // If, for some reason, you need to specify an Iframe src file (for example,
+  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
+  // do so using this property. Note that when using this property, history
+  // won't be recorded in IE6/7 until the Iframe src file loads. This property
+  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
+  // compatibility" mode).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.src = 'path/to/file.html';
+  
+  $.fn[ str_hashchange ].delay = 50;
+  /*
+  $.fn[ str_hashchange ].domain = null;
+  $.fn[ str_hashchange ].src = null;
+  */
+  
+  // Event: hashchange event
+  // 
+  // Fired when location.hash changes. In browsers that support it, the native
+  // HTML5 window.onhashchange event is used, otherwise a polling loop is
+  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
+  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
+  // compatibility" mode), a hidden Iframe is created to allow the back button
+  // and hash-based history to work.
+  // 
+  // Usage as described in <jQuery.fn.hashchange>:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).hashchange( function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).hashchange();
+  // 
+  // A more verbose usage that allows for event namespacing:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).bind( 'hashchange', function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).trigger( 'hashchange' );
+  // 
+  // Additional Notes:
+  // 
+  // * The polling loop and Iframe are not created until at least one handler
+  //   is actually bound to the 'hashchange' event.
+  // * If you need the bound handler(s) to execute immediately, in cases where
+  //   a location.hash exists on page load, via bookmark or page refresh for
+  //   example, use jQuery(window).hashchange() or the more verbose 
+  //   jQuery(window).trigger( 'hashchange' ).
+  // * The event can be bound before DOM ready, but since it won't be usable
+  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
+  //   to bind it inside a DOM ready handler.
+  
+  // Override existing $.event.special.hashchange methods (allowing this plugin
+  // to be defined after jQuery BBQ in BBQ's source code).
+  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
+    
+    // Called only when the first 'hashchange' event is bound to window.
+    setup: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to create our own. And we don't want to call this
+      // until the user binds to the event, just in case they never do, since it
+      // will create a polling loop and possibly even a hidden Iframe.
+      $( fake_onhashchange.start );
+    },
+    
+    // Called only when the last 'hashchange' event is unbound from window.
+    teardown: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to stop ours (if possible).
+      $( fake_onhashchange.stop );
+    }
+    
+  });
+  
+  // fake_onhashchange does all the work of triggering the window.onhashchange
+  // event for browsers that don't natively support it, including creating a
+  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
+  // Iframe to enable back and forward.
+  fake_onhashchange = (function(){
+    var self = {},
+      timeout_id,
+      
+      // Remember the initial hash so it doesn't get triggered immediately.
+      last_hash = get_fragment(),
+      
+      fn_retval = function(val){ return val; },
+      history_set = fn_retval,
+      history_get = fn_retval;
+    
+    // Start the polling loop.
+    self.start = function() {
+      timeout_id || poll();
+    };
+    
+    // Stop the polling loop.
+    self.stop = function() {
+      timeout_id && clearTimeout( timeout_id );
+      timeout_id = undefined;
+    };
+    
+    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
+    // if location.hash has changed, and triggers the 'hashchange' event on
+    // window when necessary.
+    function poll() {
+      var hash = get_fragment(),
+        history_hash = history_get( last_hash );
+      
+      if ( hash !== last_hash ) {
+        history_set( last_hash = hash, history_hash );
+        
+        $(window).trigger( str_hashchange );
+        
+      } else if ( history_hash !== last_hash ) {
+        location.href = location.href.replace( /#.*/, '' ) + history_hash;
+      }
+      
+      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
+    };
+    
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    $.browser.msie && !supports_onhashchange && (function(){
+      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
+      // when running in "IE7 compatibility" mode.
+      
+      var iframe,
+        iframe_src;
+      
+      // When the event is bound and polling starts in IE 6/7, create a hidden
+      // Iframe for history handling.
+      self.start = function(){
+        if ( !iframe ) {
+          iframe_src = $.fn[ str_hashchange ].src;
+          iframe_src = iframe_src && iframe_src + get_fragment();
+          
+          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
+          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
+          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
+            
+            // When Iframe has completely loaded, initialize the history and
+            // start polling.
+            .one( 'load', function(){
+              iframe_src || history_set( get_fragment() );
+              poll();
+            })
+            
+            // Load Iframe src if specified, otherwise nothing.
+            .attr( 'src', iframe_src || 'javascript:0' )
+            
+            // Append Iframe after the end of the body to prevent unnecessary
+            // initial page scrolling (yes, this works).
+            .insertAfter( 'body' )[0].contentWindow;
+          
+          // Whenever `document.title` changes, update the Iframe's title to
+          // prettify the back/next history menu entries. Since IE sometimes
+          // errors with "Unspecified error" the very first time this is set
+          // (yes, very useful) wrap this with a try/catch block.
+          doc.onpropertychange = function(){
+            try {
+              if ( event.propertyName === 'title' ) {
+                iframe.document.title = doc.title;
+              }
+            } catch(e) {}
+          };
+          
+        }
+      };
+      
+      // Override the "stop" method since an IE6/7 Iframe was created. Even
+      // if there are no longer any bound event handlers, the polling loop
+      // is still necessary for back/next to work at all!
+      self.stop = fn_retval;
+      
+      // Get history by looking at the hidden Iframe's location.hash.
+      history_get = function() {
+        return get_fragment( iframe.location.href );
+      };
+      
+      // Set a new history item by opening and then closing the Iframe
+      // document, *then* setting its location.hash. If document.domain has
+      // been set, update that as well.
+      history_set = function( hash, history_hash ) {
+        var iframe_doc = iframe.document,
+          domain = $.fn[ str_hashchange ].domain;
+        
+        if ( hash !== history_hash ) {
+          // Update Iframe with any initial `document.title` that might be set.
+          iframe_doc.title = doc.title;
+          
+          // Opening the Iframe's document after it has been closed is what
+          // actually adds a history entry.
+          iframe_doc.open();
+          
+          // Set document.domain for the Iframe document as well, if necessary.
+          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
+          
+          iframe_doc.close();
+          
+          // Update the Iframe's hash, for great justice.
+          iframe.location.hash = hash;
+        }
+      };
+      
+    })();
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    
+    return self;
+  })();
+  
+})(jQuery,this);
Index: admin/js/jquery/jquery.pageTabs.js
===================================================================
--- admin/js/jquery/jquery.pageTabs.js	(revision 1280)
+++ admin/js/jquery/jquery.pageTabs.js	(revision 1737)
@@ -9,11 +9,20 @@
 		breakerClassName: 'clear'
 	};
-
+	
 	var index = start_tab ? start_tab : 0;
-
+	var hash = document.location.hash.split('#').join('');
+	if( hash != '' ) {
+		var index = hash;
+	}
+	
 	this.params = jQuery.extend(defaults,settings);
 	this.divs = jQuery('div.'+this.params.className);
 	this.createList();
 	this.showDiv(index);
+	var pageTabs = this;
+	
+	window.onhashchange = function (event) {
+		pageTabs.showDiv(document.location.hash.split('#').join(''));
+    }
 };
 
@@ -39,11 +48,11 @@
 				li = document.createElement('li');
 				a = document.createElement('a');
-				a.appendChild(document.createTextNode(this.title));
+				$(a).html(this.title);
 				this.title = '';
-				a.href = '#';
 				a.fn = This.showDiv;
 				a.index = this.id || i;
+				a.href = '#'+a.index;
+				li.id = "part-tabs-"+a.index;
 				a.obj = This;
-				jQuery(a).click(function() { this.fn.call(this.obj,this.index); return false; });
 				li.appendChild(a);
 				This.list.appendChild(li);
Index: admin/js/meta-editor.js
===================================================================
--- admin/js/meta-editor.js	(revision 175)
+++ admin/js/meta-editor.js	(revision 1741)
@@ -28,5 +28,5 @@
 		this.target.empty();
 		
-		this.meta_dialog = $('<input type="text" />');
+		this.meta_dialog = $('<input type="text" class="ib" />');
 		this.meta_dialog.attr('title',this.text_add_meta.replace(/%s/,this.meta_type));
 		this.meta_dialog.attr('id','post_meta_input');
@@ -42,5 +42,5 @@
 		var This = this;
 		
-		this.submit_button = $('<input type="button" value="ok" />');
+		this.submit_button = $('<input type="button" value="ok" class="ib" />');
 		this.submit_button.click(function() {
 			var v = This.meta_dialog.val();
Index: admin/media.php
===================================================================
--- admin/media.php	(revision 1681)
+++ admin/media.php	(revision 1725)
@@ -91,5 +91,5 @@
 	$dir =& $core->media->dir;
 	if  (!$core_media_writable) {
-		throw new Exception('you do not have sufficient permissions to write to this folder: ');
+//		throw new Exception('you do not have sufficient permissions to write to this folder: ');
 	}
 } catch (Exception $e) {
@@ -262,4 +262,8 @@
 	);
 
+if (!$core_media_writable) {
+	dcPage::warning(__('You do not have sufficient permissions to write to this folder.'));
+}
+
 if (!empty($_GET['mkdok'])) {
 	dcPage::success(__('Directory has been successfully created.'));
@@ -343,5 +347,5 @@
 {
 	echo 
-	'<h3>'.sprintf(__('In %s:'),($d == '' ? '“'.__('Media manager').'”' : '“'.$d.'”')).'</h3>'.
+	'<h3 class="hidden">'.sprintf(__('In %s:'),($d == '' ? '“'.__('Media manager').'”' : '“'.$d.'”')).'</h3>'.
 	'<div class="media-action-box">';
 	
@@ -393,19 +397,41 @@
 	'</div>'.
 	'</div>';
-
-	echo
-	'<div class="media-action-box">'.
-	'<form action="'.html::escapeURL($page_url).'" method="post">'.
-	'<div id="new-dir-f">'.
-	'<h4>'.__('Create new directory').'</h4>'.
-	$core->formNonce().
-	'<p><label for="newdir">'.__('Directory Name:').'</label>'.
-	form::field(array('newdir','newdir'),35,255).'</p>'.
-	'<p><input type="submit" value="'.__('Create').'" />'.
-	form::hidden(array('d'),html::escapeHTML($d)).'</p>'.
-	'</div>'.
-	'</form>'.
-	'</div>';
-	}
+}
+
+$core_media_archivable = $core->auth->check('media_admin',$core->blog->id) && 
+	!(count($items) == 0 || (count($items) == 1 && $items[0]->parent));
+
+if ($core_media_writable || $core_media_archivable) {
+
+	echo '<div class="media-action-box">';
+
+	# Create directory
+	if ($core_media_writable)
+	{
+		echo
+		'<form action="'.html::escapeURL($page_url).'" method="post">'.
+		'<div id="new-dir-f">'.
+		'<h4>'.__('Create new directory').'</h4>'.
+		$core->formNonce().
+		'<p><label for="newdir">'.__('Directory Name:').'</label>'.
+		form::field(array('newdir','newdir'),35,255).'</p>'.
+		'<p><input type="submit" value="'.__('Create').'" />'.
+		form::hidden(array('d'),html::escapeHTML($d)).'</p>'.
+		'</div>'.
+		'</form>';
+	}
+
+	# Get zip directory
+	if ($core_media_archivable)
+	{
+		echo
+		'<h4>'.__('Backup content').'</h4>'.
+		'<p>'.__('Compress this directory with its content as a zip file and download it.').'</p>'.
+		'<p><a class="submit" href="'.html::escapeURL($page_url).'&amp;zipdl=1">'.
+		__('Download').'</a></p>';
+	}
+
+	echo '</div>';
+}
 
 # Empty remove form (for javascript actions)
@@ -419,17 +445,4 @@
 '</form>';
 
-# Get zip directory
-if ($core->auth->check('media_admin',$core->blog->id) && 
-	!(count($items) == 0 || (count($items) == 1 && $items[0]->parent)))
-{
-	echo
-	'<div class="media-action-box">'.
-	'<h4>'.__('Backup content').'</h4>'.
-	'<p>'.__('Compress this directory with its content as a zip file and download it.').'</p>'.
-	'<p><a class="submit" href="'.html::escapeURL($page_url).'&amp;zipdl=1">'.
-	__('Download').'</a></p>'.
-	'</div>';
-}
-
 call_user_func($close_f);
 
Index: admin/popup_link.php
===================================================================
--- admin/popup_link.php	(revision 1399)
+++ admin/popup_link.php	(revision 1719)
@@ -25,16 +25,5 @@
 # Languages combo
 $rs = $core->blog->getLangs(array('order'=>'asc'));
-$all_langs = l10n::getISOcodes(0,1);
-$lang_combo = array('' => '', __('Most used') => array(), __('Available') => l10n::getISOcodes(1,1));
-while ($rs->fetch()) {
-	if (isset($all_langs[$rs->post_lang])) {
-		$lang_combo[__('Most used')][$all_langs[$rs->post_lang]] = $rs->post_lang;
-		unset($lang_combo[__('Available')][$all_langs[$rs->post_lang]]);
-	} else {
-		$lang_combo[__('Most used')][$rs->post_lang] = $rs->post_lang;
-	}
-}
-unset($all_langs);
-unset($rs);
+$lang_combo = dcAdminCombos::getLangsCombo($rs,true);
 
 echo
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 1714)
+++ admin/post.php	(revision 1741)
@@ -51,40 +51,18 @@
 
 # Getting categories
-$categories_combo = array('&nbsp;' => '');
-try {
-	$categories = $core->blog->getCategories(array('post_type'=>'post'));
-	while ($categories->fetch()) {
-		$categories_combo[] = new formSelectOption(
-			str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-			$categories->cat_id
-	);
-	}
-} catch (Exception $e) { }
-
-# Status combo
-foreach ($core->blog->getAllPostStatus() as $k => $v) {
-	$status_combo[$v] = (string) $k;
-}
+$categories_combo = dcAdminCombos::getCategoriesCombo(
+	$core->blog->getCategories(array('post_type'=>'post'))
+);
+
+$status_combo = dcAdminCombos::getPostStatusesCombo();
+
 $img_status_pattern = '<img class="img_select_option" alt="%1$s" title="%1$s" src="images/%2$s" />';
 
 # Formaters combo
-foreach ($core->getFormaters() as $v) {
-	$formaters_combo[$v] = $v;
-}
+$formaters_combo = dcAdminCombos::getFormatersCombo();
 
 # Languages combo
 $rs = $core->blog->getLangs(array('order'=>'asc'));
-$all_langs = l10n::getISOcodes(0,1);
-$lang_combo = array('' => '', __('Most used') => array(), __('Available') => l10n::getISOcodes(1,1));
-while ($rs->fetch()) {
-	if (isset($all_langs[$rs->post_lang])) {
-		$lang_combo[__('Most used')][$all_langs[$rs->post_lang]] = $rs->post_lang;
-		unset($lang_combo[__('Available')][$all_langs[$rs->post_lang]]);
-	} else {
-		$lang_combo[__('Most used')][$rs->post_lang] = $rs->post_lang;
-	}
-}
-unset($all_langs);
-unset($rs);
+$lang_combo = dcAdminCombos::getLangsCombo($rs,true);
 
 # Validation flag
@@ -305,17 +283,7 @@
 
 # Getting categories
-$categories_combo = array(__('(No cat)') => '');
-try {
-	$categories = $core->blog->getCategories(array('post_type'=>'post'));
-	if (!$categories->isEmpty()) {
-		while ($categories->fetch()) {
-			$catparents_combo[] = $categories_combo[] = new formSelectOption(
-				str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-				$categories->cat_id
-			);
-		}
-	}
-} catch (Exception $e) { }
-
+$categories_combo = dcAdminCombos::getCategoriesCombo(
+	$core->blog->getCategories(array('post_type'=>'post'))
+);
 /* DISPLAY
 -------------------------------------------------------- */
@@ -446,5 +414,5 @@
 					'</p>'.
 					'<p>'.($post_id && $post_format != 'xhtml' ? 
-					'<a id="convert-xhtml" class="button maximal" href="post.php?id='.$post_id.'&amp;xconv=1">'.
+					'<a id="convert-xhtml" class="button" href="post.php?id='.$post_id.'&amp;xconv=1">'.
 					__('Convert to XHTML').'</a>' : '').'</p></div>')),
 		'metas-box' => array(
@@ -517,5 +485,5 @@
 		
 		"post_excerpt" =>
-			'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'<span class="form-note">'.
+			'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').' <span class="form-note">'.
 			__('Introduction to the post.').'</span></label> '.
 			form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)).
@@ -529,5 +497,5 @@
 		
 		"post_notes" =>
-			'<p class="area" id="notes-area"><label for="post_notes">'.__('Personal notes:').'<span class="form-note">'.
+			'<p class="area" id="notes-area"><label for="post_notes">'.__('Personal notes:').' <span class="form-note">'.
 			__('Unpublished notes.').'</span></label>'.
 			form::textarea('post_notes',50,5,html::escapeHTML($post_notes)).
@@ -580,5 +548,5 @@
 	
 	foreach ($sidebar_items as $id => $c) {
-		echo '<div id="'.$id.'" class="box">'.
+		echo '<div id="'.$id.'" class="sb-box">'.
 			'<h4>'.$c['title'].'</h4>';
 		foreach ($c['items'] as $e_name=>$e_content) {
@@ -633,5 +601,5 @@
 	
 	echo
-	'<div id="comments" class="multi-part" title="'.__('Comments').'">';
+	'<div id="comments" class="clear multi-part" title="'.__('Comments').'">';
 		
 	# --BEHAVIOR-- adminCommentsActionsCombo
@@ -640,5 +608,5 @@
 	$has_action = !empty($combo_action) && (!$trackbacks->isEmpty() || !$comments->isEmpty());
 	echo 
-	'<p class="top-add"><a class="button add onblog_link" href="#comment-form">'.__('Add a comment').'</a></p>';
+	'<p class="top-add"><a class="button add" href="#comment-form">'.__('Add a comment').'</a></p>';
 	
 	if ($has_action) {
Index: admin/posts.php
===================================================================
--- admin/posts.php	(revision 1596)
+++ admin/posts.php	(revision 1719)
@@ -47,31 +47,19 @@
 {
 	# Filter form we'll put in html_block
-	$users_combo = $categories_combo = array();
-	$users_combo['-'] = $categories_combo['-'] = '';
-	while ($users->fetch())
-	{
-		$user_cn = dcUtils::getUserCN($users->user_id,$users->user_name,
-		$users->user_firstname,$users->user_displayname);
-		
-		if ($user_cn != $users->user_id) {
-			$user_cn .= ' ('.$users->user_id.')';
-		}
-		
-		$users_combo[$user_cn] = $users->user_id; 
-	}
-	
+	$users_combo = array_merge(
+		array('-' => ''),
+		dcAdminCombos::getUsersCombo($users)
+	);
+
+	$categories_combo = array_merge(
+		array('-' => ''),
+		dcAdminCombos::getCategoriesCombo($categories)
+	);
 	$categories_combo[__('(No cat)')] = 'NULL';
-	while ($categories->fetch()) {
-		$categories_combo[str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').
-			html::escapeHTML($categories->cat_title).
-			' ('.$categories->nb_post.')'] = $categories->cat_id;
-	}
-	
-	$status_combo = array(
-	'-' => ''
-	);
-	foreach ($core->blog->getAllPostStatus() as $k => $v) {
-		$status_combo[$v] = (string) $k;
-	}
+	
+	$status_combo = array_merge(
+		array('-' => ''),
+		dcAdminCombos::getPostStatusesCombo()	
+	);
 	
 	$selected_combo = array(
@@ -82,13 +70,13 @@
 	
 	# Months array
-	$dt_m_combo['-'] = '';
-	while ($dates->fetch()) {
-		$dt_m_combo[dt::str('%B %Y',$dates->ts())] = $dates->year().$dates->month();
-	}
-	
-	$lang_combo['-'] = '';
-	while ($langs->fetch()) {
-		$lang_combo[$langs->post_lang] = $langs->post_lang;
-	}
+	$dt_m_combo = array_merge(
+		array('-' => ''),
+		dcAdminCombos::getDatesCombo($dates)
+	);
+	
+	$lang_combo = array_merge(
+		array('-' => ''),
+		dcAdminCombos::getLangsCombo($langs,false)	
+	);
 	
 	$sortby_combo = array(
Index: admin/posts_actions.php
===================================================================
--- admin/posts_actions.php	(revision 1637)
+++ admin/posts_actions.php	(revision 1719)
@@ -414,16 +414,7 @@
 	# categories list
 	# Getting categories
-	$categories_combo = array(__('(No cat)') => '');
-	try {
-		$categories = $core->blog->getCategories(array('post_type'=>'post'));
-		if (!$categories->isEmpty()) {
-		while ($categories->fetch()) {
-				$catparents_combo[] = $categories_combo[] = new formSelectOption(
-					str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($categories->cat_title),
-				$categories->cat_id
-			);
-		}
-		}
-	} catch (Exception $e) { }
+	$categories_combo = dcAdminCombos::getCategoriesCombo(
+		$core->blog->getCategories(array('post_type'=>'post'))
+	);
 	
 	echo
@@ -465,16 +456,5 @@
 	# Languages combo
 	$rs = $core->blog->getLangs(array('order'=>'asc'));
-	$all_langs = l10n::getISOcodes(0,1);
-	$lang_combo = array('' => '', __('Most used') => array(), __('Available') => l10n::getISOcodes(1,1));
-	while ($rs->fetch()) {
-		if (isset($all_langs[$rs->post_lang])) {
-			$lang_combo[__('Most used')][$all_langs[$rs->post_lang]] = $rs->post_lang;
-			unset($lang_combo[__('Available')][$all_langs[$rs->post_lang]]);
-		} else {
-			$lang_combo[__('Most used')][$rs->post_lang] = $rs->post_lang;
-		}
-	}
-	unset($all_langs);
-	unset($rs);
+	$lang_combo = dcAdminCombos::getLangsCombo($rs,true);
 	
 	echo
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 1609)
+++ admin/preferences.php	(revision 1726)
@@ -56,11 +56,8 @@
 }
 
-foreach ($core->getFormaters() as $v) {
-	$formaters_combo[$v] = $v;
-}
-
-foreach ($core->blog->getAllPostStatus() as $k => $v) {
-	$status_combo[$v] = $k;
-}
+# Formaters combo
+$formaters_combo = dcAdminCombos::getFormatersCombo();
+
+$status_combo = dcAdminCombos::getPostStatusescombo();
 
 $iconsets_combo = array(__('Default') => '');
@@ -77,9 +74,5 @@
 
 # Language codes
-$langs = l10n::getISOcodes(1,1);
-foreach ($langs as $k => $v) {
-	$lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v);
-	$lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : '');
-}
+$lang_combo = dcAdminCombos::getAdminLangsCombo();
 
 # Add or update user
@@ -409,5 +402,12 @@
 
 '<p><label for="user_url">'.__('URL:').'</label>'.
-form::field('user_url',30,255,html::escapeHTML($user_url)).'</p>';
+form::field('user_url',30,255,html::escapeHTML($user_url)).'</p>'.
+
+'<p><label for="user_lang">'.__('Language for my interface:').'</label>'.
+form::combo('user_lang',$lang_combo,$user_lang,'l10n').'</p>'.
+
+'<p><label for="user_tz">'.__('My timezone:').'</label>'.
+form::combo('user_tz',dt::getZones(true,true),$user_tz).'</p>';
+
 
 if ($core->auth->allowPassChange())
@@ -456,10 +456,4 @@
 '<h4>'.__('Interface').'</h4>'.
 
-'<p><label for="user_lang">'.__('Language for my interface:').'</label>'.
-form::combo('user_lang',$lang_combo,$user_lang,'l10n').'</p>'.
-
-'<p><label for="user_tz">'.__('My timezone:').'</label>'.
-form::combo('user_tz',dt::getZones(true,true),$user_tz).'</p>'.
-
 '<p><label for="user_ui_enhanceduploader" class="classic">'.
 form::checkbox('user_ui_enhanceduploader',1,$user_ui_enhanceduploader).' '.
Index: admin/style/default.css
===================================================================
--- admin/style/default.css	(revision 1698)
+++ admin/style/default.css	(revision 1748)
@@ -1,242 +1,31 @@
 /*
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
+# -- BEGIN LICENSE BLOCK --------------------------------------------------
 # This file is part of Dotclear 2.
-#
 # Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
 # Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
+# See LICENSE file or http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ----------------------------------------------------
+			LAYOUTS
+			HTML TAGS
+			FORMULAIRES
+			BOUTONS
+			MESSAGES
+			ELEMENTS PRINCIPAUX
+			REGLES SPECIFIQUES
+			MEDIA QUERIES
 */
-
-/* ------------------------------------------------------------------ html */
-html {
-	font-size: 62.5%;
-}
-body {
-	font-size: 12px; /* ie < 9 sucks */
-	font-size: 1.2rem;
-	line-height: 1.5;
-	font-family: Arial,Helvetica,sans-serif;
-	color: #333;
-	background: #fff;
-	margin: 0;
-	padding: 0;
-}
-
-a, a:link, a:visited {
-	color: #2373A8;
-	text-decoration: none;
-	border-bottom: 1px dotted #f90;
-}
-a:hover, a:active, a:focus {
-	text-decoration: underline;
-}
-a img, a:link img, a:visited img {
-	border:none;
-}
-h1, h2, h3, .as_h3, h4, h5, h6, p {
-	margin-top: 0;
-	margin-bottom: 1em;
-}
-h2 {
-	color: #666;
-	font-size: 18px; /* ie < 9 sucks */
-	font-size: 1.8rem;
-	padding: 0 0 1.5em;
-	font-weight: normal;
-}
-h2 a:link, h2 a:visited {
-	color: #666;
-	border-color: #000;
-}
-.page-title {
-	color: #d30e60;
-}
-.page-title img {
-	padding-left: .5em;
-	vertical-align: middle;
-}
-#content > h2 {
-	padding: 0 18px 6px; /* ie < 9 sucks */
-	padding: 0 1.8rem .6rem;
-	margin: 0 -18px .5em; /* ie < 9 sucks */
-	margin: 0 -1.8rem 1rem;
-	background: #fff url(bg_h2.png) repeat-x center bottom;
-}
-h3, .as_h3 {
-	color: #575859;
-	font-size: 16px; /* ie < 9 sucks */
-	font-size: 1.6rem;
-}
-h4 {
-	font-size: 14px; /* ie < 9 sucks */
-	font-size: 1.4rem;
-	color: #575859;
-}
-h5 {
-	font-size: 12px; /* ie < 9 sucks */
-	font-size: 1.2rem;
-	color: #575859;
-}
-#entry-sidebar h5 {
-	font-weight: normal;
-	color: #333;
-}
-.entry-status img.img_select_option {
-	padding-left: 4px;
-	vertical-align: text-top;
-}
-p, div.p {
-	margin: 0 0 1em 0;
-}
-hr {
-	height: 1px;
-	border-width: 1px 0 0;
-	border-color: #999;
-	border-style: solid;
-}
-pre, code {
-	font: 100% "Andale Mono","Courier New",monospace;
-}
-pre {
-	white-space: pre;
-	white-space: -moz-pre-wrap;
-	white-space: -hp-pre-wrap;
-	white-space: -o-pre-wrap;
-	white-space: -pre-wrap;
-	white-space: pre-wrap;
-	white-space: pre-line;
-	word-wrap: break-word;
-}
-abbr {
-	cursor: help;
-}
-
-/* LAYOUT
--------------------------------------------------------- */
-/* header */
+/* ---------------------------------------------------------------------------
+																	LAYOUTS
+---------------------------------------------------------------------------- */
 #header {
-	background: #575859;
+	background: #676e78;
 	position: relative;
 	border-bottom: 4px solid #A2CBE9;
 	width: 100%;
-}
-#prelude {
-	line-height: 1.5;
-	margin: 0;
-	padding: 0;
-	overflow: hidden;
-	position: absolute;
-	top: 3em;
-	left: 0;
-	background: #A2CBE9;
-	width: 100%;
-	}
-#prelude li {
-	list-style-type: none;
-	margin: 0;
-	background:transparent;
-	display: inline;
-}
-#prelude li a {
-	padding: 3px 16px 3px 8px; /* ie < 9 sucks */
-	padding: 3px 1.6rem 3px .8rem;
-	background: #A2CBE9;
-	color: #000;
-	border-bottom-color: #A2CBE9;
-}
-#top {
-	margin: 0;
-	padding: 0;
-	width: 14.5em;
-	float: left;
-}
-#top h1 {
-	padding: 0;
-	margin: 0;
-	height: 36px;
-	text-indent: -1000px;
-}
-#top h1 a {
-	position: absolute;
-	top: 0;
-	left: 0;
-	width: 174px; /* ie < 9 sucks */
-	width: 17.4rem;
-	height: 36px; /* ie < 9 sucks */
-	height: 3.6rem;
-	border: none;
-	color: #fff;
-}
-#top h1 a:link {
-	background: transparent url(dc_logos/b-dotclear120.png) no-repeat 0 6px;
-}
-#top h1 a:hover, #top h1 a:focus {
-	background: transparent url(dc_logos/b-dotclear120.png) no-repeat 0 -94px;
-}
-#info-boxes {
-	font-size: 12px; /* ie < 9 sucks */
-	font-size: 1.2rem;
-	line-height: 3em;
-}
-#info-box1 {
-	margin: 0;
-	padding: 0 3px 0 18px;
-	color: #fff;
-	display: inline-block;
-}
-#info-box2 {
-	margin: 0;
-	padding: 0 18px 0 0;
-	color: #fff;
-	float: right;
-	text-align: right;
-}
-#info-box1 p {
-	margin: 0;
-	display: inline;
-}
-#info-box1 select {
-	width: 145px; /* ie < 9 sucks */
-	width: 14.5em;
-}
-#info-box1 a img, #info-box2 a img {
-	vertical-align: middle;
-	padding-left: .3em;
-	}
-#info-boxes a {
-	font-weight: bold;
-	color: #fff;
-	border-bottom-color: #ccc;
-	margin-left: .3em;
-	margin-right: .3em;
-	white-space: nowrap;
-	font-weight: normal;
-}
-#info-boxes .logout {
-	margin-right: 0;
-}
-#info-box1 a {
-	margin-left: 1.33em;
-}
-#info-box2 a.active {
-	border-bottom-color: #fff;
-	margin: 0;
-	padding: 1.2em .5em;
-	background-color: #fff;
-	color: #333;
-	font-weight: bold;
-}
-#info-box2 span {
-	color: #999;
-}
-/* main blocks */
+	}
 #wrapper {
 	width: 100%;
 	padding-top: 1em;
-}
+	}
 #main {
 	width: 100%;
@@ -245,5 +34,5 @@
 	margin-top: 0;
 	background: #fff url(bg_menu.png);
-}
+	}
 #content {
 	margin: 0 0 0 14.5em;
@@ -251,80 +40,5 @@
 	padding: .9rem 1.8rem 1.8rem;
 	background: #fff;
-}
-	/* Micro clearfix thx to Nicolas Gallagher */
-	#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: 48%;
-	margin-left: 2%;
-	float: left;
-}
-.two-cols .col70{
-	width: 68%;
-	margin-left: 0;
-	float: left;
-}
-.col30 {
-	width: 28%;
-	margin-left: 2%;
-	float: left;
-}
-.two-cols .col:first-child,
-.two-cols .col30.first-col {
-	margin-left: 0;
-	margin-right: 2%;
-}
-.two-cols .col:last-child,
-.two-cols .col70.last-col {
-	margin-left: 2%;
-	margin-right: 0;
-}
-/* -------------------------------------------------------------- layout - onglets */
-.part-tabs ul {
-	padding: .5em 0 .3em 1em;
-	border-bottom: 1px solid #ddd;
-}
-.part-tabs li {
-	list-style: none;
-	margin: 0;
-	display: inline;
-}
-.part-tabs li a {
-	padding: .5em 2em;
-	margin-right: -1px;
-	border: 1px solid #aaa;
-	border-bottom: none;
-	text-decoration: none;
-	color: #333;
-	background-color:#E4E0EC;
-}
-.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;
-	font-weight: bold;
-	border-bottom-color: #fff;
-	padding-bottom: 7px; /* ie < 9 sucks */
-	padding-bottom: .7rem;
-}
-/* ------------------------------------------------------------------ main-menu */
+	}
 #main-menu {
 	width: 14.5em;
@@ -334,107 +48,5 @@
 	padding-bottom: 1em;
 	background: #f7f7f7;
-}
-#main-menu h3 {
-	margin: 0;
-	padding: 10px 0 10px 8px;
-	color: #666;
-	font-size: 14px; /* ie < 9 sucks */
-	font-size: 1.4rem;
-}
-#main-menu h3 img[alt="cacher"] {
-	vertical-align: top;
-}
-#main-menu ul {
-	margin: 0 0 1.5em 0;
-	padding: 0;
-	list-style: none;
-}
-#main-menu li {
-	display: block;
-	margin: 0.5em 0 0;
-	padding: 3px 0 0 30px;
-	background-repeat: no-repeat;
-	background-position: 8px .3em;
-}
-#main-menu ul li:first-child {
-	margin-top: 0;
-}
-#main-menu li.active {
-	background-color: #fff;
-}
-#main-menu a {
-	color: #333;
-	border-bottom-color: #ccc;
-}
-#main-menu .active a {
-	border-bottom: none;
-	color: #d30e60;
-}
-#main-menu .active {
-	font-weight: bold;
-}
-#search-menu {
-	padding: 4px 5px 0;
-	font-size: 100%
-}
-#search-menu * {
-	height: 22px; /* ie < 9 sucks */
-	height: 2.2rem;
-	display: inline-block;
-	vertical-align: top;
-	line-height: 22px;
-}
-#search-menu p {
-	border: 1px solid #999;
-	border-radius: .3em;
-	position: relative;
-	overflow: hidden;
-}
-#qx {
-	width: 124px; /* ie < 9 sucks */
-	width: 12.4rem;
-	border-bottom-left-radius: .3em;
-	border-top-left-radius: .3em;
-	background: transparent url(search.png) no-repeat 4px center;
-	text-indent: 18px;
-	padding: 0;
-	border: none;
-	height: 22px;
-	height: 2.2rem;
-}
-#qx:focus {
-	border: 2px solid #bee74b;
-}
-#search-menu input[type="submit"] {
-	padding: 0 3px;
-	padding: 0 .3rem;
-	margin-left: -4px;
-	background: #dfdfdf;
-	border-color: #999;
-	color: #444;
-	border-bottom-right-radius: .3em;
-	border-top-right-radius: .3em;
-	border-top-left-radius: 0;
-	border-bottom-left-radius: 0;
-	text-shadow: none;
-	border: none;
-	border-left: 1px solid #aaa;
-	font-size: 10px; /* ie < 9 sucks */
-	font-size: 1rem;
-}
-#search-menu input[type="submit"]:hover,
-#search-menu input[type="submit"]:focus {
-	background: #575859;
-	color: #fff;
-}
-#favorites-menu, #blog-menu, #system-menu, #plugins-menu {
-	border-bottom: 1px dashed #A2CBE9;
-}
-#favorites-menu h3 {
-	color: #000;
-	font-variant: small-caps;
-	padding-top: .2em;
-}
-/* ------------------------------------------------------------------ footer */
+	}
 #footer {
 	clear: both;
@@ -442,698 +54,74 @@
 	text-align: right;
 	border-top: 1px solid #ccc;
-}
-#footer p {
-	margin: 0;
-	padding: 0 1em;
-	font-size: 1em;
-}
-#footer p span.credit {
-	font-size: 1em;
-	font-weight: normal;
-}
-/* ---------------------------------------------------------------------------- auth.php */
-#login-screen {
-	display: block;
-	width: 20em;
-	margin: 1.5em auto 0;
-	font-size: 14px; /* ie < 9 sucks */
-	font-size: 1.4rem;
-}
-#login-screen h1 {
-	text-indent: -2000px;
-	background: transparent url(dc_logos/w-dotclear240.png) no-repeat top left;
-	height: 66px;
-	margin-bottom: .5em;
-	margin-left: 0;
-}
-#login-screen .fieldset {
-	border: 1px solid #A8DC26;
-	padding: 1em 1em 0 1em;
-	border-radius: 3px;
-	background: #fff;
-}
-#login-screen input[type=text], #login-screen input[type=password], #login-screen input[type=submit] {
+	}
+/* -------------------------------------------------------------- layout: two-cols */
+.two-cols {
+	position: static;
+	}
+	.two-cols .col {
+		width: 48%;
+		margin-left: 2%;
+		float: left;
+		}
+	.two-cols .col70 {
+		width: 68%;
+		margin-left: 0;
+		float: left;
+		}
+	.col30 {
+		width: 28%;
+		margin-left: 2%;
+		float: left;
+		}
+	.two-cols .col:first-child,
+	.two-cols .col30.first-col {
+		margin-left: 0;
+		margin-right: 2%;
+		}
+	.two-cols .col:last-child,
+	.two-cols .col70.last-col {
+		margin-left: 2%;
+		margin-right: 0;
+		}
+/* ------------------------------------------------- layout: optionnal one/two-boxes */
+.one-box {
+	text-align: center;
 	width: 100%;
-}
-#login-screen input.login {
-	padding-top: 6px;
-	padding-bottom: 6px;
-	font-size: 1em;
-}
-#login-screen #issue {
-	margin-left: 1.33em;
-	font-size: 12px; /* ie < 9 sucks */
-	font-size: 1.2rem;
-}
-#login-screen #issue strong {
-	font-weight: normal;
-}
-/* ------------------------------------------------------------------ dashboard */
-#dashboard-main {
-	padding: 1em 0;
-}
-#icons {
-	overflow: hidden;
-	padding-bottom: 1em;
-	text-align: center;
-}
-#icons p {
-	width: 210px;
-	text-align: center;
-	margin: 1em 0 2em;
-	padding: 1em 0;
-	display:inline-block;
-	vertical-align: top;
-}
-#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;
-	color: #333;
-}
-#icons a img {
-	padding: 2em;
-	-moz-box-shadow: 0px 1px 0px 0px #ffffff;
-	-webkit-box-shadow: 0px 1px 0px 0px #ffffff;
-	box-shadow: 0px 1px 0px 0px #ffffff;
-	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f9f9f9), color-stop(1, #e9e9e9) );
-	background:-moz-linear-gradient( center top, #f9f9f9 5%, #e9e9e9 100% );
-	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e9e9e9');
-	background-color:#f9f9f9;
-	-moz-border-radius:1em;
-	-webkit-border-radius:1em;
-	border-radius:1em;
-	border:1px solid #dcdcdc;
-	display:inline-block;
-}
-#icons a:focus img, #icons a:hover img {
-	background: #bee74b;
-}
-#icons a:focus span, #icons a:hover span {
-	text-decoration: underline;
-}
-#quick {
-	margin-top: 2em;
-}
-#quick h3 {
-	margin-bottom: 0.2em;
-	font-size: 1.2em;
-}
-#quick p.qinfo {
-	margin: -.7em -1em 1em;
-	background: #f3f3ff url(info.png) no-repeat .2em .2em;
-	border: 1px solid #99f;
-	padding: .2em 1em .1em 24px;
-	color: #666;
-}
-#quick #new_cat, .q-cat, .q-cat label {
+	}
+	.one-box .box {
+		display: inline-block;
+		vertical-align: top;
+		padding-right: 3%; 
+		text-align: left;
+		}
+.two-boxes {
+	width: 47%;
 	display: inline-block;
 	vertical-align: top;
-	margin-right: 1em;
-	margin-top: 0;
-}
-.q-cat label {
-	margin-right: .3em;
-}
-#quick #new_cat {
-	margin-bottom: 2em;
-}
-#dashboard-items {
-	margin: 3em auto;
-	display: table;
-	width: 100%;
-	border-collapse: collapse;
-}
-.db-item {
-	display: table-cell;
-	padding: 1em 3em;
-	vertical-align: top;
-	border: 1px solid #ddd;
-	border-collapse: collapse;
-}
-.db-item h3 {
-	font-weight: normal;
-}
-#dashboard-items img {
-	vertical-align: middle;
-}
-#dashboard-items ul {
-	display: block;
-	padding-left: 1.5em;
-	list-style: square;
-}
-#dashboard-items li {
-	margin: 0.25em 0 0 0;
-	color: #666;
-}
-#news dt {
-	font-weight: bold;
-	margin: 0 0 0.4em 0;
-}
-#news dd {
-	margin: 0 0 1em 0;
-}
-#news dd p {
-	margin: 0.2em 0 0 0;
-}
-
-#upg-notify {
-}
-#upg-notify ul {
-	padding-left: 1.5em;
-}
-#upg-notify li {
-	color: #fff;
-}
-/* ------------------------------------------------------------------ post */
-#entry-wrapper {
-	float: left;
-	width: 100%;
-	margin-right: -18em;
-}
-#entry-content {
-	margin-right: 19em;
-	margin-left: 0;
-}
-.multi-part {
-	padding-left: 1em;
-}
-#entry-content label {
-	text-transform: uppercase;
-	font-weight: bold;
-	margin-top: 2em;
-}
-#entry-sidebar {
-	width: 17em;
-	float: right;
-}
-#entry-sidebar select {
-	width: 100%;
-}
-#entry-sidebar input#post_position {
-	width: 4em;
-}
-.box {
-	border-bottom: 1px solid #ddd;
-	margin-bottom: 1em;
-}
-#comments {
-	clear: both;
-}
-#trackback-form textarea {
-	width: 98%;
-}
-/* ------------------------------------------------------------------ categories */
-#categories {
-	margin: 1em 0;
-}
-#categories ul {
-	list-style: none;
-	margin: 0;
-	padding: 0;
-}
-#categories li {
-	margin: .5em 0;
-	padding: .5em 1.2em;
-	border: 1px solid #ccc;
-	border-left: 8px solid #E5E3DA;
-	border-radius: 3px;
-}
-#categories input[type="checkbox"] {
-	margin-right: .8em;
-}
-#categories h4 {
-	margin: 0;
-}
-#categories label a {
-	font-weight: bold;
-}
-#categories h4 span {
-	font-weight: normal;
-}
-#categories li p {
-	margin: 0;
-	display: inline-block;
-}
-.cat-url {
-	padding-left: 1em;
-}
-.cat-actions {
-	line-height: 2;
-}
-select#del_cat {
-	width: 100%;
-}
-#new_cat {
-	font-weight: bold;
-	margin-top: 2em;
-}
-#categories .placeholder {
-        outline: 1px dashed #4183C4;
-        min-height: 2.5em;
-}
-#categories input.cat-rank {
-  float: right;
-  margin-left: 30px;
-}
-#save-set-order.disabled {
-        text-shadow: none;
-        color: #666;
-        background: #F5F5F5;
-        border: 1px solid #CCCCCC;
-}
-#save-set-order.disabled:hover {
-        color: #666;
-        background: #DFDFDF;
-        border: 1px solid #CCCCCC;
-}
-/* ------------------------------------------------------------------ media */
-#media-icon {
-	float: left;
-}
-#media-details {
-}
-.near-icon {
-	margin-left: 70px;
-	margin-bottom: 3em;
-}
-#media-details ul {
-	display: block;
-	margin-left: 0;
-	padding: 0;
-}
-#media-details li {
-	list-style: square inside;
-	margin: 0;
-	padding: 0;
-}
-#media-original-image {
-	overflow: auto;
-}
-#media-original-image.overheight {
-	height: 500px;
-}
-#add-file-f {
-	position: relative;
-}
-#add-file-f .more-file {
-	position:absolute;
-	right: 0.5em;
-	background: #999;
-	color: #fff;
-	border: none;
-}
-.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;
-}
-.media-item, .media-action-box {
-	position: relative;
-	border: 1px solid #ccc;
-	margin: 1em;
-	padding: 1em;
-	width: 300px;
+	}
+	.two-boxes:first-child, .two-boxes.odd, .two-boxes.odd:last-child {
+		margin-right: 3%;
+		}
+	.two-boxes.even:last-child, .two-boxes.even {
+		margin-left: 3%;
+		}
+.three-boxes {
+	width: 30%;
 	display: inline-block;
 	vertical-align: top;
-	min-height: 120px
-}
-a.media-icon {
-	display: block;
-	border-bottom: none;
-	margin: 0 auto; 
-}
-.media-icon img {
-	display: block;
-}
-.media-item ul {
-	display: block;
-	list-style: none;
-	margin: 0;
-	padding: 0;
-}
-/* ------------------------------------------------------------------ preferences */
-#my-favs {
-	border: 1px solid #A8DC26;
-	padding: 1em 2em
-}
-#my-favs ul {
-	list-style-type: none;
-	margin-left: 0;
-	padding-left: 0;
-	line-height: 1.2;
-}
-#my-favs li {
-	display: block;
-	float: left;
-	width: 164px;
-	margin-top: 1em;
-	margin-bottom: 1.5em;
-}
-#my-favs label {height: 2.5em;width:140px;margin-top:.3em;}
-#my-favs label input {display:inline;}
-#my-favs img {
-	display: block;
-}
-#my-favs input.position {
-	margin: 0 0 .4em .2em;
-}
-#available-favs input, #available-favs label, #available-favs label span {
-	white-space: normal;
-	display: inline;
-}
-#default-favs h3 {
-	margin-top: 2em;
-	margin-bottom: 1em;
-}
-.fav-list {
-	list-style-type: none;
-	margin-left: 0;
-	padding-left: 0;
-}
-.fav-list li {
-	line-height: 2;
-	margin-left: 0;
-	padding-left: 0;
-	position: relative;
-}
-.fav-list img {
-	vertical-align: middle;
-	margin-right: .2em;
-}
-#available-favs label span.zoom {
-	display: none;
-}
-#available-favs li:hover label span.zoom {
-	display: block;
-	position: absolute;
-	bottom: 0;
-	left: 10em;
-	background-color: #f5f5f5;
-	border: 1px solid #ddd;
-	padding: .2em;
-	border-radius: .5em;
-}
-#user-options label.ib {
-	display: inline-block;
-	width: 14em;
-	padding-right: 1em;
-}
-.blog-perm {
-	margin-top: 2em;
-	font-weight: bold;
-}
-.ul-perm {
-	list-style-type: square;
-	margin-left: 0;
-	padding-left: 3.5em;
-	margin-bottom: 0
-}
-.add-perm {
-	padding-top: .5em;
-	padding-left: 2.5em;
-	margin-left: 0;
-}
-/* in blog_pref */
-.user-perm {
-	margin: 2em 0px;
-	background: transparent url(user.png) no-repeat left top;
-	width: 320px;
-	display: inline-block;
-	vertical-align: top;
-}
-.user-perm h4, .user-perm h5, .user-perm p, .user-perm ul, .user-perm li {
-	margin: .5em 0 .33em;
-	padding: 0;
-}
-.user-perm h4 {
-	padding-left: 28px;
-}
-.user-perm ul {
-	list-style-type: inside;
-}
-.user-perm li {
-	margin-left: 1em;
-	padding-left: 0;
-}
-.user-perm h5 {
-	margin:	1em 0 0 0;
-}
-li.user_super, li.user_admin {
-	margin-left: 0;
-	padding-left: 1em;
-	list-style: none;
-	background: transparent url(../images/superadmin.png) no-repeat -2px 2px;
-}
-li.user_admin {
-	background-image: url(../images/admin.png);
-}
-
-/* -------------------------------------------------------------------- Themes */
-#themes {
-	margin: 0;
-	width: 100%;
-	padding: 0;
-}
-#themes h3 {
-}
-#themes div.theme-details {
-	border-top: 1px solid #ccc;
-	padding: 12px;
-	display: inline-block;
-	vertical-align: top;
-	width: 284px;
-}
-.current-theme {
-	background: #eef;
-}
-#themes div.theme-details:hover {
-	background: #f0f0f0;
-}
-#themes div.theme-details div.theme-shot {
-}
-#themes div.theme-details div.theme-shot img {
-	display: block;
-	border: 1px solid #ccc;
-	margin-bottom: 1.5em;
-}
-#themes div.theme-details div.theme-info {
-}
-#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 {
-}
-#themes-actions {
-	border-bottom: 1px solid #999;
-	margin-bottom: 3em;
-}
-.theme-css {
-	display: block;
-}
-/* Themes list, JS version */
-#themes-wrapper {
-	display: table;
-}
-#themes-wrapper #themes {
-	display: table-cell;
-	vertical-align: top;
-	padding-left: 1em;
-}
-#theme-box {
-	display: table-cell;
-	vertical-align: top;
-	padding: 0;
-	width: 312px;
-	border: 1px solid #ccc;
-	border-radius: 3px;
-}
-#theme-box .theme-shot,
-#theme-box .theme-info,
-#theme-box .theme-actions {
-	background: #eef;
-	padding: 1em 16px;
-	margin: 0;
-}
-#theme-box .theme-shot img {
-	display: block;
-	width: 280px;
-	height: 245px;
-	border: 1px solid #ccc;
-}
-#theme-box h4 {
-	color: #000;
-	background: #eef;
-}
-#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 .theme-actions {
-	border-bottom: 1px solid #ccc;
-}
-#themes .theme-details-js {
-	float: left;
-	width: 120px;
-	height: 150px;
-	margin: 0 12px 24px;
-	padding: 12px 12px 0;
-	text-align: center;
-	background: #f3f3f3;
-	border: 1px solid #ddd;
-	cursor: pointer;
-	border-radius: 4px;
-}
-#themes .theme-details-js label {
-	cursor: pointer;
-}
-#themes .theme-details-js.theme-selected {
-	background: #ddd;
-	border: 1px solid #999;
-}
-#themes .theme-details-js .theme-shot img {
-	width: 120px;
-	height: 105px;
-	border: 1px solid #fff;
-}
-#themes a:focus div, #themes a:hover div,
-#themes a:focus div.current-theme, #themes a:hover div.current-theme {
-	background: #bee74b;
-}
-/* ----------------------------------------------------------  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: 4em;
-	background: #f5f5f5;
-	z-index: 100;
-	clear: both;
-	padding: 0 1em;
-}
-#help-button {
-	background: transparent url(../images/page_help.png) no-repeat 6px center;
-	position: absolute;
-	top: 36px; /* ie < 9 sucks */
-	top: 3.6rem;
-	right: 0px;
-	padding: 0 1.5em 0 30px;
-	cursor: pointer;
-	color: #2373A8;
-	line-height: 42px; /* ie < 9 sucks */
-	line-height: 4.2rem;
-}
-#help-button span {
-	padding: .5em 0 .1em 0;
-	border-bottom: 1px solid #2373A8;
-}
-.help-box {
-	display: none;
-}
-.help-box ul {
-	padding-left: 20px;
-	margin-left: 0;
-}
-#content.with-help #help-button {
-	right: 282px; /* ie < 9 sucks */
-	right: 28.2rem;
-	background-color: #f5f5f5;
-	position: fixed;
-	border-top: 2px solid #FFD478;
-	border-left: 2px solid #FFD478;
-	border-bottom: 2px solid #FFD478;
-	border-bottom-left-radius: 1em;
-	border-top-left-radius: 1em;
-}
-#content.with-help #help {
-	display: block;
-	position: absolute;
-	top: 36px; /* ie < 9 sucks */
-	top: 3.6rem;
-	right: 0;
-	width: 280px; /* ie < 9 sucks */
-	width: 28rem;
-	border-left: 2px solid #FFD478;
-	border-top: 2px solid #FFD478;
-	margin-top: 0;
-	padding: .5em 0 0 0;
-	overflow: auto;
-}
-#content.with-help .help-content {
-	padding: 0 .5em 1em;
-}
-.help-content dt {
-	font-weight: bold;
-	color: #626262;
-	margin: 0;
-}
-.help-content dd {
-	margin: 0.3em 0 1.5em 0;
-}
-/* ------------------------------------------------------------------ popups */
+	margin-left: 2.5%;
+	margin-right: 2.5%; 
+	}
+	.three-boxes:first-child {
+		margin-left: 0;
+		}
+	.three-boxes:last-child {
+		margin-right: 0;
+		}
+/* boîtes intérieures */
+.box {
+	margin-bottom: 2em;
+	}
+/* ---------------------------------------------------------------- layout: popups */
 body.popup #wrapper, body.popup #top {
 	width: 100%;
@@ -1150,5 +138,5 @@
 	font-weight: normal;
 	color: #fff;
-	background: #575859;
+	background: #676e78;
 	font-size: 1.5em;
 	text-indent: .5em;
@@ -1168,157 +156,36 @@
 	border: none;
 }
-/* ------------------------------------------------------------------ messages */
-.error, .message, .static-msg, .static-msg, .success {
-	padding: 1em 0.5em 0.5em 48px;
-	margin-bottom: 1em;
-	border-radius: 8px;
-}
-p.error, p.message, p.static-msg, p.success {
-	padding-top: 1em;
-	padding-bottom: 1em;
-}
-.error {
-	background: #FFBABA url(msg-error.png) no-repeat .7em .7em;
-	color: #000;
-}
-.message, .static-msg {
-	background: #666 url(msg-std.png) no-repeat .7em .7em;
-	color: #fff;
-}
-.success {
-	background: #bee74b url(msg-success.png) no-repeat .7em .7em;
-	color: #000;
-}
-.message a, .static-msg a {
-	color: #fff;
-}
-.success a {
-	color: #666;
-}
-.dc-update {
-	padding: 1em 48px 0.5em 48px;
-	margin-bottom: 1em;
-	border-radius: 8px;
-	background: #A2CBE9 url(msg-success.png) no-repeat .7em .7em;
-}
-.dc-update a {
-	color: #000;
-	border-color: #000;
-	margin-right: 1em;
-}
-a.info {
-	margin-left: 2em;
-	font-weight: bold;
-}
-/* ------------------------------------------------------------------ navigation */
-.anchor-nav {
-	background: #575859;
-	color: #fff;
-	padding: 4px 1em;
-	float: right;
-}
-.nav_prevnext {
-	margin-bottom: 2em;
-	color: #fff;
-}
-.nav_prevnext a, a.back {
-	border: 1px solid #ddd;
-	padding: 2px 1.5em;
-	border-radius: .75em;
-	background-color: #f0f0f0;
-}
-a.back:before {
-	content: "\ab\a0";
-}
-a.onblog_link {
-	color: #333;
-	float: right;
-	border: 1px solid #eee;
-	padding: 2px 1.5em;
-	border-radius: .75em;
-	background-color: #ffe;
-}
-/* ------------------------------------------------------------------ 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, #entry-content label.no-margin {
+/* ------------------------------------------------------------- layout: compléments */
+.constrained {
 	margin: 0;
-}
-.vertical-separator {
-	margin-top: 2em;
-}
-p.clear.vertical-separator {
-	padding-top: 2em;
-}
-.border-top {
-	border-top: 1px solid #999;
-	padding-top: 1em;
-	margin-top:	1em;
-}
-.fieldset {
-	background: #fff;
-	border: 1px solid #aaa;
-	border-radius: 6px;
-	padding: 1em .7em .5em;
-	margin-bottom: 1em;
-}
-.fieldset h3 {
-	color: #333;
-}
+	padding: 0;
+	border: none;
+	background: transparent;
+	}
 .table {
 	display: table;
-}
+	}
 .cell {
 	display: table-cell;
-}
-/* paragraphe pour bouton Nouveau bidule */
-p.top-add {
-	text-align: right;
-	margin: 0;
-	}
-p.top-add a {
-	padding: .3em 1em .3em .5em;
-	font-weight: bold;
-}
-p.top-add a img {
-	padding-right: .3em;
-	vertical-align: middle;
-}
-
+	vertical-align: top;
+	}
 .clear {
 	clear: both;
-}
+	}
 .lclear {
 	clear: left;
-}
-div.clearer {
+	}
+.clearer {
 	height: 1px;
 	font-size: 1px;
-}
-.right {
-	text-align: right;
-}
-.txt-center {
-	text-align: center;
-}
+	}
+/* Micro clearfix thx to Nicolas Gallagher */
+.clearfix:before, .clearfix:after {
+	content: " "; 
+	display: table;
+	}
+.clearfix:after {
+	clear: both;
+	}
 .frame-shrink {
 	border: 1px solid #666;
@@ -1327,35 +194,84 @@
 	height: 120px;
 	overflow: auto;
-}
-.grid {
-	background: transparent repeat url('grid.png') 0 0;
-}
-.line p {
+	}
+/* ---------------------------------------------------------------------------
+																	HTML TAGS
+---------------------------------------------------------------------------- */
+html {
+	font-size: 62.5%;
+	}
+body {
+	font-size: 12px; /* ie < 9 sucks */
+	font-size: 1.2rem;
+	line-height: 1.5;
+	font-family: Arial,Helvetica,sans-serif;
+	color: #333;
+	background: #fff;
 	margin: 0;
-}
-.offline {
+	padding: 0;
+	}
+/* ------------------------------------------------------------------ titres */
+h1, h2, h3, .as_h3, h4, .as_h4, h5, h6 {
+	margin-top: 0;
+	margin-bottom: 1em;
+	}
+h2 {
 	color: #666;
-}
-ul.nice {
-	margin: 1em 0;
-	padding: 0 0 0 2em;
-	list-style: square;
-}
-ul.nice li {
-	margin:0;
-	padding: 0;
-}
-.zip-dl {
-	background: transparent url(package.png) no-repeat 0 50%;
-	padding: 5px 0 5px 20px;
-}
-.distrib img {
-	display: block;
-	float: right;
-	margin-top: -1em;
-}
-
-/* TABLES
--------------------------------------------------------- */
+	font-size: 18px; /* ie < 9 sucks */
+	font-size: 1.8rem;
+	padding: 0 0 1.5em;
+	font-weight: normal;
+	}
+	/* titre de page */
+	#content > h2 {
+		padding: 0 18px 6px; /* ie < 9 sucks */
+		padding: 0 1.8rem .6rem;
+		margin: 0 -18px .5em; /* ie < 9 sucks */
+		margin: 0 -1.8rem 1rem;
+		background: #fff url(bg_h2.png) repeat-x center bottom;
+		}
+	h2 a:link, h2 a:visited {
+		color: #676e78;
+		border-color: #000;
+		}
+	.page-title {
+		color: #d30e60;
+		}
+	.page-title img {
+		padding-left: .5em;
+		vertical-align: middle;
+		}
+h3, .as_h3 {
+	margin-top: 1em;
+	color: #676e78;
+	font-size: 16px; /* ie < 9 sucks */
+	font-size: 1.6rem;
+	}
+h4, as_h4 {
+	font-size: 14px; /* ie < 9 sucks */
+	font-size: 1.4rem;
+	color: #676e78;
+	}
+	.smart-title, .box h3, .media-action-box h4 { /* pour les h3 ou les h4 titres de boîtes */
+		font-size: 1em;
+		text-transform: uppercase;
+		font-weight: bold;
+		color: #333;
+		text-shadow: 0 1px 0 rgba(200, 200, 200, 0.6)
+		}
+h5 {
+	font-size: 12px; /* ie < 9 sucks */
+	font-size: 1.2rem;
+	color: #676e78;
+	}
+	#entry-sidebar h5 {
+		font-weight: normal;
+		color: #333;
+		}
+	.entry-status img.img_select_option {
+		padding-left: 4px;
+		vertical-align: text-top;
+		}
+/* ---------------------------------------------------------------- tableaux */
 table {
 	font-size: 12px; /* ie < 9 sucks */
@@ -1363,11 +279,5 @@
 	border-collapse: collapse;
 	margin: 0 0 1em 0;
-}
-table.posts-list {
-	min-width: 50%;
-}
-tr.line:hover {
-	background: #f3f3f3;
-}
+	}
 caption {
 	color: #333;
@@ -1375,111 +285,75 @@
 	text-align: left;
 	margin-bottom: .5em;
-}
-
+	}
+th {
+	border-width: 1px 0 1px 0;
+	border-style: solid;
+	border-color: #ddd;
+	background: #f3f3ff;
+	padding: .4em 1em .4em .5em;
+	vertical-align: top;
+	text-align: left;
+	text-transform: uppercase;
+	font-size: 10px;
+	font-size: 1rem;
+	}
 td {
 	border-width: 0 0 1px 0;
 	border-style: solid;
 	border-color: #e3e3e3;
-	padding: .3em 1em .3em .5em;
+	padding: .4em 1em .4em .5em;
 	vertical-align: top;
-}
-th {
-	border-width: 1px 0 1px 0;
+	}
+
+/* ---------------------------------------------------------- autres balises */
+p {
+	margin: 0 0 1em 0;
+	}
+hr {
+	height: 1px;
+	border-width: 1px 0 0;
+	border-color: #ddd;
+	background: #ddd;
 	border-style: solid;
-	border-color: #ccc;
-	background: #f3f3ff;
-	padding: .3em 1em .3em .5em;
-	vertical-align: top;
-	text-align: left;
-}
-th.first img {
-	padding-right: 24px;
-}
-.noborder td, td.noborder, .noborder th, th.noborder {
-	border-width: 0 0 1px 0;
-	border-color: #ddd;
-	line-height: 2em;
-	padding-bottom: 0;
-}
-.noborder p {
-	margin-bottom: 0;
-}
-table .maximal, table.maximal {
-	width: 100%;
-}
-table .minimal {
-	width: 1px;
-}
-table .nowrap {
-	white-space: nowrap;
-	vertical-align: top;
-}
-table .count {
-	text-align: right;
-	padding-right: 1.5em;
-}
-table.settings, table.prefs {
-	width: 80%;
-	border: 1px solid #999;
-	margin-bottom: 3em;
-}
-table.settings th, table.prefs th {
-	background: #f3f3ff;
-}
-table.settings th:first-child, table.prefs th:first-child {
-	width: 20%;
-}
-table.settings th + th, table.prefs th + th {
-	width: 30%;
-}
-table.settings th + th + th, table.prefs th + th + th {
-	width: 10%;
-}
-table.settings th:last-child, table.prefs th:last-child {
-	width: 40%;
-}
-td.status {
-	vertical-align: middle;
-}
-td.status img {
-	margin-bottom: -2px;
-}
-td.status a {
-	border: none;
-}
-tr.line img.expand, th img.expand {
-	margin-right: 6px;
-	margin-bottom: -2px;
-}
-tr.line input {
-	vertical-align: middle;
-}
-tr.expand td {
-	border-bottom: none;
-}
-td.expand {
-	padding: 1em;
-}
-
-.dragable {
-	border-collapse: separate;
-}
-.dragable tbody td {
-
-}
-.handle {
-	padding: 0;
-}
-.handler {
-	cursor: move;
-	background: transparent url(drag.png) no-repeat 0 50%;
-	padding-left: 15px;
-}
-/* ----------------------------------------------------------------- FORMS */
+	}
+hr.clearer {
+	clear: both;
+	}
+pre, code {
+	font: 100% "Andale Mono","Courier New",monospace;
+	}
+pre {
+	white-space: pre;
+	white-space: -moz-pre-wrap;
+	white-space: -hp-pre-wrap;
+	white-space: -o-pre-wrap;
+	white-space: -pre-wrap;
+	white-space: pre-wrap;
+	white-space: pre-line;
+	word-wrap: break-word;
+	}
+abbr {
+	cursor: help;
+	}
+/* ------------------------------------------------------------------ liens */
+a, a:link, a:visited {
+	color: #2373A8;
+	text-decoration: none;
+	border-bottom: 1px dotted #999;
+	}
+a:hover, a:active, a:focus {
+	text-decoration: underline;
+	}
+a img, a:link img, a:visited img {
+	border:none;
+	}
+/* ----------------------------------------------------------------------------
+																	FORMULAIRES
+---------------------------------------------------------------------------- */
 form {
 	display: block;
 	margin: 0;
 	padding: 0;
-}
+	}
 fieldset {
 	display: block;
@@ -1489,6 +363,9 @@
 	border-style: solid;
 	border-color: #ccc;
-	background: #f5f5f5;
-}
+	background: #f7f7f7;
+	}
+input, textarea, select, option, optgroup, legend {
+	font: 100% "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;
+	}
 legend {
 	font-weight: bold;
@@ -1500,66 +377,242 @@
 	margin-bottom: 0.5em;
 	border-radius: 3px;
-}
+	}
+label .maximal, textarea.maximal, input.maximal {
+	width: 99%;
+	}
+input[type=text], input[type=password], textarea, select {
+	background: #fbfbfb;
+	color: #000;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #ddd;
+	border-radius: 3px;
+	box-shadow: 1px 1px 2px #F1F1F1 inset;
+	padding: 3px; 
+	}
+	input:focus, textarea:focus, select:focus {
+		-webkit-box-sizing: border-box;
+		-moz-box-sizing: border-box;
+		box-sizing: border-box;
+		border-color: #bee74b;
+		}
+	textarea {
+		padding: 2px 0;
+		}
+		textarea.maximal {
+			resize: vertical;
+			}
+		.area textarea {
+			display: block;
+			width: 100%;
+			resize: vertical;
+			}
+	select {
+		padding: 2px 0;
+		}
+		select.l10n option {
+			padding-left: 16px;
+			}
+		option.avail10n {
+			background: transparent url(../images/check-on.png) no-repeat 0 50%;
+			}
+	input.invalid, textarea.invalid, select.invalid {
+		border: 1px solid red;
+		background: #FFBABA;
+		color: red;
+		box-shadow: 0 0 0 3px rgba(218, 62, 90, 0.3);
+		}
+	input[type=text], input[type=password], textarea {
+		margin-right: .3em;
+		}
+	input[type=checkbox], input[type=radio], input[type=file] {
+		border: none;
+		margin: 0;
+		padding: 0;
+		background: transparent;
+		}
+	input[type=file] {
+		margin-top: .3em;
+		margin-bottom: .3em;
+		}
 optgroup {
 	font-weight: bold;
 	font-style: normal;
-}
+	}
 option {
 	font-weight: normal;
-}
-input, textarea, select {
-	background: #f9f9f9;
+	}
+label, label span {
+	display: block;
+	}
+	label.ib, input.ib {
+		display: inline-block;
+		}
+	label.classic {
+		display: inline;
+		}
+	label.classic input, label span input, label.classic select, label span select {
+		display: inline;
+		}
+	label.required {
+		font-weight: bold;
+		}
+		label.required abbr {
+			color: #dd0000;
+			font-size: 1.3em;
+			}
+	label.area, p.area {
+		width: inherit !important;
+		}
+p.field {
+	position: relative;
+	}
+	p.field label {
+		display: block;
+		width: 14em;
+		}
+	p.field input, p.field select {
+		display: inline;
+		position: absolute;
+		left: 14.5em;
+		top: 0;
+		}
+a.form-control {
+	display: none;
+	background: url(../images/expand.png) no-repeat 4px center;
+	padding-left: 20px;
 	color: #000;
-	border-width: 2px;
-	border-style: solid;
-	border-color: #ccc #ddd #ddd #ccc; 
-}
-select {
-	border-right: 2px solid #fff;
-}
-input.invalid, textarea.invalid, select.invalid {
-	border: 1px solid red;
-	background: #fff;
-	color: red;
-	box-shadow: 0 0 0 1px rgba(218, 62, 90, 0.3)
-}
-input, textarea, select, option {
-	font: 100% "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;
-}
-input[type=text], input[type=password], textarea {
-	padding: 2px 0;
-	margin-right: .3em;
-}
-textarea {
-	padding: 2px 0;
-}
-input[type=checkbox], input[type=radio], input[type=file] {
-	border: none;
-	margin: 0;
-	padding: 0;
-	background: transparent;
-}
-input[type=file] {
-	margin-top: .3em;
-	margin-bottom: .3em;
-}
-label {
-	display: block;
-}
-label input, label select, label span {
-	display: block;
-}
-p.form-note {
-	font-style:italic;
-	margin-top: -.7em;
+	}
+.form-note {
+	font-style: italic;
+	font-weight: normal;
 	color: #666;
-}
-span.form-note {
-	font-style:italic;
+	}
+	p.form-note {
+		margin-top: -.7em;
+		}
+	span.form-note {
+		text-transform: none;
+		}
+/* ----------------------------------------------------------------------------
+																		BOUTONS
+---------------------------------------------------------------------------- */
+/* commun */
+input[type=submit], input[type=reset], input[type=button], input[type=delete],
+input.submit, input.reset, input.button, input.delete,
+a.button, a.submit, a.delete, a.reset {
+	display: inline-block;
+	cursor: pointer;
+	text-align: center;
+	text-decoration: none;
+	padding: 2px 6px 2px;
+	border-radius: 3px;
+	font-size: 12px; /* ie < 9 sucks */
+	font-size: 1.2rem;
+	line-height: 1.5em;
+ 	}
+	a.button, a.submit, a.reset {
+	 	padding-bottom: 1px;
+	 	}
+ /* validation */
+input[type=submit], a.submit {
+	color: #fff;
+	text-shadow: 0 -1px 0 rgba(100, 100, 100, 0.6);
+	background:#25A6E1;
+	background:-moz-linear-gradient(top,#25A6E1 0%,#188BC0 100%);
+	background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#25A6E1),color-stop(100%,#188BC0));
+	background:linear-gradient(top,#25A6E1 0%,#188BC0 100%);
+	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#25A6E1',endColorstr='#188BC0',GradientType=0);
+	border: 1px solid #2C8FD1;
+ 	padding-bottom: 1px;
+	}
+	input[type=submit]:hover, input[type=submit]:focus,
+	a.submit:hover, a.submit:focus {
+		background:#188BC0;
+		background:-moz-linear-gradient(top,#188BC0 0%,#25A6E1 100%);
+		background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#188BC0),color-stop(100%,#25A6E1));
+		background:linear-gradient(top,#188BC0 0%,#25A6E1 100%);
+		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#25A6E1',endColorstr='#25A6E1',GradientType=0);
+		}
+/* suppression, reset, "neutres" */
+input[type=reset], input[type=delete], input[type=button],
+input.delete, input.reset, input.button,
+a.delete, a.reset, a.button {
+	border: 1px solid #ccc;
+	background: #f5f5f5;
+	color: #000;
+	background: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#dfdfdf));
+	background: -moz-linear-gradient(top,  #f5f5f5,  #dfdfdf);
+	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.8);
+	}
+	input[type=reset]:hover, input[type=delete]:hover, input[type=button]:hover,
+	input.delete:hover, input.reset:hover, input.button:hover,
+	a.delete:hover, a.reset:hover, a.button:hover,
+	input[type=reset]:focus, input[type=delete]:focus, input[type=button]:focus,
+	input.delete:focus, input.reset:focus, input.button:focus,
+	a.delete:focus, a.reset:focus, a.button:focus {
+		background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #e9e9e9), color-stop(1, #f9f9f9) );
+		background:-moz-linear-gradient( center top, #e9e9e9 5%, #f9f9f9 100% );
+		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e9e9e9', endColorstr='#f9f9f9');
+		background-color:#e9e9e9;
+		}
+	a.delete, input[type=delete], input.delete {
+		color: #c00;
+		margin-left: 1em;
+		padding-bottom: 2px;
+		}
+		a.delete:hover, input[type=delete]:hover, input.delete:hover,
+		a.delete:focus, input[type=delete]:focus, input.delete:focus {		
+			border-color: #c00;
+			}
+		a.button {padding-bottom: 1px}
+	#info-box a.button {
+		padding: 0 .5em;
+		margin-left: 2em;
+		}
+.button.add {
+	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bee74b), color-stop(1, #9BCA1C) );
+	background:-moz-linear-gradient( center top, #bee74b 5%, #9BCA1C 100% );
+	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bee74b', endColorstr='#9BCA1C');
+	background-color:#bee74b;
+	border:1px solid #B2D742;
+	padding:.33em 1.33em;
+	color: #000;
+	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
 	font-weight: normal;
-	text-transform: none;
-	color: #666;
-}
-p.form-note.warn, p.form-note.info, p.warning {
+	font-size: 14px; /* ie < 9 sucks */
+	font-size: 1.4rem;
+	}
+	.button.add:hover, .button.add:active, .button.add:focus {
+		background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #9BCA1C), color-stop(1, #bee74b) );
+		background:-moz-linear-gradient( center top, #9BCA1C 5%, #bee74b 100% );
+		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9BCA1C', endColorstr='#bee74b');
+		background-color:#9BCA1C;
+		}
+	.button-add:focus {
+		outline: dotted 1px;
+		}
+	/* paragraphe pour bouton Nouveau bidule */
+	p.top-add {
+		text-align: right;
+		margin: 0;
+		}
+
+/* disabled */
+input.disabled {
+ 	text-shadow: none;
+ 	color: #666;
+ 	background: #F5F5F5;
+	border: 1px solid #CCC;
+	}
+	input.disabled:hover {
+		color: #666;
+		background: #DFDFDF;
+		border: 1px solid #CCC;
+		}
+/* ----------------------------------------------------------------------------
+																	MESSAGES
+---------------------------------------------------------------------------- */
+.warn, .warning, .info {
 	font-style: normal;
 	padding: .2em .66em .2em;
@@ -1568,199 +621,1092 @@
 	display: inline-block;
 	line-height: 1.5em;
-}
-p.form-note.warn, p.warning {
-	background: #ffd url(msg-warning.png) no-repeat .3em .3em;
-	border: 1px solid #f0c020;
-}
-p.form-note.info {
-	background: #f5eaff url(msg-info.png) no-repeat .3em .3em;
-	border: 1px solid #c484ff;
-}
-.form-note a {border-bottom: 1px solid #ddbaff;}
-
-label.ib {
-	display: inline-block;
-}
-label.classic {
-	display: inline;
-}
-label.classic input, label span input, label.classic select, label span select {
-	display: inline;
-}
-
-label.area, p.area {
-	width: inherit !important;
-}
-.area textarea {
-	display: block;
-	width: 100%;
-	resize: vertical;
-}
-label.required {
-	font-weight: bold;
-}
-label.required abbr {
-	color: #dd0000;
-	font-size: 1.3em;
-}
-label.inline {
-	display: inline;
-}
-p.field {
-	position: relative;
-
-}
-p.field label {
-	display: block;
-	width: 14em;
-}
-p.field input, p.field select {
-	display: inline;
-	position: absolute;
-	left: 14.5em;
-	top: 0;
-}
-label .maximal, textarea.maximal, input.maximal {
-	width: 100%;
-}
-textarea.maximal {
-	resize: vertical;
-}
-
-a.form-control {
-	display: none;
-	background: url(../images/expand.png) no-repeat 4px center;
-	padding-left: 20px;
-	color: #000;
-}
-.constrained {
+	border-radius: 3px;
+	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6)
+	}
+	.warn, .warning {
+		background: #FEFACD url(msg-warning.png) no-repeat .3em .3em;
+		border: 1px solid #F7E07E;
+		}
+	.info {
+		background: #D9EDF7 url(msg-info.png) no-repeat .3em .3em;
+		border: 1px solid #BCE8F1;
+		}
+.error, .message, .static-msg, .success, .warning-msg {
+	padding: 1em 0.5em 0.5em 48px;
+	margin-bottom: 1em;
+	border-radius: 8px;
+	}
+	p.error, p.message, p.static-msg, p.success, p.warning-msg {
+		padding-top: 1em;
+		padding-bottom: 1em;
+		}
+	.error {
+		background: #FFBABA url(msg-error.png) no-repeat .7em .7em;
+		color: #000;
+		text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
+		}
+	.message, .static-msg {
+		background: #676e78 url(msg-std.png) no-repeat .7em .7em;
+		color: #fff;
+		}
+		.message a, .static-msg a {
+			color: #fff;
+		}
+	.success, .warning-msg {
+		color: #000;
+		text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6)
+		}
+		.success {
+			background: #bee74b url(msg-success.png) no-repeat .7em .7em;
+			}
+		.warning-msg {
+			background: #F7E07E url(msg-warning.png) no-repeat .7em .7em;
+			border: 1px solid #F7E07E;
+			}
+		.success a, .warning-msg a {
+			color: #333;
+			}
+.dc-update {
+	padding: 1em 48px 0.5em 48px;
+	margin-bottom: 1em;
+	border-radius: 8px;
+	background: #A2CBE9 url(msg-success.png) no-repeat .7em .7em;
+	text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
+	color: #34495e;
+	}
+	.dc-update h3 {
+		margin-top: 0;
+		color: #34495e;
+		}
+	.dc-update a {
+		color: #34495e;
+		border-color: #000;
+		margin-right: 1em;
+		}
+		a.updt-info {
+			margin-left: 2em;
+			font-weight: bold;
+			}
+		.dc-update a.button {
+			border-color: #ccc;
+			font-weight: bold;
+			padding: .5em 1em; 
+			}
+/* ---------------------------------------------------------------------------------
+ 																ELEMENTS PRINCIPAUX
+--------------------------------------------------------------------------------- */
+/* -------------------------------------------------------------- HEADER ELEMENTS */
+/* prelude */
+#prelude {
+	line-height: 1.5;
 	margin: 0;
 	padding: 0;
-	border: none;
-	background: transparent;
-}
-input:focus, textarea:focus, select:focus {
-	-webkit-box-sizing: border-box;
-	-moz-box-sizing: border-box;
-	box-sizing: border-box;
-	border: 2px solid #bee74b;
-}
-/* --------------------------------------------------------------- buttons */
-/* commun */
-input[type=submit],
-input[type=reset],
-input[type=button],
-a.button,
-a.submit {
-	display: inline-block;
-	cursor: pointer;
-	text-align: center;
-	text-decoration: none;
-	padding: .1em .5em;
-	border-radius: .2em;
-	margin-bottom: .1em;
+	overflow: hidden;
+	position: absolute;
+	top: 3em;
+	left: 0;
+	background: #A2CBE9;
+	width: 100%;
+	}
+	#prelude li {
+		list-style-type: none;
+		margin: 0;
+		background:transparent;
+		display: inline;
+		}
+	#prelude li a {
+		padding: 3px 16px 3px 8px; /* ie < 9 sucks */
+		padding: 3px 1.6rem 3px .8rem;
+		background: #A2CBE9;
+		color: #000;
+		border-bottom-color: #A2CBE9;
+		}
+/* top (h1) */
+#top {
+	margin: 0;
+	padding: 0;
+	width: 14.5em;
+	float: left;
+	}
+	h1 {
+		padding: 0;
+		margin: 0;
+		height: 36px;
+		text-indent: -1000px;
+		}
+		h1 a {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 174px; /* ie < 9 sucks */
+			width: 17.4rem;
+			height: 36px; /* ie < 9 sucks */
+			height: 3.6rem;
+			border: none;
+			color: #fff;
+			background: transparent url(dc_logos/b-dotclear120.png) no-repeat 0 6px;
+			}
+		h1 a:hover, h1 a:focus {
+			background-position: 0 -94px;
+			}
+/* info-boxes */
+#info-boxes {
 	font-size: 12px; /* ie < 9 sucks */
 	font-size: 1.2rem;
- }
-h4 a.button {font-weight: normal;}
-
-/* validation */
-input[type=submit],
-input[type=button],
-a.submit {
-	color: #fff;
-	text-shadow: 0 -1px 1px #1A87B9;
-	background:#25A6E1;
-	background:-moz-linear-gradient(top,#25A6E1 0%,#188BC0 100%);
-	background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#25A6E1),color-stop(100%,#188BC0));
-	background:linear-gradient(top,#25A6E1 0%,#188BC0 100%);
-	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#25A6E1',endColorstr='#188BC0',GradientType=0);
-	border:1px solid #2C8FD1;
-
-}
-input[type=submit]:hover,
-input[type=button]:hover,
-a.submit:hover,
-input[type=submit]:focus,
-input[type=button]:focus,
-a.submit:focus {
-	background:#188BC0;
-	background:-moz-linear-gradient(top,#188BC0 0%,#25A6E1 100%);
-	background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#188BC0),color-stop(100%,#25A6E1));
-	background:linear-gradient(top,#188BC0 0%,#25A6E1 100%);
-	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#25A6E1',endColorstr='#25A6E1',GradientType=0);
-}
-/* suppression et reset */
-a.button,
-input[type=submit].reset,
-input[type=submit].delete {
-	border: 1px solid #ccc;
-	background: #f5f5f5;
-	color: #000;
-	background: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#dfdfdf));
-	background: -moz-linear-gradient(top,  #f5f5f5,  #dfdfdf);
-	text-shadow:1px 1px 0px #fff;
-	}
-a.button:hover,
-input[type=reset]:hover,
-input[type=submit].reset:hover,
-input[type=submit].delete:hover,
-a.button:focus,
-input[type=reset]:focus,
-input[type=submit].reset:focus,
-input[type=submit].delete:focus {
-	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #e9e9e9), color-stop(1, #f9f9f9) );
-	background:-moz-linear-gradient( center top, #e9e9e9 5%, #f9f9f9 100% );
-	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e9e9e9', endColorstr='#f9f9f9');
-	background-color:#e9e9e9;
-	}
-a.delete,
-input.delete,
-input[type=submit].delete {
-	color: #c00;
-	padding-bottom: 2px;
-}
-#entry-content .delete {
-	margin-left: 1em;
-}
-a.delete:hover,
-input.delete:hover,
-input[type=submit].delete:hover,
-a.delete:focus,
-input.delete:focus,
-input[type=submit].delete:focus {
-	border-color: #c00;
-}
-/* finasseries */
-input[type=button] {
-	padding: .1em;
-}
-#info-box a.button {
-	padding: 0 .5em;
-	margin-left: 2em;
-}
-.button.add {
-	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #bee74b), color-stop(1, #9BCA1C) );
-	background:-moz-linear-gradient( center top, #bee74b 5%, #9BCA1C 100% );
-	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#bee74b', endColorstr='#9BCA1C');
-	background-color:#bee74b;
-	border:1px solid #B2D742;
-	padding:.5em 1.5em;
-	color: #000;
-	text-shadow:1px 1px 0px #98cf40;
-	font-weight: normal;
+	line-height: 3em;
+	}
+	#info-boxes a {
+		font-weight: bold;
+		color: #fff;
+		border-bottom-color: #ccc;
+		margin-left: .3em;
+		margin-right: .3em;
+		white-space: nowrap;
+		font-weight: normal;
+		}
+	#info-boxes a img {
+		vertical-align: middle;
+		padding-left: .3em;
+		}
+	#info-box1 {
+		margin: 0;
+		padding: 0 3px 0 18px;
+		color: #fff;
+		display: inline-block;
+		}
+		#info-box1 p {
+			margin: 0;
+			display: inline;
+			}
+		#info-box1 select {
+			width: 145px; /* ie < 9 sucks */
+			width: 14.5em;
+			}
+		#info-box1 a {
+			margin-left: 1.33em;
+			}
+	#info-box2 {
+		margin: 0;
+		padding: 0 18px 0 0;
+		color: #fff;
+		float: right;
+		text-align: right;
+		}
+		#info-box2 span {
+			color: #999;
+			}
+		#info-box2 .logout {
+			margin-right: 0;
+			}
+		#info-box2 a.active {
+			border-bottom-color: #fff;
+			margin: 0;
+			padding: 1.2em .5em;
+			background-color: #fff;
+			color: #333;
+			font-weight: bold;
+			}
+/* ---------------------------------------------------------- MAIN-MENU ELEMENTS */
+#favorites-menu, #blog-menu, #system-menu, #plugins-menu {
+	border-bottom: 1px dashed #A2CBE9;
+	}
+#main-menu h3 {
+	margin: 0;
+	padding: 10px 0 10px 8px;
+	color: #666;
 	font-size: 14px; /* ie < 9 sucks */
 	font-size: 1.4rem;
-}
-.button.add:hover, .button.add:active, .button.add:focus {
-	background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #9BCA1C), color-stop(1, #bee74b) );
-	background:-moz-linear-gradient( center top, #9BCA1C 5%, #bee74b 100% );
-	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9BCA1C', endColorstr='#bee74b');
-	background-color:#9BCA1C;
-}
-.button-add:focus {
-	outline: dotted 1px;
-}
+	}
+	#favorites-menu h3 {
+		color: #000;
+		font-variant: small-caps;
+		padding-top: .2em;
+		}
+#main-menu a {
+	color: #333;
+	border-bottom-color: #ccc;
+	}
+#main-menu ul {
+	margin: 0 0 1.5em 0;
+	padding: 0;
+	list-style: none;
+	}
+	#main-menu li {
+		display: block;
+		margin: 0.5em 0 0;
+		padding: 4px 0 1px 32px;
+		background-repeat: no-repeat;
+		background-position: 8px .3em;
+		}
+		#main-menu ul li:first-child {
+			margin-top: 0;
+			}
+		#main-menu li.active {
+			background-color: #fff;
+			font-weight: bold;
+			}
+			#favorites-menu li.active {
+				background-color: transparent;
+				}
+		#main-menu .active a {
+			border-bottom: none;
+			color: #d30e60;
+			}
+			#favorites-menu .active a {
+				color: #000;
+				}
+#search-menu {
+	padding: 4px 5px 0;
+	font-size: 100%
+	}
+	#search-menu * {
+		height: 22px; /* ie < 9 sucks */
+		height: 2.2rem;
+		display: inline-block;
+		vertical-align: top;
+		line-height: 22px;
+		}
+	#search-menu p {
+		border: 1px solid #999;
+		border-radius: .3em;
+		position: relative;
+		overflow: hidden;
+		}
+	#qx {
+		width: 124px; /* ie < 9 sucks */
+		width: 12.4rem;
+		border-bottom-left-radius: .3em;
+		border-top-left-radius: .3em;
+		background: transparent url(search.png) no-repeat 4px center;
+		text-indent: 18px;
+		padding: 0;
+		border: none;
+		height: 22px;
+		height: 2.2rem;
+		}
+		#qx:focus {
+			border-color: #bee74b;
+			}
+	#search-menu input[type="submit"] {
+		padding: 0 3px;
+		padding: 0 .3rem;
+		margin-left: -4px;
+		background: #dfdfdf;
+		border-color: #999;
+		color: #444;
+		border-bottom-right-radius: .3em;
+		border-top-right-radius: .3em;
+		border-top-left-radius: 0;
+		border-bottom-left-radius: 0;
+		text-shadow: none;
+		border: none;
+		border-left: 1px solid #aaa;
+		font-size: 10px; /* ie < 9 sucks */
+		font-size: 1rem;
+		}
+		#search-menu input[type="submit"]:hover,
+		#search-menu input[type="submit"]:focus {
+			background: #676e78;
+			color: #fff;
+			}
+/* ----------------------------------------------------------------- CONTENT ELEMENTS */
+.part-tabs ul {
+	padding: .5em 0 .3em 1em;
+	border-bottom: 1px solid #ddd;
+	}
+	.part-tabs li {
+		list-style: none;
+		margin: 0;
+		display: inline;
+		}
+		.part-tabs li a {
+			padding: .5em 2em;
+			margin-right: -1px;
+			border: 1px solid #ccc;
+			border-bottom: none;
+			text-decoration: none;
+			color: #333;
+			background-color: #ecf0f1;
+			}
+		.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;
+			font-weight: bold;
+			border-bottom-color: #fff;
+			padding-bottom: 7px; /* ie < 9 sucks */
+			padding-bottom: .7rem;
+		}
+	.multi-part {
+		padding-left: 1em;
+		}
+/* contextual help */
+#help {
+	margin-top: 4em;
+	background: #f5f5f5;
+	z-index: 100;
+	clear: both;
+	padding: 0 1em;
+	}
+	#content.with-help #help {
+		display: block;
+		position: absolute;
+		top: 36px; /* ie < 9 sucks */
+		top: 3.6rem;
+		right: 0;
+		width: 280px; /* ie < 9 sucks */
+		width: 28rem;
+		border-left: 2px solid #FFD478;
+		border-top: 2px solid #FFD478;
+		margin-top: 0;
+		padding: .5em 0 0 0;
+		overflow: auto;
+		}
+#help-button {
+	background: transparent url(../images/page_help.png) no-repeat 6px center;
+	position: absolute;
+	top: 36px; /* ie < 9 sucks */
+	top: 3.6rem;
+	right: 0px;
+	padding: 0 1.5em 0 30px;
+	cursor: pointer;
+	color: #2373A8;
+	line-height: 42px; /* ie < 9 sucks */
+	line-height: 4.2rem;
+	}
+	#help-button span {
+		padding: .5em 0 .1em 0;
+		border-bottom: 1px solid #2373A8;
+		}
+	#content.with-help #help-button {
+		right: 282px; /* ie < 9 sucks */
+		right: 28.2rem;
+		background-color: #f5f5f5;
+		position: fixed;
+		border-top: 2px solid #FFD478;
+		border-left: 2px solid #FFD478;
+		border-bottom: 2px solid #FFD478;
+		border-bottom-left-radius: 1em;
+		border-top-left-radius: 1em;
+		}
+.help-box {
+	display: none;
+	}
+	.help-box ul {
+		padding-left: 20px;
+		margin-left: 0;
+		}
+	#content.with-help .help-content {
+		padding: 0 .5em 1em;
+		}
+		.help-content dt {
+			font-weight: bold;
+			color: #626262;
+			margin: 0;
+			}
+		.help-content dd {
+			margin: 0.3em 0 1.5em 0;
+			}
+/* ------------------------------------------------------------------ FOOTER ELEMENTS */
+#footer p {
+	margin: 0;
+	padding: 0 1em;
+	font-size: 1em;
+	}
+	span.credit {
+		font-size: 1em;
+		font-weight: normal;
+		}
+/* ---------------------------------------------------------------------------------------
+																	RÈGLES SPÉCIFIQUES
+---------------------------------------------------------------------------------------- */
+/* ---------------------------------------------------------------- LISTES TABLEAUX */
+table .maximal, table.maximal {
+	width: 100%;
+	}
+table .minimal {
+	width: 1px;
+	}
+table .nowrap {
+	white-space: nowrap;
+	vertical-align: top;
+	}
+table .count {
+	text-align: right;
+	padding-right: 1.5em;
+	}
+th.first img {
+	padding-right: 24px;
+	}
+tr.line img.expand, th img.expand {
+	margin-right: 6px;
+	margin-bottom: -2px;
+	}
+tr.line p {
+	margin: 0;
+	}
+tr.line input {
+	vertical-align: middle;
+	}
+tr.line:hover {
+	background: #f3f3f3;
+	}
+td.status {
+	vertical-align: middle;
+	}
+td.status img {
+	margin-bottom: -2px;
+	}
+td.status a {
+	border: none;
+	}
+.noborder td, td.noborder, .noborder th, th.noborder {
+	border-width: 0 0 1px 0;
+	border-color: #ddd;
+	line-height: 2em;
+	padding-bottom: 0;
+	}
+.noborder p {
+	margin-bottom: 0;
+	}
+table.posts-list {
+	min-width: 50%;
+	}
+table.settings, table.prefs {
+	width: 80%;
+	border: 1px solid #ccc;
+	margin-bottom: 3em;
+	}
+	table.settings th, table.prefs th {
+		background: #f3f3ff;
+		}
+	table.settings th:first-child, table.prefs th:first-child {
+		width: 20%;
+		}
+	table.settings th + th, table.prefs th + th {
+		width: 30%;
+		}
+	table.settings th + th + th, table.prefs th + th + th {
+		width: 10%;
+		}
+	table.settings th:last-child, table.prefs th:last-child {
+		width: 40%;
+		}
+/* js */
+td.expand {
+	padding: 1em;
+	}
+tr.expand td {
+	border-bottom: none;
+	}
+.dragable {
+	border-collapse: separate;
+	}
+.handle {
+	padding: 0;
+	}
+.handler {
+	cursor: move;
+	background: transparent url(drag.png) no-repeat 0 50%;
+	padding-left: 15px;
+	}
+/* ----------------------------------------------------------- BOITES À FILTRES */
+#filters-form {
+	border: 1px dashed #999;
+	border-radius: .5em;
+	margin-bottom: 2em;
+	padding: .5em 1em 0;
+	}
+#filters-form .table {
+	width: 100%;
+	padding: 0;
+	margin-bottom: 1em;
+	margin-top: .5em;
+	}
+	#filters-form .cell {
+		padding: 0 2em 0 0;
+		}
+	#filters-form .filters-sibling-cell {
+		padding-top: 3.8em;
+		}
+#filters-form .filters-options {
+	padding-left: 2em;
+	border-left: 1px solid #ccc;
+	}
+#filters-form label.ib, span.ib {
+	width:7em;
+	}
+#filters-form label.ibw, span.ibw {
+	width: 9em;
+	display: inline-block;
+	}
+#filters-form select {
+	width: 14em;
+	}
+#filters-form h4 {
+	margin-top: 0;
+	margin-bottom: 2em;
+	}
+/* ---------------------------------------------------------------------------- SPEC PAGES */
+/* ---------------------------------------------------------------------------- auth.php */
+#login-screen {
+	display: block;
+	width: 20em;
+	margin: 1.5em auto 0;
+	font-size: 14px; /* ie < 9 sucks */
+	font-size: 1.4rem;
+	}
+#login-screen h1 {
+	text-indent: -2000px;
+	background: transparent url(dc_logos/w-dotclear240.png) no-repeat top left;
+	height: 66px;
+	margin-bottom: .5em;
+	margin-left: 0;
+	}
+#login-screen .fieldset {
+	border: 1px solid #A8DC26;
+	padding: 1em 1em 0 1em;
+	border-radius: 3px;
+	background: #fff;
+	}
+#login-screen input[type=text], #login-screen input[type=password], #login-screen input[type=submit] {
+	width: 100%;
+	}
+	#login-screen input.login {
+		padding-top: 6px;
+		padding-bottom: 6px;
+		font-size: 1em;
+		}
+#login-screen #issue {
+	margin-left: 1.33em;
+	font-size: 12px; /* ie < 9 sucks */
+	font-size: 1.2rem;
+	}
+	#login-screen #issue strong {
+		font-weight: normal;
+		}
+/* ------------------------------------------------------------------------- index.php */
+#dashboard-main {
+	padding: 1em 0;
+	}
+/* raccourcis */
+#icons {
+	overflow: hidden;
+	padding-bottom: 1em;
+	text-align: center;
+	}
+	#icons p {
+		width: 210px;
+		text-align: center;
+		margin: 1em 0 2em;
+		padding: 1em 0;
+		display:inline-block;
+		vertical-align: top;
+		}
+	#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;
+			color: #333;
+			}
+		#icons a img {
+			padding: 2em;
+			-moz-box-shadow: 0px 1px 0px 0px #ffffff;
+			-webkit-box-shadow: 0px 1px 0px 0px #ffffff;
+			box-shadow: 0px 1px 0px 0px #ffffff;
+			background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f9f9f9), color-stop(1, #e9e9e9) );
+			background:-moz-linear-gradient( center top, #f9f9f9 5%, #e9e9e9 100% );
+			filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e9e9e9');
+			background-color:#f9f9f9;
+			-moz-border-radius:1em;
+			-webkit-border-radius:1em;
+			border-radius:1em;
+			border:1px solid #dcdcdc;
+			display:inline-block;
+			}
+			#icons a:focus img, #icons a:hover img {
+				background: #bee74b;
+				}
+			#icons a:focus span, #icons a:hover span {
+				text-decoration: underline;
+				}
+/* billet rapide */
+#quick {
+	margin-top: 1em;
+	padding-top: 1em;
+	}
+	#quick h3 {
+		margin-bottom: 0.2em;
+		font-size: 1.2em;
+		}
+	#quick p.qinfo {
+		margin: -.7em -1em 1em;
+		background: #f3f3ff url(info.png) no-repeat .2em .2em;
+		border: 1px solid #99f;
+		padding: .2em 1em .1em 24px;
+		color: #666;
+		}
+	#quick #new_cat, .q-cat, .q-cat label {
+		display: inline-block;
+		vertical-align: top;
+		margin-right: 1em;
+		margin-top: 0;
+		}
+	.q-cat label {
+		margin-right: .3em;
+		}
+	#quick #new_cat {
+		margin-bottom: 2em;
+	}
+/* modules additionnels */
+#dashboard-boxes {
+	margin: 2em auto 1em;
+	padding-top: 2em;
+	}
+	.db-items img, .db-contents img {
+		vertical-align: middle;
+		}
+	.db-items ul, .db-contents ul {
+		display: block;
+		padding-left: 1.5em;
+		list-style: square;
+		}
+		.db-items li, .db-contents li {
+			margin: 0.25em 0 0 0;
+			color: #666;
+			}
+	#news dt {
+		font-weight: bold;
+		margin: 0 0 0.4em 0;
+		}
+	#news dd {
+		margin: 0 0 1em 0;
+		}
+		#news dd p {
+			margin: 0.2em 0 0 0;
+			}
+/* message de mise à jour */
+#upg-notify ul {
+	padding-left: 1.5em;
+	}
+	#upg-notify li {
+		color: #fff;
+		}
+/* ------------------------------------------------------------------- blog_pref.php */
+.user-perm {
+	margin: 2em 0px;
+	background: transparent url(user.png) no-repeat left top;
+	width: 320px;
+	display: inline-block;
+	vertical-align: top;
+	}
+	.user-perm h4, .user-perm h5, .user-perm p, .user-perm ul, .user-perm li {
+		margin: .5em 0 .33em;
+		padding: 0;
+		}
+	.user-perm h4 {
+		padding-left: 28px;
+		}
+	.user-perm h5 {
+		margin:	1em 0 0 0;
+		}
+	.user-perm ul {
+		list-style-type: inside;
+		}
+		.user-perm li {
+			margin-left: 1em;
+			padding-left: 0;
+			}
+			li.user_super, li.user_admin {
+				margin-left: 0;
+				padding-left: 1em;
+				list-style: none;
+				background: transparent url(../images/superadmin.png) no-repeat -2px 2px;
+				}
+			li.user_admin {
+				background-image: url(../images/admin.png);
+				}
+/* ------------------------------------------------------------------- blog_theme.php */
+#themes {
+	margin: 0;
+	width: 100%;
+	padding: 0;
+	}
+	.theme-details {
+		border-top: 1px solid #ccc;
+		padding: 12px;
+		display: inline-block;
+		vertical-align: top;
+		width: 284px;
+		}
+		.theme-details.current-theme {
+			background: #eef;
+			}
+		.theme-details:hover {
+			background: #f3f3f3;
+			}
+		.theme-shot img {
+			display: block;
+			border: 1px solid #ccc;
+			margin-bottom: 1.5em;
+			}
+		span.theme-desc {
+			display: block;
+			}
+		span.theme-version {
+			color: #666;
+			}
+		.theme-css {
+			display: block;
+			}
+	#themes-actions {
+		border-bottom: 1px solid #999;
+		margin-bottom: 3em;
+		}
+/* Themes list, JS version */
+#themes-wrapper {
+	display: table;
+	}
+	#themes-wrapper #themes {
+		display: table-cell;
+		vertical-align: top;
+		padding-left: 1em;
+		}
+	#theme-box {
+		display: table-cell;
+		vertical-align: top;
+		padding: 0;
+		width: 312px;
+		border: 1px solid #ccc;
+		border-radius: 3px;
+		}
+		#theme-box .theme-shot,
+		#theme-box .theme-info,
+		#theme-box .theme-actions {
+			background: #eef;
+			padding: 1em 16px;
+			margin: 0;
+			}
+		#theme-box .theme-shot img {
+			display: block;
+			width: 280px;
+			height: 245px;
+			border: 1px solid #ccc;
+			}
+		#theme-box h4 {
+			color: #000;
+			background: #eef;
+			}
+		#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 .theme-actions {
+			border-bottom: 1px solid #ccc;
+			}
+#themes .theme-details-js {
+	float: left;
+	width: 120px;
+	height: 150px;
+	margin: 0 12px 24px;
+	padding: 12px 12px 0;
+	text-align: center;
+	background: #f3f3f3;
+	border: 1px solid #ddd;
+	cursor: pointer;
+	border-radius: 4px;
+	}
+	#themes .theme-details-js label {
+		cursor: pointer;
+		}
+	#themes .theme-details-js.theme-selected {
+		background: #e7e7e7;
+		border: 1px solid #999;
+		}
+	#themes .theme-details-js .theme-shot img {
+		width: 120px;
+		height: 105px;
+		border: 1px solid #fff;
+		}
+	#themes a:focus div, #themes a:hover div,
+	#themes a:focus div.current-theme, #themes a:hover div.current-theme {
+		background: #bee74b;
+		}
+/* ------------------------------------------------------------------ categories.php */
+#categories {
+	margin: 1em 0;
+	}
+#categories ul {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+	}
+	#categories li {
+		margin: .5em 0;
+		padding: .5em 1.2em;
+		border: 1px solid #ccc;
+		border-left: 8px solid #E5E3DA;
+		border-radius: 3px;
+		}
+		#categories label a {
+			font-weight: bold;
+			}
+		#categories li p {
+			margin: 0;
+			display: inline-block;
+			}
+		#categories input[type="checkbox"] {
+			margin-right: .8em;
+			}
+		.cat-url {
+			padding-left: 1em;
+			}
+		#categories .placeholder {
+			outline: 1px dashed #4183C4;
+			min-height: 2.5em;
+			}
+		#categories input.cat-rank {
+			float: right;
+			margin-left: 30px;
+			}
+#categories h4 {
+	margin: 0;
+	}
+	#categories h4 span {
+		font-weight: normal;
+		}
+.cat-actions {
+	line-height: 2;
+	}
+	#del_cat {
+		width: 100%;
+		}
+/* ------------------------------------------------------------------ media.php */
+.media-list {
+	position: static;
+	}
+.media-item {
+	position: relative;
+	border: 1px solid #ccc;
+	margin: 1em;
+	padding: 1em;
+	width: 300px;
+	display: inline-block;
+	vertical-align: top;
+	min-height: 120px
+	}
+	.media-item ul {
+		display: block;
+		list-style: none;
+		margin: 0;
+		padding: 0;
+		}
+	a.media-icon {
+		display: block;
+		border-bottom: none;
+		margin: 0 auto; 
+		}
+		.media-icon img {
+			display: block;
+			}
+.media-action-box {
+	position: relative;
+	margin: 3em 3em 1em 1em;
+	display: inline-block;
+	vertical-align: top;
+	}
+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;
+	}
+/* --------------------------------------------------------------- media-item.php */
+#media-icon {
+	float: left;
+	}
+.near-icon {
+	margin-left: 70px;
+	margin-bottom: 3em;
+	}
+#media-details ul {
+	display: block;
+	margin-left: 0;
+	padding: 0;
+	}
+	#media-details li {
+		list-style: square inside;
+		margin: 0;
+		padding: 0;
+		}
+#media-original-image {
+	overflow: auto;
+	}
+	#media-original-image.overheight {
+		height: 500px;
+		}
+/* -------------------------------------------------------------------- plugins.php */
+#plugins td.action {
+	vertical-align: middle;
+	}
+.distrib img {
+	display: block;
+	float: right;
+	margin-top: -1em;
+	}
+/* ---------------------------------------------------------- post.php, page.php */
+#entry-wrapper {
+	float: left;
+	width: 100%;
+	margin-right: -18em;
+	}
+#entry-content {
+	margin-right: 20em;
+	margin-left: 0;
+	}
+	#entry-content label {
+		text-transform: uppercase;
+		font-weight: bold;
+		margin-top: 2em;
+		}
+	#entry-content label:first-child {
+		margin-top: 0;
+		}
+#entry-sidebar {
+	width: 18em;
+	float: right;
+	}
+	#entry-sidebar select {
+		width: 100%;
+		}
+	#entry-sidebar input#post_position {
+		width: 4em;
+		}
+	.sb-box {
+		border-bottom: 1px solid #ddd;
+		margin-bottom: 1em;
+		}
+/* ---------------------------------------------------------- preferences.php */
+#my-favs {
+	border: 1px solid #A8DC26;
+	padding: 1em 2em
+	}
+	#my-favs ul {
+		list-style-type: none;
+		margin-left: 0;
+		padding-left: 0;
+		line-height: 1.2;
+		}
+		#my-favs li {
+			display: block;
+			float: left;
+			width: 164px;
+			margin-top: 1em;
+			margin-bottom: 1.5em;
+			}
+	#my-favs label {
+		height: 2.5em;
+		width:140px;
+		margin-top:.3em;
+		}
+		#my-favs label input {
+			display:inline;
+			}
+	#my-favs img {
+		display: block;
+		}
+	#my-favs input.position {
+		margin: 0 0 .4em .2em;
+		}
+	#available-favs input, #available-favs label, #available-favs label span {
+		white-space: normal;
+		display: inline;
+		}
+		#default-favs h3 {
+			margin-top: 2em;
+			margin-bottom: 1em;
+			}
+		.fav-list {
+			list-style-type: none;
+			margin-left: 0;
+			padding-left: 0;
+			}
+			.fav-list li {
+				line-height: 2;
+				margin-left: 0;
+				padding-left: 0;
+				position: relative;
+				}
+			.fav-list img {
+				vertical-align: middle;
+				margin-right: .2em;
+			}
+	#available-favs label span.zoom {
+		display: none;
+		}
+	#available-favs li:hover label span.zoom {
+		display: block;
+		position: absolute;
+		bottom: 0;
+		left: 10em;
+		background-color: #f7f7f7;
+		border: 1px solid #ddd;
+		padding: .2em;
+		border-radius: .5em;
+		}
+#user-options label.ib {
+	display: inline-block;
+	width: 14em;
+	padding-right: 1em;
+	}
+/* --------------------------------------------------------------------- user.php */
+.blog-perm {
+	margin-top: 2em;
+	font-weight: bold;
+	}
+.ul-perm {
+	list-style-type: square;
+	margin-left: 0;
+	padding-left: 3.5em;
+	margin-bottom: 0
+	}
+.add-perm {
+	padding-top: .5em;
+	padding-left: 2.5em;
+	margin-left: 0;
+	}
 
+/* ------------------------------------------------------------------------------------
+																				CLASSES
+------------------------------------------------------------------------------------ */
 /* jQuery Autocomplete plugin */
 .ac_results {
@@ -1770,5 +1716,5 @@
 	overflow: hidden;
 	z-index: 99999;
-}
+	}
 .ac_results ul {
 	width: 100%;
@@ -1777,66 +1723,91 @@
 	padding: 0;
 	margin: 0;
-}
-.ac_results li {
-	margin: 0px;
-	padding: 2px 5px;
-	cursor: default;
-	display: block;
-	font: menu;
-	font-size: 1em;
-	line-height: 16px;
-	overflow: hidden;
-}
+	}
+	.ac_results li {
+		margin: 0px;
+		padding: 2px 5px;
+		cursor: default;
+		display: block;
+		font: menu;
+		font-size: 1em;
+		line-height: 16px;
+		overflow: hidden;
+		}
 .ac_loading {
 	background: transparent url('loader.gif') right center no-repeat;
-}
+	}
 .ac_over {
 	background-color: #06c;
 	color: white;
-}
-
-/* ------------------------------------------------------- Filters */
-#filters-form {
-	border: 1px dashed #999;
-	border-radius: .5em;
+	}
+/* password indicator */
+.pw-table {
+	display: table;
+	margin-bottom: 1em;
+	}
+.pw-cell {
+	display: table-cell;
+	margin-bottom: 1em;
+	}
+#pwindicator {
+	display: table-cell;
+	vertical-align: bottom;
+	padding-left: 1.5em;
+	height: 3.8em;
+	}
+	#pwindicator .bar {
+		height: 6px;
+		margin-bottom: 4px;
+		}
+		.pw-very-weak .bar {
+			background: #900;
+			width: 30px;
+			}
+		.pw-weak .bar {
+			background: #c00;
+			width: 60px;
+			}
+		.pw-mediocre .bar {
+			background: #f60;
+			width: 90px;
+			}
+		.pw-strong .bar {
+			background: #060;
+			width: 120px;
+			}
+		.pw-very-strong .bar {
+			background: #0c0;
+			width: 150px;
+			}
+/* ------------------------------------------------------------------ navigation */
+/* selects accès rapide */
+.anchor-nav {
+	background: #ecf0f1;
+	color: #000;
+	padding: 4px 1em;
+	}
+/* nav links */
+.nav_prevnext {
 	margin-bottom: 2em;
-	padding: .5em 1em 0;
-}
-#filters-form .table {
-	display: table;
-	width: 100%;
-	padding: 0;
-	margin-bottom: 1em;
-	margin-top: .5em;
-}
-#filters-form .cell {
-	padding: 0 2em 0 0;
-	display: table-cell;
-	vertical-align: top;
-}
-#filters-form .filters-sibling-cell {
-	padding-top: 3.8em;
-}
-#filters-form .filters-options {
-	padding-left: 2em;
-	border-left: 1px solid #ccc;
-}
-#filters-form label.ib, span.ib {
-	width:7em;
-	display: inline-block;
-}
-#filters-form label.ibw, span.ibw {
-	width: 9em;
-	display: inline-block;
-}
-#filters-form select {
-	width: 14em;
-}
-#filters-form h4 {
-	margin-top: 0;
-	margin-bottom: 2em;
-}
-
-/* ---------------------------------------------------- Pagination */
+	color: #fff;
+	}
+	.nav_prevnext a, a.back {
+		border: 1px solid #ddd;
+		padding: 2px 1.5em;
+		border-radius: .75em;
+		background-color: #f0f0f0;
+		}
+		a.back:before {
+			content: "\ab\a0";
+			}
+		a.onblog_link {
+			color: #333;
+			float: right;
+			border: 1px solid #eee;
+			padding: 2px 1.5em;
+			border-radius: .75em;
+			background-color: #ffe;
+			}
+/* Pagination */
 .pagination {
 	height: 22px;
@@ -1844,71 +1815,87 @@
 	line-height: 22px;
 	padding: 0 .75em;
-	border: 1px solid #ddd;
+	border: 1px solid #e7e7e7;
 	overflow: hidden;
-	background: #e1e1e1;
-	background: -moz-linear-gradient(center top , #f2f2f2, #e1e1e1);
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f2f2), color-stop(100%,#e1e1e1));
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	border-radius: 4px;
+	background: #f3f3f3;
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
 	clear: left;
-}
-.pagination a, .pagination strong {
-	height: 20px;
-	border: none;
-	padding: 2px 6px;
-	background-color : transparent;
-	background-position : 50% 50%;
-	background-repeat: no-repeat;
-}
-.pagination a:hover, .pagination strong {
-	border-color : #ccc;
-	background-color: #fff;
-}
-
-/* --------------------------------------------------------------- password indcator */
-.pw-table {
-	display: table;
+	}
+	.pagination a, .pagination strong {
+		height: 20px;
+		border: none;
+		padding: 2px 6px;
+		background-color : transparent;
+		background-position : 50% 50%;
+		background-repeat: no-repeat;
+		}
+		.pagination a:hover, .pagination strong {
+			border-color : #ccc;
+			background-color: #fff;
+			}
+/* Etapes */
+.step {
+	display: inline-block;
+	float: left;
+	margin: 3px 10px 2px 0;
+	padding: 5px .5em;
+	background: #ecf0f1;
+	border-radius: 3px;
+	font-weight: bold;
+	border: 1px solid #bdc3c7;
+	color: #738182;
+	}
+/* ---------------------------------------------------------------- utilisables partout  */
+.fieldset {
+	background: #fff;
+	border: 1px solid #bbb;
+	border-radius: 3px;
+	padding: 1em .7em .5em;
 	margin-bottom: 1em;
-}
-.pw-cell {
-	display: table-cell;
-	margin-bottom: 1em;
-}
-#pwindicator {
-	display: table-cell;
-	vertical-align: bottom;
-	padding-left: 1.5em;
-	height: 3.8em;
-}
-#pwindicator .bar {
-	height: 6px;
-	margin-bottom: 4px;
-}
-.pw-very-weak .bar {
-	background: #900;
-	width: 30px;
-}
-.pw-weak .bar {
-	background: #c00;
-	width: 60px;
-}
-.pw-mediocre .bar {
-	background: #f60;
-	width: 90px;
-}
-.pw-strong .bar {
-	background: #060;
-	width: 120px;
-}
-.pw-very-strong .bar {
-	background: #0c0;
-	width: 150px;
-}
-/* ------------------------------------------------------------- cachotteries */
+	}
+	.fieldset h3 {
+		color: #333;
+		}
+.right {
+	text-align: right;
+	}
+.txt-center {
+	text-align: center;
+	}
+.no-margin, label.no-margin {
+	margin-top: 0;
+	margin-bottom: 0;
+	}
+.vertical-separator {
+	margin-top: 2em;
+	}
+	p.clear.vertical-separator {
+		padding-top: 2em;
+		}
+.border-top {
+	border-top: 1px solid #999;
+	padding-top: 1em;
+	margin-top:	1em;
+	}
+.grid {
+	background: transparent repeat url('grid.png') 0 0;
+	}
+ul.nice {
+	margin: 1em 0;
+	padding: 0 0 0 2em;
+	list-style: square;
+	}
+	ul.nice li {
+		margin:0;
+		padding: 0;
+		}
+.offline {
+	color: #666;
+	}
 /* caché pour tout le monde */
 .hide {
 	display: none;
-}
+	}
 /* Caché sauf pour les revues d'écran */
 .hidden {
@@ -1925,29 +1912,55 @@
 .no-js .hidden-if-no-js {
         display: none;
-}
+	}
 /* montré si js est inactif */
 .no-js .hidden-if-js {
 	display: block;
-}
+	}
 /* caché si js est actif */
 .hidden-if-js {
         display: none;
-}
-
-/* ---------------------------------------------------------------------------
-	Media queries vite fait en attendant la reprise complète du layout
----------------------------------------------------------------------------- */
+	}
+/* ------------------------------------------------------------------------------------
+																				UTILS
+------------------------------------------------------------------------------------ */
+/* 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;
+	}
+/* ------------------------------------------------------------------------------------
+															UN POIL DE MEDIA QUERIES
+------------------------------------------------------------------------------------ */
 @media screen and (max-width: 920px) {
-	#top, #top h1 a {width: 42px !important; height:100%; overflow: hidden;
-}
-	#top h1 a:link {
-		background: transparent url(dc_logos/b-dotclear120.png) no-repeat -180px 6px;
-		border-right: 1px solid #ccc;
-	}
-	#top h1 a:hover, #top h1 a:focus {
-		background: url(dc_logos/b-dotclear120.png) no-repeat -180px -94px;
-		border-right: 1px solid #A2CBE9;
-	}
-}
+	#top, #top h1 a {
+		width: 42px !important; 
+		height:100%; 
+		overflow: hidden;
+		}
+		#top h1 a:link {
+			background: transparent url(dc_logos/b-dotclear120.png) no-repeat -180px 6px;
+			border-right: 1px solid #ccc;
+			}
+		#top h1 a:hover, #top h1 a:focus {
+			background: url(dc_logos/b-dotclear120.png) no-repeat -180px -94px;
+			border-right: 1px solid #A2CBE9;
+			}
+	}
 @media screen and (max-width: 800px) {
 	#top, #info-boxes, #info-box1, #info-box2 {
@@ -1956,11 +1969,11 @@
 		margin:0;
 		padding:0;
-		line-height: 32px; /* ie < 9 sucks */
-		line-height: 3.2rem;
-	}
-	#info-box1 {margin-left: .75em;}
-	#info-box1 select {width: 140px; width: 14rem;}
-	#main-menu, #main, #content, #content h2, #entry-wrapper, #entry-sidebar, #entry-content, .two-cols .col, .two-cols .col:first-child {
-    	display:block;
+		line-height: 32px; line-height: 3.2rem;
+		}
+		#info-box1 { margin-left: .75em; }
+		#info-box1 select { width: 140px; width: 14rem; }
+	#main-menu, #main, #content, #content h2, #entry-wrapper, #entry-sidebar, #entry-content, 
+	.two-cols .col, .two-cols .col:first-child, .boxes {
+		display:block !important;
     	width: 98%;
     	margin:0 auto;
@@ -1969,23 +1982,32 @@
     	text-align: left;
     	clear: both;
-  	}
+		}
   	#content {
-  		width: 100%;
-  		padding-top: .5em;
-  	}
-}
+		width: 100%;
+		padding-top: .5em;
+  		}
+	}
 @media screen and (max-width: 720px) {
-	.smallscreen {display: none;}
-	#help-button {width:20px; overflow: hidden;}
-	#info-box2 {float:none;}
-	#dashboard-items div {display: block;margin-bottom: 1em; padding: 0 1em;}
-	#help-button {height:26px; width:26px; background-color: #A2CBE9; padding: 0; margin:0;font-size:10px; font-size: 1rem;line-height: 68px}
-}
+	.smallscreen { display: none; }
+	#info-box2 { float:none; }
+	#help-button {
+		height:26px; 
+		width:26px; 
+		background-color: #A2CBE9; 
+		padding: 0; 
+		margin: 0;
+		font-size: 10px; font-size: 1rem;
+		line-height: 68px;
+		overflow: hidden;
+		}
+	}
 @media screen and (max-width: 492px) {
-	#header {height: 36px; height: 3.6rem;}
-	#wrapper {font-size: 16px; font-size: 1.6rem;}
-	.page-title, #info-boxes, .media-item {display: inline-block;}
-	div.media-list .media-item {width: 90%; float: none}
-	#info-box1 select {width: 120px; width: 12rem; margin-right: .6rem;}
-	#info-box1 p.nomobile, label.nomobile {display: none;}
-}
+	#header { height: 36px; height: 3.6rem; }
+	#wrapper { font-size: 16px; font-size: 1.6rem; }
+	.page-title, #info-boxes { display: inline-block; }
+	#info-box1 select {
+		width: 120px; width: 12rem; 
+		margin-right: .6rem;
+		}
+	#info-box1 p.nomobile, label.nomobile { display: none; }
+	}
Index: admin/style/jsToolBar/jsToolBar.css
===================================================================
--- admin/style/jsToolBar/jsToolBar.css	(revision 1697)
+++ admin/style/jsToolBar/jsToolBar.css	(revision 1741)
@@ -2,6 +2,6 @@
 	border-width : 0 1px 1px 1px;
 	border-style : solid;
-	border-color : #ccc;
-	background : #f9f9f9;
+	border-color : #ddd;
+	background : #f7f7f7;
 }
 .jstEditor textarea, .jstEditor iframe {
@@ -10,5 +10,5 @@
 	box-sizing: border-box;	
 	margin: 0;
-	border: 2px solid #f9f9f9;
+	border: 1px solid #fbfbfb;
   	width: 100%;
   	padding: .5em 0 0 0;
@@ -24,20 +24,15 @@
 }
 .jstEditor textarea:focus, .jstEditor iframe:focus {
-	border: 2px solid #bee74b;
+	border-color: #bee74b;
 }
 .jstElements {
 	height: 28px;
 	padding: 0 1rem; 
-	border: 1px solid #ccc;
+	border: 1px solid #dfdfdf;
 	overflow: hidden; 
-	background: #e1e1e1; 
-	background: -moz-linear-gradient(center top , #f2f2f2, #e1e1e1); 
-	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f2f2f2), color-stop(100%,#e1e1e1)); 
+	background: #f5f5f5; 
 	-moz-border-radius: 4px 4px 0 0; 
 	-webkit-border-radius: 4px 4px 0 0; 
 	border-radius: 4px 4px 0 0; 
-	-webkit-box-shadow: 0 1px 0 #FFF inset; 
-	-moz-box-shadow: 0 1px 0 #FFF inset; 
-	box-shadow: 0 1px 0 #FFF inset;
 }
 
@@ -48,18 +43,18 @@
 	width: 12em;
 	margin-right: .6rem;
-	border: 1px solid #ccc; 
+	border: 1px solid #ddd; 
 }
 .jstElements button {
 	width : 30px;
 	height: 28px;
-	border-style: groove;
+	border-style: solid;
 	border-width:  0 1px 0 0;
-	border-color: #666;
-	background-color : transparent;
+	border-color: #e7e7e7;
+	background-color : #f7f7f7;
 	background-position : 50% 50%;
 	background-repeat: no-repeat;
 }
 .jstElements button:hover {
-	border-color : #ccc;
+	border-color : #ddd;
 	background-color: #fff;
 }
@@ -70,5 +65,5 @@
 	display : inline-block;
 	vertical-align: top;
-	background: #dfdfdf;
+	background: #e5e5e5;
 }
 span.jstSpacer {
@@ -76,7 +71,4 @@
 	height: 28px;
 	margin-right: 0;
-	border-style: groove;
-	border-width:  0 1px 0 0;
-	border-color: #666;
 }
 
@@ -96,5 +88,5 @@
 .jstSwitcher li.jstSwitcherCurrent {
 	color: #fff;
-	background: #575859;
+	background: #677374;
 	border-radius: 0 0 2px 2px;
 }
Index: admin/user.php
===================================================================
--- admin/user.php	(revision 1621)
+++ admin/user.php	(revision 1719)
@@ -32,18 +32,11 @@
 $user_options = $core->userDefaults();
 
-foreach ($core->getFormaters() as $v) {
-	$formaters_combo[$v] = $v;
-}
-
-foreach ($core->blog->getAllPostStatus() as $k => $v) {
-	$status_combo[$v] = $k;
-}
+# Formaters combo
+$formaters_combo = dcAdminCombos::getFormatersCombo();
+
+$status_combo = dcAdminCombos::getPostStatusesCombo();
 
 # Language codes
-$langs = l10n::getISOcodes(1,1);
-foreach ($langs as $k => $v) {
-	$lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v);
-	$lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : '');
-}
+$lang_combo = dcAdminCombos::getAdminLangsCombo();
 
 # Get user if we have an ID
Index: debian/control
===================================================================
--- debian/control	(revision 0)
+++ debian/control	(revision 1743)
@@ -8,5 +8,5 @@
 Package: dotclear
 Architecture: all
-Depends: ${misc:Depends}, apache2 | httpd | apache, libclearbricks, php5-pgsql | php5-sqlite | php5-mysql, php5-gd
+Depends: ${misc:Depends}, apache2 | httpd | apache, libclearbricks, php5-pgsql | php5-sqlite | php5-mysql | php5-mysqli, php5-gd
 Suggests: php5-tidy
 Description: DotClear 2
Index: inc/admin/lib.admincombos.php
===================================================================
--- inc/admin/lib.admincombos.php	(revision 1722)
+++ inc/admin/lib.admincombos.php	(revision 1722)
@@ -0,0 +1,175 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+if (!defined('DC_RC_PATH')) { return; }
+/**
+@ingroup DC_CORE
+@nosubgrouping
+@brief Admin combo library 
+
+Dotclear utility class that provides reuseable combos across all admin
+
+*/
+class dcAdminCombos {
+
+	/** @var dcCore dcCore instance */
+	public static $core;
+	
+	/**
+	Returns an hierarchical categories combo from a category record
+	
+	@param	categories		<b>record</b>		the category record
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/
+	public static function getCategoriesCombo($categories) {
+		$categories_combo[__('(No cat)')] = '';
+		while ($categories->fetch()) {
+			$categories_combo[str_repeat('&nbsp;&nbsp;',$categories->level-1).($categories->level-1 == 0 ? '' : '&bull; ').
+				html::escapeHTML($categories->cat_title).
+				' ('.$categories->nb_post.')'] = $categories->cat_id;
+		}
+		return $categories_combo;
+	}
+	
+	/**
+	Returns available post status combo 
+	
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/
+	public static function getPostStatusesCombo() {
+		$status_combo =  array();
+		foreach (self::$core->blog->getAllPostStatus() as $k => $v) {
+			$status_combo[$v] = (string) $k;
+		}
+		return $status_combo;
+	}
+	
+	/**
+	Returns an users combo from a users record
+	
+	@param	users		<b>record</b>		the users record
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/
+	public static function getUsersCombo($users) {
+		$users_combo = array();
+		while ($users->fetch())
+		{
+			$user_cn = dcUtils::getUserCN($users->user_id,$users->user_name,
+			$users->user_firstname,$users->user_displayname);
+			
+			if ($user_cn != $users->user_id) {
+				$user_cn .= ' ('.$users->user_id.')';
+			}
+			
+			$users_combo[$user_cn] = $users->user_id; 
+		}
+		return $users_combo;
+	}
+	
+	/**
+	Returns an date combo from a date record
+	
+	@param	dates		<b>record</b>		the dates record
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/	
+	public static function getDatesCombo($dates) {
+		$dt_m_combo= array();
+		while ($dates->fetch()) {
+			$dt_m_combo[dt::str('%B %Y',$dates->ts())] = $dates->year().$dates->month();
+		}		
+		return $dt_m_combo;
+	}
+	
+	/**
+	Returns an lang combo from a lang record
+	
+	@param	langs		<b>record</b>		the langs record
+	@param	with_available	<b>boolean</b>	if false, only list items from record
+											if true, also list available languages
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/	
+	public static function getLangsCombo($langs,$with_available=false) {
+		$all_langs = l10n::getISOcodes(0,1);
+		if ($with_available) {
+			$langs_combo = array('' => '', __('Most used') => array(), __('Available') => l10n::getISOcodes(1,1));
+			while ($langs->fetch()) {
+				if (isset($all_langs[$langs->post_lang])) {
+					$langs_combo[__('Most used')][$all_langs[$langs->post_lang]] = $langs->post_lang;
+					unset($langs_combo[__('Available')][$all_langs[$langs->post_lang]]);
+				} else {
+					$langs_combo[__('Most used')][$langs->post_lang] = $langs->post_lang;
+				}
+			}
+		} else {
+			$langs_combo = array();
+			while ($langs->fetch()) {
+				$lang_name = isset($all_langs[$langs->post_lang]) ? $all_langs[$langs->post_lang] : $langs->post_lang;
+				$langs_combo[$lang_name] = $langs->post_lang;
+			}
+		}
+		unset($all_langs);
+		return $langs_combo;
+	}
+	
+	/**
+	Returns a combo containing all available and installed languages for administration pages
+	
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/	
+	public static function getAdminLangsCombo() {
+		$lang_combo = array();
+		$langs = l10n::getISOcodes(1,1);
+		foreach ($langs as $k => $v) {
+			$lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v);
+			$lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : '');
+		}
+		return $lang_combo;
+	}
+	
+	/**
+	Returns a combo containing all available formaters in admin
+	
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/	
+	public static function getFormatersCombo() {
+		foreach (self::$core->getFormaters() as $v) {
+			$formaters_combo[$v] = $v;
+		}
+		return $formaters_combo;
+	}
+	
+	/**
+	Returns a combo containing available blog statuses
+	
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/	
+	public static function getBlogStatusesCombo() {
+		$status_combo = array();
+		foreach (self::$core->getAllBlogStatus() as $k => $v) {
+			$status_combo[$v] = (string) $k;
+		}
+		return $status_combo;
+	}
+	
+	/**
+	Returns a combo containing available comment statuses
+	
+	@return	<b>array</b> the combo box (form::combo -compatible format)
+	*/	
+	public static function getCommentStatusescombo() {
+		$status_combo = array();
+		foreach (self::$core->blog->getAllCommentStatus() as $k => $v) {
+			$status_combo[$v] = (string) $k;
+		}
+		return $status_combo;
+	}
+}
+dcAdminCombos::$core = $GLOBALS['core'];
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 1699)
+++ inc/admin/lib.dc.page.php	(revision 1741)
@@ -150,7 +150,7 @@
 
 		echo
-		'<div id="wrapper">'."\n".
+		'<div id="wrapper" class="clearfix">'."\n".
 		'<div id="main">'."\n".
-		'<div id="content">'."\n";
+		'<div id="content" class="clearfix">'."\n";
 
 		# Safe mode
@@ -330,4 +330,9 @@
 	{
 		self::message($msg,$timestamp,$div,$echo,"success");
+	}
+
+	public static function warning($msg,$timestamp=true,$div=false,$echo=true)
+	{
+		self::message($msg,$timestamp,$div,$echo,"warning-msg");
 	}
 
@@ -613,8 +618,20 @@
 		"//<![CDATA[\n".
 		"\$(function() {\n".
-			"	\$.pageTabs(".$default.");\n".
+			"	pagetabs = \$.pageTabs(".$default.");\n".
 			"});\n".
 "\n//]]>\n".
-"</script>\n";
+"</script>\n".
+		"<!--[if lt IE 8]>\n".
+		self::jsLoad('js/ie7/ie7-hashchange.js').
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		"\$(function() {".
+			"\$(window).hashchange( function(){".
+				"pagetabs.showDiv(document.location.hash.split('#').join(''));".
+			"});".
+		"});".
+		"\n//]]>\n".
+		"</script>\n".
+		"<![endif]-->\n";
 }
 
Index: inc/config.php.in
===================================================================
--- inc/config.php.in	(revision 1535)
+++ inc/config.php.in	(revision 1743)
@@ -12,5 +12,5 @@
 if (!defined('DC_RC_PATH')) { return; }
 
-// Database driver (mysql, pgsql, sqlite)
+// Database driver (mysql, mysqli, pgsql, sqlite)
 define('DC_DBDRIVER','');
 
Index: inc/core/class.dc.blog.php
===================================================================
--- inc/core/class.dc.blog.php	(revision 1689)
+++ inc/core/class.dc.blog.php	(revision 1743)
@@ -658,5 +658,5 @@
 		if (!$rs->isEmpty())
 		{
-			if ($this->con->driver() == 'mysql') {
+			if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') {
 				$clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'";
 			} elseif ($this->con->driver() == 'pgsql') {
@@ -1828,5 +1828,5 @@
 		if (!$rs->isEmpty())
 		{
-			if ($this->con->driver() == 'mysql') {
+			if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') {
 				$clause = "REGEXP '^".$this->con->escape($url)."[0-9]+$'";
 			} elseif ($this->con->driver() == 'pgsql') {
@@ -2187,5 +2187,5 @@
 		
 		# mySQL uses "JOIN" synthax
-		if ($this->con->driver() == 'mysql') {
+		if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') {
 			$strReq .= 
 				'JOIN '.$this->prefix.'post tp ON tc.post_id = tp.post_id ';
@@ -2196,5 +2196,5 @@
 		
 		# pgSQL uses "FROM" synthax
-		if ($this->con->driver() != 'mysql') {
+		if ($this->con->driver() != 'mysql' || $this->con->driver() == 'mysqli') {
 			$strReq .= 
 				'FROM '.$this->prefix.'post tp ';
@@ -2206,5 +2206,5 @@
 		
 		# add pgSQL "WHERE" clause
-		if ($this->con->driver() != 'mysql') {
+		if ($this->con->driver() != 'mysql' || $this->con->driver() == 'mysqli') {
 			$strReq .= 
 				'AND tc.post_id = tp.post_id ';
@@ -2265,5 +2265,5 @@
 		
 		# mySQL uses "INNER JOIN" synthax
-		if ($this->con->driver() == 'mysql') {
+		if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') {
 			$strReq = 
 				'DELETE FROM tc '.
@@ -2302,5 +2302,5 @@
 		
 		# mySQL uses "INNER JOIN" synthax
-		if ($this->con->driver() == 'mysql') {
+		if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') {
 			$strReq = 
 				'DELETE FROM tc '.
Index: inc/core/class.dc.core.php
===================================================================
--- inc/core/class.dc.core.php	(revision 1698)
+++ inc/core/class.dc.core.php	(revision 1743)
@@ -64,4 +64,6 @@
 		if ($this->con instanceof mysqlConnection) {
 			mysqlConnection::$weak_locks = true;
+		} elseif ($this->con instanceof mysqliConnection) {
+			mysqliConnection::$weak_locks = true;
 		}
 		
Index: inc/core/class.dc.media.php
===================================================================
--- inc/core/class.dc.media.php	(revision 1468)
+++ inc/core/class.dc.media.php	(revision 1718)
@@ -74,5 +74,10 @@
 		
 		if (!is_dir($root)) {
-			throw new Exception(sprintf(__('Directory %s does not exist.'),$root));
+			# Check public directory
+			if ( $core->auth->isSuperAdmin() ) {
+				throw new Exception(__("There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting)."));
+			} else {
+				throw new Exception(__("There is no writable root directory for the media manager. You should contact your administrator."));
+			}
 		}
 		
@@ -299,5 +304,7 @@
 			$f->media_thumb = array();
 			$p = path::info($f->relname);
+
 			$alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
+
 			$thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root.'/'.$p['dirname'],$p['base'],'%s');
 			$thumb_url = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root_url.$p['dirname'],$p['base'],'%s');
@@ -306,8 +313,18 @@
 			$thumb_url = preg_replace('#\./#','/',$thumb_url);
 			$thumb_url = preg_replace('#(?<!:)/+#','/',$thumb_url);
+
+			if ($alpha) {
+				$thumb_alt = sprintf($this->thumb_tp,$this->root.'/'.$p['dirname'],$p['base'],'%s');
+				$thumb_url_alt = sprintf($this->thumb_tp,$this->root_url.$p['dirname'],$p['base'],'%s');
+				# Cleaner URLs
+				$thumb_url_alt = preg_replace('#\./#','/',$thumb_url_alt);
+				$thumb_url_alt = preg_replace('#(?<!:)/+#','/',$thumb_url_alt);
+			}
 			
 			foreach ($this->thumb_sizes as $suffix => $s) {
 				if (file_exists(sprintf($thumb,$suffix))) {
 					$f->media_thumb[$suffix] = sprintf($thumb_url,$suffix);
+				} elseif ($alpha && file_exists(sprintf($thumb_alt,$suffix))) {
+					$f->media_thumb[$suffix] = sprintf($thumb_url_alt,$suffix);
 				}
 			}
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 1694)
+++ inc/prepend.php	(revision 1719)
@@ -59,4 +59,5 @@
 $__autoload['adminCommentList']		= dirname(__FILE__).'/admin/lib.pager.php';
 $__autoload['adminUserList']			= dirname(__FILE__).'/admin/lib.pager.php';
+$__autoload['dcAdminCombos']			= dirname(__FILE__).'/admin/lib.admincombos.php';
 
 $__autoload['dcTemplate']			= dirname(__FILE__).'/public/class.dc.template.php';
Index: locales/fr/main.po
===================================================================
--- locales/fr/main.po	(revision 1697)
+++ locales/fr/main.po	(revision 1745)
@@ -3312,2 +3312,29 @@
 msgid "%1$s: %2$s"
 msgstr "%1$s : %2$s"
+
+msgid "Dotclear news"
+msgstr "Actualité de Dotclear"
+
+msgid "The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file."
+msgstr "Le répertoire de cache n'existe pas ou n'est pas accessible en écriture. Vous devez créer ce répertoire avec les droits suffisants et affecter celui-ci à \"DC_TPL_CACHE\" dans le fichier inc/config.php."
+
+msgid "The cache directory does not exist or is not writable. You should contact your administrator."
+msgstr "Le répertoire de cache n'existe pas ou n'est pas accessible en écriture. Vous devriez contacter votre administrateur."
+
+msgid "There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting)."
+msgstr "Il n'existe pas de répertoire /public/ à l'endroit spécifié pour le réglage \"public_path\" dans about:config. Vous devez créer ce répertoire avec les droits suffisants (ou changer ce réglage)."
+
+msgid "There is no writable root directory for the media manager. You should contact your administrator."
+msgstr "Il n'existe pas de répertoire principal accessible en écriture pour la médiathèque. Vous devriez contacter votre administrateur."
+
+msgid "You do not have sufficient permissions to write to this folder."
+msgstr "Vous n'avez pas les droits suffisants pour écrire dans ce répertoire."
+
+msgid "MySQL (deprecated)"
+msgstr "MySQL (obsolète)"
+
+msgid "The URL of blog or the URL scan method might not be well set (<code>%s</code> return a <strong>%s</strong> status)."
+msgstr "L'URL du blog ou la méthode de lecture de l'URL ne semblent pas être bien réglées (<code>%s</code> retourne un statut <strong>%s</strong>)"
+
+msgid "The URL of blog or the URL scan method might not be well set (<code>%s</code> does not return an ATOM feed)."
+msgstr "L'URL du blog ou la méthode de lecture de l'URL ne semblent pas être bien réglées (<code>%s</code> ne retourne pas un flux ATOM)"
Index: plugins/importExport/inc/class.dc.import.wp.php
===================================================================
--- plugins/importExport/inc/class.dc.import.wp.php	(revision 1622)
+++ plugins/importExport/inc/class.dc.import.wp.php	(revision 1719)
@@ -80,8 +80,6 @@
 			$this->post_limit = $this->vars['post_limit'];
 		}
-		
-		foreach ($this->core->getFormaters() as $v) {
-			$this->formaters[$v] = $v;
-		}
+
+		$this->formaters = dcAdminCombos::getFormatersCombo();
 	}
 	
Index: plugins/importExport/inc/flat/class.flat.import.php
===================================================================
--- plugins/importExport/inc/flat/class.flat.import.php	(revision 1093)
+++ plugins/importExport/inc/flat/class.flat.import.php	(revision 1743)
@@ -160,5 +160,5 @@
 					if (in_array($last_line_name,$constrained)) {
 						# UNDEFER
-						if ($this->con->driver() == 'mysql') $this->con->execute('SET foreign_key_checks = 1');
+						if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 1');
 						if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED');
 					}
@@ -166,5 +166,5 @@
 					if (in_array($line->__name,$constrained)) {
 						# DEFER
-						if ($this->con->driver() == 'mysql') $this->con->execute('SET foreign_key_checks = 0');
+						if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 0');
 						if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL IMMEDIATE');
 					}
@@ -205,5 +205,5 @@
 			}
 			
-			if ($this->con->driver() == 'mysql') $this->con->execute('SET foreign_key_checks = 1');
+			if ($this->con->driver() == 'mysql' || $this->con->driver() == 'mysqli') $this->con->execute('SET foreign_key_checks = 1');
 			if ($this->con->driver() == 'pgsql') $this->con->execute('SET CONSTRAINTS ALL DEFERRED');
 		}
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 1713)
+++ plugins/pages/page.php	(revision 1741)
@@ -53,28 +53,15 @@
 
 # Status combo
-foreach ($core->blog->getAllPostStatus() as $k => $v) {
-	$status_combo[$v] = (string) $k;
-}
+$status_combo = dcAdminCombos::getPostStatusesCombo();
+
 $img_status_pattern = '<img class="img_select_option" alt="%1$s" title="%1$s" src="images/%2$s" />';
 
 # Formaters combo
-foreach ($core->getFormaters() as $v) {
-	$formaters_combo[$v] = $v;
-}
+$formaters_combo = dcAdminCombos::getFormatersCombo();
 
 # Languages combo
 $rs = $core->blog->getLangs(array('order'=>'asc'));
-$all_langs = l10n::getISOcodes(0,1);
-$lang_combo = array('' => '', __('Most used') => array(), __('Available') => l10n::getISOcodes(1,1));
-while ($rs->fetch()) {
-	if (isset($all_langs[$rs->post_lang])) {
-		$lang_combo[__('Most used')][$all_langs[$rs->post_lang]] = $rs->post_lang;
-		unset($lang_combo[__('Available')][$all_langs[$rs->post_lang]]);
-	} else {
-		$lang_combo[__('Most used')][$rs->post_lang] = $rs->post_lang;
-	}
-}
-unset($all_langs);
-unset($rs);
+$lang_combo = dcAdminCombos::getLangsCombo($rs,true);
+
 
 # Validation flag
@@ -480,6 +467,6 @@
 		
 		"post_excerpt" =>
-			'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'<span class="form-note">'.
-			__('Add an introduction to the post.').'</span></label> '.
+			'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').' <span class="form-note">'.
+			__('Introduction to the post.').'</span></label> '.
 			form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)).
 			'</p>',
@@ -492,6 +479,6 @@
 		
 		"post_notes" =>
-			'<p class="area" id="notes-area"><label for="post_notes">'.__('Personal notes:').'<span class="form-note">'.
-			__('Add unpublished notes.').'</span></label>'.
+			'<p class="area" id="notes-area"><label for="post_notes">'.__('Personal notes:').' <span class="form-note">'.
+			__('Unpublished notes.').'</span></label>'.
 			form::textarea('post_notes',50,5,html::escapeHTML($post_notes)).
 			'</p>'
@@ -545,5 +532,5 @@
 	
 	foreach ($sidebar_items as $id => $c) {
-		echo '<div id="'.$id.'" class="box">'.
+		echo '<div id="'.$id.'" class="sb-box">'.
 			'<h4>'.$c['title'].'</h4>';
 		foreach ($c['items'] as $e_name=>$e_content) {
@@ -603,5 +590,5 @@
 	
 	echo
-	'<p class="top-add"><a class="button add onblog_link" href="#comment-form">'.__('Add a comment').'</a></p>';
+	'<p class="top-add"><a class="button add" href="#comment-form">'.__('Add a comment').'</a></p>';
 
 	if ($has_action) {
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 1636)
+++ plugins/simpleMenu/index.php	(revision 1722)
@@ -23,46 +23,30 @@
 
 # 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) { }
-
+$rs = $core->blog->getCategories(array('post_type'=>'post'));
+$categories_combo = dcAdminCombos::getCategoriesCombo($rs);
+unset($categories_combo[__('(No cat)')]);
+$rs->moveStart();
+while ($rs->fetch()) {
+	$categories_label[$rs->cat_id] = html::escapeHTML($rs->cat_title);
+}
 # 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) { }
+$langs_combo = dcAdminCombos::getLangscombo(
+	$core->blog->getLangs(array('order'=>'asc'))
+);
 
 # 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) { }
+$rs = $core->blog->getDates(array('type'=>'month'));
+$months_combo = array_merge(
+	array(__('All months') => '-'),
+	dcAdmincombos::getDatesCombo($rs)
+);
+
+$first_year = $last_year = 0;
+while ($rs->fetch()) {
+	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);
 
 # Liste des pages -- Doit être pris en charge plus tard par le plugin ?
@@ -395,5 +379,4 @@
 	dcPage::success(__('Menu items have been successfully updated.'));
 }
-
 if ($step)
 {
Index: tests/functional/fixtures/form_media_disabled.html
===================================================================
--- tests/functional/fixtures/form_media_disabled.html	(revision 1724)
+++ tests/functional/fixtures/form_media_disabled.html	(revision 1724)
@@ -0,0 +1,37 @@
+<div>
+  <h4>Add files</h4>
+
+  <form id="fileupload" action="media.php?popup=0&amp;post_id=" method="post" enctype="multipart/form-data" aria-disabled="false">
+    <p>
+      <input type="hidden" name="MAX_FILE_SIZE" value="2097152"  />
+      <input type="hidden" name="xd_check" value="7a87b8c0d60e38a05b1b8cf524d08a5594222763"  />
+    </p>
+    <div class="fileupload-ctrl">
+      <p class="queue-message"></p>
+      <ul class="files"></ul>
+    </div>
+    <div class="fileupload-buttonbar clear">
+      <p>
+	<label for="upfile"><span class="add-label one-file">Choose file</span></label>
+	<button class="button add">Choose files</button>
+	<input type="file" id="upfile" name="upfile[]" data-url="media.php?popup=0&amp;post_id=" />
+      </p>
+      <p class="one-file">
+	<label for="upfiletitle">Title:</label>
+	<input type="text" size="35" name="upfiletitle" id="upfiletitle" maxlength="255"  />
+      </p>
+      <p class="one-file">
+	<label for="upfilepriv" class="classic">Private</label>
+	<input type="checkbox" name="upfilepriv" value="1" id="upfilepriv"  />
+      </p>
+      <p class="clear">
+	<button class="button clean">Refresh</button>
+	<input class="button cancel one-file" type="reset" value="Clear All"/>
+	<input class="button start" type="submit" value="Upload"/>
+      </p>
+    </div>
+    <p style="clear:both;">
+      <input type="hidden" name="d" value="."  />
+    </p>
+  </form>
+</div>
Index: tests/functional/fixtures/form_media_enabled.html
===================================================================
--- tests/functional/fixtures/form_media_enabled.html	(revision 1724)
+++ tests/functional/fixtures/form_media_enabled.html	(revision 1724)
@@ -0,0 +1,37 @@
+<div class="enhanced_uploader">
+  <h4>Add files</h4>
+
+  <form id="fileupload" action="media.php?popup=0&amp;post_id=" method="post" enctype="multipart/form-data" aria-disabled="false">
+    <p>
+      <input type="hidden" name="MAX_FILE_SIZE" value="2097152"  />
+      <input type="hidden" name="xd_check" value="7a87b8c0d60e38a05b1b8cf524d08a5594222763"  />
+    </p>
+    <div class="fileupload-ctrl">
+      <p class="queue-message"></p>
+      <ul class="files"></ul>
+    </div>
+    <div class="fileupload-buttonbar clear">
+      <p>
+	<label for="upfile"><span class="add-label one-file">Choose file</span></label>
+	<button class="button add">Choose files</button>
+	<input type="file" id="upfile" name="upfile[]" multiple="mutiple" data-url="media.php?popup=0&amp;post_id=" />
+      </p>
+      <p class="one-file">
+	<label for="upfiletitle">Title:</label>
+	<input type="text" size="35" name="upfiletitle" id="upfiletitle" maxlength="255"  />
+      </p>
+      <p class="one-file">
+	<label for="upfilepriv" class="classic">Private</label>
+	<input type="checkbox" name="upfilepriv" value="1" id="upfilepriv"  />
+      </p>
+      <p class="clear">
+	<button class="button clean">Refresh</button>
+	<input class="button cancel one-file" type="reset" value="Clear All"/>
+	<input class="button start" type="submit" value="Upload"/>
+      </p>
+    </div>
+    <p style="clear:both;">
+      <input type="hidden" name="d" value="."  />
+    </p>
+  </form>
+</div>
Index: tests/functional/fixtures/tabs-iframe.html
===================================================================
--- tests/functional/fixtures/tabs-iframe.html	(revision 1737)
+++ tests/functional/fixtures/tabs-iframe.html	(revision 1737)
@@ -0,0 +1,1 @@
+<iframe id="testtab" src="fixtures/tabs-inframe.html"/>
Index: tests/functional/fixtures/tabs-inframe.html
===================================================================
--- tests/functional/fixtures/tabs-inframe.html	(revision 1737)
+++ tests/functional/fixtures/tabs-inframe.html	(revision 1737)
@@ -0,0 +1,14 @@
+
+<!-- page tabs -->
+<script type="text/javascript" src="../../../admin/js/jquery/jquery.js"></script>
+<script type="text/javascript" src="../../../admin/js/jquery/jquery.pageTabs.js"></script>   
+
+<div id="tab-1" class="multi-part" title="Tab 1">
+	<h3>Tab 1 - content</h3>
+</div>
+<div id="tab-2" class="multi-part" title="Tab 2">
+	<h3>Tab 2 - content</h3>
+</div>
+<div id="tab-3" class="multi-part" title="Tab 3">
+	<h3>Tab 3 - content</h3>
+</div>
Index: tests/functional/fixtures/tabs.html
===================================================================
--- tests/functional/fixtures/tabs.html	(revision 1737)
+++ tests/functional/fixtures/tabs.html	(revision 1737)
@@ -0,0 +1,13 @@
+
+<!-- page tabs -->
+<script type="text/javascript" src="../../admin/js/jquery/jquery.pageTabs.js"></script>   
+
+<div id="tab-1" class="multi-part" title="Tab 1">
+	<h3>Tab 1 - content</h3>
+</div>
+<div id="tab-2" class="multi-part" title="Tab 2">
+	<h3>Tab 2 - content</h3>
+</div>
+<div id="tab-3" class="multi-part" title="Tab 3">
+	<h3>Tab 3 - content</h3>
+</div>
Index: tests/functional/index.html
===================================================================
--- tests/functional/index.html	(revision 1703)
+++ tests/functional/index.html	(revision 1737)
@@ -7,5 +7,6 @@
     <script type="text/javascript" src="lib/jasmine.js"></script>
     <script type="text/javascript" src="lib/jasmine-html.js"></script>
-    <script type="text/javascript" src="lib/jquery.js"></script>
+    <!-- use same jquery -->
+    <script type="text/javascript" src="../../admin/js/jquery/jquery.js"></script>
     <script type="text/javascript" src="lib/jasmine-jquery.js"></script>
     <script type="text/javascript" src="lib/jasmine-jquery-bootstrap.js"></script>
@@ -13,10 +14,28 @@
     <script type="text/javascript" src="../../admin/js/_users_actions.js"></script>
     <script type="text/javascript" src="../../admin/js/common.js"></script>
+
     <script type="text/javascript" src="js/fix_include.js"></script>
 
-    <script type="text/javascript" src="spec/users_actions.js"></script>
+    <!-- jsUpload -->
+    <script type="text/javascript" src="../../admin/js/jsUpload/vendor/jquery.ui.widget.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/tmpl.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/template-upload.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/template-download.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/load-image.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/jquery.iframe-transport.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/jquery.fileupload.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/jquery.fileupload-process.js"></script>
+    <script type="text/javascript" src="../../admin/js/jsUpload/jquery.fileupload-resize.js"></script> 
+    <script type="text/javascript" src="../../admin/js/jsUpload/jquery.fileupload-ui.js"></script>
+    <script type="text/javascript" src="../../admin/js/_media.js"></script>    
+
+    <!-- <script type="text/javascript" src="spec/users_actions.js"></script> -->
     <script type="text/javascript" src="spec/toggle_with_legend.js"></script>
-
     <script type="text/javascript" src="spec/common.js"></script>
+    <script type="text/javascript" src="spec/media_manager.js"></script>
+    
+    <!-- page tabs -->
+    <script type="text/javascript" src="spec/page_tabs.js"></script>
+    
   </head>
   <body>
Index: tests/functional/js/fix_include.js
===================================================================
--- tests/functional/js/fix_include.js	(revision 1703)
+++ tests/functional/js/fix_include.js	(revision 1724)
@@ -10,2 +10,12 @@
 dotclear.msg.confirm_delete_posts = 'confirm %s delete';
 dotclear.msg.confirm_delete_comments = 'confirm %s delete';
+
+dotclear.jsUpload = {msg:{}};
+dotclear.jsUpload.msg.cancel = 'cancel';
+dotclear.jsUpload.msg.send = 'send';
+dotclear.jsUpload.msg.error = 'error';
+dotclear.jsUpload.msg.file_successfully_uploaded = 'file succesfully uploaded';
+
+dotclear.msg.enhanced_uploader_activate = 'Temporarily activate enhanced uploader';
+dotclear.msg.enhanced_uploader_disable = 'Temporarily disable enhanced uploader';
+
Index: tests/functional/lib/jasmine-jquery-bootstrap.js
===================================================================
--- tests/functional/lib/jasmine-jquery-bootstrap.js	(revision 1602)
+++ tests/functional/lib/jasmine-jquery-bootstrap.js	(revision 1724)
@@ -1,28 +1,29 @@
 (function() {
-    jasmine.getFixtures().fixturesPath = 'fixtures';
+	jasmine.getFixtures().fixturesPath = 'fixtures';
+	jasmine.getStyleFixtures().fixturesPath = '../../admin/style';
 
-    var jasmineEnv = jasmine.getEnv();
-    jasmineEnv.updateInterval = 1000;
+	var jasmineEnv = jasmine.getEnv();
+	jasmineEnv.updateInterval = 1000;
 
-    var htmlReporter = new jasmine.HtmlReporter();
+	var htmlReporter = new jasmine.HtmlReporter();
 
-    jasmineEnv.addReporter(htmlReporter);
+	jasmineEnv.addReporter(htmlReporter);
 
-    jasmineEnv.specFilter = function(spec) {
-	return htmlReporter.specFilter(spec);
-    };
+	jasmineEnv.specFilter = function(spec) {
+		return htmlReporter.specFilter(spec);
+	};
 
-    var currentWindowOnload = window.onload;
+	var currentWindowOnload = window.onload;
 
-    window.onload = function() {
-	if (currentWindowOnload) {
-	    currentWindowOnload();
+	window.onload = function() {
+		if (currentWindowOnload) {
+			currentWindowOnload();
+		}
+		execJasmine();
+	};
+
+	function execJasmine() {
+		jasmineEnv.execute();
 	}
-	execJasmine();
-    };
-
-    function execJasmine() {
-	jasmineEnv.execute();
-    }
 
 })();
Index: tests/functional/spec/common.js
===================================================================
--- tests/functional/spec/common.js	(revision 1703)
+++ tests/functional/spec/common.js	(revision 1724)
@@ -1,83 +1,83 @@
 describe("Others common methods (admin/js/common.js)", function() {
-    describe("postsActionsHelper", function() {
-	it("A confirm popup must appear if action is \"delete\" and at least on checkbox is checked", function() {
-	    loadFixtures('posts_list.html');
-	    dotclear.postsActionsHelper();
-	    
-	    spyOn(window, 'confirm').andReturn(false);
-	    var submitCallback = jasmine.createSpy().andReturn(false);
-	    $('#form-entries').submit(submitCallback);
+	describe("postsActionsHelper", function() {
+		it("A confirm popup must appear if action is \"delete\" and at least on checkbox is checked", function() {
+			loadFixtures('posts_list.html');
+			dotclear.postsActionsHelper();
+			
+			spyOn(window, 'confirm').andReturn(false);
+			var submitCallback = jasmine.createSpy().andReturn(false);
+			$('#form-entries').submit(submitCallback);
 
-	    $('select[name="action"] option[value="delete"]').attr('selected', 'selected');
-	    $('input[type="checkbox"][name="entries[]"][value="2"]').attr('checked', 'checked');
+			$('select[name="action"] option[value="delete"]').attr('selected', 'selected');
+			$('input[type="checkbox"][name="entries[]"][value="2"]').attr('checked', 'checked');
 
-	    $('#form-entries').trigger('submit');
-	    expect(window.confirm).toHaveBeenCalled();
+			$('#form-entries').trigger('submit');
+			expect(window.confirm).toHaveBeenCalled();
+		});
+		it("Confirm popup doesn't appear if action is \"delete\" but no checkbox is checked", function() {
+			loadFixtures('posts_list.html');
+			dotclear.postsActionsHelper();
+			
+			spyOn(window, 'confirm').andReturn(false);
+			var submitCallback = jasmine.createSpy().andReturn(false);
+			$('#form-entries').submit(submitCallback);
+
+			$('select[name="action"] option[value="delete"]').attr('selected', 'selected');
+			$('#form-entries').trigger('submit');
+			expect(window.confirm).not.toHaveBeenCalled();
+		});
+		it("Others actions don't show confirm popup", function() {
+			loadFixtures('posts_list.html');
+			dotclear.postsActionsHelper();
+			
+			spyOn(window, 'confirm').andReturn(false);
+			var submitCallback = jasmine.createSpy().andReturn(false);
+			$('#form-entries').submit(submitCallback);
+
+			$('select[name="action"] option[value="publish"]').attr('selected', 'selected');
+			$('#form-entries').trigger('submit');
+			expect(window.confirm).not.toHaveBeenCalled();
+		});
 	});
-	it("Confirm popup doesn't appear if action is \"delete\" but no checkbox is checked", function() {
-	    loadFixtures('posts_list.html');
-	    dotclear.postsActionsHelper();
-	    
-	    spyOn(window, 'confirm').andReturn(false);
-	    var submitCallback = jasmine.createSpy().andReturn(false);
-	    $('#form-entries').submit(submitCallback);
 
-	    $('select[name="action"] option[value="delete"]').attr('selected', 'selected');
-	    $('#form-entries').trigger('submit');
-	    expect(window.confirm).not.toHaveBeenCalled();
+	describe("commentsActionsHelper", function() {
+		it("A confirm popup must appear if action is \"delete\" and at least on checkbox is checked", function() {
+			loadFixtures('comments_list.html');
+			dotclear.commentsActionsHelper();
+			
+			spyOn(window, 'confirm').andReturn(false);
+			var submitCallback = jasmine.createSpy().andReturn(false);
+			$('#form-comments').submit(submitCallback);
+
+			$('select[name="action"] option[value="delete"]').attr('selected', 'selected');
+			$('input[type="checkbox"][name="comments[]"][value="2"]').attr('checked', 'checked');
+
+			$('#form-comments').trigger('submit');
+			expect(window.confirm).toHaveBeenCalled();
+		});
+		it("Confirm popup doesn't appear if action is \"delete\" but no checkbox is checked", function() {
+			loadFixtures('comments_list.html');
+			dotclear.commentsActionsHelper();
+			
+			spyOn(window, 'confirm').andReturn(false);
+			var submitCallback = jasmine.createSpy().andReturn(false);
+			$('#form-comments').submit(submitCallback);
+
+			$('select[name="action"] option[value="delete"]').attr('selected', 'selected');
+			$('#form-comments').trigger('submit');
+			expect(window.confirm).not.toHaveBeenCalled();
+		});
+		it("Others actions don't show confirm popup", function() {
+			loadFixtures('comments_list.html');
+			dotclear.commentsActionsHelper();
+			
+			spyOn(window, 'confirm').andReturn(false);
+			var submitCallback = jasmine.createSpy().andReturn(false);
+			$('#form-comments').submit(submitCallback);
+
+			$('select[name="action"] option[value="publish"]').attr('selected', 'selected');
+			$('#form-comments').trigger('submit');
+			expect(window.confirm).not.toHaveBeenCalled();
+		});
 	});
-	it("Others actions don't show confirm popup", function() {
-	    loadFixtures('posts_list.html');
-	    dotclear.postsActionsHelper();
-	    
-	    spyOn(window, 'confirm').andReturn(false);
-	    var submitCallback = jasmine.createSpy().andReturn(false);
-	    $('#form-entries').submit(submitCallback);
-
-	    $('select[name="action"] option[value="publish"]').attr('selected', 'selected');
-	    $('#form-entries').trigger('submit');
-	    expect(window.confirm).not.toHaveBeenCalled();
-	});
-    });
-
-    describe("commentsActionsHelper", function() {
-	it("A confirm popup must appear if action is \"delete\" and at least on checkbox is checked", function() {
-	    loadFixtures('comments_list.html');
-	    dotclear.commentsActionsHelper();
-	    
-	    spyOn(window, 'confirm').andReturn(false);
-	    var submitCallback = jasmine.createSpy().andReturn(false);
-	    $('#form-comments').submit(submitCallback);
-
-	    $('select[name="action"] option[value="delete"]').attr('selected', 'selected');
-	    $('input[type="checkbox"][name="comments[]"][value="2"]').attr('checked', 'checked');
-
-	    $('#form-comments').trigger('submit');
-	    expect(window.confirm).toHaveBeenCalled();
-	});
-	it("Confirm popup doesn't appear if action is \"delete\" but no checkbox is checked", function() {
-	    loadFixtures('comments_list.html');
-	    dotclear.commentsActionsHelper();
-	    
-	    spyOn(window, 'confirm').andReturn(false);
-	    var submitCallback = jasmine.createSpy().andReturn(false);
-	    $('#form-comments').submit(submitCallback);
-
-	    $('select[name="action"] option[value="delete"]').attr('selected', 'selected');
-	    $('#form-comments').trigger('submit');
-	    expect(window.confirm).not.toHaveBeenCalled();
-	});
-	it("Others actions don't show confirm popup", function() {
-	    loadFixtures('comments_list.html');
-	    dotclear.commentsActionsHelper();
-	    
-	    spyOn(window, 'confirm').andReturn(false);
-	    var submitCallback = jasmine.createSpy().andReturn(false);
-	    $('#form-comments').submit(submitCallback);
-
-	    $('select[name="action"] option[value="publish"]').attr('selected', 'selected');
-	    $('#form-comments').trigger('submit');
-	    expect(window.confirm).not.toHaveBeenCalled();
-	});
-    });
 });
Index: tests/functional/spec/media_manager.js
===================================================================
--- tests/functional/spec/media_manager.js	(revision 1724)
+++ tests/functional/spec/media_manager.js	(revision 1724)
@@ -0,0 +1,31 @@
+describe("Enhanced Media Manager", function() {
+	describe("Starting with media manager enhanced disabled", function() {
+		it("Enhanced uploader can be temporarily enabled", function() {
+			loadFixtures('form_media_disabled.html');
+			loadStyleFixtures('jsUpload/style.css');
+			
+			$('#fileupload').enhancedUploader();
+			expect($('p.clear a.enhanced-toggle').text()).toBe(dotclear.msg.enhanced_uploader_activate);
+			expect($('#fileupload .button.start')).not.toBeDisabled();
+
+			$('p.clear a.enhanced-toggle').click();
+			expect($('p.clear a.enhanced-toggle').text()).toBe(dotclear.msg.enhanced_uploader_disable);			
+			expect($('.button.start')).toBeDisabled();
+		});
+	});
+
+	describe("Starting with media manager enhanced enabled", function() {
+		it("Enhanced uploader can be temporarily disabled", function() {
+			loadFixtures('form_media_enabled.html');
+			loadStyleFixtures('jsUpload/style.css');
+
+			$('#fileupload').enhancedUploader();
+			expect($('p.clear a.enhanced-toggle').text()).toBe(dotclear.msg.enhanced_uploader_disable);
+			expect($('.button.start')).toBeDisabled();
+
+			$('p.clear a.enhanced-toggle').click();
+			expect($('p.clear a.enhanced-toggle').text()).toBe(dotclear.msg.enhanced_uploader_activate);
+			expect($('#fileupload .button.start')).not.toBeDisabled();
+		});
+	});
+});
Index: tests/functional/spec/page_tabs.js
===================================================================
--- tests/functional/spec/page_tabs.js	(revision 1737)
+++ tests/functional/spec/page_tabs.js	(revision 1737)
@@ -0,0 +1,92 @@
+describe("tabs method (admin/js/pageTabs.js)", function() {
+	
+	it("Construct tabs using div content", function() {
+		
+		loadFixtures('tabs.html');
+		
+		expect($('#tab-1')).toBeVisible();
+		expect($('#tab-2')).toBeVisible();
+		expect($('#tab-3')).toBeVisible();
+		
+		expect($('.part-tabs')).not.toExist();
+		
+		$.pageTabs('tab-1');
+		
+		expect($('#tab-1')).toBeVisible();
+		expect($('#tab-2')).not.toBeVisible();
+		expect($('#tab-3')).not.toBeVisible();
+		
+		expect($('.part-tabs ul li#part-tabs-tab-1 a[href=#tab-1]')).toExist();
+		expect($('.part-tabs ul li#part-tabs-tab-2 a[href=#tab-2]')).toExist();
+		expect($('.part-tabs ul li#part-tabs-tab-3 a[href=#tab-3]')).toExist();
+	
+		expect($('.part-tabs ul li#part-tabs-tab-1')).toHaveClass('part-tabs-active');
+		
+	});
+	
+	it("Change tabs when changing the hash", function() {
+		
+		runs(function() {        
+            loadFixtures('tabs-iframe.html');
+        });
+		
+		waitsFor(function() {
+            return $("#testtab").contents().find('#tab-3').get(0);
+        }, 10000);
+		
+		runs(function() {
+			f$ = $("#testtab").get(0).contentWindow.$;
+			f$.pageTabs('tab-1');
+
+			expect(f$('#tab-1').get(0)).toBeVisible();
+			expect(f$('#tab-2').get(0)).not.toBeVisible();
+			
+			expect(f$('.part-tabs ul li#part-tabs-tab-1').get(0)).toHaveClass('part-tabs-active');
+			expect(f$('.part-tabs ul li#part-tabs-tab-2').get(0)).not.toHaveClass('part-tabs-active');
+
+            $("#testtab").attr('src', $("#testtab").attr('src')+'#tab-2');
+        });
+		
+		waitsFor(function() {
+			f$ = $("#testtab").get(0).contentWindow.$;
+            return f$('#tab-1').is(':not(:visible)');
+        }, 10000);
+		
+		runs(function() {
+			f$ = $("#testtab").get(0).contentWindow.$;
+			
+    		expect(f$('#tab-2').get(0)).toBeVisible();
+
+			expect(f$('.part-tabs ul li#part-tabs-tab-1').get(0)).not.toHaveClass('part-tabs-active');
+			expect(f$('.part-tabs ul li#part-tabs-tab-2').get(0)).toHaveClass('part-tabs-active');
+			
+        });
+		
+	});
+	
+	it("Load the correct tab with the correct hash", function() {
+		
+		runs(function() {        
+            loadFixtures('tabs-iframe.html');
+            $("#testtab").attr('src', $("#testtab").attr('src')+'#tab-3');
+        });
+		
+		waitsFor(function() {
+			cond1 = $("#testtab").attr('src').split('#')[1] != '';
+			cond2 = $("#testtab").contents().find('#tab-3').get(0);
+            return cond1 && cond2;
+        }, 10000);
+		
+		runs(function() {
+			f$ = $("#testtab").get(0).contentWindow.$;
+			f$.pageTabs('tab-1');
+			
+			expect(f$('#tab-1').get(0)).not.toBeVisible();
+			expect(f$('#tab-3').get(0)).toBeVisible();
+			
+			expect(f$('.part-tabs ul li#part-tabs-tab-1').get(0)).not.toHaveClass('part-tabs-active');
+			expect(f$('.part-tabs ul li#part-tabs-tab-3').get(0)).toHaveClass('part-tabs-active');
+        });
+		
+	});
+});
Index: tests/functional/spec/toggle_with_legend.js
===================================================================
--- tests/functional/spec/toggle_with_legend.js	(revision 1703)
+++ tests/functional/spec/toggle_with_legend.js	(revision 1724)
@@ -1,47 +1,47 @@
 describe("toggleWithLegend method (admin/js/common.js)", function() {
-    it("Click arrow must make target visible", function() {
-	loadFixtures('menu.html');
-	$('#post_status').parent().toggleWithLegend($('#post_status'),{	});
+	it("Click arrow must make target visible", function() {
+		loadFixtures('menu.html');
+		$('#post_status').parent().toggleWithLegend($('#post_status'),{	});
 
-	var $arrow = $('#post_status').parent().find('img');
-	$arrow.click();
-	expect($('#post_status')).toBeVisible();
-    });
-    it("Click arrow twice,must make target visible and after second click hidden", function() {
-	loadFixtures('menu.html');
-	$('#post_status').parent().toggleWithLegend($('#post_status'),{	});
+		var $arrow = $('#post_status').parent().find('img');
+		$arrow.click();
+		expect($('#post_status')).toBeVisible();
+	});
+	it("Click arrow twice,must make target visible and after second click hidden", function() {
+		loadFixtures('menu.html');
+		$('#post_status').parent().toggleWithLegend($('#post_status'),{	});
 
-	var $arrow = $('#post_status').parent().find('img');
-	$arrow.click();
-	expect($('#post_status')).toBeVisible();
+		var $arrow = $('#post_status').parent().find('img');
+		$arrow.click();
+		expect($('#post_status')).toBeVisible();
 
-	$arrow.click();
-	expect($('#post_status')).toBeHidden();
-    });
-    it("Chick target must not hide target", function() {
-	loadFixtures('menu.html');
-	$('#post_status').parent().toggleWithLegend($('#post_status'),{	});
+		$arrow.click();
+		expect($('#post_status')).toBeHidden();
+	});
+	it("Chick target must not hide target", function() {
+		loadFixtures('menu.html');
+		$('#post_status').parent().toggleWithLegend($('#post_status'),{	});
 
-	var $arrow = $('#post_status').parent().find('img');
-	$arrow.click();
-	expect($('#post_status')).toBeVisible();
+		var $arrow = $('#post_status').parent().find('img');
+		$arrow.click();
+		expect($('#post_status')).toBeVisible();
 
-	$('#post_status option[value="-2"]').attr('selected', 'selected');
-	expect($('#post_status')).toBeVisible();
-    });
-    it("Chick target must not hide target, when legend_click is true", function() {
-	loadFixtures('menu.html');
-	var $label = $('#post_status').parent().children('label');
-	$label.toggleWithLegend($('#post_status'),{'legend_click':true, a_container:false});
+		$('#post_status option[value="-2"]').attr('selected', 'selected');
+		expect($('#post_status')).toBeVisible();
+	});
+	it("Chick target must not hide target, when legend_click is true", function() {
+		loadFixtures('menu.html');
+		var $label = $('#post_status').parent().children('label');
+		$label.toggleWithLegend($('#post_status'),{'legend_click':true, a_container:false});
 
-	$label.click();
-	expect($('#post_status')).toBeVisible();
+		$label.click();
+		expect($('#post_status')).toBeVisible();
 
-	var $arrow = $('#post_status').parent().find('img');
-	$arrow.click();
-	expect($('#post_status')).toBeVisible();
+		var $arrow = $('#post_status').parent().find('img');
+		$arrow.click();
+		expect($('#post_status')).toBeVisible();
 
-	$('#post_status').val(-2).trigger('change');
-	expect($('#post_status')).toBeVisible();
-    });
+		$('#post_status').val(-2).trigger('change');
+		expect($('#post_status')).toBeVisible();
+	});
 });
Index: tests/functional/spec/users_actions.js
===================================================================
--- tests/functional/spec/users_actions.js	(revision 1703)
+++ tests/functional/spec/users_actions.js	(revision 1724)
@@ -1,25 +1,25 @@
 describe("updatePermissionsForm method (admin/js/_users_actions.js)", function() {
-    it("Click admin persmission must checked all associated permissions", function() {
-	loadFixtures('normal.html');
-	$('#permissions-form').updatePermissionsForm();
-	var permissions = ['usage','publish','delete','contentadmin','categories'];
+	it("Click admin persmission must checked all associated permissions", function() {
+		loadFixtures('normal.html');
+		$('#permissions-form').updatePermissionsForm();
+		var permissions = ['usage','publish','delete','contentadmin','categories'];
 
-	$('input[name="perm[default][admin]"]').click();
-	for (var _i=0,_len=permissions.length;_i<_len;_i++) {
-	    expect($('input[name="perm[default]['+permissions[_i]+']"]')).toBeChecked();
-	    expect($('input[name="perm[default]['+permissions[_i]+']"]')).toBeDisabled();
-	}
-    });
+		$('input[name="perm[default][admin]"]').click();
+		for (var _i=0,_len=permissions.length;_i<_len;_i++) {
+			expect($('input[name="perm\\[default\\]\\['+permissions[_i]+'\\]"]')).toBeChecked();
+			expect($('input[name="perm\\[default\\]\\['+permissions[_i]+'\\]"]')).toBeDisabled();
+		}
+	});
 
-    it("Click contentadmin persmission must checked all associated permissions", function() {
-	loadFixtures('normal.html');
-	$('#permissions-form').updatePermissionsForm();
-	var permissions = ['usage','publish','delete'];
+	it("Click contentadmin persmission must checked all associated permissions", function() {
+		loadFixtures('normal.html');
+		$('#permissions-form').updatePermissionsForm();
+		var permissions = ['usage','publish','delete'];
 
-	$('input[name="perm[default][contentadmin]"]').click();
-	for (var _i=0,_len=permissions.length;_i<_len;_i++) {
-	    expect($('input[name="perm[default]['+permissions[_i]+']"]')).toBeChecked();
-	    expect($('input[name="perm[default]['+permissions[_i]+']"]')).toBeDisabled();
-	}
-    });
+		$('input[name="perm[default][contentadmin]"]').click();
+		for (var _i=0,_len=permissions.length;_i<_len;_i++) {
+			expect($('input[name="perm[default]['+permissions[_i]+']"]')).toBeChecked();
+			expect($('input[name="perm[default]['+permissions[_i]+']"]')).toBeDisabled();
+		}
+	});
 });
Index: nit-tests/dotclearTest.php
===================================================================
--- unit-tests/dotclearTest.php	(revision 1095)
+++ 	(revision )
@@ -1,13 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Root path
-define('NAME_UNIT_TEST','unit-tests');
-define('ROOT_UNIT_TEST',substr(dirname(__FILE__),0,strpos(dirname(__FILE__),'/'.NAME_UNIT_TEST)));
-
-?>
Index: nit-tests/inc/libs/clearbricks/_commonTest.php
===================================================================
--- unit-tests/inc/libs/clearbricks/_commonTest.php	(revision 1095)
+++ 	(revision )
@@ -1,31 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Paths
-if (!defined('NAME_UNIT_TEST')) {
-	defined('NAME_UNIT_TEST','unit-tests');
-}
-$sync_test_path = preg_replace('#/'.NAME_UNIT_TEST.'#','',dirname(__FILE__));
-
-// File to test
-define('CLEARBRICKS_PATH',ROOT_UNIT_TEST.'/inc/libs/clearbricks');
-require_once(CLEARBRICKS_PATH.'/common/lib.date.php');
-require_once($sync_test_path.'/_common.php');
-
-// Unit test class
-class clearbricksTest extends PHPUnit_Framework_TestCase
-{
-	public function setUp() {}
-	public function tearDown() {}
-   
-	public function test_clearbricks() {
-
-		$this->assertTrue(defined('CLEARBRICKS_VERSION'));
-	}
-}
-?>
Index: nit-tests/inc/libs/clearbricks/common/_mainTest.php
===================================================================
--- unit-tests/inc/libs/clearbricks/common/_mainTest.php	(revision 1095)
+++ 	(revision )
@@ -1,38 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Paths
-if (!defined('NAME_UNIT_TEST')) {
-	defined('NAME_UNIT_TEST','unit-tests');
-}
-$sync_test_path = preg_replace('#/'.NAME_UNIT_TEST.'#','',dirname(__FILE__));
-
-// File to test
-//define('CLEARBRICKS_PATH',ROOT_UNIT_TEST.'/inc/libs/clearbricks');
-//require_once(CLEARBRICKS_PATH.'/common/lib.date.php');
-require_once($sync_test_path.'/_main.php');
-
-// Unit test class
-class commonTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-	public function setUp() {}
-	public function tearDown() {}
-
-	// Unit test methods
-	public function test_common() {
-		global $__autoload;
-		$a = array('crypt','dt','files','path','form','formSelectOption','html','http','text');
-
-		$this->assertNotEmpty($__autoload);
-		foreach ($a as $value) {
-			$this->assertTrue(isset($__autoload[$value]));
-		}
-	}
-}
-?>
Index: nit-tests/inc/libs/clearbricks/common/lib.cryp.Test.php
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.cryp.Test.php	(revision 1095)
+++ 	(revision )
@@ -1,36 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Paths
-if (!defined('NAME_UNIT_TEST')) {
-	defined('NAME_UNIT_TEST','unit-tests');
-}
-$sync_test_path = preg_replace('#/'.NAME_UNIT_TEST.'#','',dirname(__FILE__));
-
-// File to test
-//define('CLEARBRICKS_PATH',ROOT_UNIT_TEST.'/inc/libs/clearbricks');
-//require_once(CLEARBRICKS_PATH.'/common/lib.date.php');
-require_once($sync_test_path.'/lib.crypt.php');
-
-// Unit test class
-class cryptTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-	public function setUp() {}
-	public function tearDown() {}
-
-	// Unit test methods
-	public function test_hmac() {
-		$this->assertTrue(crypt::hmac('dotclear is da best','lorem impsum','md5') == 'c799ac384bfc6dbff9988764989010c0');
-	}
-
-	public function test_createPassword() {
-		$this->assertTrue(strlen(crypt::createPassword()) == 8);
-	}
-}
-?>
Index: nit-tests/inc/libs/clearbricks/common/lib.date.Test.php
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.date.Test.php	(revision 1095)
+++ 	(revision )
@@ -1,80 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Paths
-if (!defined('NAME_UNIT_TEST')) {
-	defined('NAME_UNIT_TEST','unit-tests');
-}
-$sync_test_path = preg_replace('#/'.NAME_UNIT_TEST.'#','',dirname(__FILE__));
-
-// File to test
-//define('CLEARBRICKS_PATH',ROOT_UNIT_TEST.'/inc/libs/clearbricks');
-//require_once(CLEARBRICKS_PATH.'/common/lib.date.php');
-require_once($sync_test_path.'/lib.date.php');
-
-// Unit test class
-class dtTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-	protected $d;
-
-	public function setUp() {
-		$this->d = new dt;
-		$this->d->setTZ('UTC');
-	}
-	public function tearDown() {}
-
-	// Unit test methods
-
-	public function test_str() {
-		$t = mktime(10, 42, 0, 8, 13, 2003);
-		$this->assertTrue($this->d->str('%A %e %B %Y %H:%M:%S',$t) == 'Wednesday 13 August 2003 10:42:00');
-	}
-
-	public function test_dt2str() {
-		$t = mktime(10, 42, 0, 8, 13, 2003);
-		$this->assertTrue($this->d->dt2str('%A %e %B %Y %H:%M:%S',date('D, d M Y H:i:s',$t)) == 'Wednesday 13 August 2003 10:42:00');
-	}
-
-	public function test_isoe8601() {
-		$t = mktime(10, 42, 0, 8, 13, 2003);
-		$this->assertTrue($this->d->iso8601($t) == '2003-08-13T10:42:00+00:00');
-	}
-
-	public function test_rfc822() {
-		$t = mktime(10, 42, 0, 8, 13, 2003);
-		$this->assertTrue($this->d->rfc822($t) == 'Wed, 13 Aug 2003 10:42:00 +0000');
-	}
-
-	public function test_setTZ() {
-		$this->d->setTZ('Europe/Paris');
-		$this->assertTrue($this->d->getTZ() == 'Europe/Paris');
-	}
-
-	public function test_getTZ() {
-		$this->assertTrue($this->d->getTZ() == 'UTC');
-	}
-
-	public function test_getTimeOffset() {
-		// Should cope with summer/winter time offset
-		$this->assertTrue($this->d->getTimeOffset('Europe/Paris') == 3600 || $this->d->getTimeOffset('Europe/Paris') == 7200);
-	}
-
-	public function test_toUTC() {
-		$this->assertTrue($this->d->toUTC(time()) == time());
-	}
-
-	public function test_addTimeZone() {
-		$this->assertTrue($this->d->addTimeZone('UTC') == time());
-	}
-
-	public function test_getZones() {
-		$this->assertNotEmpty($this->d->getZones(false,true));
-	}
-}
-?>
Index: nit-tests/inc/libs/clearbricks/common/lib.files.Test.php
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.files.Test.php	(revision 1095)
+++ 	(revision )
@@ -1,235 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Paths
-if (!defined('NAME_UNIT_TEST')) {
-	defined('NAME_UNIT_TEST','unit-tests');
-}
-$sync_test_path = preg_replace('#/'.NAME_UNIT_TEST.'#','',dirname(__FILE__));
-
-// File to test
-//define('CLEARBRICKS_PATH',ROOT_UNIT_TEST.'/inc/libs/clearbricks');
-//require_once(CLEARBRICKS_PATH.'/common/lib.date.php');
-require_once($sync_test_path.'/lib.files.php');
-
-// Unit test class
-class fileTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-
-	public function setUp() {}
-	public function tearDown() {}
-
-	// Unit test methods
-
-	public function test_scandir() {
-		// Test with an existing dir
-		$d = files::scandir(dirname(__FILE__));
-		$this->assertTrue(count($d) > 1);
-		// Test optional order
-		$this->assertTrue(files::scandir(dirname(__FILE__),true) == rsort($d));
-		// Test with an unexisting dir
-		try {
-			$this->assertCount(0,files::scandir(dirname(__FILE__).'-undefined'));
-		} catch (exception $e) {
-			$this->assertTrue($e->getMessage() == __('Unable to open directory.'));
-		}
-	}
-
-	public function test_getExtension() {
-		$this->assertTrue(files::getExtension(__FILE__) == 'php');
-	}
-
-	public function test_getMimeType() {
-		// Test with a known extension
-		$this->assertTrue(files::getMimeType(__FILE__.'.pdf') == 'application/pdf');
-		// Test with an unknown extension
-		$this->assertTrue(files::getMimeType(__FILE__) == 'text/plain');
-	}
-
-	public function test_mimeTypes() {
-		$this->assertNotEmpty($t=files::mimeTypes());
-		return $t;
-	}
-
-	/**
-	 * @depends test_mimeTypes
-	 */
-	public function test_registerMimeTypes(array $t) {
-		// Register an unknown mime type
-		files::registerMimeTypes(array('php' => 'text/plain'));
-		$this->assertTrue(count(files::mimeTypes()) == count($t)+1);
-		// Register an known mime type
-		files::registerMimeTypes(array('pdf' => 'application/pdf'));
-		$this->assertTrue(count(files::mimeTypes()) == count($t)+1);
-	}
-
-	public function test_isDeletable() {
-		// Test with a file
-		$this->assertTrue(files::isDeletable(__FILE__));
-		// Test with a full directory
-		$this->assertFalse(files::isDeletable(dirname(__FILE__)));
-		// Test with an unknown file
-		$this->assertNull(files::isDeletable(__FILE__.'-undefined'));
-	}
-
-	public function test_makeDir() {
-		// Try to create an empty simple dir
-		$d = dirname(__FILE__).'/simple-dir';
-		files::makeDir($d);
-		$this->assertTrue(is_dir($d));
-		// Try to create an empty deeper dir
-		$dd = $d.'/try/deeper';
-		try {
-			files::makeDir($dd);
-		} catch (exception $e) {
-			$this->assertTrue($e->getMessage() == __('Unable to create directory.'));
-		}
-		$this->assertFalse(is_dir($dd));
-		// Try to create an empty deeper dir, including creation of intermediary dir
-		files::makeDir($dd,true);
-		$this->assertTrue(is_dir($dd));
-		return $d;
-	}
-
-	/**
-	 * @depends test_makeDir
-	 */
-	public function test_deltree($d) {
-		// Delete an existing tree
-		$this->assertTrue(files::deltree($d));
-		$this->assertFalse(is_dir($d));
-		// Try to delete an unexisting tree
-		try {
-			files::deltree($d);
-		} catch (exception $e) {
-			return;
-		}
-		$this->fail(__('Expected exception not thrown.'));
-	}
-
-	public function test_touch() {
-		$f = tempnam(dirname(__FILE__),'dc_');
-		$t = time();
-		files::touch($f);
-		$this->assertTrue($t <= filemtime($f));
-		unlink($f);
-		// Try to touch an unexisting file
-		files::touch($f);
-		$this->assertFalse(file_exists($f));
-	}
-
-	public function test_inheritChmod() {
-		$f = tempnam(dirname(__FILE__),'dc_');
-		files::inheritChmod($f);
-		$this->assertTrue((fileperms($f) & 0x0FFF) == (fileperms(dirname($f)) & 0x0FFF));
-		unlink($f);
-	}
-
-	public function test_putContent() {
-		$f = tempnam(dirname(__FILE__),'dc_');
-		$f_content = 'Lorem ipsum';
-		files::putContent($f,$f_content);
-		$this->assertTrue(file_get_contents($f) == $f_content);
-		unlink($f);
-		// Try with a read-only file and unexisting file
-		$f = tempnam(dirname(__FILE__),'dc_');
-		chmod($f,0444);
-		try {
-			files::putContent($f,$f_content);
-			unlink($f);
-			files::putContent($f,$f_content);
-		} catch (exception $e) {
-			unlink($f);
-			return;
-		}
-		$this->fail(__('Expected exception not thrown.'));
-	}
-
-	public function test_size() {
-		$this->assertTrue(files::size(1024*42) == '42 KB');
-	}
-
-	public function test_str2bytes() {
-		$this->assertTrue(files::str2bytes('42K') == (1024*42));
-		$this->assertNotInternalType('integer',files::str2bytes('42X'));
-	}
-
-	public function test_uploadStatus() {
-		$f = array();
-		try {
-			files::uploadStatus($f);
-		} catch (exception $e) {
-			$this->assertTrue($e->getMessage() == __('Not an uploaded file.'));
-		}
-		$f['error'] = UPLOAD_ERR_OK;
-		$this->assertTrue(files::uploadStatus($f));
-		$f['error'] = 'another unknown status';
-		$this->assertTrue(files::uploadStatus($f));
-		try {
-			$f['error'] = UPLOAD_ERR_INI_SIZE;
-			files::uploadStatus($f);
-		} catch (exception $e) {
-			return;
-		}
-		$this->fail(__('Expected exception not thrown.'));
-	}
-
-	public function test_getDirList() {
-		$c = files::getDirList(dirname(__FILE__).'/../');
-		$this->assertNotEmpty($c);
-		$this->assertCount(2,$c);
-		$this->assertNotEmpty($c['dirs']);
-		$this->assertNotEmpty($c['files']);
-	}
-
-	public function test_tidyFileName() {
-		$this->assertTrue(files::tidyFileName('géù=fiel.txt') == 'geu_fiel.txt');
-	}
-}
-
-// Unit test class
-class pathTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-
-	public function setUp() {}
-	public function tearDown() {}
-
-	// Unit test methods
-
-	public function test_real() {
-		$p = dirname(__FILE__).'/../common/lib.files.Test.php';
-		$this->assertTrue(path::real($p) == __FILE__);
-		$p .= '-undefined';
-		$this->assertFalse(path::real($p));
-		// Non strict test
-		$this->assertTrue(path::real($p,false) == __FILE__.'-undefined');
-	}
-
-	public function test_clean() {
-		$p = dirname(__FILE__).'/..///common/lib.files.Test.php///';
-		$this->assertTrue(path::clean($p) == dirname(__FILE__).'/common/lib.files.Test.php');
-	}
-
-	public function test_info() {
-		$i = path::info(__FILE__);
-		$this->assertNotEmpty($i);
-		$this->assertCount(4,$i);
-		$this->assertTrue($i['dirname'] == dirname(__FILE__));
-		$this->assertTrue($i['basename'] == 'lib.files.Test.php');
-		$this->assertTrue($i['extension'] == 'php');
-		$this->assertTrue($i['base'] == 'lib.files.Test');
-	}
-
-	public function test_fullFromRoot() {
-		$this->assertTrue(path::fullFromRoot(NAME_UNIT_TEST,ROOT_UNIT_TEST) == ROOT_UNIT_TEST.'/'.NAME_UNIT_TEST);
-		$this->assertTrue(path::fullFromRoot('/'.NAME_UNIT_TEST,ROOT_UNIT_TEST) == '/'.NAME_UNIT_TEST);
-	}
-}
-?>
Index: nit-tests/inc/libs/clearbricks/common/lib.form.Test.combo.1.xml
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.form.Test.combo.1.xml	(revision 1095)
+++ 	(revision )
@@ -1,4 +1,0 @@
-<select name="ctrl-combo" id="ctrl-combo">
-	<option value="1">first label</option>
-	<option value="2">second label</option>
-</select>
Index: nit-tests/inc/libs/clearbricks/common/lib.form.Test.combo.2.xml
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.form.Test.combo.2.xml	(revision 1095)
+++ 	(revision )
@@ -1,11 +1,0 @@
-<select name="ctrl-name" id="ctrl-id" class="ctrl-class" tabindex="13" disabled="disabled" aria-required="true">
-	<option value="1">first label</option>
-	<option value="2" selected="selected">second label</option>
-	<optgroup label="first group">
-		<option value="3">third label</option>
-	</optgroup>
-	<optgroup label="second group">
-		<option value="4">fourth label</option>
-		<option value="5">fifth label</option>
-	</optgroup>
-</select>
Index: nit-tests/inc/libs/clearbricks/common/lib.form.Test.php
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.form.Test.php	(revision 1095)
+++ 	(revision )
@@ -1,69 +1,0 @@
-<?php
-# error reporting
-ini_set('display_errors',1);
-error_reporting(E_ALL|E_STRICT);
-
-# include PHPUnit
-require 'PHPUnit/Autoload.php';
-
-// Paths
-if (!defined('NAME_UNIT_TEST')) {
-	defined('NAME_UNIT_TEST','unit-tests');
-}
-$sync_test_path = preg_replace('#/'.NAME_UNIT_TEST.'#','',dirname(__FILE__));
-
-// File to test
-//define('CLEARBRICKS_PATH',ROOT_UNIT_TEST.'/inc/libs/clearbricks');
-//require_once(CLEARBRICKS_PATH.'/common/lib.date.php');
-require_once($sync_test_path.'/lib.form.php');
-
-// Unit test class
-class formTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-
-	public function setUp() {}
-	public function tearDown() {}
-
-	// Unit test methods
-
-	public function test_combo() {
-		$nid = 'ctrl-combo';
-		$data = array(
-			'first label' => 1,
-			'second label' => 2
-			);
-		$res = form::combo($nid,$data);
-		$this->assertXmlStringEqualsXmlFile(dirname(__FILE__).'/lib.form.Test.combo.1.xml',$res);
-		$nid = array('ctrl-name','ctrl-id');
-		$data = array(
-			'first label' => 1,
-			'second label' => 2,
-			'first group' => array('third label' => 3),
-			'second group' => array('fourth label' => 4,'fifth label' => 5));
-		$res = form::combo($nid,$data,2,'ctrl-class',13,true,'aria-required="true"');
-		$this->assertXmlStringEqualsXmlFile(dirname(__FILE__).'/lib.form.Test.combo.2.xml',$res);
-	}
-
-	public function test_radio() {
-		
-	}
-}
-
-// Unit test class
-class formSelectOptionTest extends PHPUnit_Framework_TestCase
-{
-	// Fixture
-	protected $c;
-
-	public function setUp() {
-		$this->c = new formSelectOption('option-label',13,'ctrl-class',' rel="author"');
-	}
-	public function tearDown() {}
-
-	// Unit test methods
-	public function test_render() {
-		$this->assertXmlStringEqualsXmlFile(dirname(__FILE__).'/lib.form.Test.render.1.xml',$this->c->render(true));
-	}
-}
-?>
Index: nit-tests/inc/libs/clearbricks/common/lib.form.Test.render.1.xml
===================================================================
--- unit-tests/inc/libs/clearbricks/common/lib.form.Test.render.1.xml	(revision 1095)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<option value="13" rel="author" class="ctrl-class" selected="selected">option-label</option>
Index: nit-tests/readme.md
===================================================================
--- unit-tests/readme.md	(revision 1095)
+++ 	(revision )
@@ -1,11 +1,0 @@
-Dotclear and Clearbricks Unit tests
-===================================
-
-Running tests (from dotclear root directory):
-
-phpunit unit-tests
-
-
-References:
-
-* PHPUnit documentation: http://www.phpunit.de/manual/3.7/en/index.html
